纸上得来终觉浅,绝知此事要躬行。
1. 基础知识
1.1 Samba 服务介绍
1987
年,微软公司和英特尔公司共同制定了SMB
(Server Messages Block
,服务器消息块)协议,旨在解决局域网内的文件或打印机等资源的共享问题,这也使得在多个主机之间共享文件变得越来越简单。到了1991
年,当时还在读大学的Tridgwell
为了解决Linux
系统与Windows
系统之间的文件共享问题,基于SMB
协议开发出了SMBServer
服务程序。这是一款开源的文件共享软件,经过简单配置就能够实现Linux
系统与Windows
系统之间的文件共享工作。
所需的软件包括:
Samba
服务端软件包Samba-client
客户端软件包Samba-common
公共文件软件包
Samba
由smbd
和nmbd
两个守护进程组成,两个进程的启动脚本相互独立。
nmbd
- nmb启动脚本:
/etc/rc.d/init.d/nmb
nmbd
服务进程提供NetBIOS
名称服务,以满足基于通过网络文件系统(CIFS
)协议的共享访问环境NetBIOS
名称服务是Windows
基于于主机实现互相通信的机制,性能差,一般使用CIFS
smbd
服务默认监听的端口是UCP
协议的137
,通过nmb
服务启动nmbd
进程
- nmb启动脚本:
smbd
- smb启动脚本:
/etc/rc.d/init.d/smb
smbd
服务进程为客户端提供文件共享与打印机服务,还负责用户权限验证以及锁功能smbd
服务默认监听的端口是TCP
协议的139
与445
,通过smb
服务启动smbd
进程
- smb启动脚本:
1.2 安装 Samba 服务程序
[root@localhost ~ ]# yum install samba
Loaded plugins: langpacks, product-id, subscription-manager
………………省略部分输出信息………………
Installing:
samba x86_64 4.1.1-31.el7 rhel 527 k
Transaction Summary
================================================================================
Install 1 Package
samba.x86_64 0:4.1.1-31.el7
Complete!
2. Samba 服务主配置文件
Samba
服务程序的主配置文件与前面学习过的Apache
服务很相似,包括全局配置参数和区域配置参数。全局配置参数用于设置整体的资源共享环境,对里面的每一个独立的共享资源都有效。区域配置参数则用于设置单独的共享资源,且仅对该资源有效。创建共享资源的方法很简单,如下表自定义共享配置。
- 主配置文件
/etc/samba/smb.conf
2.1 全局设定
- 全局设定:可以共享的设置
[global] | 子参数 | 参数描述信息 |
---|---|---|
workgroup = MYGROUP |
- | 工作组名称 |
server string = Samba Version %v |
- | 服务器介绍信息,参数%v 为显示 SMB 版本号 |
netbios name = xxx |
- | 定义 netbios 名称 |
log file = /var/log/samba/log.%m |
- | 定义日志文件的存放位置与名称,参数%m 为来访的主机名 |
max log size = 50 |
- | 定义日志文件的最大容量为 50KB,超过就会自动滚动 |
interfaces = xxx |
- | 指定 Samba 服务监听的接口 |
hosts allow = xxx |
- | 使用基于 IP 地址的访问控制 |
- | ||
security = user |
- | 安全验证的方式,总共有 4 种 |
- | #share |
来访主机无需验证口令;比较方便,但安全性很差 |
- | #user |
需验证来访主机提供的口令后才可以访问;提升了安全性 |
- | #server |
使用独立的远程主机验证来访主机提供的口令(集中管理账户) |
- | #domain |
使用域控制器进行身份验证 |
passdb backend = tdbsam |
- | 定义用户后台的类型,共有 3 种 |
- | #smbpasswd |
使用 smbpasswd 命令为系统用户设置 Samba 服务程序的密码 |
- | #tdbsam |
创建数据库文件并使用 pdbedit 命令建立 Samba 服务程序的用户 |
- | #ldapsam |
基于 LDAP 服务进行账户验证 |
load printers = yes |
- | 设置在 Samba 服务启动时是否共享打印机设备 |
cups options = raw |
- | 打印机的选项 |
2.2 私有家目录
- 私有家目录:不能共享的设置
[homes] | 共享参数 |
---|---|
comment = Home Directories |
描述信息 |
browseable = no |
指定共享信息是否在“网上邻居”中可见 |
writable = yes |
定义是否可以执行写入操作,与“read only”相反 |
2.3 打印机共享
- 打印机共享:可以共享的设置
[printers] | 打印机共享参数 |
---|---|
comment = All Printers |
定义打印机描述信息 |
path = /var/spool/samba |
共享文件的实际路径(重要) |
browseable = no |
指定共享信息是否在“网上邻居”中可见 |
guest ok = no |
是否所有人可见,等同于”public”参数 |
writable = no |
定义是否可以执行写入操作,与“read only”相反 |
printable = yes |
是否可打印 |
2.4 自定义共享
- 自定义共享:不能共享的设置
[shared_name] | 自定义共享名称 |
---|---|
comment = Comment String |
描述信息 |
path = /path/to/share_directory |
定义共享目录 |
public = {yes | no} |
是否允许公开访问 |
guest ok = {yes | no} |
是否允许来宾账号访问,类似于 public |
writable = {yes | no} |
是否允许可以写 |
read only = {yes | no} |
是否允许可以写,类似于 writable |
write list = +GROUP_NAME |
指定可写用户列表,可为用户或组名 |
3. Samba 服务命令工具
smbclient
命令用于交互式的数据访问smbpasswd
命令为Samba
账号系统独立密码pdbedit
命令用于管理SMB
服务程序的账户信息数据库testparm
命令,用于测试配置文件是否有语法错误,以及显示最终生效的配置
3.1 smbclient 命令
- 注意事项
smbclient
命令可以直接指定用户名和密码,也可以交互式给定- 查看指定主机上用户的所有共享的资源
- 使用方式
- 查看指定主机上用户的所有共享的资源:
smbclient -L HOST -U USERNAME
- 获取到共享信息:
smbclint //SERVER/shared_name -U USERNAME
- 查看指定主机上用户的所有共享的资源:
# 1、列出某个IP地址所提供的共享文件夹
smbclient -L 198.168.0.1 -U username%password
# 2、像FTP客户端一样使用smbclient
# 有许多命令和ftp命令相似,如cd 、lcd、get、megt、put、mput等
smbclient //192.168.0.1/tmp -U username%password
# 3、直接一次性使用smbclient命令
smbclient -c "ls" //192.168.0.1/tmp -U username%password
smbclient //192.168.0.1/tmp -U username%password
smb:/>ls
# 4、除了使用smbclient,还可以通过mount和smbcount挂载远程共享文件夹
# 挂载
mount -t cifs -o username=escape,password=123456 //192.168.0.1/tmp /mnt/tmp
# 取消挂载
umount /mnt/tmp
3.2 smbpasswd 命令
客户端访问Samba
共享服务所使用的账号名称就是服务器端系统中真实存在的系统账号名称,但是不同于微软的共享设置,访问Samba
共享的密码必须是独立的Samba
密码,而不能使系统密码。即使有人获取了Samba
的账号和密码,也难以控制系统。
注意事项
smbpasswd
命令为系统用户添加Samba
登录密码
命令参数
参数 | 作用 |
---|---|
-a 用户名 |
添加 Samba 账户并设置密码 |
-x 用户名 |
删除 Samba 账户 |
-d 用户名 |
禁用 Samba 账户 |
-e 用户名 |
启用 Samba 账户 |
[root@localhost ~ ]# smbpasswd -a escape
3.3 pdbedit 命令
- 注意事项
pdbedit
命令用于管理SMB
服务程序的账户信息数据库,格式为“pdbedit [选项] 账户”- 在第一次把账户信息写入到数据库时需要使用
-a
参数,以后在执行修改密码、删除账户等操作时就不再需要该参数了
- 命令参数
参数 | 作用 |
---|---|
-a 用户名 |
建立 Samba 用户 |
-x 用户名 |
删除 Samba 用户 |
-L |
列出用户列表 |
-Lv |
列出用户详细信息的列表 |
[root@localhost ~ ]# pdbedit -a escape
4. 实战演示
4.1 服务端配置
- 第 1 步:创建用于访问共享资源的账户信息
CentOS
系统中,Samba
服务程序默认使用的是用户口令认证,即user
模式- 只有建立账户信息数据库之后,才能使用用户口令认证模式,确保仅让有密码且受信任的用户访问共享资源
Samba
服务的数据库要求账户必须在当前系统中已经存在,否则日后创建文件时将导致文件的权限属性混乱不堪
[root@localhost ~]# id escape
uid=1000(escape) gid=1000(escape) groups=1000(escape)
[root@localhost ~]# pdbedit -a -u escape
new password:此处输入该账户在Samba服务数据库中的密码
retype new password:再次输入密码进行确认
Unix username: escape
NT username:
Account Flags: [U ]
User SID: S-1-5-21-507407404-3243012849-3065158664-1000
Primary Group SID: S-1-5-21-507407404-3243012849-3065158664-513
Full Name: escape
Home Directory: \\\\localhost\escape
HomeDir Drive:
Logon Script:
Profile Path: \\localhost\escape\profile
Domain: LOCALHOST
Account desc:
Workstations:
Munged dial:
Logon time: 0
Logoff time: Wed, 06 Feb 2036 10:06:39 EST
Kickoff time: Wed, 06 Feb 2036 10:06:39 EST
Password last set: Mon, 13 Mar 2017 04:22:25 EDT
Password can change: Mon, 13 Mar 2017 04:22:25 EDT
Password must change: never
Last bad password : 0
Bad password count : 0
Logon hours : FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
第 2 步:创建用于共享资源的文件目录
- 在创建时,不仅要考虑到文件读写权限的问题,还需要考虑应用于该目录的
SELinux
安全上下文所带来的限制 Samba
配置文件中就有关于SELinux
安全上下文策略的说明,只需按照说明中给的值进行修改即可- 修改完毕后执行
restorecon
命令,让应用于目录的新SELinux
安全上下文立即生效
[root@localhost ~]# mkdir /home/database
[root@localhost ~]# chown -Rf escape:escape /home/database
[root@localhost ~]# semanage fcontext -a -t samba_share_t /home/database
[root@localhost ~]# restorecon -Rv /home/database
restorecon reset /home/database context unconfined_u:object_r:home_root_t:s0->unconfined_u:object_r:samba_share_t:s0
第 3 步:设置 SELinux 服务与策略
- 设置
SELinux
服务与策略,使其允许通过Samba
服务程序访问普通用户家目录 - 执行
getsebool
命令筛选出所有与Samba
相关的SELinux
域策略 - 根据策略的名称和经验,在使用
setsebool
命令选择出正确的策略条目进行开启
[root@localhost ~]# getsebool -a | grep samba
samba_create_home_dirs --> off
samba_domain_controller --> off
samba_enable_home_dirs --> off
samba_export_all_ro --> off
samba_export_all_rw --> off
samba_portmapper --> off
samba_run_unconfined --> off
samba_share_fusefs --> off
samba_share_nfs --> off
sanlock_use_samba --> off
use_samba_home_dirs --> off
virt_sandbox_use_samba --> off
virt_use_samba --> off
[root@localhost ~]# setsebool -P samba_enable_home_dirs on
第 4 步:修改 Samba 服务的主配置文件
- 在配置文件中,
[homes]
参数为来访用户的家目录共享信息,[printers]
参数为共享的打印机设备 - 如果这两项如果在今后的工作中不需要,可以像手动删除,这没有任何问题,需要的时候可以手动再次创建
[root@localhost ~]# vim /etc/samba/smb.conf
[global]
workgroup = MYGROUP
server string = Samba Server Version %v
log file = /var/log/samba/log.%m
max log size = 50
security = user
passdb backend = tdbsam
load printers = yes
cups options = raw
[database]
comment = Do not arbitrarily modify the database file
path = /home/database
public = no
writable = yes
第 5 步:重启 smb 服务
[root@localhost ~]# systemctl restart smb
[root@localhost ~]# systemctl enable smb
ln -s '/usr/lib/systemd/system/smb.service' '/etc/systemd/system/multi-user.target.wants/smb.service'
[root@localhost ~]# iptables -F
[root@localhost ~]# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
4.2 Windows 客户端
Samba
服务程序可以解决Linux
系统和Windows
系统的资源共享问题
- 要在
Windows
系统中访问共享资源,只需要在命令框中输入两个反斜杠,然后再加服务器的IP
地址即可
- 如果已经清空了
Linux
系统上iptables
防火墙的默认策略,应该能看到Samba
共享服务的登录界面
- 正确输入
escape
账户名以及使用pdbedit
命令设置的密码后,就可以登录到共享界面中了
4.3 Linux 客户端
Samba
服务程序还可以实现Linux
系统之间的文件共享
- 客户端安装支持文件共享服务的软件包
cifs-utils
[root@localhost ~]# yum install cifs-utils
Loaded plugins: langpacks, product-id, subscription-manager
......
Installing:
cifs-utils x86_64 6.2-6.el7 rhel 83 k
Transaction Summary
================================================================================
Install 1 Package
cifs-utils.x86_64 0:6.2-6.el7
Complete!
- 在
Linux
客户端,按照Samba
服务的用户名、密码、共享域的顺序将相关信息写入到一个认证文件中 - 为了保证不被其他人随意看到,最后把这个认证文件的权限修改为仅
root
管理员才能够读写
[root@localhost ~]# vim auth.smb
username=escape
password=redhat
domain=MYGROUP
[root@localhost ~]# chmod -Rf 600 auth.smb
- 在
Linux
客户端上创建一个用于挂载Samba
服务共享资源的目录 - 把挂载信息写入到
/etc/fstab
文件中,以确保共享挂载信息在服务器重启后依然生效
[root@localhost ~]# mkdir /database
[root@localhost ~]# vim /etc/fstab
/dev/mapper/rhel-root / xfs defaults 1 1
UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b /boot xfs defaults 1 2
/dev/mapper/rhel-swap swap swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0
//192.168.10.10/database /database cifs credentials=/root/auth.smb 0 0
[root@localhost ~]# mount -a
# 或者自行手动挂载
mount -t cifs //SERVER/shared_name /mount_point -o username=USERNAME,password=PASSWORD
- 进入到挂载目录
/database
后就可以看到Windows
系统访问Samba
服务程序时留下来的文件了
[root@localhost ~]# cat /database/Memo.txt
i can edit it .