目录
Samba服务简介
samba是一个能让Linux系统应用Microsoft网络通讯协议的软件,其最大的功能是可以用于Linux与windows、linux系统之间的文件共享和打印共享。
SMB是samba 的核心启动服务,主要负责建立 Linux Samba服务器与Samba客户机之间的对话, 验证用户身份并提供对文件和打印系统的访问。
NMB是samba负责解析的服务,类似DNS实现的功能,NMB可以把Linux系统共享的工作组名称与其IP对应起来。
基本操作
[root@CentOS8 ~]# systemctl start smb
[root@CentOS8 ~]# systemctl start nmb
启动
[root@CentOS8 ~]# systemctl status smb
[root@CentOS8 ~]# systemctl status nmb
查看状态
[root@CentOS8 ~]# systemctl stop smb
[root@CentOS8 ~]# systemctl stop nmb
停止
[root@CentOS8 ~]# systemctl enable smb
[root@CentOS8 ~]# systemctl enable nmb
设置开机自启动
[root@CentOS8 ~]# rpm -qa | grep samba 查询是否已经安装
samba-4.13.3-3.el8.x86_64
samba-libs-4.13.3-3.el8.x86_64
samba-common-libs-4.13.3-3.el8.x86_64
samba-client-4.13.3-3.el8.x86_64
pcp-pmda-samba-5.2.5-4.el8.x86_64
samba-common-4.13.3-3.el8.noarch
samba-common-tools-4.13.3-3.el8.x86_64
samba-client-libs-4.13.3-3.el8.x86_64
[root@CentOS8 ~]# rpm -ql samba | grep mbd 查询samba包安装了什么文件
/usr/sbin/nmbd
/usr/sbin/smbd
/usr/share/man/man8/nmbd.8.gz
/usr/share/man/man8/smbd.8.gz
[root@CentOS8 ~]# netstat -tlnp | grep mbd 查看samba服务启用了什么端口
tcp 0 0 0.0.0.0:445 0.0.0.0:* LISTEN 45535/smbd
tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN 45535/smbd
tcp6 0 0 :::445 :::* LISTEN 45535/smbd
tcp6 0 0 :::139 :::* LISTEN 45535/smbd
Samba服务主配置文件
位于/etc/samba/smb.conf目录下,默认配置如下
[global]
workgroup = SAMBA #工作组名称
security = user #安全等级
passdb backend = tdbsam #账号存储后端类型
printing = cups #设置共享打印机类型,这里是cups打印系统
printcap name = cups #设置共享打印机的配置文件
load printers = yes #设置是否在启动samba时共享打印机
cups options = raw #cups打印系统的设置
[homes]
comment = Home Directories #名称
valid users = %S, %D%w%S #%S表示所有samba用户
#%D表示域名或工作组名,%w起路径分隔符作用
#即域名\所有用户,某个域名下的所有用户
browseable = No #不可浏览
read only = No #可读可写
inherit acls = Yes #允许权限继承
[printers]
comment = All Printers #名称
path = /var/tmp #路径
printable = Yes #可打印
create mask = 0600 #创建文件权限
browseable = No #不可浏览
[print$]
comment = Printer Drivers #名称
path = /var/lib/samba/drivers #路径
write list = @printadmin root #具有写入权限的用户组printadmin,用户root
force group = @printadmin
#↑指定文件完全拥有者为printadmin用户组,无论该文件为谁创建
create mask = 0664 #创建文件权限
directory mask = 0775 #创建目录权限
全局配置参数
[global] | 参数 | 作用 |
---|---|---|
workgroup = MYGROUP | 工作组名称(不区分大小写) | |
选填项 | server string = Samba Server Version %v | 服务器注释,可加入%v显示版本号 |
选填项 | netbios name = myserver | 设定主机名,不填会默认采用本机DNS的第一部分,不可与workgroup设置相同 |
选填项 | interfaces = lo ens33 127.0.0.1 192.168.89.128/24 | 设置服务器监听哪些网卡 |
选填项 | hosts allow = 192.168.89.1 | 允许来自192.168.89.1的主机连接 |
192.168.89.EXCEPT192.168.89.110 | 允许来自192.168.89.*的主机连接,但排除192.168.89.110 | |
192.168.89.0/255.255.255.0 | 允许来自192.168.89.0/255.255.255.0子网中所有主机连接 | |
选填项 | hosts deny = 192.168.89.1 | 拒绝来自192.168.89.1的主机连接,其他选项格式同hosts allow |
选填项 | max connections = 20 | 指定连接服务器的最大连接数目,这里若超出20则拒绝新的连接请求,为0时表示不限制数量 |
选填项 | deadtime = 30 | 指定无操作的连接的连接时间,单位为分钟,这里指30分钟,超过30分钟没有打开任何文件将被自动切断,该值若为0则表示服务器不自动切断任何连接 |
选填项 | log file = /var/log/samba/log.%m | 设置服务器日志文件的存储位置和名称,%m代表主机名,即pc1和pc2两台主机访问后会在目录内生成log.pc1和log.pc2两个日志文件 |
选填项 | config file = 路径 | 设置服务器读取时的配置文件读取路径,默认为/etc/samba/smb.conf,该功能还可以给每个用户单独的配置文件,如/etc/samba/%U.smb.conf,这样在登录时会自动读取“用户名.smb.conf”的配置文件,以达到组内用户不同权限的效果 |
选填项 | max log size = 50 | 设置服务器日志文件的最大容量,单位为kb,为0是表示不限制大小 |
security = user | 服务器安全级别,共三种,share等级在samba4中已不再支持 | |
user:用户安全级别,账号密码需在服务器中建立,由服务器本身负责身份认证,下面三种先咕了,日后填坑 | ||
server:服务器安全级别,依靠其他服务器负责验证用户的账号和密码,为代理验证,若验证失败会转为user级别为替代方式进行身份认证 | ||
domain:域安全级别,使用主域控制器完成身份认证 | ||
ads:采用活动目录服务验证 | ||
map to guest = Bad User | share等级 | |
obey pam restrictions = yes/no | 设置是否使用pam限制规则 | |
passdb backend = tdbsam | 定义用户后台类型 | |
smbpasswd:使用smb的工具给系统用户设置密码,客户端使用该账号和密码访问samba资源,smbpasswd默认在/etc/samba目录下 | ||
passdb.tdb可以用smbpasswd -a来建立用户,前提是用户存在,或使用pdbedit -a 或 pdbedit -x 来新建或删除samba用户 | tdbsam:创建数据库文件并使用pdbedit建立SMB独立的用户,数据库文件名为passdb.tdb,默认在/var/lib/samba/private目录下 | |
passdb backend = ldapsam:ldap://LDAP Server | ldapsam:基于LDAP的账户管理方式来验证用户,但首先需要建立LDAP服务 | |
选填项 | encrypt passwords = yes/no | 是否将认证密码加密,默认为yes |
选填项 | smb passwd file = /etc/samba/smbpasswd | 用户后台类型为smbpasswd时smbpasswd文件的默认路径,但smbpasswd文件需要手动创建 |
选填项 | username map = 路径 | 定义用户名映射,类似于给服务器的用户起名字,登录时使用这个名字就可以代表服务器本地用户登录 |
选填项 | guest account = nobody | 用来设置guest用户名 |
选填项 | socket options = TCP_NODELAY SO_RCVBUF=8192 SO_SNDBUF=8192 | 用来设置客户端与服务器间会话的Socket选项,优化传输速度 |
选填项 | domain master = yes/no | 是否成为网域主浏览器 |
选填项 | local master = yes/no | 是否成为本地网域主浏览器 |
选填项 | preferred master = yes/no | 提高成为网域主浏览器的机会,设置为yes时最好把domain master也设为yes |
选填项 | os level = 200 | 该参数决定服务器是否有机会成为本地网域的主浏览器 |
选填项 | domain logons = yes/no | 是否作为本地与控制器,主域控制器和备份域控制器都需要开启此项 |
选填项 | logon script = %u.bat | 设置登录脚本 |
选填项 | wins support = yes/no | 设置服务器是否提供wins服务 |
选填项 | wins server = wins服务器IP地址 | 设置服务器是否使用别的wins服务器提供wins服务 |
选填项 | wins proxy = yes/no | 设置服务器是否开启wins代理服务 |
选填项 | dns proxy = yes/no | 设置服务器是否开启dns代理服务 |
选填项 | password server = 目标IP | 设置用户账号认证服务器,当security = server时生效 |
选填项 | time server = yes/no | 设置让nmbd成为连接到服务器的客户端的时间服务器 |
printing = cups | 设置共享打印机的类型,现支持的打印系统有bsd,sysv,plp,lprng,aix,hupx,qnx | |
printcap name = cups | 设置打印机的配置文件 | |
load printers = yes | 设置是否在启动Samba时共享打印机 | |
cup options = raw | cups打印系统的设置 | |
选填项 | include = 路径 | 嵌套其他文件里的代码,插入到当前行里 |
局部配置参数
[share] | 参数 | 作用 |
---|---|---|
comment = 任意字符串 | 对共享的描述 | |
必填项 | path = 路径 | 指定共享目录的路径,可用%u和%m来代表用户名和客户机的netbios名,如果想为/home/share目录下为每个linux用户以他的用户名建立目录作为共享目录则可以写成path=/home/share/%u;或者以每台访问samba的机器的netbios命名文件夹,可以写成path=/home/share/%m |
browseable = yes/no | 指定该共享是否可以浏览 | |
read only = yes/no | 指定该共享是否只读 | |
writable = yes/no | 指定该共享是否可写(与read only同义) | |
available = yes/no | 指定该共享是否可用 | |
user = 用户名(,@组名) | 可能使用该共享的用户 | |
admin users = 用户名(,@组名) | 用来指定该共享的管理员用户和组 | |
valid users = 用户名(,@组名) | 允许访问该共享的用户和组 | |
invalid users = 用户名(,@组名) | 禁止访问该共享的用户和组 | |
write list = 用户名(,@组名) | 允许写入该共享的用户和组 | |
read list = 用户名(,@组名) | 只允许读取该共享的用户和组 | |
public = yes/no | 指定该共享是否允许guest用户访问 | |
guest ok = yes/no | 和public互为替代项 | |
hosts deny = IP地址 | 拒绝指定IP的主机访问,与allow一样会覆盖全局参数 | |
hosts allow = IP 地址 | 允许指定IP的主机访问 | |
create mode = 八进制数 | 默认值为0744,指定新建文件的访问权限,新建文件的访问权限与create mode进行按位与操作,计算后与force create mode进行按位或操作,得到的结果为新建文件的访问权限 | |
force create mode = 八进制数 | 默认值为0000 | |
directory mode = 八进制数 | 默认值为0755,指定新建目录的访问权限,新建目录的访问权限与directory mode进行按位与操作,计算后与force directory mode进行按位或操作,得到结果即为新建目录的访问权限 | |
force directory mode = 八进制数 | 默认值为0000 | |
force user = 用户 | 强制指定文件的属主 |
题一
创建共享资源
组 | 用户 | 权限 |
Fin | Fin01,Fin02 | 对financial有读取和写入权限,无法访问manager,对exchange有读取和写入权限,对public有读取权限 |
Net | Net01,Net02 | 对manager有读取权限,对exchange有读取和写入权限,对financial有读取权限,对public有读取权限 |
Man | Man01,Man02 | 对manager有读取和写入权限,对exchange有读取和写入权限,对financial有读取权限,对public有读取权限 |
创建系统用户组和系统用户并查看
[root@CentOS8 ~]# groupadd Fin 建立Fin组
[root@CentOS8 ~]# groupadd Net 建立Net组
[root@CentOS8 ~]# groupadd Man 建立Man组
[root@CentOS8 ~]# useradd -g Fin Fin01 创建Fin01用户并将Fin01加入Fin组中
[root@CentOS8 ~]# useradd -g Fin Fin02 创建Fin02用户并将Fin02加入Fin组中
[root@CentOS8 ~]# useradd -g Net Net01 创建Net01用户并将Net01加入Net组中
[root@CentOS8 ~]# useradd -g Net Net02 创建Net02用户并将Net02加入Net组中
[root@CentOS8 ~]# useradd -g Man Man01 创建Man01用户并将Man01加入Man组中
[root@CentOS8 ~]# useradd -g Man Man02 创建Man02用户并将Man02加入Man组中
查询6个用户的信息
[root@CentOS8 ~]# id Fin01
uid=1001(Fin01) gid=1001(Fin) 组=1001(Fin)
[root@CentOS8 ~]# id Fin02
uid=1002(Fin02) gid=1001(Fin) 组=1001(Fin)
[root@CentOS8 ~]# id Net01
uid=1003(Net01) gid=1002(Net) 组=1002(Net)
[root@CentOS8 ~]# id Net02
uid=1004(Net02) gid=1002(Net) 组=1002(Net)
[root@CentOS8 ~]# id Man01
uid=1005(Man01) gid=1003(Man) 组=1003(Man)
[root@CentOS8 ~]# id Man02
uid=1006(Man02) gid=1003(Man) 组=1003(Man)
[root@CentOS8 ~]# tail /etc/passwd -n6
Fin01:x:1001:1001::/home/Fin01:/bin/bash
Fin02:x:1002:1001::/home/Fin02:/bin/bash
Net01:x:1003:1002::/home/Net01:/bin/bash
Net02:x:1004:1002::/home/Net02:/bin/bash
Man01:x:1005:1003::/home/Man01:/bin/bash
Man02:x:1006:1003::/home/Man02:/bin/bash
对系统用户设置Samba密码
[root@CentOS8 ~]# smbpasswd -a Fin01
New SMB password:
Retype new SMB password:
Added user Fin01.
[root@CentOS8 ~]# smbpasswd -a Fin02
New SMB password:
Retype new SMB password:
Added user Fin02.
[root@CentOS8 ~]# smbpasswd -a Net01
New SMB password:
Retype new SMB password:
Added user Net01.
[root@CentOS8 ~]# smbpasswd -a Net02
New SMB password:
Retype new SMB password:
Added user Net02.
[root@CentOS8 ~]# smbpasswd -a Man01
New SMB password:
Retype new SMB password:
Added user Man01.
[root@CentOS8 ~]# smbpasswd -a Man02
New SMB password:
Retype new SMB password:
Added user Man02.
查看已设置Samba密码的用户
[root@CentOS8 ~]# pdbedit -L
Fin01:1001:
Net01:1003:
Man01:1005:
Fin02:1002:
Net02:1004:
Man02:1006:
建立共享资源目录并分配权限
[root@CentOS8 ~]# mkdir -p /usr/financial
[root@CentOS8 ~]# mkdir -p /usr/manager
[root@CentOS8 ~]# mkdir -p /usr/exchange
[root@CentOS8 ~]# mkdir -p /usr/public
[root@CentOS8 ~]# chmod 777 /usr/financial
[root@CentOS8 ~]# chmod 777 /usr/manager
[root@CentOS8 ~]# chmod 777 /usr/exchange
[root@CentOS8 ~]# chmod 777 /usr/public
设为777方便文件操作,具体用户权限需要在samba里再次分配
修改主配置文件
[root@CentOS8 ~]# vim /etc/samba/smb.conf
在文件末尾增加四个共享,分别为financial,manager,exchange和public
[financial]
comment = financial
path = /usr/financial
browseable = yes #指定文件是否可以读取,此处为是
public = no #指定文件是否允许游客访问,此处为否
write list = @Fin #指定可以写入数据的成员,此处为Fin组的用户
[manager]
comment = manager
path = /usr/manager
browseable = yes #指定文件是否可以读取,此处为是
writable = no #指定文件是否可以写入,此处为否
public = no #指定文件是否允许游客访问,此处为否
valid users = @Man,@Net #指定可以访问的成员,此处为Man组和Net组用户可以访问
write list = @Man #指定可以写入数据的成员,此处问Man组的用户
[exchange]
comment = exchange
path = /usr/exchange
browseable = yes #指定文件是否可以读取,此处为是
writable = yes #指定文件是否可以写入,此处为是
public = no #指定文件是否允许游客访问,此处为否
[public]
comment = public
path = /usr/public
browseable = yes #指定文件是否可以读取,此处为是
writable = no #指定文件是否可以写入,此处为否
public = no #指定文件是否允许游客访问,此处为否
测试代码正确性
[root@CentOS8 ~]# testparm
Load smb config files from /etc/samba/smb.conf
Loaded services file OK.
Weak crypto is allowed
Server role: ROLE_STANDALONE
Press enter to see a dump of your service definitions
# Global parameters
[global]
config file = /etc/samba/%U.smb.conf
printcap name = cups
security = USER
username map = /etc/samba/smbusers
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
[financial]
comment = financial
path = /usr/financial
write list = @Fin
[manager]
comment = manager
path = /usr/manager
valid users = @Man @Net
write list = @Man
[exchange]
comment = exchange
path = /usr/exchange
read only = No
[public]
comment = public
path = /usr/public
登录验证
分别用六个账户登录
Fin组
访问manager共享时
写入至public共享时
Net组
写入至financial共享时
写入至manager共享时
写入至public共享时
Man组
写入至financial共享时
写入至public共享时
题二
设置用户账号映射
用户账号映射是为了确保系统用户的安全而存在的一项功能
将系统用户的ID转换成另一个不存在的ID,身份验证时使用该不存在ID来进行身份验证,这样访问者无法得知系统用户的真正ID
用户 | 映射后的用户名 |
smbuser | test01 |
开启账号映射功能
[global]
workgroup = SAMBA
security = user
passdb backend = tdbsam
username map = /etc/samba/smbusers #增加这一行
printing = cups
printcap name = cups
load printers = yes
cups options = raw
创建账号映射文件
[root@CentOS8 ~]# vim /etc/samba/smbusers
smbuser = test01
登录验证
题三
主机访问控制
指定部分主机可以访问该共享,避免安全隐患,此处以public共享为例
设置拒绝访问
[public]
comment = public
path = /usr/public
browseable = yes
writable = no
public = no
hosts deny = 192.168.89. #拒绝192.168.89网段的主机访问
设置允许访问
[public]
comment = public
path = /usr/public
browseable = yes
writable = no
public = no
hosts deny = 192.168.89.
hosts allow = 192.168.89.1
#允许IP为192.168.89.1的主机访问,即当前虚拟网卡IP
#hosts allow优先级比hosts deny优先级更高,所以可以访问
登录验证
windows主机正常访问
使用linux主机访问
[root@CentOS8 ~]# smbclient //192.168.89.128/public -U test01
Enter SAMBA\test01's password:
tree connect failed: NT_STATUS_ACCESS_DENIED
题四
客户端限制用户登录
demo01 | 物理机 | 192.168.89.1 | 可登录 |
demo01 | 虚拟机 | 192.168.89.241 | 可登录 |
demo02 | 物理机 | 192.168.89.1 | 不可登录 |
demo02 | 虚拟机 | 192.168.89.241 | 可登录 |
修改主配置文件
[root@CentOS8 ~]# vim /etc/samba/smb.conf
[global]
workgroup = SAMBA
security = user
passdb backend = tdbsam
username map = /etc/samba/smbusers
printing = cups
printcap name = cups
load printers = yes
cups options = raw
obey pam restrictions = yes #增加这一行,开启pam认证模块
修改pam.d目录下的samba认证文件
[root@CentOS8 ~]# vim /etc/pam.d/samba
#%PAM-1.0
auth required pam_nologin.so
auth include password-auth
account required pam_access.so accessfile=/etc/samba/smblogin
account include password-auth #↑增加这一行,开启pam_access.so认证模块
session include password-auth
password include password-auth
创建smb.login文件
[root@CentOS8 ~]# vim /etc/samba/smblogin
+:demo01:192.168.89. #允许demo01在192.168.89.0网段上访问samba服务
-:demo02:192.168.89.1 #拒绝demo02在192.168.89.1主机上访问samba服务
登录验证
在物理机上demo01用户正常访问
在物理机上demo02用户拒绝访问
在虚拟机上demo01用户正常访问
[root@CentOS8 ~]# smbclient //192.168.89.128/exchange -U demo01
Enter SAMBA\demo01's password:
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Fri Mar 4 21:59:28 2022
.. D 0 Thu Mar 3 10:22:25 2022
gg.txt A 3 Fri Mar 4 21:32:25 2022
18555904 blocks of size 1024. 11120456 blocks available
在虚拟机上demo02用户正常访问
[root@CentOS8 ~]# smbclient //192.168.89.128/exchange -U demo02
Enter SAMBA\demo02's password:
Try "help" to get a list of possible commands.
smb: \> ls
. D 0 Fri Mar 4 21:59:28 2022
.. D 0 Thu Mar 3 10:22:25 2022
gg.txt A 3 Fri Mar 4 21:32:25 2022
18555904 blocks of size 1024. 11120456 blocks available
题五
为samba用户设置独立配置文件
实现不同用户间都有不同的独立权限,相同的组内用户也有不同的权限
修改主配置文件
[global]
workgroup = SAMBA
security = user
passdb backend = tdbsam
username map = /etc/samba/smbusers
printing = cups
printcap name = cups
load printers = yes
cups options = raw
# obey pam restrictions = yes #注释pam认证模块,这题用不到
config file = /etc/samba/%U.smb.conf
#使用户设置文件在登录时检查本地是否存在对应用户的配置文件,若存在则调用它
[myshare]
comment = mysahre
path = /share
public = yes
valid users = @sales
write list = demo02
read only = no
browseable = no
指定demo02用户配置文件
[root@CentOS8 ~]# cp -a /etc/samba/smb.conf /etc/samba/demo02.smb.conf
[root@CentOS8 ~]# vim /etc/samba/demo02.smb.conf
[myshare]
comment = mysahre
path = /share
public = yes
valid users = @sales
write list = demo02
read only = no
#删除最后一行的browseable = no
登录验证
demo01用户无法浏览myshare共享
demo02用户可以浏览myshare共享
注意事项
- 本文颜色为紫色的字体为博主也不懂的知识,待日后知识储备足够后再补齐
- 该篇文章为操作方便而将防火墙直接关闭并修改SElinux模式为Permissive在工作中切勿使用该方法,推荐修改安全上下文和将两个核心服务加入防火墙允许的服务里,这里不作赘述
- samba服务在构建运行环境的过程中容易遇到一些麻烦,此处推荐一篇帮助博主解决的文章错误代码解决办法,包含且不限于(手动doge)代码0x80070035,0x80004005,0x800704cf
易错点
- 从samba4起不再支持share安全等级,解决办法见全局配置参数表格
[root@CentOS8 ~]# testparm
Load smb config files from /etc/samba/smb.conf
WARNING: Ignoring invalid value 'share' for parameter 'security'
Error loading services.
- 添加samba用户前需要查询用户是否已存在,否则会失败
[root@CentOS8 ~]# smbpasswd -a cykablyat
New SMB password:
Retype new SMB password:
Failed to add entry for user cykablyat.
- 各个指令间功能重合部分不能同时出现,否则可能出现共享权限分配未达到理想权限
- 分配读写权限后在虚拟机内使用root用户创建的文件在共享内打开后无法编辑也无法删除,是因为文件权限不够,因此验证是否有读写权限要靠创建文件来验证
- 输入正确密码后依然无法通过身份验证,该问题常出现在win7上,解决办法:前往本地安全策略——>安全设置——>本地策略——>安全选项,找到“网络安全:LAN管理器身份验证级别”一项,更改属性为“仅发送NTLMv2响应”