Samba服务配置详解

Samba服务介绍

简单的来讲Samba是一个基于SMB协议(Server Messages Block,信息服务块)在Linux和UNIX系统上实现不同操作系统之间文件共享和打印机共享的开源软件。

Samba有两个主要的进程smbdnmbd。smbd进程提供了文件和打印机共享,而nmbd则提供了NetBIOS名称服务和浏览支持,帮助SMB客户定位服务器,处理所有基于UDP的协议,使主机能浏览Linux服务器。smbd进程使用的是TCP 端口139 和 445,nmbd进程使用的是UDP 端口138和139

安装

[root@server ~]# yum install -y samba samba-client

samba-client:这个组件则提供了当 Linux 做为Samba Client 端时,所需要的工具指令。这个组件不安装也可以无影响,它可以实现远程连接Samba共享文件,和FTP客户端样的操作。

主配置文件详解

Samba服务的主配置文件为/etc/samba/smb.conf,其可以分为两部分,一个是全局设置参数,一个是文件共享设置参数。
配置文件详解参考了这篇文章https://blog.csdn.net/weixin_40806910/article/details/81917077,非常详细,可以收藏一波,学习学习。

[global]		//全局配置参数
	workgroup = MYGROUP			//工作组名称											
	server string = Samba Server Version %v			//samba服务器的介绍信息,%v为显示SMB的版本号	
	netbios name = smbserver						//设置Samba服务的NetBIOS名称。如果不填,则默认会使用该服务器的DNS名称的第一部分。注意netbios name和workgroup名字不要设置成一样了。
	interfaces = lo eth0 192.168.12.2/24 192.168.13.2/24			//设置Samba服务监听哪些网卡,可以写网卡名,也可以写该网卡的IP地址。
	hosts allow = 192.168.10. 192.168.20.1					//表示允许连接到Samba服务器的客户端,多个参数以空格隔开。可以用一个IP表示,也可以用一个网段表示。
			还有多种方式,例如:
				hosts allow=172.17.2.EXCEPT 172.17.2.50
					表示容许来自172.17.2.*的主机连接,但排除172.17.2.50
				hosts allow=172.17.2.0/255.255.0.0
					表示容许来自172.17.2.0/255.255.0.0子网中的所有主机连接
				hosts allow=M1,M2
					表示容许来自M1和M2两台计算机连接
				hosts allow=@pega
					表示容许来自pega网域的所有计算机连接
	max connections = 0          	 /用来指定连接Samba服务的最大连接数目。如果超出连接数目,则新的连接请求将被拒绝。0表示不限制。
	deadtime = 0		 	    	 //用来设置断掉一个没有打开任何文件的连接的时间。单位是分钟,0代表Samba Server不自动切断任何连接。
	log file = /var/log/samba/log.%m				//定义日志文件的存放位置与名称,参数%m为来访主机名					
	max log size = 50				 //定义日志文件的最大容量
	security = user					
				//定义用户访问samba的安全验证方式,共四种
							1.share:来访主机无需验证用户名和密码,安全性低。
							2.user:需要验证来访主机的用户名和密码。
							3.server:使用独立的远程主机来验证来访主机的用户名和密码,是一种代理验证。其实就是用 远程服务器集中管理全部用户和口令,如果认证失败,Samba将使用user模式作为替代的方式。
							4.domain:使用域控制器进行身份验证。
	passdb backend = tdbsam
				//定义用户后台的类型,共三种
							1.smbpasswd:使用smbpasswd命令为系统用户设置Samba服务的密码。
							2.tdbsam:使用一个数据库文件来创建用户数据库,数据库文件名为passdb.tdb,位于/var/lib/samba/private/passdb.tdb,可使用smbpasswd或pdbedit这两个命令来为系统用户设置Samba服务的密码 。
							3.ldapsam:基于LDAP服务进行身份验证。
	load printers = yes					//设置在Samba服务启动时是否共享打印机
	
