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
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354

推荐阅读更多精彩内容

  • 1、第八章 Samba服务器2、第八章 NFS服务器3、第十章 Linux下DNS服务器配站点,域名解析概念命令:...
    哈熝少主阅读 3,734评论 0 10
  • 一个程序被加载到内存当中运行,那么在内存内的那个数据就被称为进程(process)。进程是操作系统上非常重要的概念...
    Zhang21阅读 1,933评论 0 12
  • SELinux的基本概念设置SELinux 一、SELinux的基本概念 (一)定义: SELinux:Secur...
    哈喽别样阅读 565评论 0 1
  • SELinux的有四种工作类型:(不同版本不同类型) strict:centos5,每个进程都受到selinux的...
    beeworkshop阅读 1,351评论 0 1
  • 还没离开,准备离开。 为什么准备离开呢?因为深圳是我攀不上的高枝,房价筑起了阶级之间的壁垒,这个壁垒是我永远都跨不...
    先锋小戏阅读 1,084评论 0 1