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

出于产品、解决方案同事的诉求,需要搭建一个用于共享文件的平台,因此基于 Samba 搭建了一个共享文件服务器,这里记录一下,以便用于后续维护参阅。

Samba 是 SMB/CIFS 网络文件共享协议的免费开放源重新实现,该协议允许最终用户访问文件,打印机和其他共享资源。

环境

  • CentOS 7.6
  • Samba 4.10.16
  • 能够访问互联网环境

安装 Samba

执行安装

1
sudo yum install samba samba-client

安装完成后,开机启动,并且启用服务:

1
2
sudo systemctl start smb.service 
sudo systemctl enable smb.service

smb 服务提供文件共享和打印服务,并侦听 TCP 端口 139 和 445。nmb服务向客户端提供基于 IP 命名服务的 NetBIOS,并侦听 UDP 端口137。

配置防火墙

执行如下命令,允许 samba 服务访问

1
2
3
4
[root@localhost ~]# firewall-cmd --permanent --zone=public --add-service=samba
success
[root@localhost ~]# firewall-cmd --zone=public --add-service=samba
success

创建Samba用户和目录结构

在确定文件或者用户目录之前要看下磁盘的空间情况

1
2
3
4
5
6
7
8
/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

1
mkdir /home/samba		

创建一个名为sambashare的新组。然后,我们将所有 Samba 用户添加到该组中。

1
sudo groupadd sambashare

/home/samba目录组所有权设置为sambashare

1
do chgrp sambashare /home/samba

Samba 使用 Linux 用户和组权限系统,但它具有与标准 Linux 身份验证分开的身份验证机制。下面将使用标准的 Linux useradd工具创建用户,然后使用smbpasswd实用程序设置用户密码。

创建 Samba 用户

创建名为glmapper的新用户,命令如下:

1
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:

1
2
sudo mkdir /home/samba/glmapper
sudo chown glmapper:sambashare /home/samba/glmapper

以下命令将 setgid 位添加到/home/samba/glmapper目录,以便该目录中的新创建文件将继承父目录的组。这样,无论哪个用户创建一个新文件,该文件都将具有sambashare的组所有者。例如,如果您未将目录的权限设置为2770,并且sadmin用户创建了一个新文件,则用户glmapper将无法读取/写入该文件。 165]

1
sudo chmod 2770 /home/samba/glmapper

设置用户密码将glmapper用户帐户添加到 Samba 数据库:

1
2
3
4
5
6
7
8
9
10
11
#系统将提示输入并确认用户密码。
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 这个组中。创建管理用户:

1
sudo useradd -M -d /home/samba/users -s /usr/sbin/nologin -G sambashare sadmin

上面的命令还创建了一个组sadmin,并将用户添加到sadminsambashare组中。

设置密码并启用用户:

1
2
3
4
# 设置密码
sudo smbpasswd -a sadmin
# 启用账户
sudo smbpasswd -e sadmin

创建Users共享目录

1
2
3
4
# 创建目录
mkdir /home/samba/users
# 将目录所有权设置为用户 sadmin 和组 sambashare:
sudo chown sadmin:sambashare /home/samba/users

所有身份验证的用户都可以访问此目录。以下命令配置对/home/samba/users目录中sambashare组成员的写/读访问:

1
sudo chmod 2770 /home/samba/users

配置 Samba 共享

编辑 Samba 配置文件 vi /etc/samba/smb.conf ,并将下面的配置添加到配置文件中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[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 服务

1
2
sudo systemctl restart smb.service
sudo systemctl restart nmb.service

使用 win 配置连接到 Samba 共享

下面是使用 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 模式

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

http://www.glmapper.com/2023/05/31/tools/tool-samba-file-server/

作者

卫恒

发布于

2023-05-31

更新于

2023-05-31

许可协议

评论