[共享名]
	comment =  描述						 	//对该共享的描述,可以是任意字符串。
	path = 共享目录路径			   		 	//用来指定共享目录的路径。可以用%u、%m这样的宏来代替路径里的unix用户和客户机的Netbios名,用宏表示主要用于[homes] 共享域。例如:如果我们不打算用home段做为客户的共享,而是在/home/share/下为每个Linux用户以他的用户名建个目录,作为他的共享目 录,这样path就可以写成:path = /home/share/%u; 。用户在连接到这共享时具体的路径会被他的用户名代替,要注意这个用户名路径一定要存在,否则,客户机在访问时会找不到网络路径。同样,如果我们不是以用 户来划分目录,而是以客户机来划分目录,为网络上每台可以访问samba的机器都各自建个以它的netbios名的路径,作为不同机器的共享资源,就可以 这样写:path = /home/share/%m 。
	browseable = yes/no			   		 	//用来指定该共享是否可以浏览。
	writable = yes/no					 	//用来指定该共享路径是否可写。
	write list = 允许写入该共享的用户		 	//指定可以在该共享下写入文件的用户。
	read list = 用户						//指定只能读取该共享资源的用户和组。
	available = yes/no					 	//用来指定该共享资源是否可用。
	admin users = 该共享的管理者			 	//指定该共享的管理员(对该共享具有完全控制权限)。在samba 3.0中,如果用户验证方式设置成“security=share”时,此项无效。多个用户中间用逗号隔开,如果要加入一个组就用“@组名”表示。
	valid users = 允许访问该共享的用户	 	//用来指定允许访问该共享资源的用户。多个用户或者组中间用逗号隔开,如果要加入一个组就用“@组名”表示。
	invalid users = 禁止访问该共享的用户	 	//用来指定不允许访问该共享资源的用户。多个用户中间用逗号隔开,如果要加入一个组就用“@组名”表示。
	public = yes/no							//用来指定该共享是否允许guest账户访问。
	guest ok = yes/no						//意义同“public”。


//特殊的几个共享
[homes]			//用户家目录的共享参数
	comment = Home Directories				//描述信息
	browseable = no							
	writable = yes
[printers]		//打印机共享参数
	comment = All Printers
	path = /var/spool/samba
	browseable = no
	guest ok = no
	writable = no
	printable = yes			//指明打印机是否可打印	

注:Samba安装好后,可以使用testparm命令可以测试smb.conf配置是否正确。使用testparm –v命令可以详细的列出smb.conf支持的配置参数。

实例

我们先配置一个简单的共享资源。创建一个名为test的共享资源,该资源可浏览、可写入、不允许匿名用户访问。

[root@server ~]# 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 
[test]
        comment = a simple shared file
        path = /test
        browseable = yes
        writable = yes
        public = no

Samba服务默认的安全验证方式是user, 因此要建立用户数据库,使用pdbedit命令为系统用户设置Samba服务的密码 ,第一次将账户信息写入数据库时需要使用-a参数,同时Samba服务的数据库要求写入的账户必须已经在系统存在。
当然还有要注意一下共享目录的本身权限,即使在samba配置文件中开放了写入权限,但是本身权限不到位,后面Client端操作是会提示没有权限。

[root@server ~]# useradd user1
[root@server ~]# pdbedit -a user1
[root@server ~]# pdbedit -L			//列出账户列表
user1:1001:

创建共享目录,考虑到防火墙和SELinux的影响,需要对Samba服务放行,同时对共享目录设置一下SELinux安全上下文,让目录和里面的文件能被Samba服务访问到。

[root@server ~]# firewall-cmd --permanent --add-service=samba
success
[root@server ~]# firewall-cmd --permanent --add-service=mountd	   //mountd 进程是一个远程过程调用(RPC),其作用是对客户端要求安装(mount)文件系统的申请作出响应。
		
success
[root@server ~]# firewall-cmd --reload 
success
[root@server ~]# mkdir /test
[root@server ~]# chmod o+w /multiuser
[root@server ~]# semanage fcontext -a -t samba_share_t /test		//设置SELinux安全上下文
[root@server ~]# restorecon -Rv  /test				//使SELinux安全上下文立即生效

[root@server ~]# ls -Zd /test				//查看目录SELinux安全上下文
drwxr-xr-x. root root unconfined_u:object_r:samba_share_t:s0 /test
[root@server ~]# systemctl restart smb nmb
[root@server ~]# systemctl enable smb nmb

我们用Client端来测试一下,使用smbclient命令的-L参数显示服务器端所共享出来的所有资源。

[root@client ~]# smbclient -L //172.25.0.11 -U user1
Enter user1's password: 
Domain=[MYGROUP] OS=[Unix] Server=[Samba 4.1.1]

	Sharename       Type      Comment
	---------       ----      -------
	test            Disk      a simple shared file
	IPC$            IPC       IPC Service (Samba Server Version 4.1.1)
