第五十九天 : SELinux 环境下网络服务设置: 第 2 部分

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

然后使用命令重启服务:

1
#/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 环境下网络服务设置 , 第 1 部分: 配置 Apache 、Samba、NFS

SELinux 环境下的 Apache 配置

Apache 的 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 定义了一些文件类型:

  • httpd_sys_content_t 主要用于提供静态内容服务的文件,如 HTML 静态网站使用的文件。这种类型的标记文件可以访问(只读)httpd 和执行脚本 httpd。默认情况下,这种类型的文件和目录标记不能被写入或修改 httpd 或其他进程。注意:默认情况下,创建的文件或复制到的 /var/www/html/httpd_sys_content_t 类型的标记。
  • httpd_sys_script_exec_t 主要用于设置 /var/www/cgi-bin/ 目录下的 cgi 脚本。默认情况下 SELinux 策略防止 httpd 执行 CGI 脚本。
  • httpd_sys_content_rw_t 使用 httpd_sys_content_rw_t 的类型标签读取和写脚本标记文件 httpd_sys_script_exec_t 的类型。
  • httpd_sys_content_ra_t 使用 httpd_sys_content_ra_t 的类型标签将读取和附加标记的脚本文件 httpd_sys_script_exec_t 类型。

如 果需要修改文件和目录的 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:角色

Apache 的 SELinux 的布尔变量

对于网络服务而言,SElinux 仅仅开放了最低运行需求,为了发挥 Apache 服务器的功能还必须把布尔值必须打开,以允许某些行为包括允许 httpd 脚本网络访问, 允许 httpd 访问 NFS 和 CIFS 文件系统, 允许执行通用网关接口(CGI)脚本 。可以使用命令 getsebool 查询当前布尔变量。然后可以使用下面的 setsebool 命令开放布尔变量:

 #setsebool – P  httpd_enable_cgi on

下面是常用的布尔变量:

  • allow_httpd_anon_write 禁用时这个布尔变量允许的 httpd 到只有标记文件 public_content_rw_t 类型的读取访问。启用此布尔变量将允许的 httpd 写入到文件标记与一个公共文件目录包 含一个公共文件传输服务,如 public_content_rw_t 类型。
  • allow_httpd_mod_auth_pam 启用此布尔变量允许 mod_auth_pam 模块访问 httpd。
  • <