Linux服务之Samba服务器


纸上得来终觉浅,绝知此事要躬行。

Linux服务之Samba服务器


1. 基础知识

1.1 Samba 服务介绍

1987年,微软公司和英特尔公司共同制定了SMBServer Messages Block服务器消息块)协议,旨在解决局域网内的文件或打印机等资源的共享问题,这也使得在多个主机之间共享文件变得越来越简单。到了1991年,当时还在读大学的Tridgwell为了解决Linux系统与Windows系统之间的文件共享问题,基于SMB协议开发出了SMBServer服务程序。这是一款开源的文件共享软件,经过简单配置就能够实现Linux系统与Windows系统之间的文件共享工作。

所需的软件包括:

  • Samba服务端软件包
  • Samba-client客户端软件包
  • Samba-common公共文件软件包

Sambasmbdnmbd两个守护进程组成,两个进程的启动脚本相互独立。

  • nmbd
    • nmb启动脚本:/etc/rc.d/init.d/nmb
    • nmbd服务进程提供NetBIOS名称服务,以满足基于通过网络文件系统(CIFS)协议的共享访问环境
    • NetBIOS名称服务是Windows基于于主机实现互相通信的机制,性能差,一般使用CIFS
    • smbd服务默认监听的端口是UCP协议的137,通过nmb服务启动nmbd进程
  • smbd
    • smb启动脚本:/etc/rc.d/init.d/smb
    • smbd服务进程为客户端提供文件共享与打印机服务,还负责用户权限验证以及锁功能
    • smbd服务默认监听的端口是TCP协议的139445,通过smb服务启动smbd进程

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服务之Samba服务器

  • 如果已经清空了Linux系统上iptables防火墙的默认策略,应该能看到Samba共享服务的登录界面

Linux服务之Samba服务器

  • 正确输入escape账户名以及使用pdbedit命令设置的密码后,就可以登录到共享界面中了

Linux服务之Samba服务器


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 .

文章作者: Escape
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Escape !
  目录