Domain=[MYGROUP] OS=[Unix] Server=[Samba 4.1.1]

	Server               Comment
	---------            -------
	SERVER               Samba Server Version 4.1.1

	Workgroup            Master
	---------            -------
	MYGROUP              SERVER

当然我们也可以像使用FTP客户端一样使用smbclient,同时还可以使用-c参数一次性连接使用命令。

[root@client ~]# smbclient //172.25.0.11/test -U user1
Enter user1's password: 
Domain=[MYGROUP] OS=[Unix] Server=[Samba 4.1.1]
smb: \> l
  .                                   D        0  Thu May 23 22:09:50 2019
  ..                                  D        0  Fri May 24 19:44:11 2019
  1                                   D        0  Thu May 23 21:47:26 2019
  2                                   D        0  Thu May 23 22:09:50 2019

		40913 blocks of size 262144. 28533 blocks available
smb: \> mkdir 0
smb: \> ls
  .                                   D        0  Fri May 24 20:07:47 2019
  ..                                  D        0  Fri May 24 19:44:11 2019
  1                                   D        0  Thu May 23 21:47:26 2019
  2                                   D        0  Thu May 23 22:09:50 2019
  0                                   D        0  Fri May 24 20:07:47 2019

		40913 blocks of size 262144. 28533 blocks available
smb: \> 
[root@client ~]# smbclient -c "ls" //172.25.0.11/test -U user1
Enter user1's password: 
Domain=[MYGROUP] OS=[Unix] Server=[Samba 4.1.1]
  .                                   D        0  Fri May 24 20:07:47 2019
  ..                                  D        0  Fri May 24 19:44:11 2019
  1                                   D        0  Thu May 23 21:47:26 2019
  2                                   D        0  Thu May 23 22:09:50 2019
  0                                   D        0  Fri May 24 20:07:47 2019

		40913 blocks of size 262144. 28533 blocks available

使用mount命令挂载共享资源

[root@client ~]# mkdir /test
[root@client ~]# mount -t cifs //172.25.0.11/test /test -o username=user1,password=123456
[root@client ~]# df -h
Filesystem          Size  Used Avail Use% Mounted on
/dev/vda1            10G  3.1G  7.0G  31% /
devtmpfs            906M     0  906M   0% /dev
tmpfs               921M   84K  921M   1% /dev/shm
tmpfs               921M   17M  904M   2% /run
tmpfs               921M     0  921M   0% /sys/fs/cgroup
//172.25.0.11/test   10G  3.1G  7.0G  31% /test

注:CIFS(Common Internet File System)文件系统也称通用Internet文件系统,它使程序可以访问远程Internet计算机上的文件并要求此计算机的服务。

介绍一下Samba服务的Multiuser(multi这个英文单词本身意思就是多个)挂载技术:客户端的管理员只需做一次挂载的操作,那么客户端的用户在访问挂载点时,若需要不同的权限,可以临时切换为新的共享用户(无需重新挂载)。挂载参数需要添加“multiuser,sec=ntlmssp”,客户机上的普通用户可以通过cifscreds命令提交新的身份凭据。
我们用一个实例来了解一下 Samba服务的Multiuser机制,首先我们新建一个共享资源名字就叫做multiuser,该资源可浏览、用户user1只有只读权限、用户user可写、可读,同时匿名用户也就是guest不可访问。

[root@server ~]# 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
[test]
        comment = a simple shared file
        path = /test
        browseable = yes
        writable = yes
        public = no
[multiuser] 
        comment = Multiuser mount experiment
        path = /multiuser
        browseable = yes
        writable = no 
        write list = user2
        public = no 
[root@server ~]# pdbedit -a user2
[root@server ~]# mkdir /multiuser
[root@server ~]# semanage fcontext -a -t samba_share_t /multiuser
[root@server ~]# restorecon -Rv /multiuser
restorecon reset /multiuser context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:samba_share_t:s0
[root@server ~]# chmod o+w /multiuser
[root@server ~]# systemctl restart smb nmb

Client端测试

[root@client ~]# smbclient -L //172.25.0.11 -U user1
Enter user1's password: 
Domain=[MYGROUP] OS=[Unix] Server=[Samba 4.1.1]

	Sharename       Type      Comment
	---------       ----      -------
	test            Disk      a simple shared file
	multiuser       Disk      Multiuser mount experiment
	IPC$            IPC       IPC Service (Samba Server Version 4.1.1)
