写在前面的话
先来说说故事背景:公司内部文件服务器的解决方案其实很多,对于中小型互联网公司,大多的在这一块的选型还是 FTP,或者 VSFTP,但是个人实在是对那个东西喜欢不起来,于是就选择了配置相对于简单一些的 Samba,燃鹅,在使用过程中却被各种需求搞得心力交瘁。于是便决定写这么个东西,一个能够满足大部分公司的需求的东西。
文章标题企业级,一是源于本身是企业使用,所以企业级没毛病。二是会夹杂复杂的授权,所以还是没毛病。
总之就是咱先把牛逼吹了,实不实现的了再说,
需求说明
假如存在一个 XXX 互联网公司,它的简单组织架构如下图:
现在它对于文件服务器的需求如下图:
说明:
1. 账号分为三类:管理员 / 普通 / 只读,注意,我们创建用户不能有下划线,中横线,否则 Windows 中有 BUG
2. 部门目录权限如下:
见权限:代表可以见到别人的目录,但是不能打开。
读权限:能够进去目录查看文件,但是不能修改。
写自己:自己上传的文件可以修改删除。
写别人:别人上传的文件都能修改删除。
3. 公共目录权限:
所有用户对于公共文件中所有文件都可见且能够读取。
用户能够除了只读账户对自己部门的目录都能够写文件。
各个部门管理员账户能够对自己部门所有文件进行任何操作。
最后就是 zcadmin 用户其实就是老板,想干啥干啥,当然 zc 也有很高的权限,可以到处写。
第一阶段:基础部门目录权限分配
理了下目录关系和用户关系,我们可以先着手把用户和目录设计好:
注意,我这里使用的是 CentOS 7.5,总的来说 CentOS 系列使用方法应该都差不多,区别可能就是启动命令。
1. 安装 Samba:
yum -y install samba samba-client samba-swat
2. 创建目录:
mkdir /company cd /company/ mkdir 总裁办文件 研发部文件 人事行政部文件 财务部文件 公共文件 cd 公共文件/ mkdir 财务部共享 研发部共享 人事行政部共享 总裁办共享
查看目录结构:
tree -N /company/
结构如图:
3. 添加用户
# 添加组 groupadd zcgroup groupadd devgroup groupadd hrgroup groupadd fdgroup # 添加用户 useradd -g zcgroup -s /sbin/nologin zc useradd -g zcgroup -s /sbin/nologin zcread useradd -g zcgroup -s /sbin/nologin zcadmin useradd -g devgroup -s /sbin/nologin dev useradd -g devgroup -s /sbin/nologin devread useradd -g devgroup -s /sbin/nologin devadmin useradd -g hrgroup -s /sbin/nologin hr useradd -g hrgroup -s /sbin/nologin hrread useradd -g hrgroup -s /sbin/nologin hradmin useradd -g fdgroup -s /sbin/nologin fd useradd -g fdgroup -s /sbin/nologin fdread useradd -g fdgroup -s /sbin/nologin fdadmin
4. 修改目录权限:
cd /company/ # 修改目录权限 chmod -R 1775 总裁办文件 研发部文件 人事行政部文件 财务部文件 公共文件 # 修改所有者所属组 chown -R devadmin.devgroup 研发部文件 chown -R hradmin.hrgroup 人事行政部文件 chown -R fdadmin.fdgroup 财务部文件 chown -R zcadmin.zcgroup 总裁办文件
5. 修改主配置文件:/etc/samba/smb.conf
############################################################################## # 全局配置 ############################################################################## [global] workgroup = WORKGROUP server string = Samba Server Version %v netbios name = Samba log file = /var/log/samba/samba_log.%m max log size = 50 security = user passdb backend = tdbsam include = /etc/samba/user/%U.smb.conf
注意:红色部分配置说明我们每个用户登录以后其实是单独的配置文件,配置文件为 /etc/samba/user/用户名.smb.conf
6. 添加用户单独配置文件:
mkdir /etc/samba/user
cd /etc/samba/user
我们这里以研发部为例,普通用户 dev 的配置文件:dev.smb.conf
[研发部文件] comment = dev config path = /company/研发部文件/ public = no admin users = devadmin valid users = @devgroup writable = yes create mask = 1777 directory mask = 1777 force create mode = 1777 force directory mode = 1777
管理员用户 devadmin 的配置文件:devread.smb.conf
[研发部文件] comment = dev admin config path = /company/研发部文件/ public = no admin users = devadmin valid users = @devgroup writable = yes create mask = 1777 directory mask = 1777 force create mode = 1777 force directory mode = 1777
只读用户 devread 的配置文件:devadmin.smb.conf
[研发部文件] comment = dev read config path = /company/研发部文件/ public = no admin users = devadmin valid users = @devgroup writable = no
简单做个说明:
a. 掩码设为 1777,目的是让所有有权用户都可随意进出所属部门下面全部目录(最后一个 7 是为 zc 这种用户准备的)。
b. 创建目录的人具有该目录以及该目录下文件的绝对控制权。这意味着假设 dev 用户创建一个 dev 目录,devadmin 去 dev 目录下新建一个 test 文件,由于 dev 用户具有 dev 目录的绝对控制权,所有他是能够修改删除该文件的。但是如果这个文件不在 dev 下面 dev 用户就至于查看权限。
这种情形是不可避免的,在 Samba 中我们应该注重文件夹的使用。最好是基础文件夹由 admin 账户建立。
c. 配置在 admin users 中的管理员账户拥有最高权限,该共享下任何文件都能修改删除。
d. writable = no,直接只读,不需要再分配其它权限。
e. 最后说说为啥要即使同样的配置也分为单独的文件,目的是为了分开管理,这样我们想调整哪个用户改哪个文件即可。
最终配置如图:
7. 将系统用户添加到 Samba 中:
smbpasswd -a dev smbpasswd -a devadmin smbpasswd -a devread
smbpasswd -a hr smbpasswd -a hradmin smbpasswd -a hrread
smbpasswd -a fd smbpasswd -a fdadmin smbpasswd -a fdread
smbpasswd -a zc smbpasswd -a zcadmin smbpasswd -a zcread
查看用户:
pdbedit -L
如果想删除某个用户,则只需:
pdbedit -x 用户名
8. 至此,我们完成了第一个阶段,就是每个目录拥有了三个角色,普通 / 管理员 / 只读。
第二阶段:总裁办用户其它权限
我们根据权限表知道,总裁办出来只读账户,其它账户是具备其他目录的读写权限的。
这意味着,zcadmin 得具备其它目录 admin 的权限,而 zc 用户得具备其它目录的普通权限。
1. 将用户加入各个目录的组:
usermod -a -G devgroup zc usermod -a -G devgroup zcadmin usermod -a -G hrgroup zc usermod -a -G hrgroup zcadmin usermod -a -G fdgroup zc usermod -a -G fdgroup zcadmin
2. 修改 zc.smb.conf 和 zcadmin.smb.conf
[总裁办文件] comment = zc config path = /company/总裁办文件/ public = no admin users = zcadmin valid users = @zcgroup writable = yes create mask = 1777 directory mask = 1777 force create mode = 1777 force directory mode = 1777 [研发部文件] comment = zc config path = /company/研发部文件/ public = no admin users = devadmin,zcadmin valid users = @devgroup writable = yes create mask = 1777 directory mask = 1777 force create mode = 1777 force directory mode = 1777 [人事行政部文件] comment = hr config path = /company/人事行政部文件/ public = no admin users = hradmin,zcadmin valid users = @hrgroup writable = yes create mask = 1777 directory mask = 1777 force create mode = 1777 force directory mode = 1777 [财务部文件] comment = fd config path = /company/财务部文件/ public = no admin users = fdadmin,zcadmin valid users = @fdgroup writable = yes create mask = 1777 directory mask = 1777 force create mode = 1777 force directory mode = 1777
到这一步的时候我做了如下测试:
a. devadmin 用户登录,在 研发部文件 中创建 admin 目录和 admin 文件。
b. 切换到 dev 用户,尝试删除 admin 目录和 admin 文件,均提示权限不足,进入 admin 目录创建 dev 文件,在外层创建 dev 目录和 dev 文件。
c. 切换 zc 用户, 尝试删除 研发部文件 中任意文件,均提示无权限,去 admin 目录创建 zc 文件,在外层创建 zc 目录和 zc 文件。
d. 切换 devadmin 和 zcadmin 进去 研发部文件 中删除任意文件均可。
此时就实现了普通用户只能删除自己的文件,管理员可以管理所有。
第三阶段:公共文件
这其实是最麻烦的需求,其实通常对于这种目录我们最好的出路方式就是除了管理员,各自能够删除修改各自的就行。
但是总有例外,有时需求来了挡都挡不住,所以这里给出最复杂的设计。
1. 修改目录权限:
cd /company/公共文件 chown -R devadmin.devgroup 研发部共享 chown -R hradmin.hrgroup 人事行政部共享 chown -R fdadmin.fdgroup 财务部共享 chown -R zcadmin.zcgroup 总裁办共享
值得注意的是,此时 公共文件 这个目录的用户和组依然是 root,我们不会去修改它。
2. 修改主配置文件,添加公共配置:smb.conf
############################################################################## # 全局配置 ############################################################################## [global] workgroup = WORKGROUP server string = Samba Server Version %v netbios name = Samba log file = /var/log/samba/samba_log.%m max log size = 500 security = user passdb backend = tdbsam include = /etc/samba/common.cmb.conf include = /etc/samba/user/%U.smb.conf
在我们导入单个用户配置之前,我先导入这个公共配置,该配置意味着所有用户都具有。如果后面的用户不要或者权限不对,我们都可以在单独的用户配置的文件里面复写它。
值得注意的是,导入顺序很重要,这意味着谁复写谁。
3. 增加 common 配置:/etc/samba/common.cmb.conf
[公共文件] comment = common config path = /company/公共文件/ public = no
admin users = zcadmin valid users = @zcgroup,@devgroup,@hrgroup,@fdgroup writable = yes create mask = 1777 directory mask = 1777 force create mode = 1777 force directory mode = 1777
我们默认给写权限,所以用户都可以在自己部门的目录下修改删除自己的文件。
当然,zcadmin 这个是全部的管理员,所以我们这里直接就给他指定了。
4. 只读用户复写权限,如:devread.smb.conf
[研发部文件] comment = dev read config path = /company/研发部文件/ public = no admin users = devadmin valid users = @devgroup writable = no [公共文件] comment = common config path = /company/公共文件/ public = no valid users = @zcgroup,@devgroup,@hrgroup,@fdgroup writable = no
直接复写为只读权限!
5. 普通用户的权限本身就和默认的权限一致,所以我们不需要再度去修改。
6. 管理员用户相比比较复杂,如果授权整个目录就会导致所有目录都能管理。
所以我这里给出的方法是除了共享文件作为管理员账户的一个项目外,另外里面对于的部门也作为单独项目授权。
但是为了不显示两个这样的目录,我们将单独授权的目录隐藏。
当然这里需要排除 zcadmin,因为前面已经指定了,他就是全部的管理员,我们修改另外三个管理员配置。
这里以 devadmin 为例:devadmin.smb.conf
[研发部文件] comment = dev admin config path = /company/研发部文件/ public = no admin users = devadmin valid users = @devgroup writable = yes create mask = 1777 directory mask = 1777 force create mode = 1777 force directory mode = 1777 [公共文件-研发部共享] comment = common config path = /company/公共文件/研发部共享/ public = no admin users = zcadmin,devadmin valid users = @zcgroup,@devgroup,@hrgroup,@fdgroup writable = yes create mask = 1777 directory mask = 1777 force create mode = 1777 force directory mode = 1777
browseable = no
最终达到的效果:
a. 部门普通用户打开公共文件,能够访问所有文件夹。能够在自己部门的目录修改删除自己的文件。
b. 部门管理员能够在公共文件自己的部门目录下任意删改。对于其它部门目录只读。
c. zc 用户能够在公共文件下所有目录增删改自己的文件。
d. 只读账户在公共文件下全局只读。
7. 至此,所有需求全部完成。
小结
这篇文章写了我差不多两天,其中各种测试,windows 测试还非常麻烦。但是总的来说能够满足大部分需求。
当然,Samba 目前来说有个很大的问题,我依然没有找到一款能够像连接 FTP 一样的客户端来连接 Samba,如果知道的朋友可以分享一下。
关于其它 Samba 的一些知识如果不知道可以去简单了解一些,本文还是针对直接有需要的朋友。
最后,如果你觉得还可以,给个推荐也是可以的。