Samba是一个能让Linux系统应用Microsoft网络通讯协议的软件,而SMB是Server Message Block的缩写,即为服务器消息块 ,SMB主要是作为Microsoft的网络通讯协议,后来Samba将SMB通信协议应用到了Linux系统上,就形成了现在的Samba软件。后来微软又把 SMB 改名为 CIFS(Common Internet File System),即公共 Internet 文件系统,较多的用在了Linux与windows之间的数据共享上面。

常见应用

  • 分享档案与打印机服务;
  • 可以提供用户登入 SAMBA 主机时的身份认证,以提供不同身份者的个别数据;
  • 可以进行 Windows 网络上的主机名解析 (NetBIOS name)
  • 可以进行装置的分享 (例如 Zip, CDROM…)

Samba使用的 damons:

NetBIOS 机器间的沟通

  • 取得对方主机的NetBIOS name 定位该主机所在:
  • 利用对方给予权限存取可用资源

SAMBA 使用下面两个服务来控制上面两步骤,分别是:

  • nmbd
    • 这个daemon是用来管理工作组,NetBIOS name等等的解析。
    • 主要利用 UDP 协议开启 port 137 138 来负责名称解析的任务。
  • smbd
    • 这个daemon主要用来管理SAMBA主机分享的目录,档案与打印机等等。
    • 主要利用可靠的TCP协议来传输数据,开放端口为139.

所以SAMBA每次启动至少都需要有这个daemon,而当我启动了SAMBA之后,主机系统就会启动137,138 这两个UDP 及139这个TCP端口。

Samba联机方式

peer/peer(对等模式)

peer/peer 联机的示意图

优点:每部计算机均可以独立运作,而不受他人的影响

缺点:当整个网域内的所有人员都要进行数据分享时,需知道所有计算机里面的账号与密码。

比较适合

  1. 小型的网域
  2. 没有需要常常进行档案数据分享的网络环境
  3. 每个使用者都独自拥有该计算机的拥有权(该计算机是用户的,而不是公用的!)

domain model(主控模式)

将所有的账号与密码都放置在一部主控计算机 (Primary Domain Controller, PDC) 上面,在我的网域里面,任何人想要使用任何计算机时,都需要在屏幕前方输入账号与密码,然后通通藉由 PDC 服务器的辨识后,才给予适当的权限。也就是说,不同的身份还具有不一样的计算机资源权限。

domain model 联机的示意图

Samba服务器搭建

1
2
3
4
5
6
yum -y install samba*
systemctl start smb
systemctl enable smb
firewall-cmd --permanent --add-service=samba
getenforce ##可以显示当前SELinux的应用模式,是强制、执行还是停用
#Permissive

这里的getenforce结果一定要是Permissive 不然selinux可能会阻止了进程

setenforce 0 临时关闭

vim /etc/sysconfig/selinux 永久关闭

\#SELINUX=enforcing

SELINUX=disabled

Samba软件

samba-common主要提供samba服务器的设置文件与设置文件语法检验程序testparm

samba-client客户端软件,主要提供linux主机作为客户端时,所需要的工具指令集

samba-swat基于https协议的samba服务器web配置界面

samba服务器端软件,主要提供samba服务器的守护程序,共享文档,日志的轮替,开机默认选项Samba服务器安装完毕,会生成配置文件目录/etc/samba和其它一些samba可执行命令工具,/etc/samba/smb.conf是samba的核心配置文件。

Samba服务的配置文件

/etc/samba/smb.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
[global] #全局参数
workgroup = SAMBA #定义工作组
security = user #安装验证方式,共4种user、share、server、domain

passdb backend = tdbsam #定义用户后台类型,总共有3种smbpasswd、tdbsam、ldapsam

printing = cups #设置在Samba服务启动时是否共享打印机设备
printcap name = cups
load printers = yes
cups options = raw #打印机的选项

server string = Samba Server Version %v #服务器提示字符,默认显示samba版本
log file = /var/log/samba/log.%m #定义日志文件

[homes]
comment = Home Directories #描述信息
valid users = %S, %D%w%S #有效访问用户
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
force group = @printadmin
create mask = 0664
directory mask = 0775

