SELinux(Security Enhanced Linux)管理

Linux传统的文件访问控制机制是DAC(Discretionary Access Control)。她基于用户和组,通过比对当前用户及文件的属主和组来完成访问控制。

$ ls -l /etc/shadow
-rw------- 1 root root 1010 Apr 25 22:05 /etc/shadow

而SELinux在DAC之上又提供了一层访问的保护控制。SELinux提供的是MAC (Mandatory Access Control) 。SELinux不会为root提供为所欲为的权限。SELinux在内核级提供策略驱动的访问控制,这种控制针对的是进程和当前的用户。SELinux的policy中有rule,而且在系统启动时加载。Linux内核通过 LSM (Linux Security Modules)对rule强制执行。


SELinux的运行机制

SELinux不会覆盖,干涉DAC及POSIX Access Control Lists(setfacl 和 getfac l命令)的控制。

SELinux可以甚至可以约束root的权限。

查看当前用户的Context

$ id -Z
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

包含4个域,最后一个域包含一个冒号。
SELinux是一种基于标签的强制访问控制。

上下文Context的域Field

# ps -eZ | grep sshd
system_u:system_r:sshd_t:s0-s0:c0.c1023 1047 ?  00:00:00 sshd
system_u:system_r:sshd_t:s0-s0:c0.c1023 1163 ?  00:00:00 sshd
unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 1167 ? 00:00:00 sshd
  • system_u 表示 SELinux user
  • system_r 表示 SELinux role
  • sshd_t 表示 SELinux type(或者domain)
  • s0 表示 敏感性sensitivity


    SELinux的上下文和域

SELinux的context中每个字段的作用(每个字段都有相应的label)

user role type Sensitivity level
SELinux用户 定义一个user能做什么不能做什么。且用户不能随意切换角色。 控制进程在不同type上的行为 实现多层控制,用户资源分类及访问控制。

Sensitivity level又包含两个部分

confdentiality value category value
s开头 c开头
0 (lowest confdentiality) 相当于一个标签

进程不能读取或写入(通信)更高confdentiality value的资源。
不给进程分配适当的category value,则不能对资源做任何事情。当资源的category value和进程的category value相同时才能完成访问。

查看SELinux的状态

$ sestatus
SELinux status:                 enabled
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux
Loaded policy name:             targeted
Current mode:                   enforcing
Mode from config file:          enforcing
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      28

SELinux policy store通常有:
strict, targeted, mcs, and mls
其中
MLS=enabled 将启用4个字段Field
cat /sys/fs/selinux/mls 返回值:disabled=0 enabled=1

SELinux的三种状态

1. disabled

彻底关闭SELinux

2. permissive

不强制执行SELinux的策略。对于违反策略的行为允许,但要报告。

3. enforcing

强制执行SELinux的策略。对于违反策略的行为拒绝,仍要报告。

三种状态在配置文件/etc/selinux/config中设置。
查看命令

$ grep ^SELINUX= /etc/selinux/config

如何获取SELinux的当前状态?

apt install selinux-utils
getenforce
或者
apt install policycoreutils
sestatus

如何关闭SELinux?

  • 临时性关闭
$ setenforce 0
或者
$ echo 0 > /sys/fs/selinux/enforce

0表示 permissive
1表示 enforcing

启动时通过向内核传参来启用SELinux而不管配置文件/etc/selinux/config如何配置?

title Linux with SELinux permissive
root (hd0,0)
kernel /kernel root=/dev/md3 selinux=1 enforcing=0
initrd /initramfs

如何只针对某个域将SELinux切换为permissive状态?

$ semanage permissive -a minidlna_t
这里minidlna_t是应用程序的SELinux type或者Domain

如何查看某个域是否已经设置为了permissive状态?

$ semanage permissive -l

如何查看一个进程的SELinux context?

ps –eZ

如何查看一个程序启用了SELinux?

  • 查看一个程序使用的so(sharing object)——通过ELF
$ scanelf -n /bin/ls
如果动态连接的共享对象so中包含libselinux库,那么该程序启用了SELinux。
  • 或者使用ldd查看程序的共享对象so的依赖
$ ldd /bin/ls | grep selinux
看有没有libselinux.so.1

可以通过日志来排障

  • 日志格式——AVC (Access Vector Cache)形式如下:
type=AVC msg=audit(1369306885.125:4702304): avc: denied { append }
for pid=1787 comm=72733A6D61696E20513A526567 name="oracle_audit.log"
dev=dm-18 ino=65 scontext=system_u:system_r:syslogd_t:s0 tcontext=syst
em_u:object_r:usr_t:s0 tclass=file

scontext指source context
tcontext指target context

  • 日志审计输出文件
    /var/log/audit/audit.log
    或者
    /var/log/auth.log

  • 查看最近的SELinux出错信息

$ ausearch -m avc -ts recent
  • 使用/var/lib/setroubleshoot推送的日志
Jun 14 12:05:43 localhost setroubleshoot: SELinux is preventing
/usr/sbin/httpd from 'getattr' accesses on the directory
/var/www/html/infocenter. For complete SELinux messages, run
**sealert -l 26f2a1c3-0134-458e-a69b-4ef223e20009**

看不见SELinux的拒绝日志怎么办?

$ seinfo | grep -E '(dontaudit|allow)'
$ semodule --disable_dontaudit --build
恢复
$ semodule --build

也可以使用audit2allow -w命令,该命令可以提供更直观的描述和解答。

$ ausearch –m avc –ts today | audit2why

如何查看在SELinux的策略中一个目录的上下文应该是什么样的?