Domain=[MYGROUP] OS=[Unix] Server=[Samba 4.1.1]

	Server               Comment
	---------            -------
	SERVER               Samba Server Version 4.1.1

	Workgroup            Master
	---------            -------
	MYGROUP
[root@client ~]# vim /etc/fstab            
#
# /etc/fstab
# Created by anaconda on Wed May  7 01:22:57 2014
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=9bf6b9f7-92ad-441b-848e-0257cbb883d1 /                       xfs     defaults        1 1
//172.25.0.11/test /test cifs defaults,username=user1,password=123456 1 1
//172.25.0.11/multiuser /multiuser cifs defaults,username=user1,password=123456,multiuser,sec=ntlmssp,_netdev 1 1
[root@client ~]# mkdir /multiuser
[root@client ~]# mount -a
[root@client multiuser]# df -h
Filesystem               Size  Used Avail Use% Mounted on
/dev/vda1                 10G  3.1G  7.0G  31% /
devtmpfs                 906M     0  906M   0% /dev
tmpfs                    921M   84K  921M   1% /dev/shm
tmpfs                    921M   17M  904M   2% /run
tmpfs                    921M     0  921M   0% /sys/fs/cgroup
//172.25.0.11/test        10G  3.1G  7.0G  31% /test
//172.25.0.11/multiuser   10G  3.1G  7.0G  31% /multiuser

在server端的multiuser目录中创建一个名为1的文件和一个名为test的目录,用来测试。

[root@server ~]# cd /multiuser/
[root@server multiuser]# vim 1
[root@server multiuser]# mkdir test

切回client端测试,发现只可以读,不可以写。因为我们在挂载时用的是user1的身份挂载的,但是user1只有只读权限,所以操作才会被拒绝。

[root@client multiuser]# cat 1
this a test
[root@client multiuser]# vim 1
this a test
awawdawdaw
~                                                                                                                                  
~                                                                                                                                  
~                                                                                                                                  
~                                                                                                                                  
~                                                                                                                                  
~                                                                                                                                  
~                                                                                                                                  
~       
"1"
"1" E212: Can't open file for writing
Press ENTER or type command to continue
[root@client multiuser]# mkdir 5
mkdir: cannot create directory ‘5’: Permission denied

如果我们想要不取消挂载,就获取user2用户的写入权限,就要用到 cifscreds命令去提交新的身份凭证,我们来试一下。

[root@client multiuser]# cifscreds -u user2 add 172.25.0.11
Password: 
[root@client multiuser]# mkdir 5
mkdir: cannot create directory ‘5’: Permission denied

但此时我们已经用cifscreds命令提交了身份凭证为什么权限还不足呢?经过我查找资料也没发现具体原因(可能我水平不够),可能是安全原因,因为cifscreds向当前会话的内核密钥环提供其用户名和密码(好吧有点牵强,还是附上红帽官网对于cifscreds的介绍)。

The root user mounts the share using the multiuser option and an account that has minimal access to the contents of the share. Regular users can then provide their user name and password to the current session’s kernel keyring using the cifscreds utility. If the user accesses the content of the mounted share, the kernel uses the credentials from the kernel keyring instead of the one initially used to mount the share.

经过我的实验,cifscreds不适用于root用户(也不能说不适用,只是再在root用户下使用cifscreds命令把指定用户的用户名和密码加入内核密钥环会不生效),而适用与非root用户。废话不多说看实验,实践是检验真理的唯一标准还是很有道理的,还是要多做实验当然理论也不能丢。

[root@client multiuser]# useradd 1
[root@client multiuser]# su - 1
[1@client ~]$ cd /multiuser
[1@client multiuser]$ ll
ls: reading directory .: Permission denied
total 0
[1@client multiuser]$ cifscreds -u user2 add 172.25.0.11
Password: 
[1@client multiuser]$ cd /multiuser
[1@client multiuser]$ ll
total 1024
-rw-r--r--. 1 root root 12 May 24 21:39 1
drwxr-xr-x. 2 root root  0 May 24 21:41 test
[1@client multiuser]$ mkdir 66
[1@client multiuser]$ ll
total 1024
-rw-r--r--. 1 root root 12 May 24 21:39 1
drwxr-xr-x. 2 1003 1003  0 May 24 22:59 66
drwxr-xr-x. 2 root root  0 May 24 21:41 test
[1@client multiuser]$ 
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值