求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
  
 
 
     
   
分享到
SELinux 环境下网络服务设置
 

发布于2013-4-25

 

简介: 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 服务。

#service vsftpd start 

下面把文件 /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 进程:

#service named restart 

总结

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 新手入门)准备的更多参考资料。
 
相关文章

中台产品面面观
如何在互联网产品中建立中台?
什么是产品生命周期管理?
产品设计之前,如何分析业务需求和用户痛点?
 
相关文档

产品经理是怎样炼成的
APP产品规划方法
产品经理培训文档
产品生命周期管理PLM
 
相关课程

产品经理与产品管理
卓越产品经理训练营
产品需求分析与管理
基于用户体验的产品设计
 
分享到
 
 


基于模型的整车电子电气架构设计
嵌入式设备上的 Linux 系统开发
Linux 的并发可管理工作队列
ARM嵌入式系统的问题总结分析
嵌入式系统设计与实例开发
WinCE6.0的EBOOT概要
更多...   


UML +RoseRealtime+嵌入式
C++嵌入式系统开发
嵌入式白盒测试
手机软件测试
嵌入式软件测试
嵌入式操作系统VxWorks


中国航空 嵌入式C高质量编程
使用EA和UML进行嵌入式系统分析设计
基于SysML和EA的嵌入式系统建模
上海汽车 嵌入式软件架构设计
北京 嵌入式C高质量编程
北京 高质高效嵌入式开发
Nagra linux内核与设备驱动原理
更多...