文件共享是在企业办公网络中经常用到的一项功能,如何设置并使用文件共享在技术上并不复杂,其中的问题主要集中在权限配置方面。
本文以世界技能大赛网络系统管理赛项中的一道题目作为案例,详细分析了如何利用Samba服务结合系统权限来完成各种复杂的权限设置,本文所采用的系统版本为CentOS7。

1. 任务需求与分析

将/share/archive目录创建为samba共享,并完成下列要求:
① 共享名为archive;
② zhangsan,lisi,wangwu用户都能通过输入用户名和密码(Skills39)登录并上传文件;
③ 其他人不能访问共享目录;
④ zhangsan能够查看和删除所有人的文件;
⑤ lisi能够查看所有人的文件,但不能删除别人的文件;
⑥ wangwu只能查看和删除自己的文件,不能查看和删除别人的文件;
在这6项需求中,第1、2、3项需求属于Samba服务的常规配置,实现起来较为简单;第4、5、6项需求主要是针对不同用户的权限设置,需要结合系统权限完成配置,实现起来较为复杂。下面就从这两个方面分别进行分析。

2. Samba常规配置

在CentOS7系统中所提供的Samba版本为4.6.2,软件默认没有安装,首先执行下列命令安装、启动服务,并将之设为开机自动运行。

# yum install samba
# systemctl start smb
# systemctl enable smb

Samba的配置文件为“/etc/samba/smb.conf”,下面在配置文件中定义共享,相关设置项如图1所示。
Samba服务权限配置案例

对设置项的解释:
 [archive]:指定共享名,也就是客户端在访问时所看到的共享目录名字。
 path:指定共享目录在服务器中对应的实际路径,要求必须使用绝对路径。
 valid users:只允许指定的Samba用户访问该共享。
 writable:共享目录是否允许Samba用户写入。这里虽然设置了所有Samba用户都可以写入,但由于“valid users”设置项限制了只有指定的三个用户可以访问共享,因而实际上也只有这三个用户可以写入。
配置完成后,保存退出。
下面创建共享目录,并将其权限设为777。

# mkdir -p /share/archive
# chmod 777 /share/archive

接下来再创建Samba用户。由于Samba用户要以系统用户为基础,因而需要先创建出系统用户之后,再将其添加为Samba用户。这里为了进行测试,额外再创建一个Samba用户maliu。

# useradd -s /sbin/nologin zhangsan
# useradd -s /sbin/nologin lisi
# useradd -s /sbin/nologin wangwu
# useradd -s /sbin/nologin maliu

下面将这些系统用户添加为Samba用户,同时需要为每位用户指定密码。需要注意的是,Samba用户的密码与系统用户的密码没有任何关系。

# smbpasswd -a zhangsan
# smbpasswd -a lisi
# smbpasswd -a wangwu
# smbpasswd -a maliu

最后,可以通过执行“pdbedit -L”命令列表显示目前系统中已经存在的所有Samba用户。

# pdbedit -L
zhangsan:1009:
lisi:1010:
wangwu:1011:
maliu:1012:

至此,Samba的常规配置就完成了,执行“systemctl restart smb”命令重启服务,使配置生效。然后可以在Windows或Linux客户端进行访问测试,用户zhangsan、lisi、wangwu都可以访问共享,并上传文件,但用户maliu没有访问共享的权限。具体测试过程从略。

3. 权限设置

下面再来完成第4、5、6项要求,这也是在这整个任务需求中最复杂的部分。将这三项需求进行归纳,核心问题主要有两个:是否允许删除别人的文件,是否允许读取别人的文件。下面分别来解决这两个问题。

3.1 限制删除别人的文件

