文件共享是在企业办公网络中经常用到的一项功能, 如何设置并使用文件共享在技术上并不复杂, 其中的问题主要集中在权限配置方面.
本文以世界技能大赛网络系统管理赛项中的一道题目作为案例, 详细分析了如何利用 Samba 服务结合系统权限来完成各种复杂的权限设置, 本文所采用的系统版本为 CentOS7.
1. 任务需求与分析
将 / share/archive 目录创建为 samba 共享, 并完成下列要求:
1 共享名为 archive;
2 zhangsan,lisi,wangwu 用户都能通过输入用户名和密码 (Skills39) 登录并上传文件;
3 其他人不能访问共享目录;
4 zhangsan 能够查看和删除所有人的文件;
5 lisi 能够查看所有人的文件, 但不能删除别人的文件;
6 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 所示.
对设置项的解释:
[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 所示.
设置完成后, 同样需要执行 "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 所示.
至此, 这个综合案例中的所有任务需求都已全部完成. 对于 Linux 系统中的绝大多数服务, 用户在使用这些服务时的最终权限基本都是由两个因素综合决定的: 一个因素是在服务配置文件中所做的相关设置, 另一个因素则是系统权限. 因而作为系统运维人员, 必须要熟知服务配置和系统权限, 这样方能更好地满足各种不同的实际工作需求.
来源: http://blog.51cto.com/yttitan/2382465