$ matchpathcon /var/www/html/infocenter

当然也可以借助man查询SELinux策略中的context,domain,类型,问题处理等。如:

$ man ftpd_selinux

查看当前用户的SELinux context

$ id -Z

如何查看哪些SELinux域是没有限制的?

$ seinfo -aselinux_unconfined_type -x

如何改变用户的角色?

注:可以通过yum provides newrole命令查看newrole命令需要安装哪个软件包。

$ id -Z
staff_u:staff_r:staff_t
$ newrole -r sysadm_r
Password:
$ id -Z
staff_u:sysadm_r:sysadm_t

修改敏感性

$ newrole -l s0:c0.c100

sudo如何管理SELinux用户的context?

这种方法比newrole命令更常用,但该法不能修改敏感性。

  • 修改用户的context
$ sudo -r dbadm_r -t dbadm_t vim /etc/postgresql/pg_hba.conf
  • 在sudo的配置文件中配置用户的context
# /etc/sudoers
myuser ALL=(ALL) TYPE=dbadm_t ROLE=dbadm_r ALL

如何以一个category执行程序?

$ runcon -l Salaries firefox

如何查找一个路径的默认context

$ findcon /etc/selinux/strict/contexts/files/file_contexts -p /usr/lib/
pgsql/test/regress/pg_regress

如何修改文件的context

$ chcon -R -t httpd_sys_content_t /srv/www
$ chcon --reference /var/www/index.html /srv/www/index.html

永久性修改(在/etc/selinux/targeted/contexts/files/file_contexts中修改配置项)
$ semanage fcontext -a -t httpd_sys_content_t "/srv/www(/.*)?"

恢复chcon做的修改
$ restorecon -R /srv/www

比较文件的context是否相同
$ semanage fcontext -a -e /var/www /srv/www

还原context为默认/初始状态

~针对openssh软件包
$ rlpkg openssh
$ setfiles -R openssh restore

~针对整个系统
$ rlpkg -a -r
$ setfiles -f -F relabel

对于CentOS系统还可以如下还原系统初始设置
$ touch /.autorelabel    注意是在系统根目录/下
$ reboot

查找context的变更
$ sesearch -T -s httpd_t -t var_log_t  从httpd_t变到var_log_t  

设置敏感性和类别
$ chcon -l s0:c0,c2 index.html
$ chcat -- +Customer2 index.html 设置附加信息

SELinux转换规则

文件和进程是不同的东西,文件上定义了SELinux域,而进程也继承相应的context,两者之间在SELinux的策略数据库中建立了对应关系,即转换规则。

转换规则的查看
$ sesearch -T | grep "process sshd_t"
   type_transition kdumpctl_t sshd_exec_t : process sshd_t; 
   type_transition init_t sshd_exec_t : process sshd_t; 
   type_transition inetd_t sshd_exec_t : process sshd_t; 
   type_transition openshift_initrc_t sshd_exec_t : process sshd_t; 
   type_transition sge_shepherd_t sshd_exec_t : process sshd_t; 
   type_transition glusterd_t sshd_exec_t : process sshd_t; 
   type_transition svc_run_t sshd_exec_t : process sshd_t; 
   type_transition realmd_t sshd_exec_t : process sshd_t; 
   type_transition piranha_pulse_t sshd_exec_t : process sshd_t; 
   type_transition sge_job_t sshd_exec_t : process sshd_t; 
   type_transition cluster_t sshd_exec_t : process sshd_t; 
   type_transition condor_startd_t sshd_exec_t : process sshd_t; 
   type_transition initrc_t sshd_exec_t : process sshd_t;
上述为进程域(type,如initrc_t)到文件域(type,如sshd_exec_t)的转换规则。
查询有没有某条转换规则
$ sesearch -s initrc_t -t httpd_t -c process -p transition -A
$ sesearch -s initrc_t -t httpd_exec_t -c file -p execute -A
$ sesearch -s httpd_t -t httpd_exec_t -c file -p entrypoint -A
$ seinfo -r system_r -x | grep httpd_t

当所有上述涉及的转换规则都满足时SELinux才会放行。

网络控制

$ semanage port -l | grep http_port
$ sesearch -s httpd_t -t http_port_t -A
$ semanage port -a -t http_port_t -p tcp 84

troubleshooting

  1. 通过日志
    /var/log/messages 应用程序日志(包含SELinux出错信息)
    /var/log/audit/audit.log 审计日志(包含SELinux出错信息)
    /var/log/secure 登陆认证日志(显示认证信息)
通过audit2allow生成转换规则并显示出来
$ grep setkey /var/log/audit/audit.log | audit2allow

通过audit2allow生成转换规则,并在本地生成策略文件localpolicy.pp
$ grep setkey /var/log/audit/audit.log | audit2allow -M localpolicy
将localpolicy.pp加载内存
semodule -i localpolicy.pp

获得最近AVC出错信息的提示
$ ausearch -m avc -ts recent | audit2why

获得最近AVC出错信息的解决方案
$ ausearch -m avc -ts recent | audit2allow
  1. 修改用户的context
为SELinux User增加Roles="staff_r system_r pgsql_admin_r"
$ semanage user -a -R "staff_r system_r pgsql_admin_r" pgsql_admin_u

为登陆用户auser设定SELinux User=pgsql_admin_u 
$ semanage login -a -s pgsql_admin_u auser

重置登陆用户auser的context
$ restorecon -RvF /home/auser

你可能感兴趣的:(SELinux(Security Enhanced Linux)管理)