要完成这个任务,首先需要明确一个问题:在Linux系统中,用户需要具有哪种权限,才可以将一个文件删除。
Linux系统规定,用户只要对某个目录具备“写入(w)”权限,那么便可以修改或删除该目录中的任何文件,而不论这个文件的权限是什么。
也就是说,用户能否删除一个文件,取决于用户对文件所在的目录是否具有写入权限。由于我们将共享目录/share/archive的系统权限设为了777,因而此时任何用户都可以删除该目录中的任意文件。但在任务5和任务6中,又明确要求用户lisi和wangwu不能删除别人的文件,所以这里自然就想到了sbit粘滞位权限。
sbit权限的作用是:当目录被设置了sbit权限之后,即便用户对目录有“写入(w)”权限,也不能删除该目录中其他用户的文件,每个文件只有该文件的所有者和root用户才有权将其删除。
因而下面需要为共享目录/share/archive设置sbit权限:

# chmod o+t /share/archive/
# ll -d /share/archive/
drwxrwxrwt. 2 root root 26 4月  28 20:32 /share/archive/

这样,所有的Samba用户都可以向共享目录中上传文件,但是只能删除自己的文件,而无法删除别人的文件。
但如此一来,又无法满足任务4的需求了,用户zhangsan也无法删除别人的文件。到这里,思路好像进入了死胡同。
其实关于sbit权限,还有一条规则是:对于目录的所有者,可以不受sbit权限的限制,他可以删除该目录中所有用户的文件。
只要明白了该规则,问题自然就迎刃而解,我们只需将共享目录的所有者更改为zhangsan即可。

# chown zhangsan /share/archive/
# ll -d /share/archive/
drwxrwxrwt. 2 zhangsan root 26 4月  28 20:32 /share/archive/

至此,关于能否删除文件的需求就全部解决了。

3.2 限制读取别人的文件

同之前一样,要完成这个任务首先需要明确,用户具有哪种权限才可以读取文件。这个问题相对比较简单,在Linux系统中,用户只要对文件本身具有“读取(r)”权限,那么便可以查看文件中的内容。
综合任务4、5、6这三项需求,用户zhangsan和lisi可以读取所有人的文件,而用户wangwu则只能读取自己的文件。下面是具体的实现过程。
首先在Samba的配置文件“/etc/samba/smb.conf”中定义用户上传文件的默认权限,这里需要用到“create mask”设置项,将用户上传文件的默认权限设置为0640,也就是说只有文件的所有者以及所属组用户才具有读取权限。相关设置项如图2所示。
Samba服务权限配置案例
设置完成后,同样需要执行“systemctl restart smb”命令重启服务生效。
接下来我们只需使得zhangsan和lisi能够成为每个上传文件的所属组的成员即可,但是默认情况下,用户所上传文件的所属组都是与该用户同名的私有组,如果要使得所有用户上传文件的所属组都能够是同一个指定的用户组,那么就需要为共享目录设置SGID权限。
SGID权限的作用是:如果针对目录设置SGID,则在该目录内所建立的文件或子目录的所属组,将统一被自动设置成此目录的所属组。
比如我们在系统中创建一个名为admin的用户组,并将其设为共享目录/share/archive/的所属组,然后再对/share/archive/目录设置SGID权限,这样用户在共享目录中上传的所有文件,其默认的用户组都统一被设置成了admin。

# groupadd admin
# chown :admin /share/archive/
# chmod g+s /share/archive/
# ll -d /share/archive
drwxrwsrwt. 2 zhangsan admin 60 4月  29 10:01 /share/archive

然后再将用户zhangsan和lisi都加入到admin组即可。

# gpasswd -a zhangsan admin
# gpasswd -a lisi admin

最后,分别以用户zhangsan、lisi、wangwu的身份在目录中上传文件,其默认权限如图3所示。
Samba服务权限配置案例

至此,这个综合案例中的所有任务需求都已全部完成。对于Linux系统中的绝大多数服务,用户在使用这些服务时的最终权限基本都是由两个因素综合决定的:一个因素是在服务配置文件中所做的相关设置,另一个因素则是系统权限。因而作为系统运维人员,必须要熟知服务配置和系统权限,这样方能更好地满足各种不同的实际工作需求。