出于团队诉求,需要搭建一个用于共享文件的平台,因此基于 Samba 搭建了一个共享文件服务器,这里记录一下,以便用于后续维护参阅。
Samba 是 SMB/CIFS 网络文件共享协议的免费开放源重新实现,该协议允许最终用户访问文件,打印机和其他共享资源。
环境
- CentOS 7.6
- Samba 4.10.16
- 能够访问互联网环境
安装 Samba
执行安装
shell sudo yum install samba samba-client
安装完成后,开机启动,并且启用服务:
shell sudo systemctl start smb.service sudo systemctl enable smb.service
smb
服务提供文件共享和打印服务,并侦听 TCP 端口 139 和 445。nmb
服务向客户端提供基于 IP 命名服务的 NetBIOS,并侦听 UDP 端口 137。
配置防火墙
执行如下命令,允许 samba
服务访问
shell [root@localhost ~]# firewall-cmd --permanent --zone=public --add-service=samba success [root@localhost ~]# firewall-cmd --zone=public --add-service=samba success
创建Samba用户和目录结构
在确定文件或者用户目录之前要看下磁盘的空间情况
/dev/mapper/centos-root 50G 1.4G 49G 3% / devtmpfs 3.9G 0 3.9G 0% /dev tmpfs 3.9G 0 3.9G 0% /dev/shm tmpfs 3.9G 17M 3.9G 1% /run tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup /dev/vda1 1014M 146M 869M 15% /boot /dev/mapper/centos-home 142G 33M 142G 1% /home tmpfs 783M 0 783M 0% /run/user/0
我的系统在 /home 分配的空间最大,因此这里将所有 Samba 目录和数据都放在 /home 空间下;新建一个 /home/samba
shell mkdir /home/samba
创建一个名为sambashare
的新组。然后,我们将所有 Samba 用户添加到该组中。
shell sudo groupadd sambashare
将/home/samba
目录组所有权设置为sambashare
:
shell do chgrp sambashare /home/samba
Samba
使用 Linux 用户和组权限系统,但它具有与标准 Linux 身份验证分开的身份验证机制。下面将使用标准的 Linux useradd
工具创建用户,然后使用 smbpasswd
实用程序设置用户密码。
创建 Samba 用户
创建名为 glmapper
的新用户,命令如下:
sudo useradd -M -d /home/samba/glmapper -s /usr/sbin/nologin -G sambashare glmapper
useradd
选项的含义如下:
-M
不创建用户的主目录。(将手动创建此目录)-d /home/samba/glmapper
将用户的主目录设置为/home/samba/glmapper
。-s /usr/sbin/nologin
禁止该用户访问 shell。-G sambashare
将用户添加到sambashare
组。
创建用户的主目录,并将目录所有权设置为用户 glmapper 和组 sambashare:
shell sudo mkdir /home/samba/glmapper sudo chown glmapper:sambashare /home/samba/glmapper
以下命令将 setgid 位添加到 /home/samba/glmapper
目录,以便该目录中的新创建文件将继承父目录的组。这样,无论哪个用户创建一个新文件,该文件都将具有 sambashare
的组所有者。例如,如果您未将目录的权限设置为2770
,并且 sadmin
用户创建了一个新文件,则用户 glmapper
将无法读取/写入该文件。 165]
bash sudo chmod 2770 /home/samba/glmapper
设置用户密码将glmapper
用户帐户添加到 Samba 数据库:
```bash
系统将提示输入并确认用户密码。
sudo smbpasswd -a glmapper
输入成功之后
New SMB password: Retype new SMB password: Added user glmapper.
启用 glmapper 账户,成功会显示 Enabled user glmapper.
sudo smbpasswd -e josh
```
如果再需要创建其他用户,流程就是和创建 glmapper 的流程是一样的了。
创建 用户和组 sadmin
sadmin 组的所有成员将具有管理权限,如果期望其他用户也具备管理权限,则可以将用户加入到 sadmin 这个组中。创建管理用户:
bash sudo useradd -M -d /home/samba/users -s /usr/sbin/nologin -G sambashare sadmin
上面的命令还创建了一个组sadmin
,并将用户添加到sadmin
和sambashare
组中。
设置密码并启用用户:
```bash
设置密码
sudo smbpasswd -a sadmin
启用账户
sudo smbpasswd -e sadmin ```
创建Users
共享目录
```bash
创建目录
mkdir /home/samba/users
将目录所有权设置为用户 sadmin 和组 sambashare:
sudo chown sadmin:sambashare /home/samba/users ```
所有身份验证的用户都可以访问此目录。以下命令配置对/home/samba/users
目录中sambashare
组成员的写/读访问:
bash sudo chmod 2770 /home/samba/users
配置 Samba 共享
编辑 Samba 配置文件 vi /etc/samba/smb.conf
,并将下面的配置添加到配置文件中
```bash [users] # 登录时将使用的共享名称 path = /home/samba/users # 分享的目录路径 browseable = yes # 是否应在可用共享列表中列出该共享。设置为no,其他用户将看不到共享。 read only = no # valid users 列表中指定的用户是否能够写入此共享 force create mode = 0660 # 设置此共享中新创建文件的权限。 force directory mode = 2770 # 设置此共享中新创建目录的权限。 valid users = @sambashare @sadmin # 允许访问共享的用户和组的列表。组以@符号为前缀。
[glmapper] path = /home/samba/glmapper browseable = no read only = no force create mode = 0660 force directory mode = 2770 valid users = glmapper @sadmin ```
配置完成后,重新启动 Samba 服务
bash sudo systemctl restart smb.service sudo systemctl restart nmb.service
使用 win 配置连接到 Samba 共享
基于 win10+ 系统
下面是使用 Windows File Explore 访问共享的步骤: * 1、打开文件管理器,右击 “此电脑” * 2、选择 “添加一个网络位置”,然后点击下一步 * 3、在 “Internet 或者网络地址” 中,输入 Samba 共享的地址 \\192.168.1.136\glmapper
(192.168.1.136 是我的主机 IP,glmapper 是我的共享目录) * 4、单机下一步,这里会提示你输入登录凭证(然后输入前面创建用户所设置的用户名和密码即可) * 5、下一步... 完成
至此就可以在本地磁盘看到映射的服务器了。
问题
在配置完成之后,可以正常连接到文件服务器,并且也可以看到相应的目录,但是当我创建文件时,提示没有权限。从前面的用户/组授权来看,完全是没有问题的。最后咨询了下 IT 部门的同事,猜测可能是 SELinux 禁止网络上对 Samba 服务器上的共享目录进行写操作导致;尝试执行 setenforce 0
之后无写权限的问题解决了。
SELinux 的作用:
- 1、通过对进程和文件资源采用 MAC 控制方式,为 Linux 系统提供了改进的安全性;
- 2、赋予了主体最小的访问特权,最大限度地减小系统中服务进程可访问的资源,可以防止主体对其他用户或进程产生不利的影响;
- 3、每个进程都有自己的运行区域,各进程仅运行在自己的域内,无法访问其他进程和文件;
- 4、SELinux 能最大程序上限制 Linux 系统中的恶意代码活动。
setenforce 设置
- 1 设置 SELinux 成为 enforcing 模式
- 0 设置 SELinux 成为 permissive 模式