在RHEL 7上使用SELinux设置Samba服务器

时间:2020-03-21 11:46:57  来源:igfitidea点击:

我们将设置一个Samba服务器并配置适合组协作的网络共享。

测试环境

我们有两台RHEL 7.0服务器可用:

srv1.rhce.local(10.8.8.71)将配置为Samba服务器
srv2.rhce.local(10.8.8.72)将被配置为Samba客户端

两台服务器都将SELinux设置为强制模式。

Samba服务器

本节中的所有命令都在服务器srv1上运行。

本文中使用的samba软件包版本为4.1.1.

软件包,服务和防火墙

samba-client软件包包含smbpasswd命令。

# yum install -y samba samba-client
# systemctl enable smb nmb
# firewall-cmd --permanent --add-service=samba
# firewall-cmd --reload

准备共享目录

我们将创建两个不同的份额,如下所述:

'/srv/samba_pub'与所有人共享r/w的公共Samba共享,
'/srv/samba_group'一个用于组协作的Samba共享。

创建目录:

# mkdir /srv/{samba_pub,samba_group}

更改公共Samba共享的权限:

# chmod 0777 /srv/samba_pub

配置组共享的协作:

# groupadd devops
# chgrp devops /srv/samba_group
# chmod 2775 /srv/samba_group

我们想为所有不是devops组成员的用户提供只读特权。

当用户向Samba服务器进行身份验证时,将使用Samba用户帐户,但是Samba用户帐户被映射到Linux用户帐户,并且该用户帐户需要访问权限。

请注意,对Linux文件系统没有写权限的用户将对共享没有写权限。
如果将共享设置为可写,则对Linux文件系统具有写权限的所有用户都具有对该共享的写访问权限。

创建几个Samba用户dev1和dev2,其中dev1是devops Linux组的成员:

# useradd -s /sbin/nologin -G devops dev1
# useradd -s /sbin/nologin dev2
# smbpasswd -a dev1
# smbpasswd -a dev2

检查Samba用户的数据库:

# pdbedit -L

应用SELinux上下文

让我们检查默认的SELinux上下文:

# ls -dZ /srv/samba_*
drwxrwsr-x. root devops unconfined_u:object_r:var_t:s0  /srv/samba_group
drwxrwxrwx. root root   unconfined_u:object_r:var_t:s0  /srv/samba_pub

将samba_share_t上下文类型应用于组共享:

# semanage fcontext -a -t samba_share_t "/srv/samba_group(/.*)?"

请注意,如果仅通过Samba访问共享目录,则应将其标记为samba_share_t,从而为Samba提供读写访问权限。

Samba还可以提供带有SELinux类型public_content_t(只读)和public_content_rw_t(读写)的标签文件。
对于公共共享,我们将使用public_content_rw_t类型。

请注意,标有public_content_t类型的文件允许它们被FTP,Apache,Samba和rsync读取。
标有public_content_rw_t类型的文件需要设置布尔值,然后服务才能写入标有public_content_rw_t类型的文件。

在Samba的情况下,所需的布尔值为smbd_anon_write。

# setsebool -P smbd_anon_write=1
# semanage fcontext -a -t public_content_rw_t "/srv/samba_pub(/.*)?"

不要忘记恢复SELinux上下文:

# restorecon -Rv /srv/samba_*

其他值得一提的SELinux布尔值

如果我们想以只读方式共享任何标准目录,则可以设置布尔值samba_export_all_ro:

# setsebool -P samba_export_all_ro=1

上面的布尔值将允许Samba读取系统上的每个文件。
默认情况下它是关闭的。

同样,如果我们要共享通过Samba读/写的所有文件和目录,则可以设置samba_export_all_rw:

# setsebool -P samba_export_all_rw=1

此布尔值将允许Samba读取和写入系统上的每个文件。
一般来说,这是一个坏主意,因为受损的Samba服务器将变得极为危险。
默认情况下它是关闭的。

如果要允许samba创建新的主目录,则需要打开samba_create_home_dirs布尔值:

# setsebool -P samba_create_home_dirs=1

默认情况下,SELinux策略关闭SELinux主目录共享([homes]部分定义了默认情况下启用的特殊文件共享)。
如果要将虚拟机设置为Samba服务器并希望共享用户主目录,则需要设置samba_enable_home_dirs布尔值:

# setsebool -P samba_enable_home_dirs=1

需要启用上述功能才能使[homes]正常工作。

请注意,Samba SELinux策略将不允许任何受限的应用程序访问服务器上安装的远程samba共享。
如果要对服务器的主目录使用远程Samba服务器,则必须设置use_samba_home_dirs布尔值:

