在RHEL 7上使用SELinux设置Samba服务器
我们将设置一个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的活动连接。