RH358提供基于文件的网络存储–提供SMB文件共享
本章节介绍如何提供Samba共享,但在我眼中,Samba已经成为鸡肋服务,因为勒索病毒的出现,很多政企都会在网络层面封禁135、137、138、139和445端口,而Samba协议就是使用这几个高风险端口,因此,是否用Samba真的好好考虑了。在我看来,还是别用。
RH358专栏地址:https://blog.csdn.net/qq_41765918/category_11532281.html
文章目录
1. 描述 SMB
服务器消息块Server Message Block (SMB)是Microsoft Windows服务器和客户端的标准文件共享协议。可以通过几种方式配置SMB文件服务器。
-
最简单的方法之一是配置一个独立的服务器,其中服务器及其客户机是一个通用Windows工作组的成员。服务器本地管理用户帐号和密码。
-
更复杂的配置可能使用Microsoft Active Directory (AD)来通过域控制器协调用户身份验证。
-
Red Hat Enterprise Linux既可以作为客户端,也可以作为服务器来访问和提供SMB文件共享。客户端挂载SMB文件共享需要安装cifs-utils包。在服务器上,samba包允许使用SMB协议共享目录。
2. 使用SMB共享目录
Samba可以以SMB网络文件共享的方式共享Linux目录。本课程涵盖了作为独立服务器的Samba的配置。在该配置中,服务器管理其Samba数据库中的用户帐户,并向本地Windows工作组的成员提供文件共享。
SMB共享目录的基本步骤如下:
-
安装samba软件包。
-
准备共享目录。
-
配置/etc/samba/smb.conf配置文件。
-
在Samba数据库中设置适当的Linux用户并对其进行配置。
-
启动Samba并打开本地防火墙。
-
从客户端系统挂载SMB共享以验证您的配置。
3. 安装Samba和准备共享目录
在samba服务器上安装samba包。
[root@host ~]# yum install samba
如果要共享的目录不存在,则创建该目录。
[root@host ~]# mkdir /srv/smbshare
设置Linux访问权限
Samba将其用户帐户映射到Linux用户。在这个基本配置中,使用Linux文件权限控制对目录的访问。例如,为developers组的成员提供写访问权限,并为其他人提供读访问权限,可以使用以下命令:
[root@host ~]# chgrp developers /srv/smbshare
[root@host ~]# chmod 2775 /srv/smbshare
[root@host ~]# ll /srv/smbshare
drwxrwsr-x. 2 root developers 6 May 26 08:56 /srv/smbshare
# SGID位确保新内容自动属于开发人员组。
设置SELinux上下文类型
要使Samba正确地与SELinux一起工作,请将目录上下文类型设置为samba_share_t。
[root@host ~]# semanage fcontext -a -t samba_share_t '/srv/smbshare(/.*)?'
[root@host ~]# restorecon -Rv /srv/smbshare
Samba还可以提供标记为SELinux public_content_t(只读)和public_content_rw_t(读/写)类型的文件。使用public_content_rw_t类型,启用SELinux smbd_anon_write布尔值以允许读写访问。当你想要Apache HTTP Server或NGINX能够提供或写入共享目录内容时,这两种SELinux类型很有用。
**警告:**不要使用Samba共享同时也是NFS导出、挂载的NFS文件系统或FTP共享的目录。这样做可能会导致文件损坏或其他文件访问问题。
4. 配置Samba
Samba的配置文件为/etc/samba/smb.conf。该文件被划分为多个部分。每个节以方括号中的节名开始,后面是一组参数。
/etc/samba/smb.conf配置文件以[global]部分开始。该部分提供了常规服务器配置和默认值,可以在后续部分中覆盖它们。下一节定义文件或打印机共享。注释一行,可以使用分号 (😉 或散列 (#) 字符。
配置全局部分
**[global]**部分定义了Samba服务器的基本配置。下面是最常用的参数。
workgroup
workgroup表示服务器的Windows工作组。当客户机系统查询服务器时,该名称将显示在客户机系统上。默认值为WORKGROUP。
security
安全参数控制Samba对客户机进行身份验证的方式。使用security = user,客户机使用本地Samba服务器在其数据库中管理的用户名和密码登录。该值为默认值。
server min protocol
server min protocol参数表示服务器支持的最小SMB版本。默认情况下,服务器支持协议的所有版本,并与客户端协商该版本。由于第一个版本SMB1(或CIFS)存在安全问题,Red Hat建议通过将server min protocol设置为SMB2来排除该版本。但是,通过这种配置,Microsoft Windows XP或更早版本将无法访问服务端,因为它们只支持SMB1。SMB协议当前版本为版本3
**注意:**Red Hat Enterprise Linux 8.2及以上版本。Samba默认禁用SMB1支持。
smb encrypt
smb encrypt激活流量加密。默认情况下,服务器和客户端协商加密。如果需要强制加密,smb加密参数设置为必选,server min protocol设置为SMB3。只有SMB3提供对加密的原生支持。Microsoft Windows 8, Microsoft Windows Server 2012。操作系统及以上版本均支持加密SMB3。
配置共享部分
在[global]节之后,在自定义节中定义您的共享。括号中的节名定义了共享的名称,就像从客户端看到的那样。这些部分中最有用的指示如下。
path
path指令提供要在服务器上共享的目录的全名。
writeable
writeable指令指示认证用户是否对共享有读写访问权限(当设置为yes时),或没有读写访问权限(当设置为no时)。默认设置为no。
write list
当writeable指令的值为no(默认值)时,可以使用write list指令提供一个以逗号分隔的对共享具有读写访问权限的用户列表。不在列表中的用户只有读访问权限。
在列表中,可以通过@字符作为组名的前缀来指定本地Linux组。以下示例授予operator1用户和developers组成员读/写访问权限。
write list = operator1, @developers
valid users
缺省情况下,所有通过认证的用户都可以访问共享。如果您想要限制该访问,请使用valid users指令。该指令接受以逗号分隔的应该具有访问权限的用户列表。
下面的示例声明SMB devcode共享,并授予对 /srv/smbshare目录的访问权限。所有经过认证的用户都有对共享的读访问权限,但只有developers组的成员有读/写访问权限。
[devcode]
path = /srv/smbshare
write list = @developers
下面的示例通过只允许developer组和operator1用户访问来进一步限制对共享的访问。operator1不在写列表中,只有读权限。
[devcode]
path = /srv/smbshare
valid users = operator1, @developers
write list = @developers
验证配置文件
/etc/samba/smb.conf文件是否存在错误,请使用不带参数的testparm命令。
[root@host ~]# 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...
5. 准备 Samba 用户
每个Samba帐户必须有一个具有相同用户名的关联Linux帐户。要创建仅samba用户帐户,请锁定其Linux密码,并将其登录shell设置为/sbin/nologin该配置阻止用户使用SSH或从控制台登录到Linux系统。
以为operator1用户创建一个锁定的Linux用户为例。
[root@host ~]# useradd -s /sbin/nologin operator1
创建Linux帐户之后,使用Samba公共工具包中的smbpasswd命令将它们添加到Samba数据库中。
要将用户添加到Samba数据库,请使用smbpasswd命令,并使用-a选项和用户名作为参数。命令提示输入密码。
[root@host ~]# smbpasswd -a operator1
New SMB password: redhat
Retype new SMB password: redhat
Added user operator1.
要从Samba数据库中删除用户,请使用-x选项。
[root@host ~]# smbpasswd -x operator1
Deleted user operator1.
除了smbpasswd命令外,还提供了更强大的pdbedit命令。例如,使用pdbedit -L命令列出Samba数据库中的用户。有关更多信息,请参见pdbedit(8)手册页。
Samba在/var/lib/samba/private/目录下维护它的数据库。不要直接修改该目录中的文件。
6. 启动Samba
使用systemct l命令启用并启动smb服务。
[root@host ~]# systemctl enable --now smb
要允许Samba服务器通信,请打开Samba防火墙服务,该服务控制对端口139/TCP和端口445/TCP的访问。
[root@host ~]# firewall-cmd --permanent --add-service=samba
[root@host ~]# firewall-cmd --reload
**重要:**Samba定期检查/etc/samba/smb.conf是否被更改。如果配置文件已经更改,那么Samba将自动重新加载它。这不会影响任何已经建立到Samba服务的连接,直到连接关闭或Samba完全重新启动。
执行systemctl reload smb命令立即重新加载配置文件,或执行systemctl restart smb命令完全重启Samba。
7. 挂载SMB文件系统
Microsoft Windows和Linux系统都可以从Samba服务器访问SMB共享。在Linux系统下,需要安装cifs-utils包,以便在本地系统上挂载SMB共享。
在Linux上,使用//servername/sharename符号访问共享。标准的微软Windows统一命名约定Uniform Naming Convention (UNC)是用\servername\sharename来表示网络资源。但是,因为 \ 在shell中是转义字符。Linux实用程序通常使用 / 字符代替。
要挂载SMB共享,必须提供用户凭据,以便使用Samba服务器进行身份验证。这些凭据决定了对共享上的文件的访问权限。
对于手动挂载,可以使用username挂载选项。该命令提示用户输入密码。
[root@client ~]# mount -o username=operator1 //host.example.com/devcode /mnt
Password for operator1@//host.example.com/devcode: redhat
为了自动挂载共享,例如从/etc/fstab使用凭证选项。下面的示例显示了/etc/fstab中的条目,该条目使用凭据文件挂载devcode共享。
//host.example.com/devcode /data cifs credentials=/etc/samba/credentials 0 0
凭据文件提供用于身份验证的用户名和密码。
[root@client ~]# cat /etc/samba/credentials
username=operator1
password=redhat
因为凭据文件包含一个密码,所以将文件存储在一个安全的目录中,并限制其访问:
[root@client ~]# chown root /etc/samba/credentials
[root@client ~]# chmod 600 /etc/samba/credentials
请求加密
如果需要强制SMB流量加密,请在mount命令中使用seal选项。下面的示例显示了/etc/fstab中的条目,该条目挂载devcode共享并强制流量加密。
//host.example.com/devcode /data cifs credentials=/etc/samba/credentials,seal 0 0
执行多用户SMB挂载
当使用凭据或用户名选项挂载SMB共享时,这些凭据将被本地系统上的所有用户使用。任何用户都可以使用这些特定的凭据访问共享。
理想情况下,希望每个用户都使用自己的SMB凭据来确定对挂载的共享上的文件的访问。可以通过多用户挂载选项进行设置。
当使用multiuser时,可以让根用户使用对共享具有最小访问权限的凭据挂载SMB共享。用户登录时,使用cifscreds命令将其SMB密码临时添加到安全内核密匙环中。然后,客户机的Linux内核将使用它们的SMB凭据来确定对共享的访问,而不是根用户用于挂载共享的凭据。
下面的步骤描述了多用户选项的系统配置。
-
创建用于挂载SMB共享的凭据文件。在凭据文件中使用的用户必须具有对SMB共享的最小访问权限,并具有对共享目录的读访问权限,但是不需要更多的访问权限。
-
在mount命令中添加multiuser选项。下面的/etc/fstab条目使用credentials和multiuser选项。该条目在单行中,没有换行。
//host.example.com/devcode /data cifs credentials=/etc/samba/creds,multiuser 0 0
- 使用mount命令挂载SMB共享。
在访问挂载点之前,用户应该运行cifscreds命令提供他们的凭据。
[developer1@client ~]$ cifscreds add host.example.com
Password: redhat
cifscreds命令使用子命令作为其第一个参数,Samba服务器名作为第二个参数。add子命令将SMB凭据加载到内核密钥环。clear子命令为用户从特定主机的内核密钥环中删除凭据。update子命令用新用户和密码替换内核密钥环中的凭据。
注意:默认情况下,cifscreds假设SMB凭据使用的用户名与当前Linux用户名匹配。可以在add 或 clear后使用-u username选项为SMB凭据指定不同的用户名子通信
参考文档:samba(7)、smb.conf(5)、testparm(1)、smbpasswd(8)、pdbedit(8)、mount.cifs(8) 和 cifscreds(1) man page
8. 课本练习
[student@workstation ~]$ lab filestorage-smb start
这个命令确保servera和serverd在网络上可用,并在servera上创建developer1和operator1用户帐户。
在本练习中,您将serverd配置为一个独立的SMB文件服务器,它共享/smbshare目录。将servera配置为使用SMB共享multiuser挂载选项挂载到/designs目录下。
1. 安装samba软件包
[root@serverd ~]# yum -y install samba
2. 创建marketing组和/smbshare目录并进行配置。
配置/smbshare目录如下:
-
该目录属于营销组。
-
目录中设置了SGID位。
-
每个人对目录都有读权限,但只有marketing组可以写。
[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 /smbshare
Relabeled /smbshare from unconfined_u:object_r:default_t:s0 tounconfined_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 2 09:40 /smbshare
3. 编辑/etc/samba/smb.conf配置文件。
-
将工作组设置为MYCOMPANY。
-
将Samba配置为需要加密流量。
-
强制Samba只支持SMB版本3及更高版本。
-
创建名为data的共享。
-
共享/smbshare目录。
-
保护共享,以便每个人都可以访问它,但只有marketing组的成员有写访问权限。
[root@serverd ~]# vim /etc/samba/smb.conf
[global]
workgroup = MYCOMPANY
smb encrypt = required
server min protocol = SMB3
…………
[data]
path = /smbshare
write list = @marketing
[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...
# 如果该命令报告任何警告或错误,则在继续之前纠正它们
4. 按要求创建用户和组并设置好权限。
创建仅支持samba的developer1用户帐户,然后将其添加到marketing组。该用户帐户具有对该共享的写访问权限,因为它是marketing组的成员。
创建仅支持samba的operator1用户帐户。不要将其添加到marketing组,它对该共享具有只读访问权限。
[root@serverd ~]# useradd -s /sbin/nologin -G marketing developer1
[root@serverd ~]# smbpasswd -a developer1
New SMB password: redhat
Retype new SMB password: redhat
Added user developer1.
[root@serverd ~]# useradd -s /sbin/nologin operator1
[root@serverd ~]# smbpasswd -a operator1
New SMB password: redhat
Retype new SMB password: redhat
Added user operator1.
5. 创建额外的sambamount用户帐户,该帐户对共享具有最小的访问权限。
只在客户机系统上使用该系统帐户来使用多用户选项挂载共享
创建sambamount用户帐户。设置登录shell为/sbin/nologin,防止Linux用户登录。使用–system选项(或-r)将其声明为系统帐户,并且不创建主目录。
[root@serverd ~]# useradd -r -s /sbin/nologin sambamount
[root@serverd ~]# smbpasswd -a sambamount
New SMB password: redhat
Retype new SMB password: redhat
Added user sambamount.
6. 启用并启动smb服务,然后打开防火墙端口。
[root@serverd ~]# systemctl enable --now smb
[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 Fri 2021-07-02 10:12:52 CST; 4s ago
Docs: man:smbd(8)
man:samba(7)
man:smb.conf(5)
Main PID: 2765 (smbd)
Status: "smbd: ready to serve connections..."
Tasks: 4 (limit: 11248)
Memory: 8.3M
CGroup: /system.slice/smb.service
├─2765 /usr/sbin/smbd --foreground --no-process-group
├─2767 /usr/sbin/smbd --foreground --no-process-group
├─2768 /usr/sbin/smbd --foreground --no-process-group
└─2769 /usr/sbin/smbd --foreground --no-process-group
[root@serverd ~]# firewall-cmd --permanent --add-service=samba
success
[root@serverd ~]# firewall-cmd --reload
success
7. 持久地将SMB data共享挂载在servera上的/designs挂载点下。
# 为此,创建/etc/samba/creds.txt文件,包含sambamount用户的凭据。使用/etc/fstab中的credentials, multiuser, seal挂载选项来激活多用户模式并加密通信。
[root@servera ~]# yum -y install cifs-utils
[root@servera ~]# vim /etc/samba/creds.txt
username=sambamount
password=redhat
[root@servera ~]# chmod 600 /etc/samba/creds.txt
[root@servera ~]# mkdir /designs
[root@servera ~]# echo "//serverd.lab.example.com/data /designs cifs credentials=/etc/samba/creds.txt,multiuser,seal 0 0" >> /etc/fstab
[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
8. 测试。
[root@servera ~]# su - developer1
[developer1@servera ~]$ cifscreds add serverd.lab.example.com
Password: redhat
[developer1@servera ~]$ echo Hello World > /designs/test.txt
[developer1@servera ~]$ ls /designs
test.txt
[developer1@servera ~]$ cat /designs/test.txt
Hello World
[developer1@servera ~]$ exit
logout
[root@servera ~]# su - operator1
[operator1@servera ~]$ cifscreds add serverd.lab.example.com
Password: redhat
[operator1@servera ~]$ ls /designs
test.txt
[operator1@servera ~]$ cat /designs/test.txt
Hello World
[operator1@servera ~]$ echo Hello World > /designs/operator1.txt
-bash: /designs/operator1.txt: Permission denied
完成实验
[student@workstation ~]$ lab filestorage-smb finish
总结
- 介绍SMB。
- 如何部署和配置Samba。
- 导出Samba并挂载使用。
- 若喜欢金鱼哥的文章,顺手点个赞。也可点个关注,因为后续会不断上干货。