# setsebool -P use_samba_home_dirs=1

上面的代码允许安装远程Samba文件共享并将其用作本地Linux主目录。

另一个重要的布尔值是samba_share_nfs。
默认情况下,SELinux阻止Samba守护程序读取和写入NFS共享。
如果使用Samba共享NFS文件系统,则需要打开samba_share_nfs布尔值:

# setsebool -P samba_share_nfs=1

否则将导致权限被拒绝的安装错误,但不会将任何内容登录到日志文件“ /var/log/audit/audit.log”,这使得故障排除变得很困难。

配置Samba

打开文件“ /etc/samba/smb.conf”进行编辑,然后添加以下内容:

[global]
;       Most Windows systems default to WORKGROUP
	workgroup = MYGROUP
	server string = Samba Server Version %v
;	netbios name = MYSERVER
	interfaces = lo 10.8.8.0/24
	hosts allow = 127. 10.8.8.
        hostname lookups = yes
	log file = /var/log/samba/log.%m
	max log size = 50
	security = user
	passdb backend = tdbsam
	map to guest = bad user
        guest account = nobody
	load printers = no
[public]
	comment = Public Share
	path = /srv/samba_pub
;	public = yes
	writable = yes
	browseable = yes
	printable = no
	guest ok = yes
[group]
        comment = Group Share
        path = /srv/samba_group
        writable = no
        browseable = yes
	printable = no
        guest ok = no
        write list = @devops
        read list = dev2
        valid users = @devops, dev2

请注意,hosts allow参数(如果在[global]部分中指定了该参数)将适用于所有共享,而不管每个共享是否具有不同的设置。
主机可以通过主机名或者源IP地址指定。
通过反向解析传入连接尝试的IP地址来检查主机名。
名称解析的默认名称解析顺序是使用LMHOSTS文件,然后是标准Unix名称解析方法(/etc/hosts,DNS和NIS的某种组合),然后查询WINS服务器,最后使用广播来确定地址。
NetBIOS名称。
建议我们必须启用主机名查找才能使反向解析正常工作。

如果将共享设置为只读(只读=是,或者反向同义词writable = no)(默认设置),则写列表中列出的用户仍具有对该共享的读写访问权限。
因此,对于组共享,属于devops组成员的所有用户都具有读写访问权限。
但是,用户dev2可以装载共享,但是具有只读访问权限。

另一方面,如果共享是可写的(只读=否),则无论将只读选项设置为什么,读列表中的用户都不会被授予写访问权限。

请注意,可打印服务(printable = yes)将始终允许写入目录(允许用户权限),但只能通过假脱机操作进行。
默认值为可打印=否。

有效的用户参数指定允许访问共享的用户列表。
不在列表中的用户不允许访问共享。
请注意,将列表保留为空白是默认设置,允许所有用户访问共享。

请注意,来宾ok是public的同义词。

总而言之,这些是默认设置,可以省略,除非需要进行更改:

hosts allow = # none (all hosts permitted access)
read only = yes
writable = no
printable = no
browseable = yes
valid users = # no valid users list (anyone can login)
guest ok = no

让我们测试配置:

# testparm -s
Load smb config files from /etc/samba/smb.conf
rlimit_max: increasing rlimit_max (1024) to minimum Windows limit (16384)
Processing section "[public]"
Processing section "[group]"
Loaded services file OK.
Server role: ROLE_STANDALONE
[global]
	workgroup = MYGROUP
	server string = Samba Server Version %v
	interfaces = lo, 10.8.8.0/24
	map to guest = Bad User
	log file = /var/log/samba/log.%m
	max log size = 50
	load printers = No
	idmap config * : backend = tdb
	hosts allow = 127., 10.8.8.
[public]
	comment = Public Share
	path = /srv/samba_pub
	read only = No
	guest ok = Yes
[group]
	comment = Group Share
	path = /srv/samba_group
	valid users = @devops, dev2
        read list = dev2
	write list = @devops

启动服务:

# systemctl start smb nmb

在本地测试访问权限:

# smbclient //localhost/public -U guest%

Samba客户端

本节中的所有命令都在服务器srv2上运行。

安装套件

# yum install -y samba-client cifs-utils

桑巴山股票

创建安装点:

# mkdir /mnt/{samba_pub,samba_group}

桑巴山股票:

# mount -o username=dev1 //srv1.rhce.local/group /mnt/samba_group
# mount -o username=guest,password= //srv1.rhce.local/public /mnt/samba_pub