[common] #共享名称为common
comment = Common share
path = /common #指定共享目录
valid users = tom jerry #有效账户列表
create mask = 0750 #客户端上传文件的默认权限
directorymask = 0775 #客户端创建目录的默认权限
browseable = yes #客户端是否对所有人可见
writable= no #是否允许写入
write list = tom #写权限账户列表
admin users = tom #该共享的管理员,具有完全权限
invalid users = root bin #禁止root与bin访问common共享
guest ok = no #是否允许匿名访问

主要配置参数-[global]

参数 描述
workgroup = WORKGROUP 设定Samba Server所要加入的工作组或域
server string = Samba Server Version %v 设定 Samba Server 的注释,%v表示显示Samba的版本号
netbios name = smbserver 设置Samba Server的NetBIOS名称
interfaces = lo eth0 192.168.12.2/24 192.168.13.2/24 说明:设置Samba Server监听哪些网卡,可以写网卡名,也可以写该网卡的IP地址。
hosts allow = 127. 192.168.1. 192.168.10.1 表示允许连接到Samba Server的客户端,多个参数以空格隔开,hosts deny 与hosts allow 刚好相反。
hosts allow=@example.com 表示允许来自example.com网域的所有计算机连接
hosts allow=172.17.2.EXCEPT172.17.2.50 表示容许来自172.17.2.*的主机连接,但排除172.17.2.50
max connections = 0 max connections用来指定连接Samba Server的最大连接数目。如果超出连接数目,则新的连接请求将被拒绝。0表示不限制
log file = /var/log/samba/log.%m 设置Samba Server日志文件的存储位置以及日志文件名称。在文件名后加个%m(主机名),表示对每台访问Samba Server的机器都单独记录一个日志文件。
max log size = 50 设置Samba Server日志文件的最大容量,单位为kB,0代表不限制
encrypt passwords = yes/no 是否将认证密码加密
smb passwd file = /etc/samba/smbpasswd 如果之前设置的是smbpasswd模式的话
username map = /etc/samba/smbusers 用来定义用户名映射,比如可以将root换成administrator、admin等。不过要事先在smbusers文件中定义好。比如:root = administrator admin,这样就可以用administrator或admin这两个用户来代替root登陆Samba Server,更贴近windows用户的习惯。
guest account = nobody 用来设置guest用户名。
load printers = yes/no 设置是否在启动Samba时就共享打印机。
printcap name = cups 设置共享打印机的配置文件。
printing = cups 设置Samba共享打印机的类型

security = user

  • share不需要提供用户名和口令
  • user共享目录只能被授权的用户访问,密码要在本Samba Server中建立
  • server依靠其他Windows NT/2000或Samba Server来验证用户的账号和密码,是一种代理验证。
  • domain域安全级别,使用主域控制器(PDC)来完成认证

passdb backend = tdbsam

passdb backend表示用户后台,有三种后台:smbpasswdtdbsamldapsam

sam表示security account manager(安全账户管理)

smbpasswd:该方式是使用smb自己的工具smbpasswd来给系统用户(真实用户或者虚拟用户)设置一个Samba密码,客户端就用这个密码来访问Samba的资源。smbpasswd文件默认在/etc/samba目录下,不过有时候要手工建立该文件。

tdbsam:该方式则是使用一个数据库文件来建立用户数据库。数据库文件/etc/samba/passdb.tdb。要建立的Samba用户必须先是系统用户。我们也可以使用pdbedit命令来建立Samba账户。

创建删除Samba账户

1
2
pdbedit –a username	#创建
pdbedit –x username

列出Samba用户列表,读取passdb.tdb数据库文件

1
pdbedit –L

列出Samba用户列表的详细信息

1
pdbedit -Lv

暂停该Samba用户的账号

1
pdbedit -c "[]" -u u

恢复该Samba用户的账号

1
pdbedit –c "[]" –u username

ldapsam该方式则是基于LDAP的账户管理方式来验证用户。首先要建立LDAP服务,然后设置passdb backend = ldapsam:ldap://LDAP Server

主要配置参数-[Share]

