Samba:使⽤ Samba 为远程客户端提供共享⽂件系统

对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》

写在前面


  • 分享一些 SMB 的搭建笔记
  • 考试顺便整理
  • 理解不足小伙伴帮忙指正

对每个人而言,真正的职责只有一个:找到自我。然后在心中坚守其一生,全心全意,永不停息。所有其它的路都是不完整的,是人的逃避方式,是对大众理想的懦弱回归,是随波逐流,是对内心的恐惧 ——赫尔曼·黑塞《德米安》


SMB 简单介绍

SMB协议最初由Microsoft开发,后来成为 Windows 网络中最常用的文件共享协议。SMB协议也可以用于与Unix或Linux系统进行文件共享,通过Samba软件包,Unix和Linux系统可以作为SMB服务器提供文件共享服务,允许Windows系统访问共享文件和打印机。

NFS能让 Unix 和 Linux 机器沟通或者让 Windows 机器沟通,SMB 可以实现 Windows 机器与 Unix 或 Linux 机器沟通。

在实际的使用中, SMB协议 更多的是 Windows操作系统 中使用文件共享协议,它允许 Windows系统之间共享文件和打印机。

Samba

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

可以实现以下功能:

  • 文件共享:Samba 可以将 Linux/UNIX 系统上的文件和目录共享给 Windows、macOS 和其他支持 SMB/CIFS 协议的客户端。这意味着您可以使用 Samba 在不同操作系统之间共享文件和目录。
  • 打印机共享:Samba 允许您将打印机连接到 Linux/UNIX 系统,并通过 SMB/CIFS 协议将其共享给 Windows、macOS 和其他客户端。这样,您可以在网络上共享打印机,并允许多个用户使用同一台打印机。
  • 认证和授权:Samba 提供了身份验证和访问控制机制,允许您配置用户认证、访问权限和共享级别。您可以创建用户账号,设置密码策略,并为共享目录指定不同的访问权限。
  • 域控制器:Samba 可以充当一个域控制器,提供类似于 Windows 域的功能。您可以使用 Samba 创建和管理用户账号、组、策略,并实现集中管理和身份验证。
  • 家庭文件服务器:您可以使用 Samba 在家庭网络中搭建一个文件服务器,允许家庭成员共享文件和目录,并进行访问控制。
  • 安全性和加密:Samba 支持加密通信,并提供了数据的保护和安全传输。您可以配置 Samba 使用 SSL/TLS 加密协议来保护数据的传输和存储。
  • 跨平台兼容性:Samba 提供了与 Windows 网络的良好兼容性,使 Linux/UNIX 系统能够与 Windows 网络无缝集成。

samba 访问流程简单说明

  • Samba 服务器启动并监听指定的端口(默认为 445 端口)。
  • 客户端发起连接请求,连接到 Samba 服务器。
  • Samba 服务器接收到连接请求,建立与客户端的连接。
  • 客户端发送 SMB/CIFS 请求到 Samba 服务器,请求访问共享资源或执行特定操作。
  • Samba 服务器解析请求,根据请求的类型和参数执行相应的操作。
  • 如果请求涉及访问共享资源,Samba 服务器将检查客户端的身份验证信息,并根据配置文件中的访问控制规则确定是否授予访问权限。
  • Samba 服务器执行请求的操作,如读取、写入、创建、删除文件等。
  • Samba 服务器生成响应,将响应发送回客户端。
  • 客户端接收到响应,根据响应的内容进行相应的处理和显示。

主机既可以充当客户端,也可以充当服务器来访问和提供 SMB 文件共享:

  • 作为 客户端,挂载 SMB 文件共享需要安装 cifs-utils 软件包以及 samba-client。
  • 作为 服务器,使用 SMB 协议共享目录需要安装 samba 软件包。

Linux 环境配置SMB共享基本步骤如下:

  • 安装samba软件包。
  • 准备Samba用户
  • 准备共享的目录。
  • 配置/etc/samba/smb.conf配置文件
  • 启动Samba并打开本地防火墙
  • 从客户端系统挂载 SMB 共享以验证您的配置。

