SELinux 环境下网络服务设置 , 配置 Apache 、Samba、NFS、vsftp 、MySQL、Bind DNS
来源:互联网 发布:小镇姑娘 知乎 编辑:程序博客网 时间:2024/06/06 03:58
Selinux 的安全防护措施主要集中在各种网络服务的访问控制。对于 Apache 、Samba、NFS 数据库来说,Selinux 仅仅开放了最基本的运行需求。至于连接外部网络、运行脚本、访问用户目录、共享文件等,必须经过一定的 Selinux 策略调整才能充分发挥网络服务器的作用,在安全和性能直接获取平衡。
引言
SELinux 的安全防护措施主要集中在各种网络服务的访问控制。对于像 Apache 、Samba、NFS、vsftp 、MySQL、Bind dns 等服务来说,SELinux 仅仅开放了最基本的运行需求。至于连接外部网络、运行脚本、访问用户目录、共享文件等,必须经过一定的 SELinux 策略调整才能充分发挥网络服务器的作用,在安全和性能直接获取平衡。
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。
- allow_httpd_sys_script_anon_write 这个布尔变量定义 HTTP 脚本是否允许写访问到文件标记在一个公共文件传输服务 public_content_rw_t 类型。
- httpd_builtin_scripting 这个布尔变量定义 httpd 的脚本的访问。在这个布尔变量启用,往往需要为 PHP 内容。
- httpd_can_network_connect 禁用时这个布尔变量防止从网络或远程端口发起连接的 HTTP 脚本和模块。打开这个布尔变量允许这种访问。
- httpd_can_network_connect_db 禁用时这个布尔变量防止发起一个连接到数据库服务器的 HTTP 脚本和模块。打开这个布尔变量允许这种访问。
- httpd_can_network_relay 打开这个当布尔变量的 httpd 正在使用正向或反向代理。
- httpd_can_sendmail 禁用时这个布尔变量防止发送邮件的 HTTP 模块。这可以防止垃圾邮件的攻击漏洞中发现的 httpd。打开这个布尔变量允许 HTTP 模块发送邮件。
- httpd_dbus_avahi 关闭时这个布尔变量拒绝服务的 avahi 通过 D-BUS 的 httpd 访问。打开这个布尔变量允许这种访问。
- httpd_enable_cgi 禁用时这个布尔变量防止 httpd 的执行 CGI 脚本。打开这个布尔变量让 httpd 的执行 CGI 脚本。
- httpd_enable_ftp_server 开放这个布尔变量会容许的 httpd 作为 FTP 服务器的 FTP 端口和行为。
- httpd_enable_homedirs 禁用时这个布尔变量阻止访问用户主目录的 httpd。打开这个布尔变量允许 httpd 访问用户主目录。
- httpd_execmem 启用时这个布尔变量允许 httpd 的执行程序需要的内存地址。建议不要启用这个布尔变量从安全角度来看,因为它减少了对缓冲区溢出,但是某些模块和应用程序(如 Java 和 Mono 应用)的保护需要这种特权。
- httpd_ssi_exec 这个布尔变量定义服务器端包含(SSI)的网页中的元素是否可以执行。
- httpd_tty_comm 这个布尔变量定义的 httpd 是否被允许访问的控制终端。这种访问通常是不需要的,但是,如配置 SSL 证书文件的情况下,终端访问所需的显示和处理一个密码提示。
- httpd_use_cifs 打开这个布尔变量允许 httpd 访问 CIFS 文件系统上标记的文件,如通过 Samba 挂载的文件系统,cifs_t 类型。
- httpd_use_nfs 打开这个布尔变量允许 httpd 访问 NFS 文件系统上的标记文件 nfs_t 类型,如文件系统,通过 NFS 挂载。
几个配置实例:
(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 配置
Samba 的 SELinux 的文件类型
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 命令 。
Samba 的 SELinux 的布尔变量
SELinux 也为 Samba 提供了一些布尔变量用来调整 SELinux 策略,如果希望 Samba 服务器共享 NFS 文件系统,可以使用如下命令:
# setsebool -P samba_share_nfs on
下面是常用的布尔变量;
- allow_smbd_anon_write 开放此布尔变量启用允许 smbd 保留一个区域的共同文件。
- samba_create_home_dirs 开放此布尔变量启用允许 Samab 独立创建新的主目录。这通常是用于 PAM 机制。
- samba_domain_controller 当启用此布尔变量时允许 Samba 作为域控制器,以及赋予它的权限执行相关的命令,如使用 useradd,groupadd 的 和 passwd 。
- samba_enable_home_dirs 启用此布尔变量允许 Samba 共享用户的主目录。
- samba_export_all_rw 启用此布尔变量允许公布任何文件或目录,允许读取和写入权限。
- samba_run_unconfined 启用此布尔变量允许允许的 Samba 运行 / var / lib/samba/ scripts 目录中的脚本。
- samba_share_nfs 启用此布尔变量将允许 Samba 共享 NFS 文件系统。
- use_samba_home_dirs 启用此布尔变量可以使用远程服务器 Samba 的主目录。
- virt_use_samba 允许虚拟机访问 CIFS 文件。
配置实例
(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 的 SELinux 的文件类型
SELinux 环境中,nfs 服务器的守护进程都是在受限的 nfs_t 域中运行。并且和其他受限的网络服务相互隔离。SELinux 策略不允许使用 NFS 共享远程文件。如果一定要共享远程文件,可以使用 nfs_export_all_ro 和 nfs_export_all_rw 等布尔值变量调整 SELinux 的策略。按照 SELinux 的策略规定客户端安装 NFS 文件系统采用的默认文件系统是 nfs_t,此外 SELinux 还针对 nfsd 定义了一些文件类型:
- var_lib_nfs_t 这种类型用于现有的和新的文件复制或在创建的 /var/lib/nfs 目录中。在正常运行这种类型应该不需要改变。要恢复到默认设置,可以使用超级用户权限运行命令:restorecon -R -v /var/lib/nfs。
- nfsd_exec_t /usr/sbin/rpc.nfsd 程序文件和其他涉及到 NFS 可执行文件和库都是这种类型。其他文件不使用此类型的任何文件。
NFS 的 SELinux 的布尔变量
SELinux 提供了几个布尔变量用来调整 NFS,你可以在系统安全和 NFS 功能之间取得平衡。例如:
将本机的 NFS 共享设置成可读可写,需要开放相关布尔值变量:
#setsebool -P nfs_export_all_rw on
如果你想要将远程 NFS 的家目录共享到本机,需要开放相关布尔值变量:
#setsebool -P use_nfs_home_dirs on
下面是常用的布尔变量;
- allow_ftpd_use_nfs 当启用时这个布尔变量允许 ftpd 访问 NFS 挂载。
- allow_nfsd_anon_write 当启用时这个布尔变量允许写入到一个公共目录匿名 nfsd。
- httpd_use_nfs 当启用时这个布尔变量容许的 httpd 访问一个 NFS 文件系统上存储的文件。
- nfs_export_all_ro 当启用时这个布尔变量允许任何文件或目录通过 NFS 导出,允许只读权限。
- nfs_export_all_rw 当启用时这个布尔变量允许任何通过 NFS 导出的文件或目录,允许读取和写入权限。
- qemu_use_nfs 当启用时这个布尔变量允许 QEMU 使用 NFS 文件系统。
- samba_share_nfs 启用此布尔变量将允许 Samba 共享 NFS 文件系统。
- use_nfs_home_dirs 当启用时这个布尔变量允许将支持 NFS 主目录。
- virt_use_nfs 当启用时这个布尔变量允许虚拟机访问 NFS 文件。
- xen_use_nfs 当启用时这个布尔变量允许 Xen 使用 NFS 文件。
一个例子
这个例子中 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 服务的配置。
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 不让其工作,这样做是不对的。其实安全性和应用性就是有这种矛盾,系统管理员要寻找一定的安全中间点。
- SELinux 环境下网络服务设置 , 配置 Apache 、Samba、NFS、vsftp 、MySQL、Bind DNS
- SELinux 下网络服务设置:Apache
- fedpra 16 之 samba + vsftp + nfs 配置
- 喜羊羊系列之linux网络服务设置(nfs,tftp,samba)
- SELinux 和网络服务设置
- nfs、pure-ftp、vsftp、samba的区别和安装配置
- 在selinux 环境下使用samba
- linux下vsftp和samba基础配置
- samba,vsftp,apache
- 配置Apache服务器,设置DNS
- redhat下搭建php+apache+mysql+vsftp
- 正式生产环境下hadoop集群的DNS+NFS+ssh免密码登陆配置
- 生产环境下Hadoop大集群安装与配置+DNS+NFS
- 正式生产环境下hadoop集群的DNS+NFS+ssh免密码登陆配置
- 生产环境下部署hadoop集群(包括dns配置,nfs共享,awk资源分发)
- Windows 环境下配置Apache 、PHP、Mysql
- Windows下Apache+PHP+MySQL环境配置
- windows下 Apache+MySQL+PHP环境配置
- ViBe前景检测算法
- bzoj 1912: [Apio2010]patrol 巡逻
- 关于rest的一些标注
- 五、SpringBoot JPA 配置redis
- 第十一周 阅读程序(5b)
- SELinux 环境下网络服务设置 , 配置 Apache 、Samba、NFS、vsftp 、MySQL、Bind DNS
- pow()函数自实现
- springMVC post方式乱码解决方案
- 一篇关于连通区域分析的好文
- JDK安装、配置
- Swift开发:解析xml文件案例
- drools的规则文件
- HTTPS与SSL
- Android抽象布局——include、merge 、ViewStub