参数 描述
comment = 任意字符串 comment是对该共享的描述
path = 共享目录路径 /home/share/下为每个Linux用户以他的用户名建个目录,作为他的共享目录,这样path就可以写成:path = /home/share/%u
path= /home/share/%m 为网络上每台可以访问samba的机器都各自建个以它的netbios名的路径
browseable = yes/no 指定该共享是否可以浏览
writable = yes/no 该共享路径是否可写
available = yes/no 指定该共享资源是否可用
admin users = 该共享的管理者 admin users =david,sandy(多个用户中间用逗号隔开)
valid users = 允许访问该共享的用户
invalid users = 禁止访问该共享的用户
write list = 允许写入该共享的用户

创建共享目录

1
2
3
4
5
6
7
useradd -s /sbin/nologin testuserh
useradd -s /sbin/nologin testuserl
pdbedit -a testuserh
pdbedit -a testuserl
pdbedit -L
mkdir /common
echo "hello world!" > /common/test.txt
1
2
3
4
5
[common]
path = /common
public = yes
browseable = yes
write list = testuserh

linux挂载smb共享目录

安装:yum -y install samba-client cifs-utils

匿名查看smb服务器共享的目录

1
smbclient -L //192.168.77.199 -N

image-20210910161807563

1
smbclient //192.168.201.147/common -U testuserh

image-20210911181952978

NT_STATUS_ACCESS_DENIED opening remote file \xxx.exe

重要!!! 要想使用户可以上传和删除文件,除了系统当中的定义的允许写操作外,目录文件系统也要有写权限才可以
1
2
3
4
5
6
7
8
9
10
11
12
setfacl -m u:testuserh:rwx /common
[root@localhost ~]# getfacl /common/
getfacl: Removing leading '/' from absolute path names
# file: common/
# owner: root
# group: root
user::rwx
user:testuserh:rwx
group::r-x
mask::rwx
other::r-x
netstat –na |grep ESTABLISHED

日志分析

配置

1
2
3
4
5
6
7
Default: log level = 0

Example: log level = 3 passdb:5 auth:10 winbind:2

Example: log level = 1 full_audit:1@/var/log/audit.log winbind:2

log level = 1 auth:3 #以下参考这个配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
all。该参数是可选的:如果您不指定额外的关键字,假定使用 all。
tdb。与不重要的数据库相关的日志消息,这是 Samba 使用的键值存储。
printdrivers。打印机驱动程序管理例程。
lanman。 NT LAN Manager 调试。
smb。 SMB 协议调试。
rpc_parse。远程过程调用(RPCs)解析。
rpc_srv。服务器端 RPCs。
rpc_cli。客户端 RPCs。
passdb。在 Samba 主机上存储密码的旧有方式。
sam。本地 Samba 帐户数据库。
auth。Samba 内与用户身份验证相关的各个模块。
winbind。用于允许Microsoft用户透明地登录到UNIX系统的组件。
vfs。为 Virtual File System 模块调试消息,允许您通过可插入模块添加功能到Samba。
idmap。在UNIX 用户IDs与Microsoft安全标识符之间映射身份。
quota。与配额处理相关的消息,同时由Microsoft Windows NT策略和UNIX文件系统处理。
acls。访问控制列表处理。
locking。文件锁定状态和错误。
msdfs。与 Samba 的分布式文件系统支持相关的日志消息。
dmapi。数据管理应用程序编程接口(API)功能。必须使用第三方DMAPI实现编译Samba来使用该功能。
registry。Windows 注册表的模仿。

成功登录

1
2
[2021/09/11 03:58:39.242932,  2] ../../source3/auth/auth.c:329(auth_check_ntlm_password)
check_ntlm_password: authentication for user [testuserh] -> [testuserh] -> [testuserh] succeeded

image-20210911190147619

失败登录

1
2
[2021/09/11 04:05:06.906891,  3] ../../auth/gensec/spnego.c:1445(gensec_spnego_server_negTokenTarg_step)
gensec_spnego_server_negTokenTarg_step: SPNEGO(ntlmssp) login failed: NT_STATUS_WRONG_PASSWORD

image-20210911190645705

参考链接

第十六章、文件服务器之二: SAMBA 服务器

Samba服务器搭建与配置

samba启动失败

文件共享服务—Samba

Samba