安装部署

serverd 配置为独⽴的 SMB ⽂件服务器,它将共享 /smbshare ⽬录。可以使⽤ multiuser 挂载选项,将 servera 配置为将此 SMB 共享挂载到 /designs ⽬录下。

安装 samba 软件包。

1
2
3
[root@serverd ~]# yum install  samba -y
Red Hat Enterprise Linux 8.1 BaseOS (dvd) 21 MB/s | 2.2 MB 00:00
Red Hat Enterprise Linux 8.1 AppStream (dvd) 32 MB/s | 5.6 MB 00:00

创建 marketing 组和 /smbshare ⽬录。配置 /smbshare ⽬录,其他配置:

  • 该⽬录属于该 marketing
  • 该⽬录设置了 SGID
  • 每个⼈都具有⽬录的读取访问权限,但只有 marketing 组可以写⼊
  • ⽬录具有 samba_share_t SELinux上下⽂类型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#创建 marketing 组。
[root@serverd ~]# groupadd marketing
#创建 /smbshare ⽬录。
[root@serverd ~]# mkdir /smbshare
#将 /smbshare ⽬录的组所有权更改为 marketing。
[root@serverd ~]# chgrp marketing /smbshare
#在⽬录上设置 SGID 位,并且仅向该 marketing 组授予写⼊权限。
[root@serverd ~]# chmod 2775 /smbshare
#在 SELinux 策略中添加⼀条规则,使 /smbshare ⽬录及其内容的上下⽂类型为
samba_share_t。
[root@serverd ~]# semanage fcontext -a -t samba_share_t '/smbshare(/.*)?'
#将 SELinux 规则应⽤到 /smbshare ⽬录。
[root@serverd ~]# restorecon -Rv /smbshare
Relabeled /smbshare from unconfined_u:object_r:default_t:s0 to
unconfined_u:object_r:samba_share_t:s0
#验证⼯作成果。组权限、组所有权和 SELinux 类型应与以下输出匹配。
[root@serverd ~]# ls -ldZ /smbshare
drwxrwsr-x. 2 root marketing unconfined_u:object_r:samba_share_t:s0 6 May 22
08:10 /smbshare

编辑 /etc/samba/smb.conf 配置⽂件,按照下面的要求配置

  • 将⼯作组设置为 MYCOMPANY
  • Samba 配置为需要加密流量
  • 强制 Samba 仅⽀持 SMB 版本 3 和更⾼版本
  • 创建名为 data 的共享。
  • 共享 /smbshare ⽬录。
  • 保护共享,以便每个⼈都可以访问它,但只有 marketing 组的成员具有写⼊访问权限。

编辑 /etc/samba/smb.conf ⽂件,并将 workgroup 指令设置为 MYCOMPANY。

1
2
3
4
5
...output omitted...
[global]
workgroup = MYCOMPANY
...output omitted...

在 [global] 部分下,强制加密,并将最⼩协议版本设置为 SMB3

1
2
3
4
5
6
...output omitted...
[global]
workgroup = MYCOMPANY
smb encrypt = required
server min protocol = SMB3
...output omitted...

在⽂件的末尾,添加以下来定义新的共享。

1
2
3
4
...output omitted...
[data]
path = /smbshare
write list = @marketing ;配置项指定了具有写权限的用户或用户组。

完成后,保存并关闭该⽂件。

运⾏ testparm 命令,以验证 /etc/samba/smb.conf 配置⽂件

1
2
3
4
5
6
7
[root@serverd ~]# testparm
Load smb config files from /etc/samba/smb.conf
Loaded services file OK.
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions
Enter
...output omitted...

创建仅限 Samba 的 developer1 用户帐户,然后将它添加到 marketing 组。该用户帐户对共享具有写访问权限,因为它是 marketing 组的成员。

