写在前面的话

先来说说故事背景:公司内部文件服务器的解决方案其实很多,对于中小型互联网公司,大多的在这一块的选型还是 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 的一些知识如果不知道可以去简单了解一些,本文还是针对直接有需要的朋友。

最后,如果你觉得还可以,给个推荐也是可以的。

Samba:打造企业级授权文件共享服务器的更多相关文章

  1. 用Centos7搭建小微企业Samba文件共享服务器【转】

    转自 用Centos7搭建小微企业Samba文件共享服务器 - 今日头条(www.toutiao.com)http://www.toutiao.com/i6436937837660078593/ 最近 ...

  2. Ubuntu配置Samba文件共享服务器

    Samba是在Linux和UNIX系统上实现SMB协议的一个免费软件,由服务器及客户端程序构成.SMB(Server Messages Block,信息服务块)是一种在局域网上共享文件和打印机的一种通 ...

  3. 《Linux就该这么学》培训笔记_ch12_使用Samba或NFS实现文件共享

    <Linux就该这么学>培训笔记_ch12_使用Samba或NFS实现文件共享 文章最后会post上书本的笔记照片. 文章主要内容: SAMBA文件共享服务 配置共享资源 Windows挂 ...

  4. 文件共享服务器share

    文件共享服务器:(类似于FTP服务器) 1.创建共享:文件夹右键属性--共享--开启共享--设置共享名--设置共享权限(建议设置为everyone完全控制,然后具体的权限需求在ntfs权限中设置即可) ...

  5. 动手打造轻量web服务器(二)路由

    tomcat启动慢?自己动手打造轻量web服务器(一) 上篇讲了怎么做一个最简单的web服务器,这篇就是在上篇加上URL路由功能(什么是路由?) 首先,根据http获得请求行 val scanner ...

  6. HTTP 文件共享服务器工具 - chfs

    CuteHttpFileServer/chfs是一个免费的.HTTP协议的文件共享服务器,使用浏览器可以快速访问.它具有以下特点: 单个文件,整个软件只有一个可执行程序,无配置文件等其他文件 跨平台运 ...

  7. 文件共享服务器nfs搭建过程

    网络文件共享服务器192. yum install -y nfs-utils 在exports文件中添加的从机范围 vim /etc/exports /home/nfs/ (rw,sync,fsid= ...

  8. Spring Boot_打造企业级微信点餐系统_汇总贴

    2019更新版 Spring Boot双版本(1.5/2.1) 打造企业级微信点餐系统 H:\BaiDu\微服务0830\2019微服务时代Spring Boot双版本(1.5-2.1)  打造企业级 ...

  9. 基于Nettty打造自己的MVC服务器

    最近开始折腾Netty,体验下NIO编程.既然学习了,就要做点东西出来,要不然不容易掌握学到的东西.在Netty的官方demo上都有各种case的sample,打造Http服务器的核心代码就是从Sam ...

随机推荐

  1. 简洁的描述SpringMVC工作流程

    1.客户端发送来的请求 经过前端控制器(springDispatcherServlet)调用映射器(HandlerMapping)来找到对应的执行链(HandlerExecutionChain)对象, ...

  2. 利用org.mybatis.generator生成实体类

    springboot+maven+mybatis+mysql 利用org.mybatis.generator生成实体类 1.添加pom依赖:   2.编写generatorConfig.xml文件 ( ...

  3. HBase 学习之路(七)——HBase过滤器详解

    一.HBase过滤器简介 Hbase提供了种类丰富的过滤器(filter)来提高数据处理的效率,用户可以通过内置或自定义的过滤器来对数据进行过滤,所有的过滤器都在服务端生效,即谓词下推(predica ...

  4. VUE、微信for动态变量取值(拼接取值)

    item.value是其它循的值如value=[1,2,3] {{'images[arrAy' + item.value+']'}} 那么拼接结果是 {{images[arrAy1]}}, {{ima ...

  5. 17 | 精益求精:聊聊提高GUI测试稳定性的关键技术

  6. JAVA String类型的一些小操作

    String类型是否包含某个String类型的函数:源字符串.contains(包含字符串)  返回值为:boolean类型(true或false) String类型把某个字符替换成另一个字符:源字符 ...

  7. java日期在今天的基础上加一个月。并计算时间相差天数

    Calendar calendar = Calendar.getInstance(); calendar.setTime(date); calendar.add(Calendar.MONTH, 1); ...

  8. springboot2.x纯注解整合dubbo

    springboot1.x和springboot2.x整合差距挺大的,基于最新的2.x进行整合,使用纯注解的方式 依赖选取 首先pom文件的依赖引入,maven仓库有Apache和alibaba两个 ...

  9. 你必须了解的java内存管理机制(四)-垃圾回收

    本文在个人技术博客不同步发布,详情可用力戳 亦可扫描屏幕右侧二维码关注个人公众号,公众号内有个人联系方式,等你来撩... 相关链接(注:文章讲解JVM以Hotspot虚拟机为例,jdk版本为1.8) ...

  10. CDQZ集训DAY9 日记

    彻彻底底的爆炸了…… 考试上来第一题看完30分暴力后就不知道怎么打了,然后看第二题,一开始脑残以为是网络流,后来发现是树状结构后觉得是那个经典的n^2的树上背包DP,然而脑子又一次犯笨,竟然,竟然去枚 ...