当前位置 : 主页 > 操作系统 > centos >

SELinux环境下网络服务设置

来源:互联网 收集:自由互联 发布时间:2022-06-20
基于最近RHCE中考察到SELINUX,本文简单介绍SELinux的一些设置,深入的暂不考虑,不对的地方欢迎指出! SELinux介绍: SELinux是美国国家安全局为linux设计的一项开放源代码的项目,主要是希

基于最近RHCE中考察到SELINUX,本文简单介绍SELinux的一些设置,深入的暂不考虑,不对的地方欢迎指出!

SELinux介绍:

SELinux是美国国家安全局为linux设计的一项开放源代码的项目,主要是希望将其做为系统的最后一道防线,来抵御黑客的进攻和入侵系统。

Selinux 的安全防护措施主要集中在各种网络服务的访问控制,

Selinux是一个在内核中执行,提供MAC能力的子系统,以提供传统DAC架构的不足,SELinux子系统以“类型强制性”读取控制机制为主,并融合RBAC、MLS和MCS3种MAC读取控制机制的特性。

1、DAC

Discretionary Access Control(任意读取控制),在DAC的架构下,每个对象都会记录一个拥有者的信息,只要是该对象的拥有者,就可以获得该对象的完全控制权限。其他需要读取该对象时候必须授予适当权限,每个对象仅有一组拥有者信息。

2、MAC

Mandatory Access Control(强制性读取控制),在MAC的架构下,会为每一个对象添置一个安全上下文(security context),进程和用户除了具备传统的权限之外,还必须获得selinux的授权,才能读取对象。

3、“类型强制性”读取控制机制

在SElinux里定义了许多的类型,每一个进程、文件、设备、网络链线等都必须表示其所属类型,进程仅能读取相同类型的文件,如果非相关的类型,切SELinux不允许读取时,则无法读取。

SELinux配置文件:

配置文件:/etc/selinux/config,它还有个链接文件:/etc/sysconfig/selinux 

[root@justin ~]# cat /etc/selinux/config  # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: #     enforcing - SELinux security policy is enforced.  ;强制限制状态,警告且阻止 #     permissive - SELinux prints warnings instead of enforcing.  ;警告,不阻止 #     disabled - No SELinux policy is loaded.  ;禁止状态 SELINUX=enforcing #SELINUX=disabled # SELINUXTYPE= can take one of these two values: #     targeted - Targeted processes are protected, ;控制关键网络服务 #     mls - Multi Level Security protection.   ;控制所有服务 SELINUXTYPE=targeted    ;切换类型需reboot [root@justin ~]#

SELinux状态设置:

临时设置SELinux---重启失效

1、查看SELinux状态---sestatus/getenforce

[root@justin ~]# sestatus SELinux status:                 enabled SELinuxfs mount:                /selinux Current mode:                   enforcing Mode from config file:          enforcing Policy version:                 24 Policy from config file:        targeted [root@justin ~]# getenforce  Enforcing [root@justin ~]#

2、设置SELinux状态---setenforce

[root@justin ~]# setenforce  usage:  setenforce [ Enforcing | Permissive | 1 | 0 ] [root@justin ~]# setenforce 0 [root@justin ~]# getenforce  Permissive [root@justin ~]# setenforce enforcing [root@justin ~]# getenforce  Enforcing [root@justin ~]#

3、查看SELinux加载模块--semodule

[root@justin ~]# semodule -l

4、图像化管理SELinux

[root@justin ~]# system-config-selinux

5、查看SELinux策略policy

命令seinfo从规则policy.conf或二进制规则policy.21中提取策略的规则数量统计信息

[root@justin yum.repos.d]# seinfo -bash: seinfo: command not found [root@justin yum.repos.d]# yum -y install setools* [root@justin yum.repos.d]# seinfo  Statistics for policy file: /etc/selinux/targeted/policy/policy.24 Policy Version & Type: v.24 (binary, mls)    Classes:            81    Permissions:       235    Sensitivities:       1    Categories:       1024    Types:            3488    Attributes:        273    Users:               9    Roles:              12    Booleans:          187    Cond. Expr.:       222    Allow:          273919    Neverallow:          0    Auditallow:         96    Dontaudit:      199904    Type_trans:      23469    Type_change:        38    Type_member:        48    Role allow:         20    Role_trans:        291    Range_trans:      3993    Constraints:        87    Validatetrans:       0    Initial SIDs:       27    Fs_use:             22    Genfscon:           81    Portcon:           426    Netifcon:            0    Nodecon:             0    Permissives:        59    Polcap:              2 [root@justin yum.repos.d]#

永久性SELinux设置

上面设置的selinux的状态reboot后失效,要reboot生效需要修改配置文件,如下:

[root@justin ~]# vim /etc/sysconfig/selinux  # This file controls the state of SELinux on the system. # SELINUX= can take one of these three values: #     enforcing - SELinux security policy is enforced. #     permissive - SELinux prints warnings instead of enforcing. #     disabled - No SELinux policy is loaded. SELINUX=enforcing    ;disabled与enforcing、permissive切换需要reboot # SELINUXTYPE= can take one of these two values: #     targeted - Targeted processes are protected, #     mls - Multi Level Security protection. SELINUXTYPE=targeted

开启SELinux后需要通过两部来完成设置,一个是安全上下文,另个是策略值(也叫bool值),策略值是对安全上下文的补充

设置安全上下文

ls -Z、ps -Z、id -Z分别可以查看文件、进程、用户的上下文属性;默认下,mv操作保持安全上下文不变,创建和拷贝的文件继承父目录的安全上下文。

[root@justin ~]# ls -lZ|tail -3 -rwxr-xr-x. root root unconfined_u:object_r:admin_home_t:s0 script.sh drwxr-xr-x. root root system_u:object_r:admin_home_t:s0 Templates drwxr-xr-x. root root system_u:object_r:admin_home_t:s0 Videos [root@justin ~]# ls --scontext|tail -3      ;--scontext只显示安全上下文 unconfined_u:object_r:admin_home_t:s0 script.sh system_u:object_r:admin_home_t:s0 Templates system_u:object_r:admin_home_t:s0 Videos [root@justin ~]#  [root@justin ~]# ps -Z|tail -3 unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 2075 pts/0 00:00:01 bash unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 2816 pts/0 00:00:01 ps unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 2817 pts/0 00:00:00 tail [root@justin ~]# id -Z unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 [root@justin ~]#

unconfined未定义的类型,表示不受selinux控制,它的权限模型仍是DAC

由5部分组成:属主域(user):角色域(object role):类型域(user type):敏感度:类别

通常显示3部分:user_u:object_u:user_home_t

临时修改安全上下文

chcon---change context,临时修改是的type值

命令格式:

   Chcon [OPTIONS…] CONTEXT FILES…..     CONTEXT 为要设置的安全上下文    FILES 对象(文件)

   Chcon [OPTIONS…] –reference=PEF_FILES FILES…     -reference 参照的对象;PEF_FILES 参照文件上下文(源文件);FILES 应用参照文件上下文为我的上下文(目标文件)。

 OPTIONS 如下:

        -f          强迫执行

        -R         递归地修改对象的安全上下文

        -r ROLE    修改安全上下文角色的配置

        -t TYPE    修改安全上下文类型的配置

        -u USER   修改安全上下文用户的配置

        -v         显示冗长的信息

        -l, --range=RANGE    修改安全上下文中的安全级别

root@justin home]# ll -Zd harry/ drwx------. harry harry unconfined_u:object_r:user_home_dir_t:s0 harry/ [root@justin home]# ll -Zd /var/www/html/ drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/ [root@justin home]# chcon --reference=/var/www/html/ harry/ [root@justin home]# ll -Zd harry/ drwx------. harry harry system_u:object_r:httpd_sys_content_t:s0 harry/ [root@justin home]# restorecon harry/ [root@justin home]# ll -Zd harry/ drwx------. harry harry system_u:object_r:user_home_dir_t:s0 harry/ [root@justin home]# chcon -t httpd_sys_content_t harry/ [root@justin home]# ll -Zd harry/ drwx------. harry harry system_u:object_r:httpd_sys_content_t:s0 harry/ [root@justin home]#

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:强制恢复文件安全语境

semanage---SELinux Policy Management tool

File contexts

       Add file-context for everything under /web

       # semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"

       # restorecon -R -v /web

-a:添加

-d:删除

-m:修改

-l:列举

-n:不打印说明头

-D:全部删除


-f:文件

-t:类型

-s:用户


SELinux 环境下的 Apache 配置

当启用 SELinux时,Apache HTTP 服务器(httpd)默认情况下在受限的 httpd_t 域中运行,并和其他受限制的网络服务分开。即使一个网络服务被攻击者破坏,攻击者的资源和可能造成的损害是有限的。下面的示例演示的是 SELinux 下的 httpd 进程。

[root@Zabbix_server html]# ps auxZ|grep httpd system_u:system_r:httpd_t:s0    root      1807  0.0  0.8  34584  8868 ?        Ss   Aug21   0:05 /usr/sbin/httpd system_u:system_r:httpd_t:s0    apache    1876  0.0  0.4  34584  5012 ?        S    Aug21   0:00 /usr/sbin/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 仅仅开放了最低运行需求,为了发挥 Apache 服务器的功能还必须把布尔值必须打开,以允许某些行为。