1
[root@serverd ~]# useradd -s /sbin/nologin -G marketing developer1

创建仅限 Samba 的 operator1 用户帐户。不要将它添加到 marketing 组,以便它对该共享具有只读访问权限。将这两个帐户的 SMB 密码设为 redhat。

将 developer1 用户帐户添加到 Samba

1
[root@serverd ~]# smbpasswd -a developer1

完整的操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
[root@serverd ~]# groupadd marketing
[root@serverd ~]# mkdir /smbshare
[root@serverd ~]# chgrp marketing /smbshare
[root@serverd ~]# chmod 2775 /smbshare
[root@serverd ~]# semanage fcontext -a -t samba_share_t '/smbshare(/.)?'
[root@serverd ~]# restorecon -Rv /s
sbin/ smbshare/ srv/ sys/
[root@serverd ~]# restorecon -Rv /s
sbin/ smbshare/ srv/ sys/
[root@serverd ~]# restorecon -Rv /smbshare
Relabeled /smbshare from unconfined_u:object_r:default_t:s0 to unconfined_u:object_r:samba_share_t:s0
[root@serverd ~]# ls -ldZ /smbshare
drwxrwsr-x. 2 root marketing unconfined_u:object_r:samba_share_t:s0 6 Jul 6 20:43 /smbshare
[root@serverd ~]# vim /etc/samba/smb.conf
[root@serverd ~]# testparm
Load smb config files from /etc/samba/smb.conf
Loaded services file OK.
Server role: ROLE_STANDALONE

Press enter to see a dump of your service definitions

# Global parameters
[global]
printcap name = cups
security = USER
server min protocol = SMB3
workgroup = MYCOMPANY
idmap config * : backend = tdb
cups options = raw
smb encrypt = required


[homes]
browseable = No
comment = Home Directories
inherit acls = Yes
read only = No
valid users = %S %D%w%S


[printers]
browseable = No
comment = All Printers
create mask = 0600
path = /var/tmp
printable = Yes


[print$]
comment = Printer Drivers
create mask = 0664
directory mask = 0775
force group = @printadmin
path = /var/lib/samba/drivers
write list = @printadmin root


[data]
path = /smbshare
write list = @markting

添加 smb 用户,这里使用系统用户,先创建系统用户,然后添加对应的 smb 用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@serverd ~]# useradd  -s /sbin/nologin -G marketing developer1
[root@serverd ~]# smbpasswd -a developer1
New SMB password:
Retype new SMB password:
Added user developer1.
[root@serverd ~]# useradd -s /sbin/nologin operator1
[root@serverd ~]# smbpasswd -a operator1
New SMB password:
Retype new SMB password:
Added user operator1.
[root@serverd ~]# useradd -r -s /sbin/nologin sambamount
[root@serverd ~]# smbpasswd -a sambamount
New SMB password:
Retype new SMB password:
Added user sambamount.

配置 smb 开机自启动

1
2
[root@serverd ~]# systemctl enable  --now smb
Created symlink /etc/systemd/system/multi-user.target.wants/smb.service → /usr/lib/systemd/system/smb.service.

查看服务状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@serverd ~]# systemctl status smb
● smb.service - Samba SMB Daemon
Loaded: loaded (/usr/lib/systemd/system/smb.service; enabled; vendor preset: disabled)
Active: active (running) since Thu 2023-07-06 21:17:54 CST; 18s ago
Docs: man:smbd(8)
man:samba(7)
man:smb.conf(5)
Main PID: 2822 (smbd)
Status: "smbd: ready to serve connections..."
Tasks: 4 (limit: 11251)
Memory: 8.3M
CGroup: /system.slice/smb.service
├─2822 /usr/sbin/smbd --foreground --no-process-group
├─2824 /usr/sbin/smbd --foreground --no-process-group
├─2825 /usr/sbin/smbd --foreground --no-process-group
└─2826 /usr/sbin/smbd --foreground --no-process-group

