SELinux 的安全防护措施主要集中在各种网络服务的访问控制。对于像 Apache 、Samba、NFS、vsftp 、MySQL、Bind dns 等服务来说,SELinux 仅仅开放了最基本的运行需求。至于连接外部网络、运行脚本、访问用户目录、共享文件等,必须经过一定的 SELinux 策略调整才能充分发挥网络服务器的作用,在安全和性能直接获取平衡。
当 启用 SELinux 是,Apache HTTP 服务器(httpd)默认情况下在受限的 httpd_t 域中运行,并和其他受限制的网络服务分开。即使一个网络服务被攻击者破坏,攻击者的资源和可能造成的损害是有限的。下面的示例演示的是 SELinux 下的 httpd 进程。
$ ps -eZ | grep httpd
unconfined_u:system_r:httpd_t:s0 2850 ? 00:00:00 httpd
unconfined_u:system_r:httpd_t:s0 2852 ? 00:00:00 httpd
……
和 SELinux 上下文相关的 httpd 进程是 system_u:system_r:httpd_t:s0。 httpd 进程都运行在 httpd_t 域中。文件类型必须正确设置才能让 httpd 访问 。例如 httpd 可以读取文件类型是 httpd_sys_content_t,但不能写和修改。此外 httpd 不能访问 samba_share_t 类型的文件(Samba 访问控制的文件),也不能访问用户主目录中被标记为与 user_home_t 文件类型,主要是防止 httpd 读写用户主目录中的文件并且继承其访问权限。httpd 可以读写的文件类型是 httpd_sys_content_rw_t。Apache 默认的文档根目录类型是 httpd_sys_content_t。除非另外设置 httpd 只能访问 / var/www/html/ 目录中的 httpd_sys_content_t 类型的文件和子目录。此外 SELinux 还针对 httpd 定义了一些文件类型:
如 果需要修改文件和目录的 SELinux 类型属性时可以使用三个命令:chcon、 semanage fcontext 和 restorecon 命令 。说明:使用 chcon 命令来对文件的类型进行重新标识。然而,这样的标识不是永久性的修改,一旦系统重启,该标识就会改变回去。对于文件类型的永久性改变,需要采用 semanage 命令。chcon、 semanage fcontext 和 restorecon 三个命令是本文的重点下面首先介绍一下使用方法:
(1)chcon 命令
作用:chcon 命令用来改变 SELinux 文件属性即修改文件的安全上下文
用法:chcon [ 选项 ] CONTEXT 文件
主要选项 :
-R:递归改变文件和目录的上下文。
--reference:从源文件向目标文件复制安全上下文
-h, --no-dereference:影响目标链接。
-v, --verbose:输出对每个检查文件的诊断。
-u, --user=USER:设置在目标用户的安全上下文。
-r,--role=ROLE:设置目标安全领域的作用。
-t, --type=TYPE:在目标设定的安全上下文类型。
-l, --range=RANGE:设置 set role ROLE in the target security context 目标安全领域的范围。
-f:显示少量错误信息。
(2)restorecon 命令
作用:恢复 SELinux 文件属性文件属性即恢复文件的安全上下文
用法:restorecon [-iFnrRv] [-e excludedir ] [-o filename ] [-f filename | pathname…]
主要选项 :
-i:忽略不存在的文件。
-f:infilename 文件 infilename 中记录要处理的文件。
-e:directory 排除目录。
-R – r:递归处理目录。
-n:不改变文件标签。
-o outfilename:保存文件列表到 outfilename,在文件不正确情况下。
– v:将过程显示到屏幕上。
-F:强制恢复文件安全语境。
说 明;restorecon 命令和 chcon 命令类似,但它基于当前策略默认文件上下文文件设置与文件有关的客体的安全上下文,因此,用户没有指定一个安全上下文,相反,restorecon 使用文件上下文文件的条目匹配文件名,然后应用特定的安全上下文,在某些情况下,它是在还原正确的安全上下文。
(3)semanage fcontext 命令
作用:管理文件安全上下文
用法:
semanage fcontext [-S store] -{a|d|m|l|n|D} [-frst] file_spec
semanage fcontext [-S store] -{a|d|m|l|n|D} -e replacement target
主要选项 :
-a:添加
-d:删除
-m:修改
-l:列举
-n:不打印说明头
-D:全部删除
-f:文件
-s:用户
-t:类型
r:角色
对于网络服务而言,SElinux 仅仅开放了最低运行需求,为了发挥 Apache 服务器的功能还必须把布尔值必须打开,以允许某些行为包括允许
httpd 脚本网络访问, 允许 httpd 访问 NFS 和 CIFS 文件系统, 允许执行通用网关接口(CGI)脚本 。可以使用命令
getsebool 查询当前布尔变量。然后可以使用下面的 setsebool 命令开放布尔变量:
#setsebool – P httpd_enable_cgi on
下面是常用的布尔变量:
(1) 运行一个静态 web 网页
假设使用如下命令:mkdir /mywebsite ,建立一个文件夹作为 Apache 服务器的文档根目录。可以使用如下命令查看其文件属性:
# ls -dZ /mywebsite
drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /mywebsite
按 照 SELinux 策略规定和继承原则,/mywebsite 目录和其中的文件会具有 default_t 类型,,包括以后创建的文件或者子目录也会继承和拥有这种类型,这样受限的 httpd 进程是不能访问的,可以使用 chcon 和 restorecon 命令修改 /mywebsite 的文件类型属性,确保之后建立的文件和复制的文件具有相同 httpd_sys_content_t 的类型,从而使受限的 httpd 进程能够访问。
# chcon -R -t httpd_sys_content_t /mywebsite
# touch /mywebsite/index.html
# ls -Z /mywebsite /website/index.html
-rw-r--r-- root root unconfined_u:object_r:httpd_sys_content_t:s0 /mywebsite /index.html
下面修改 /etc/httpd/conf/httpd.conf 文件,改为:
#DocumentRoot "/var/www/html"
DocumentRoot "/mywebsite"
然后重启 Apache 服务器。
如果要要彻底修改 /mywebsite 的文件类型属性,使之重新启动后设置还有效,可以使用 semanage fcontext 和 restorecon 命令
# semanage fcontext -a -t httpd_sys_content_t "/mywebsite(/.*)?"
# restorecon -R -v /mywebsite
(2) 共享 NFS 和 CIFS 文件系统
默 认情况下,在客户端的 NFS 挂载 NFS 文件系统的政策定义一个默认的上下文标记这个默认的上下文使用 nfs_t 类型。此外默认情况下,Samba 共享客户端上安装有策略的定义一个默认的上下文标记。这个默认的上下文使用 cifs_t 类型。根据 SELinux 策略配置,Apache 服务可能无法读取 nfs_t 或 cifs_t 类型。通过设置布尔值开启或关闭来控制哪个服务被允许访问 nfs_t 和 cifs_t 类型。
例如使用 setsebool 命令打开 httpd_use_nfs 布尔变量后,httpd 即可访问 nfs-t 类型的 nfs 共享资源了:
# setsebool -P httpd_use_nfs on
例如使用 setsebool 命令打开 httpd_use_cifs 布尔变量后,httpd 即可访问 cifs_t 类型的 cifs 共享资源了:
# setsebool -P httpd_use_cifs on
(3)更改端口号
根据策略配置,服务可能只被允许运行在特定的端口号 。试图改变服务运行的端口,在不改变政策,可能导致启动失败的服务。首先查看一下 SELinux 允许 HTTP 侦听 TCP 端口,使用命令:
# semanage port -l | grep -w http_port_t
http_port_t tcp 80, 443, 488, 8008, 8009, 8443
可以看到默认情况下,SELinux 允许 HTTP 侦听 TCP 端口 80,443,488,8008,8009 或 8443。假设要把端口号 80 修改为 12345 ,下面看看修改端口号的方法:
修改配置文件 /etc/httpd/conf/httpd.conf 为
# Change this to Listen on specific IP addresses as shown below to
# prevent Apache from glomming onto all bound IP addresses (0.0.0.0)
#Listen 12.34.56.78:80
Listen 10.0.0.1:12345
使用命令修改:
# semanage port -a -t http_port_t -p tcp 12345
然后确认一下:
# semanage port -l | grep -w http_port_t
http_port_t tcp 12345, 80, 443, 488, 8008, 8009, 8443
SELinux 环境中,Samba 服务器的 smbd 和 nmbd 守护进程都是在受限的 smbd_t 域中运行。并且和其他受限的网络服务相互隔离。下面的示例演示的是 SELinux 下的 smb 进程
$ ps -eZ | grep smb
unconfined_u:system_r:smbd_t:s0 16420 ? 00:00:00 smbd
unconfined_u:system_r:smbd_t:s0 16422 ? 00:00:00 smbd
缺 省情况下,smbd 只能读写 samba_share_t 类型的文件 , 不能读写 httpd_sys_content_t 类型的文件。如果希望 smbd 能读写 httpd_sys_content_t 类型的文件,可以重新标记文件的类型。另外还可以修改布尔值如允许 Samba 提供 NFS 文件系统等共享资源。如果需要修改文件和目录的 SELinux 类型属性时可以使用三个命令:chcon、 semanage fcontext 和 restorecon 命令 。
SELinux 也为 Samba 提供了一些布尔变量用来调整 SELinux 策略,如果希望 Samba 服务器共享 NFS 文件系统,可以使用如下命令:
# setsebool -P samba_share_nfs on
下面是常用的布尔变量;
(1) 共享一个新建的目录
受限创建一个目录作为 Samba 的共享资源,然后在目录下建立一个文件检验共享是否成功。
#mkdir /myshare
#touch /myshare/file1
设置创建目录和目录中文件的类型
#semanage fcontext -a -t samba_share_t "/myshare(/.*)?"
# restorecon -R -v /myshare
修改 Samba 配置文件 /etc/samba/smb.conf,添加共享资源定义包括如下行::
[myshare]
comment = My share
path = /myshare
public = yes
writeable = yes
创建一个 samba 用户
# smbpasswd -a testuser
New SMB password: Enter a password
Retype new SMB password: Enter the same password again
Added user testuser.
启动 Samba 服务
service smb start
查询可以使用的共享资源:
$ smbclient -U testuser -L localhost
使用 mount 命令挂载共享资源,并且检验文件:
#mount //localhost/myshare /test/ -o user= testuser
# ls /test/
(2)共享一个网页
如果要共享一个网页文件目 录如 Apache 服务器的 /var/www/html,是不能使用文件类型的。此时可以使用 samba_export_all_ro 和 samba_export_all_rw 两个布尔值变量,达到共享目录和文件的目的。步骤如下:
修改 samba 配置文件,添加如下行:
[website]
comment = Sharing a website
path = /var/www/html/
public = yes
writeable = yes
开放 samba_export_all_ro 布尔值变量
#setsebool -P samba_export_all_ro on
设置权限:
#chmod 777 /var/www/html/
共享目录:
#mount //localhost/myshare /test/ -o user= testuser
# ls /test/
SELinux 环境中,nfs 服务器的守护进程都是在受限的 nfs_t 域中运行。并且和其他受限的网络服务相互隔离。SELinux 策略不允许使用 NFS 共享远程文件。如果一定要共享远程文件,可以使用 nfs_export_all_ro 和 nfs_export_all_rw 等布尔值变量调整 SELinux 的策略。按照 SELinux 的策略规定客户端安装 NFS 文件系统采用的默认文件系统是 nfs_t,此外 SELinux 还针对 nfsd 定义了一些文件类型:
SELinux 提供了几个布尔变量用来调整 NFS,你可以在系统安全和 NFS 功能之间取得平衡。例如:
将本机的 NFS 共享设置成可读可写,需要开放相关布尔值变量:
#setsebool -P nfs_export_all_rw on
如果你想要将远程 NFS 的家目录共享到本机,需要开放相关布尔值变量:
#setsebool -P use_nfs_home_dirs on
下面是常用的布尔变量;
这个例子中 NFS 服务器的 IP 地址 192.168.1.1,NFS 客户端的 IP 地址为 192.168.1.10,两台主机在同一子网(192.168.1.0/24)。
首 先在 NFS 服务器端使用 setsebool 命令确保 nfs_export_all_rw 布尔变量已经打开,使得 NFS 客户端能够以只读的方式安装 NFS 文件系统。然后创建一个顶级目录,作为共享资源,然后在目录中建立一个文件提供给客户端访问,命令如下:
#setsebool -P nfs_export_all_rw on
#mkdir – p /share/nfs
#cp /etc/profile /share/nfs/test
# chmod - R 777 /share/nfs
下面编辑 /etc/exports 文件把共享资源加入。
/share/nfs 192.168.1.10(rw)
确保防火墙修改设置正确。然后启动 nfs 服务
# service nfs start
Starting NFS services: [ OK ]
Starting NFS quotas: [ OK ]
Starting NFS daemon: [ OK ]
Starting NFS mountd: [ OK ]
运行 exports 命令确保共享资源公布,使用 showmount 命令查询共享资源。
#exportfs -rv
exporting 192.168.1.10:/share/nfs
# showmount -e
Export list for nfs-srv:
/share/nfs 192.168.1.10
下面在 NFS 客户端可以使用命令挂载 NFS 服务器的共享资源了 :
# mount.nfs 192.168.1.1:/share/nfs /mnt
# ls /mnt
total 0
-rwxrwxrwx. 1 root root 0 2012-01-16 12:07 test
第 2 部分将讨论 vsftp 、MySQL、Bind dns 服务的配置。
手机扫一扫
移动阅读更方便
你可能感兴趣的文章