简介: SELinux 的安全防护措施主要集中在各种网络服务的访问控制。对于
vsftp 、MySQL、Bind DNS 来说,SELinux 仅仅开放了最基本的运行需求。至于连接外部网络、运行脚本、访问用户目录、共享文件等,必须经过一定的
SELinux 策略调整才能充分发挥网络服务器的作用,在在安全和性能直接获取平衡。
引言
SELinux 的安全防护措施主要集中在各种网络服务的访问控制。上文(配置
Apache 、Samba、NFS)介绍了 Apache 、Samba、NFS 三种服务的 SElinux
设置,本文介绍 SElinux 下 vsftp 、MySQL、Bind DNS 三种服务的 SElinux
设置。
SELinux 环境下的 FTP 配置
vsftp 的 SELinux 的文件类型
SElinux 环境中,vsftp 服务器的 vsftpd 守护进程都是在受限的
ftpd_t 域中运行。并且和其他受限的网络服务相互隔离。下面的示例演示的是 SELinux 下的 vsftpd
进程
#ps -eZ |grep vsftpd unconfined_u:system_r:ftpd_t:s0-s0:c0.c1023 1994 ? 00:00:00 vsftpd
|
SELinux 策略规定 vsftpd 文件访问和进程交互的限制。例如一个通过认证的本地用户不能读写自己的主目录的文件。另外
vsftpd 不能访问 NFS 或者 CIFS 文件系统,匿名用户没有写文件的访问权限,即使 /etc/vsftpd/vsftpd.conf
配置文件中开放了读写权限也是如此。通常注册后的匿名用户只能读取 /var/ftp 目录中的文件,文件类型是
public_content_t,它资源其他服务器(Apache , Samba, NFS)也可以访问
public_content_t 类型的文件 。SElinux 一共定义了两种文件类型用于设置 vsftp
服务器。
public_content_t vsftpd:可以读取的文件和目录类型是
public_content_t。其他服务如 Apache、Samba 和 NFS 也可以,但是 public_content_t
类型的文件不能被写入,即使 Linux 权限允许。如果你需要写入或者修改,必须使用 public_content_rw_t
的类型。
public_content_rw_t:可以读取和写入的文件和目录类型是
public_content_rw_t,其他服务其他服务如 Apache,Samba 和 NFS 也可以,不过必须开放相关的布尔变量。
vsftp 的布尔变量
SELinux 对 FTP 的限制非常严格,不过系统管理员可以利用布尔值变量调整
SELinux 策略设置,定制 FTP 服务器功能。
下面是常用的布尔变量:
- allow_ftpd_anon_write :关闭这个布尔变量会阻止 vsftpd 读取 public_content_rw_t
类型的文件和目录。如果允许用户通过 FTP 上传文件。必须开放这个布尔变量。
- allow_ftpd_full_access:当开放这个布尔变量时只有 Linux(DAC)的权限来控制访问,通过验证的用户可以读取和写入标记为
public_content_t 或 public_content_rw_t 类型的文件。
- allow_ftpd_use_cif:当开放这个布尔变量时 vsftpd 允许 cifs_t 类型的文件和目录,因此这个布尔变量启用,可以让你的
FTP 服务器可以使用 Samba 文件系统。
- allow_ftpd_use_nfs vsftpd:的当开放这个布尔变量时 vsftpd 允许
nfs_t 类型的文件和目录,因此这个布尔变量启用,可以让你的 FTP 服务器可以使用 NFS 文件系统。
- ftp_home_dir:当开放这个布尔变量时认证用户可以读写自己的主目录中的文件。
- ftpd_connect_db:当开放这个布尔变量时允许 vsftpd 连接数据库。
- httpd_enable_ftp_server:当开放这个布尔变量时容许的 httpd 作为 FTP
服务器,并且监听 FTP 端口。
- tftp_anon_write:当开放这个布尔变量时允许 TFTP 访问一个公共的目录。
如果希望 FTP 服务器可以使用 NFS 和 Samba 文件系统,可以使用如下命令:
#setsebool -P allow_ftpd_use_nfs on #setsebool -P allow_ftpd_use_cifs on
|
另外针对启动 SElinux 后本地用户不能注册到 FTP 服务器,可以使用如下命令解决:
#setsebool -P ftp_home_dir on
|
假设 /var/ftp/forum 是一个公共论坛,供 ftp 用户查询和读写其中的文件,那么就需要确保
ftp 服务器可以读写修改 /var/ftp/forum 目录,此时可以使用命令把 /var/ftp/forum
目录的属性设置为 public_content_rw_t:
#semanage fcontext -a -t public_content_rw_t "/var/ftp/forum (/.*)?" #restorecon -R -v /var/ftp/forum
|
另外还有使用命令修改 /var/ftp/forum 的访问权限,开放布尔变量:
#chmod 777 /var/ftp/forum #setsebool -P allow_ftpd_use_cifs on
|
配置实例
开放用户主目录
SELinux 环境下 vsftpd 通常只允许匿名用户注册,以 FTP
方式注册后,本地用户无法访问自己的主目录,无法显示文件,也无法上传下载。这是 SELinux 策略造成的,要开放用户主目录,请使用如下办法。
首先使用 root 权限修改 /etc/vsftpd/vsftpd.conf
文件,设置local-enable=YES
然后使用命令重启服务:
#/etc/rc.d/init.d/vsftpd start
|
然后开放 ftp_home_dir 布尔变量即可:
#setsebool – P ftp_home_dir on
|
设置本地用户可以上传和下载文件
这个例子介绍如何建立一个存储位置 /myftp/pub,供本地用户使用
ftp 下载和上传文件。
首先创建一个目录结构和设置权限:
#mkdir –P /myftp/pub #chown user1:root /myftp/pub #chmod 777 /myftp/pub |
使用 semanage fcontext 和 restorecon 命令设置顶级目录
/myftp 的文件属性是 public_content_t
#semanage fcontext -a -t public_content_t /myftp #restorecon -R -v /myftp/
|
使用 semanage fcontext 和 restorecon 命令设置顶级目录
/myftp 的 ftp 子目录的文件属性是 public_content_rw_t
#semanage fcontext -a -t public_content_rw_t "/myftp/pub(/.*)?" #restorecon -R -v /myftp/pub
|
下面开放布尔值变量:
#setsebool – P ftp_home_dir on #setsebool -P allow_ftpd_anon_write on
|
完成上述设置后,本地系统用户可以访问自己的主目录,把文件上传到目录 /myftp/pub
,但是不能上传到 /myftp 目录。
$ ftp localhost Connected to localhost (127.0.0.1). 220 (vsFTPd 2.1.0) Name (localhost:username): 331 Please specify the password. Password: Enter the correct password 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> put ftpupload /myftp/pub/ftpupload local: ftpupload remote: ftpupload 227 Entering Passive Mode (127,0,0,1,241,41). 150 Ok to send data. 226 File receive OK. ftp> quit 221 Goodbye. |
匿名文件上传设置
这个例子介绍如何建立一个存储位置 /var/ftp/pub,供匿名用户使用上传文件。
首先创建一个目录结构和设置权限:
#mkdir – P /var/ftp/pub #chmod 777 /var/ftp/pub
|
查询当前文件属性:
#ls – dZ /var/ftp/pub drwxr-xr-x. root root system_u:object_r:public_content_t:s0 /var/ftp/pub
|
下面要把 public_content_t 修改为 public_content-rw_t
使用命令:
#semanage fcontext -a -t public_content_rw_t "/var/ftp/pub(/.*)?" #restorecon -R -v /var/ftp/pub
|
开放布尔变量并且查询使用命令:
#setsebool -P allow_ftpd_anon_write on #getsebool allow_ftpd_anon_write allow_ftpd_anon_write --> on
|
修改配置文件 /etc/vsftpd/vsftpd.conf 删除这一行“#annon_upload_enable=YES”的
# 符号,重启 ftp 服务。
下面把文件 /tmp/ftpupload 复制到目录 /var/ftp
下作为测试文件。然后运行 ftp 命令以 anonymous 注册。操作如下:
#cp /tmp/ ftpupload /var/ftp/ftpupload #ftp localhost Connected to localhost (127.0.0.1). 220 (vsFTPd 2.1.0) Name (localhost:username): anonymous 331 Please specify the password. Password: Enter the correct password 230 Login successful. Remote system type is UNIX. Using binary mode to transfer files. ftp> put ftpupload local: ftpupload remote: pub/ftpupload 227 Entering Passive Mode (127,0,0,1,241,41). 150 Ok to send data. 226 File receive OK. ftp> quit 221 Goodbye. |
SELinux 环境下的 MySQL 配置
MySQL 的 SELinux 文件类型
SELinux 环境中,MySQL 服务器的守护进程都是在受限的 mysqld_t
域中运行。并且和其他受限的网络服务相互隔离。下面的示例演示的是 SElinux 下的 mysqld 进程
#ps -eZ | grep mysqld unconfined_u:system_r:mysqld_safe_t:s0 6035 pts/1 00:00:00 mysqld_safe unconfined_u:system_r:mysqld_t:s0 6123 pts/1 00:00:00 mysqld
|
下面是 SELinux 针对 MySQL 定义的的文件类型:
- mysqld_db_t 这种文件类型用于标记 MySQL 数据库的位置。在红帽企业 Linux
中数据库的默认位置是 /var/lib/mysql。如果 MySQL 数据库的位置发生了变化,新的位置必须使用这种类型。
- mysqld_etc_t 这种文件类型用于标记 MySQL 的主配置文件中的 /etc/my.cnf
文件和 /etc/mysql 目录中的文件。
- mysqld_exec_t 这种文件类型用于标记 /usr/libexec/mysqld 程序文件。
- mysqld_initrc_exec_t 这种文件类型用于标记 MySQL 的初始化文件 /etc/rc.d/init.d/mysqld。
- mysqld_log_t 这种文件类型用于标记日志文件。
- mysqld_var_run_t 这种文件类型用于标记 /var/run/mysqld 目录中文件,尤其是
/var/run/mysqld/mysqld.pid 和 /var/run/mysqld/mysqld.sock。
MySQL 的布尔变量
- allow_user_mysql_connect 当开放这个布尔变量时允许用户连接数据库。
- exim_can_connect_db 当开放这个布尔变量时允许 exim 邮件程序访问数据库服务器。
- ftpd_connect_db 当开放这个布尔变量时允许 ftpd 进程访问数据库服务器。
- httpd_can_network_connect_db 当开放这个布尔变量时允许 httpd
进程访问数据库服务器。
配置实例
修改 MySQL 的存储数据库位置
在红帽企业 Linux 6 中数据库的默认位置是 /var/lib/mysql,文件类型是
mysqld_db_t。下面把它修改为 /opt/mysql,步骤如下:
首先查看缺省情况下 MySQL 的存储数据库位置(/var/lib/mysql)和 SElinux 属性:
# ls -lZ /var/lib/mysql drwx------. mysql mysql unconfined_u:object_r:mysqld_db_t:s0 mysql
|
记录下 MySQL 的存储数据库位置(/var/lib/mysql)的
SElinux 属性,然后停止 MySQL,然后建立一个新的目录,把原来的数据库文件复制到新目录,并且设置
SElinux 属性。
#service mysqld stop #mkdir -p /opt/mysql #cp -R /var/lib/mysql/* /opt/mysql/ #chmod 755 /opt/mysql #chown -R mysql:mysql /opt/mysql #semanage fcontext -a -t mysqld_db_t "/opt/mysql(/.*)?": #restorecon -R -v /opt/mysql
|
修改配置文件 /etc/my.cnf 重启 MySQL
#vi /etc/my.cnf [mysqld] datadir=/opt/mysql # service mysqld start |
SELinux 环境下的 DNS 配置
Bind 的 SELinux 文件类型
- named_zone_t 这个文件类型用于主区域文件。其他服务不能修改此类型的文件。
- named_cache_t 默认情况下 named 进程可以读写这种类型的标记的文件,无需另外的布尔值设置。
Bind 的布尔变量
- named_write_master_zones 当关闭这个布尔变量时不允许 named 进程读写主区配置文件。
- named_disable_trans 当关闭这个布尔变量时不保护 named 进程。
配置实例
SElinux 对 Bind DNS 服务器的限制不多。默认情况下 SElinux
的策略文件规定不允许 named 进程写主区配置文件。如果允许 named 进程更新主区配置文件,需要开放下面的布尔值变量:
#setsebool -P named_write_master_zones=1
|
也可以禁止 SElinux 保护 named 守护进程,使用命令:
# setsebool -P named_disable_trans=1
|
然后重启 named 进程:
总结
SELinux 的安全防护措施主要集中在各种网络服务的访问控制。对于像
Apache 、Samba、NFS、vsftp 、MySQL、Bind DNS 服务来说,系统默认配置的
SELinux 仅仅开放了最基本的运行需求。至于连接外部网络、运行脚本、访问用户目录、共享文件等,必须经过一定的
SELinux 策略调整才能充分发挥网络服务器的作用。很多用户一直觉得 SELinux 的安全级别设置十分麻烦,因此有人经常关闭
SELinux 不让其工作,这样做是不对的。其实安全性和应用性就是有这种矛盾,系统管理员要寻找一定的安全中间点。
参考资料
- 本系列的第 1 部分:Selinux 的安全防护措施主要集中在各种网络服务的访问控制。对于 Apache
、Samba、NFS 数据库来说,Selinux 仅仅开放了最基本的运行需求。本文介绍如何配置并调整
Selinux 策略实现连接外部网络、运行脚本、访问用户目录、共享文件等功能。
- 阅读 Security-Enhanced Linux,其中包含关于 SELinux 思想的大量信息。此站点提供了形成
SELinux 的相关项目的详细信息,以及与 SELinux 相关的有关安全性的大量技术论文和演示。
- 访问 SELinux Project Wiki,此站点提供了形成 SELinux 的相关项目的详细信息。
- 访问 Fedora SELinux Project Pages,此站点提供了 SELinux 使用的许多例子。
- 在 developerWorks Linux 专区寻找为 Linux 开发人员(包括 Linux
新手入门)准备的更多参考资料。
|