Jul 06 21:17:54 serverd.lab.example.com systemd[1]: Starting Samba SMB Daemon...
Jul 06 21:17:54 serverd.lab.example.com smbd[2822]: [2023/07/06 21:17:54.189066, 0] ../../lib/util/be>
Jul 06 21:17:54 serverd.lab.example.com systemd[1]: Started Samba SMB Daemon.
Jul 06 21:17:54 serverd.lab.example.com smbd[2822]: daemon_ready: daemon 'smbd' finished starting up>

防火墙放行

1
2
3
4
[root@serverd ~]# firewall-cmd --permanent --add-service=samba
success
[root@serverd ~]# firewall-cmd --reload
success

将 SMB data 共享永久挂载到 servera 上的 /designs 挂载点下。为此,使⽤ sambamount 用户的凭据创建 /etc/samba/creds.txt ⽂件。使⽤ /etc/fstab 中的 credentials、multiuserseal 挂载选项激活多用户模式并加密通信。

安装 cifs-utils 软件包,它提供 mount.cifs 命令

1
2
[root@servera ~]# yum install cifs-utils

创建 /etc/samba/creds.txt ⽂件,以提供⽤于挂载该共享的帐户和密码。使⽤ sambamount 帐户,密码为 redhat。

1
2
username=sambamount
password=redhat

保护⽂件,以便只有 root 用户可以访问它

1
[root@servera ~]# chmod 600 /etc/samba/creds.txt

创建 /designs 挂载点

1
[root@servera ~]# mkdir /designs

编辑 /etc/fstab ⽂件,再为 SMB 共享添加⼀个条⽬。在单⾏中定义以下新挂载,⽆换⾏符。

1
//serverd.lab.example.com/data /designs cifs credentials=/etc/samba/creds.txt,multiuser,seal 0 0

credentials=/etc/samba/cred.txt: 指定用户账户和密码的文件路径。Samba 服务将从这个文件中获取用户登录验证信息。

multiuser: 表示允许多个用户同时登录这个共享。如果不指定这个参数,默认只允许一个用户连接。

seal: 表示Samba将用户账户信息存储在cred.txt文件中进行简单的文本明文形式存储,而不是使用更安全的加密方式。

挂载⽂件系统,然后验证挂载是否成功。

1
2
3
4
5
[root@servera ~]# mount /designs
[root@servera ~]# df /designs
Filesystem 1K-blocks Used Available Use% Mounted on
//serverd.lab.example.com/data 10474476 2289868 8184608 22% /designs

测试对共享的访问权限。为此,请以 developer1 用户⾝份登录,提供该用户的 SMB 凭据,然后确认您可以写⼊该共享。

执⾏与 operator1 用户相同的测试。该用户帐户仅具有读取访问权限,因为它不属于该 marketing 组以 developer1 用户⾝份登录。lab 脚本已为您创建了该用户帐户。

1
2
[root@servera ~]# su - developer1
[developer1@servera ~]$

完整Demo

服务端配置 samba 共享

servera 上准备 samba 共享:

  • 创建共享文件夹 /common
  • 用户 rob 验证的密码是 compede
  • 用户 brian 验证的密码是 postroll

部署步骤:

  1. 安装对应的数据包
  2. 添加对应的 smb 用户
  3. 共享目录授权
  4. SElinux 配置
1
yum -y install samba samba-client

保证本地用户安全,给对应的 配置无法登录的 bash

1
2
3
4
# id brian; id rob
# egrep 'brian|rob' /etc/passwd
# usermod -s /sbin/nologin brian
# usermod -s /sbin/nologin rob

添加 smb 用户

1
2
3
4
5
6
7
8
9
10
11
12
[root@servera ~]# pdbedit -L
[root@servera ~]# smbpasswd -a brian
New SMB password: `postroll`
Retype new SMB password: `postroll`
Added user brian.
[root@servera ~]# (echo compede; echo compede) | smbpasswd -a rob
New SMB password:
Retype new SMB password:
Added user rob.
[root@servera ~]# pdbedit -L
brian
rob