将以下内容添加到文件“/etc/fstab”中以在引导时挂载:

//srv1.rhce.local/group   /mnt/samba_group cifs username=dev1,password=pass 0 0
//srv1.rhce.local/public  /mnt/samba_pub   cifs username=guest,password=  0 0

我们还可以使用凭据参数来传递存储在文件中的用户详细信息,例如:

//srv1.rhce.local/group   /mnt/samba_group cifs credentials=/root/creds.txt 0 0

“ /root/creds.txt”文件的内容是这样的:

username=dev1
password=pass

该文件应仅由root用户读取。

Sander van Vugt建议所有需要通过'/etc/fstab'挂载的远程文件系统都包括_netdev和x-systemd.automount挂载选项。

_netdev挂载选项可确保挂载被延迟,直到网络完全可用为止。
x-systemd.automount选项可确保与systemd的最佳集成,并将确保安装速度大大提高。

如果现在尝试写入组共享,则它应该工作,因为用户dev1是devops组的成员。
但是,如果我们使用用户的dev2凭据重新装入组共享,则将获得只读访问权限,并且将无法创建任何文件。

在Samba服务器srv1上,我们可以检查当前连接:

# smbstatus
Samba version 4.1.1
PID     Username      Group         Machine                        
------------------------------------------------------------------
2790      dev1          dev1          10.8.8.72    (ipv4:10.8.8.72:59422)
2790      nobody        nobody        10.8.8.72    (ipv4:10.8.8.72:59422)
Service      pid     machine       Connected at
------------------------------------------------------
IPC$        2790   10.8.8.72     Tue Jun  7 19:44:27 2015
group        2790   10.8.8.72     Tue Jun  7 19:44:27 2015
public       2790   10.8.8.72     Tue Jun  7 19:40:53 2015
IPC$        2790   10.8.8.72     Tue Jun  7 19:40:53 2015

也可以使用smbclient访问SMB/CIFS资源:

# smbclient -L srv1.rhce.local -N
Domain=[MYGROUP] OS=[Unix] Server=[Samba 4.1.1]
	Sharename       Type      Comment
	---------       ----      ------
	public          Disk      Public Share
	group           Disk      Group Share
	IPC$           IPC       IPC Service (Samba Server Version 4.1.1)
Domain=[MYGROUP] OS=[Unix] Server=[Samba 4.1.1]
	Server               Comment
	---------            ------
	Workgroup            Master
	---------            ------

多用户Samba安装

在RHEL 7中,我们可以使用multiuser挂载选项来创建多用户的Samba挂载。

我们使用对共享具有最小权限的用户来安装共享。
然后,普通用户可以在当前会话中添加自己的SMB用户名和密码,以将其权限提升到其自己的权限级别。

以多用户挂载方式挂载共享:

# mount -o username=dev2,multiuser,sec=ntlmssp //server1.rhce.local/group /mnt/samba_group

请注意,默认情况下,用于验证用户身份的协议是封装在原始NTLMSSP消息(sec = ntlmssp)中的NTLM v2密码哈希。
这是为了与Microsoft Windows兼容。

由于用户dev2没有写特权,我们应该尝试写入共享时遇到权限被拒绝的错误:

# touch /mnt/samba_group/test
touch: cannot touch ‘/mnt/samba_group/test’: Permission denied

在服务器srv2上,创建一个本地用户dev1:

# useradd dev1

更改为新创建的用户,然后检查Samba挂载:

# su - dev1
$ls -l /mnt/
ls: cannot access /mnt/samba_group: Permission denied
total 12
dr-xr-xr-x. 10 root root 4096 Jan  7  2014 rhel7dvd
d??????????  ? ?    ?       ?            ? samba_group
drwxr-xr-x.  2 root root 4096 Jun  7 19:55 samba_pub

我们可以使用cifscreds命令将身份验证凭据添加到用户的当前会话(密钥):

$cifscreds add srv1
Password:

再次检查Samba安装:

$ls -l /mnt/
total 12
dr-xr-xr-x. 10 root root 4096 Jan  7  2014 rhel7dvd
drwxrwsr-x.  2 root dev1    0 Jun  7 19:57 samba_group
drwxr-xr-x.  2 root root 4096 Jun  7 19:55 samba_pub

我们现在应该可以写:

$touch /mnt/samba_group/test
$ls -l /mnt/samba_group/test
-rw-r--r--. 1 dev1 dev1 0 Jun  7 19:58 /mnt/samba_group/test

并且,如果我们使用smbstatus检查Samba服务器srv1,则应该看到用户dev1和dev2的活动连接。