12.SMB
SMB 服务介绍
Samba 是在Linux和UNIX系统上实现SMB协议(Server Messages Block,信息服务块),是一种在局域网上共享文件和打印机的一种通信协议。曾用名CIFS(通用互联网文件系统 Common Internet File System), 公元1983年诞生于IBM。SMB协议是C/S架构,通过该协议客户机(包括Windows、linux、Unix系统)可以访问服务器(包括Windows、linux、Unix系统)上的共享文件系统、打印机及其他资源。
Linux既可以充当服务器提供SMB文件共享,也可以充当客户端访问SMB共享。
客户端挂载SMB文件共享,需要安装cifs-utils软件包。
服务器端提供SMB共享,需要安装samba程序包。
准备环境
关闭防火墙
[root@server ~ 15:17:44]# systemctl disable firewalld.service --now
下载软件
[root@server ~ 15:41:53]# yum install -y samba samba-client
准备共享目录
[root@server ~ 15:42:44]# mkdir -p /shares/samba[root@server ~ 15:43:10]# groupadd -g 2000 developers
[root@server ~ 15:43:27]# chgrp developers /shares/samba/
[root@server ~ 15:43:44]# chmod 2775 /shares/samba/
[root@server ~ 15:44:01]# ll -d /shares/samba/
drwxrwsr-x 2 root developers 6 Nov 28 15:43 /shares/samba/
准备 Samba 用户
每个Samba帐户必须具有一个具有相同用户名的关联Linux帐户。 要创建仅Samba的用户帐户,请锁定其Linux密码,并将其登录Shell设置为/sbin/nologin。 此配置可防止用户使用SSH或从控制台登录Linux系统。
[root@server ~ 15:44:09]# useradd -s /sbin/nologin -G developers -u 1001 developer1
[root@server ~ 15:46:38]# useradd -s /sbin/nologin -G developers -u 1002 developer2
[root@server ~ 15:46:59]# smbpasswd -a developer
1
New SMB password:
Retype new SMB password:
Mismatch - password unchanged.
Unable to get new password.
[root@server ~ 15:49:31]# smbpasswd -a developer1
New SMB password:
Retype new SMB password:
Mismatch - password unchanged.
Unable to get new password.
[root@server ~ 15:49:46]# smbpasswd -a developer1
New SMB password:
Retype new SMB password:
Added user developer1.
[root@server ~ 15:49:56]# smbpasswd -a developer
2
New SMB password:
Retype new SMB password:
Added user developer2.
[root@server ~ 15:50:08]# pdbedit -L
developer1:1001:
developer2:1002:
[root@server ~ 15:51:24]# useradd -s /sbin/nologin -u 1100 operator1
[root@server ~ 15:52:14]# smbpasswd -a operator1New SMB password:
Retype new SMB password:
Added user operator1.
[root@server ~ 15:52:42]# pdbedit -L
developer1:1001:
operator1:1100:
developer2:1002:
设置 SELinux 上下文类型
配置 Samba
Samba的配置文件是**/etc/samba/smb.conf**。
/etc/samba/smb.conf配置文件以[global]节开头。 该部分提供了常规服务器配置和默认值,您可以在随后的部分中将其覆盖。接下来的部分定义文件或打印机共享。
要注释掉一行,请使用分号(;)或井号(#)字符。
配置 global
global 部分定义Samba服务器的基本配置。 在该部分中,常用的参数如下:
workgroup 参数,指定服务器的Windows工作组。 当客户端系统查询服务器时,该名称将显示在客户端系统上。 默认值为 SAMBA。
security 参数,控制Samba如何验证客户端。默认security = user,客户端使用用户名和密码登录,本地Samba服务器在其数据库中管理该用户名和密码。
**server min protocol **参数,指定服务器支持的最低SMB版本。 默认情况下,服务器支持协议的所有版本,并与客户端协商该版本。 由于第一个版本SMB1(或CIFS)存在安全问题,因此Red Hat建议将该参数设置为SMB2来排除该版本。 但是,使用该配置,Microsoft Windows XP或更早版本的客户端将无法使用您的服务器,因为它们仅支持SMB1。 SMB协议的当前版本为版本3。
smb crypty 参数,激活流量加密。 默认情况下,服务器和客户端协商加密。 要强制加密,请将smb crypty参数设置为required,并将服务器min协议设置为SMB3。 仅SMB3提供对加密的支持。 Microsoft Windows 8,Microsoft Windows Server 2012和更高版本的操作系统支持具有加密功能的SMB3。
hosts allow 参数,设置允许访问Samba服务器的客户端列表(以逗号、空格或制表符分隔)。如果未指定,则所有主机均可访问Samba。如果global块中未指定此设置,则可以单独在每个共享中设置。如果在global块中指定此设置,则适用于所有共享。
配置共享块
在[global]部分之后,定义共享部分。 括号中的名称定义了共享的名称,客户端可以看到。 该部分中常用的指令如下:
**path **指令,提供要在您的服务器上共享的目录的全名。
writeable 指令,指示经过身份验证的用户是否对共享具有读/写访问权限(设置为yes或no)。 默认设置为no。
writeable,writable和write ok指令含义相同。read only = no指令与writeable = yes指令含义相同。
write list,当writeable指令的值为no(默认值)时,可以使用write list指令提供以逗号分隔的用户列表,列表中的用户对共享具有读/写访问权限,不在列表中的用户仅具有读取访问权限。在列表中,您可以通过在组名前面加上@字符来指定本地Linux组。
以下示例将对operator1用户和developers组成员的读写权限授予。
write list = operator1, @developers
valid users,默认情况下,所有经过身份验证的用户都可以访问共享。 如果要限制该访问,请使用该指令。 该指令采用逗号分隔的应具有访问权限的用户列表。
以下示例声明devcode共享,并授予对/shares/samba目录的访问权限。 所有经过身份验证的用户都具有对该共享的读取访问权限,但是只有开发人员组的成员具有读/写访问权限
[root@server ~ 16:43:18]# vim /etc/samba/smb.conf
[devcode]
comment = wordpress
valid users = operator1,@developers
path = /shares/wordpress
write list = @developers
hosts allow = 10.1.8.0/24
本次实验实例
声明devcode共享,并授予了对/shares/samba目录的访问权限:
只有developers组中成员和operator1用户可以访问。operator1用户可以读访问。developers组中成员具有读取/写入访问权限。hosts allow = 10.1.8.10/24只允许10.1.8.10访问
#下载wordpress文件
[root@server ~ 16:25:38]# ll
total 9628
-rw-------. 1 root root 1505 Nov 7 09:33 anaconda-ks.cfg
drwxr-xr-x 5 root root 4096 Feb 8 2018 wordpress
-rw-r--r-- 1 root root 9848003 Dec 15 2024 wordpress-4.9.4-zh_CN.zip
[root@server ~ 16:25:39]# mv wordpress /shares/
mv: overwrite ‘/shares/wordpress’? y
[root@server wordpress 16:26:40]# ls
index.php wp-includes
license.txt wp-links-opml.php
readme.html wp-load.php
wp-activate.php wp-login.php
wp-admin wp-mail.php
wp-blog-header.php wp-settings.php
wp-comments-post.php wp-signup.php
wp-config-sample.php wp-trackback.php
wp-content xmlrpc.php
wp-cron.php
#修改权限
[root@server wordpress 16:26:42]# chmod 2775 /shares/wordpress/
[root@server wordpress 16:27:12]# chgrp -R developers /shares/wordpress/
[root@server ~ 16:28:21]# ll -d /shares/wordpress/
drwxrwsr-x 5 root developers 4096 Feb 8 2018 /shares/wordpress/
检查语法错误
[root@server ~ 16:29:23]# 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
workgroup = SAMBA
idmap config * : backend = tdb
cups options = raw
[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
[devcode]
comment = wordpress
create mask = 0664
directory mask = 0775
hosts allow = 10.1.8.0/24
path = /shares/wordpress
valid users = operator1 @developers
write list = @developers
[root@server ~ 16:42:01]# echo $?
0
Linux 客户端挂载
Microsoft Windows和Linux系统都可以从Samba服务器访问SMB共享。
在Linux系统上,安装 cifs-utils 软件包,以便可以在本地系统上挂载SMB共享。
在Linux上,您可以使用**//servername/sharename**访问共享。标准的 Microsoft Windows 使用统一命名约定(UNC-Uniform Naming Convention),格式,代表网络资源。 但由于字符是shell中的转义字符,因此Linux实用程序通常改用/字符。
\servernamesharename
要挂载SMB共享,必须提供用户凭据以通过Samba服务器进行身份验证。 这些凭据确定对共享上文件的访问权限。 对于手动挂载,您可以使用username挂载选项。 该命令提示用户输入密码。
[root@proxy ~ 16:48:38]# yum install -y samb-client cifs-utils
[root@proxy ~ 16:50:03]# smbclient -L //10.1.8.10
Enter SAMBA
oot's password:
Anonymous login successful
Sharename Type Comment
--------- ---- -------
print$ Disk Printer Drivers
devcode Disk wordpress
IPC$ IPC IPC Service (Samba 4.10.16)
Reconnecting with SMB1 for workgroup listing.
Anonymous login successful
Server Comment
--------- -------
Workgroup Master
--------- -------
[root@proxy ~ 16:50:57]# smbclient -L //10.1.8.10 -U operator1
Enter SAMBAoperator1's password:
Sharename Type Comment
--------- ---- -------
print$ Disk Printer Drivers
devcode Disk wordpress
IPC$ IPC IPC Service (Samba 4.10.16)
operator1 Disk Home Directories
Reconnecting with SMB1 for workgroup listing.
Server Comment
--------- -------
Workgroup Master
--------- -------
[root@proxy ~ 16:51:49]# mkdir -p /usr/share/nginx/html/
[root@proxy ~ 16:52:14]# yum install -y nginx
[root@proxy ~ 16:56:02]# systemctl enable nginx
[root@proxy ~ 16:57:41]# mount -t cifs -o username=operator1,password=redhat //10.1.8.10/devcode /usr/share/nginx/html/
[root@proxy ~ 17:02:23]# umount /usr/share/nginx/html
[root@proxy ~ 17:02:42]# mount -t cifs -o username=developer1,password=redhat //10.1.8.10/devcode /usr/share/nginx/html/
[root@proxy ~ 17:03:06]# echo hello > /usr/share/nginx/html/index.html


多用户挂载
[root@client ~ 10:42:30]# cat /etc/samba/samba.secrets
username=operator1
password=redhat
[root@client ~ 10:41:25]# chmod o=- /etc/samba/samba.secrets
[root@client ~ 10:42:05]#
[root@client ~ 10:42:05]# tail -1 /etc/fstab
//10.1.8.10/devcode /usr/share/nginx/html cifs credentials=/etc/samba/samba.secrets 0 0
#持久化挂载
[root@client ~ 11:23:20]# vim /etc/fstab
#
//10.1.8.10/devcode /usr/share/nginx/html cifs credentials=/etc/samba/samba.secrets,multiuser 0 0
#
#添加和server端一样的用户和组
[root@client ~ 10:42:45]# useradd -u 1100 operator1
[root@client ~ 11:04:08]# groupadd -g 2000 developers
[root@client ~ 11:05:26]# useradd -G developers -u 1001 developer1
[root@client ~ 11:05:52]# useradd -G developers -u 1002 developer2
[root@client ~ 11:06:00]# echo redhat | passwd --stdin operator1
[root@client ~ 11:06:13]# echo redhat | passwd --stdin developer1
[root@client ~ 11:06:21]# echo redhat | passwd --stdin developer2
#先卸载再挂载
[root@client ~ 11:06:24]# !umount
umount /usr/share/nginx/html
umount: /usr/share/nginx/html: not mounted
[root@client ~ 11:06:39]# mount /usr/share/nginx/html/
[root@client ~ 11:07:09]# su operator1
[operator1@client ~ 11:08:20]$ cifscreds add 10,.1.8.10
[root@client ~ 11:20:28]# su - developer1
#运行cifscreds命令配置凭据
[developer1@client ~ 11:20:53]$ cifscreds add 10.1.8.10
#server端developer1密码
Password:
[developer1@client ~ 11:34:41]$ touch /usr/share/nginx/html/f1.txt
Windows挂载
win+R


如果此时想使用developer1登录,验证权限。此时需要断开旧的会话。因为Windows 会缓存之前访问 Samba 服务器的用户凭据,且默认不允许同一客户端以多个用户身份同时连接同一台 Samba 服务器。只需在 Windows 端清除旧连接和凭据缓存,再用新用户重新连接即可。
以下是具体操作步骤:
命令行强制断开所有旧连接,这是最直接有效的方法。按下输入
Win+R打开命令提示符,执行命令强制删除所有网络共享连接,命令如下:
cmd
net use * /del /y
执行后会断开当前所有的网络驱动器和 Samba 共享连接,清除旧用户的连接会话。
清除凭据管理器中的缓存凭据:若执行上一步后仍无法切换,可能是凭据被单独缓存了。按输入
Win+R打开凭据管理器,找到对应 Samba 服务器(以服务器 IP 或主机名命名)的凭据条目,选中后点击删除;也可直接进入控制面板的 “用户帐户和家庭安全→凭据管理器”,删除相关 Windows 凭据。
control keymgr.dll
重启 Workstations 服务确保生效:部分情况下旧连接进程可能残留,按输入
Win+R打开服务面板,找到 “Workstations” 服务,右键选择重启,彻底释放旧连接占用的资源。
services.msc
用权限更大的用户重新连接:两种方式可选择。
一是直接在文件资源管理器地址栏输入
\Samba服务器IP
,此时系统会弹出登录框,输入权限更大的用户名和密码即可;二是通过命令行指定用户连接,命令如下(将 Z: 改为自定义盘符,替换服务器 IP、共享名和新用户信息):
net use Z: \服务器IP共享名 /user:权限更大的用户名 *
输入后按提示输入对应密码,就能以新用户身份建立连接。
服务总结
DHCP 提供网络配置服务,额外提供tftp,告知客户端通过哪个tftp服务实现引导。DNS 提供域名解析的。tftp 小型文件传输服务器,专内用来实现网络引导。vsftpd,sftpd 实现专用的文件传输。NFS 网络文件共享,网络文件共享,不支持跨平台,为Linux、unix之间共享。Samba 支持跨平台,Linux、unix、windows之间共享iscsI 网络块存储共享,多路径。mariadb 数据库服务nginx web服务rsync 同步,配合sersync (实时监控变化) 实现实时同步。