Apache 的 SELinux 的布尔变量

eg.允许执行通用网关接口(CGI)脚本

1、查询当前的布尔值,使用getsebool -a可以查询当前所有的布尔值

[root@Zabbix_server html]# getsebool -a|grep -i cgi git_cgi_enable_homedirs --> off git_cgi_use_cifs --> off git_cgi_use_nfs --> off httpd_enable_cgi --> off [root@Zabbix_server html]#

2、开启httpd 可执行 CGI 脚本

[root@Zabbix_server html]# setsebool -P httpd_enable_cgi on [root@Zabbix_server html]# getsebool -a|grep httpd_enable_cgi httpd_enable_cgi --> on [root@Zabbix_server html]#

参数-P 使设置永久生效,不加重启失效

Apache 的 SELinux 的上下文

eg.变更主目录为/newhtml

[root@Zabbix_server ~]# mkdir /newhtml [root@Zabbix_server ~]# ll -dZ /newhtml/ drwxr-xr-x. root root unconfined_u:object_r:default_t:s0 /newhtml/ [root@Zabbix_server ~]# ll -Zd /var/www/html/ drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/ [root@Zabbix_server ~]#

按照 SELinux 策略规定和继承原则,/newhtml 目录和其中的文件会具有 default_t 类型,,包括以后创建的文件或者子目录也会继承和拥有这种类型,这样受限的 httpd 进程是不能访问的,可以使用 semanage fcontext/chcon 和 restorecon 命令修改 /newhtml 的文件类型属性,确保之后建立的文件和复制的文件具有相同 httpd_sys_content_t 的类型,从而使受限的 httpd 进程能够访问。

[root@Zabbix_server ~]# semanage fcontext -a -t httpd_sys_content_t "/newhtml(/.*)?" [root@Zabbix_server ~]# rest restart      restorecon   restorecond   [root@Zabbix_server ~]# restorecon -R -v /newhtml/ restorecon reset /newhtml context unconfined_u:object_r:default_t:s0->unconfined_u:object_r:httpd_sys_content_t:s0 [root@Zabbix_server ~]# ll -Zd /newhtml/ drwxr-xr-x. root root unconfined_u:object_r:httpd_sys_content_t:s0 /newhtml/ [root@Zabbix_server ~]# vim /etc/httpd/conf/httpd.conf   292 #DocumentRoot "/var/www/html"  293 DocumentRoot "/newhtml"  [root@Zabbix_server ~]# service httpd restart

eg.共享nfs和cifs文件系统

默认情况下,在客户端的 NFS 挂载 NFS 文件系统默认的上下文标记使用 nfs_t 类型,Samba 共享客户端上默认的上下文使用 cifs_t 类型。根据 SELinux 策略配置,Apache 服务可能无法读取 nfs_t 或 cifs_t 类型。通过设置布尔值开启或关闭来控制哪个服务被允许访问 nfs_t 和 cifs_t 类型。

[root@Zabbix_server var]# getsebool -a|grep -i httpd|egrep -i "nfs|cifs" httpd_use_cifs --> off httpd_use_nfs --> off [root@Zabbix_server var]# setse setsebool  setserial   [root@Zabbix_server var]# setsebool -P httpd_use_cifs on [root@Zabbix_server var]# setsebool -P httpd_use_nfs on [root@Zabbix_server var]# getsebool -a|grep -i httpd|egrep -i "nfs|cifs" httpd_use_cifs --> on httpd_use_nfs --> on [root@Zabbix_server var]#

eg.更改端口

根据策略配置,服务可能只被允许运行在特定的端口号 。试图改变服务运行的端口,在不改变政策,可能导致启动失败的服务。首先查看一下 SELinux 允许 HTTP 侦听 TCP 端口,使用命令:

[root@Zabbix_server home]# semanage port -l|grep -w http_port_t http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000 [root@Zabbix_server home]#

可以看到默认情况下,SELinux 允许 HTTP 侦听 TCP 端口 80,81,443,488,8008,8009 9000或 8443。假设要把端口号 80 修改为 12345 ,下面看看修改端口号的方法:

[root@Zabbix_server home]# vi /etc/httpd/conf/httpd.conf      135 #Listen 12.34.56.78:80     136 #Listen 80     137 Listen 12345 [root@Zabbix_server home]# semanage port -a -t http_port_t -p tcp 12345 [root@Zabbix_server home]# semanage port -l|grep -w http_port_t http_port_t                    tcp      12345, 80, 81, 443, 488, 8008, 8009, 8443, 9000 [root@Zabbix_server home]#

上一篇:如何使用fdisk与parted对不同容量硬盘分区
下一篇:没有了
网友评论