创建共享文件夹,这里需要配置对应的权限,上面要, 添加 brian 组,同时给 GID 权限

1
2
3
mkdir /common
chown :brian /common
chmod 2775 /common

查上下文关系类型,配置 SELinux

1
2
3
4
5
6
7
8
9
# vim /etc/samba/smb.conf.example
# yum provides semanage
# yum -y install policycoreutils-python-utils

查上下文关系命令

# man semanage fcontext | grep \#
# semanage fcontext -a -t samba_share_t "/common(/.*)?"
# restorecon -Rv /common
1
2
3
# ls -ldZ /common/
drwxrwsr-x. 2 root brian unconfined_u:object_r:`samba_share_t`:s0 6 Aug 7 13:05
/common/

使用多用户访问 samba 共享目录

在 servera 上配置 SMB 服务:

  • 您的 SMB 服务器必须是 STAFF 工作组的一个成员
  • 共享 /common 目录共享名必须为 common
  • 只有 example.com 域内的客户端可以访问 common 共享
  • common 必须是可以浏览的
  • 用户 rob 必须能够读取共享中的内容
  • 要求 rob 用户以只读的方式访问该目录, brian 可以用读写的方式来访问该目录

serverb 上,要求通过 smb 多用户的方式将共享目录 common 挂载到 /mnt/private

  • 要求在对该共享目录挂载时,以 rob 的身份进行操作
  • 要求每次开机该共享目录可以自动挂载
1
# vim /etc/samba/smb.conf
1
2
3
4
5
6
7
8
...
workgroup = STAFF
...
[common]
path = /common
hosts allow = 127. 172.25.
browseable = Yes
write list = @brian
1
2
3
4
# systemctl enable --now smb nmb

# firewall-cmd --permanent --add-service=samba
# firewall-cmd --reload
1
2
3
4
5
6
7
8
9
10
11
# smbclient -L //servera -N
Anonymous login successful

Sharename Type Comment
--------- ---- -------
...
`common` Disk
...

# smbclient -L //servera -U rob%compede
# smbclient //servera/common -U rob%compede

客户端配置

1
2
3
# yum search cifs
# yum search samba
# yum -y install cifs-utils samba-client
1
2
3
4
5
6
7
# smbclient -L //servera -N
# smbclient -L //servera -U rob%compede

# mkdir /mnt/private

# man mount.cifs
# vim /etc/samba/cred.txt
1
2
username=rob
password=compede
1
2
3
4
5
# chmod 600 /etc/samba/cred.txt
# ll /etc/samba/cred.txt
-rw-------. 1 root root 30 Aug 7 13:31 /etc/samba/cred.txt

# vim /etc/fstab
1
2
...
//servera/common /mnt/private cifs credentials=/etc/samba/cred.txt,multiuser,seal 0 0
1
# mount –a
1
2
3
4
5
6
7
8
9
10
11
12
13
# df -ht cifs
Filesystem Size Used Avail Use% Mounted on
//servera/common 10G 2.2G 7.9G 22% /mnt/private

# ls /mnt/private/
# touch /mnt/private/ro.txt
touch: cannot touch '/mnt/private/ro.txt': Permission denied
# su - brian
$ cifscreds add servera
Password: `postroll`
$ touch /mnt/private/rw.txt
$ ls /mnt/private/rw.txt
-rwxr-xr-x. 1 brian brian 0 Aug 7 13:41 /mnt/private/rw.txt

博文部分内容参考

© 文中涉及参考链接内容版权归原作者所有,如有侵权请告知:)


红帽服务管理与自动化(RH358)授课笔记


© 2018-至今 liruilonger@gmail.com, All rights reserved. 保持署名-非商用-相同方式共享(CC BY-NC-SA 4.0)

发布于

2023-08-05

更新于

2024-11-22

许可协议

评论
Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×