Bootstrap

基于 CentOS 7.6 + Samba 搭建文件服务器

出于团队诉求,需要搭建一个用于共享文件的平台,因此基于 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,并将用户添加到sadminsambashare组中。

设置密码并启用用户:

```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 模式
;