Linux之SElinux安全上下文件(1)
SELinux:Secure Enhanced Linux,是美国国家安全局(NSA=The National Security Agency)和SCC(Secure Computing Courporation)开发的LInux的一个强制控制的安全模块。2000年以GNU GPL发布,Linux内核2.6版本后继承在内核中。
访问控制类别:
DAC:Discretionary Access Control 自由访问控制
MAC:Mandatory Access Control 强制访问控制
DAC和MAC的特点:
DAC环境下进程是无束缚的
MAC环境下策略的规则决定控制的严格程度
MAC环境下进程可以被限定的
策略被用来定义被限定的进程能够使用那些资源(文件和端口)
默认情况下,没有被明确允许的行为将被拒绝
SElinux安全上下文工作类型:
strict:centos5,每个进程都受到selinux的控制
targeted:用来保护常见的网络服务,仅有限进程受到 selinux控制,
只监控容易被入侵的进程,rhel4只保护13个服务,rhel5保护88个服务
minimum:centos7,修改过的targeted,只对选择的网络服务。
mls:提供MLS(多级安全)机制的安全性
minimum和mls稳定信不足,未加以应用
为什么会用SElinux
传统的 Linux中一切皆文件,由用户、组、权限控制访问。而在SELinux中一切皆对象(object),由存放在inde表的扩展属性域的安全元素所控制其访问。
安全上下文基本格式说明
所有的文件和端口资源和进程都具备安全标签:安全上下文(security context)组成元素:
user:role:type:sesitivity:category,如
user_u:object_r:tmp_t:s0:c0
实际上下文存放在文件系统中,进程、文件、已经用户等都有相应的安全上下文:
例子:
#查看指定文件的安全上下文 ls -Z
#查看进程的安全上下文件 ps Z
#查看用户安全上下文
期望(默认)上下文:
存放在二进制的SELinux策略库(映射目录和期望安全上下文)中:
使用命令
semanage fcontext -l # 可以查看所有默认策略
SELinux策略:
对象(object):所有可以读取的对象,包括文件、目录和进程,端口等
主体:进程称为主体(subject)
SELinux中对所有的文件都赋予一个type的文件类型标签,对于所有的进程也赋予各自的一个domain的标签。domain标签能够执行的操作由安全策略里定义。
当一个subject试图访问一个object,Kernel中的策略执行服务器将检查AVC(访问矢量缓存Access Vector Cache),在AVC中,subject和object的权限被缓存(cached),查找“应用+文件”的安全环境。然后根据查询结果运行或拒绝访问。
安全策略:定义主体读取对象的规则数据库,规则中记录了哪个类型的主体使用哪个方法读取哪一项对象是允许还是拒绝的,并且定义了那种行为是运行或拒绝。
设置SELinux模式及开关使用命令:getnforce status setenforce
getenforce:#获取selinux的当前状态
sestatus: #查看selinux完整状态
setenforce 0|1#开启或关闭
0:设置为permissive
1:设置为enforcing
配置文件:
/boot/grub/grub.conf在对应的kernel内核参数后面追加
selinux=1 (启用) selinux=0(禁用)
/etc/sysconfig/selinux
/etc/selinux/config
SELINUX变量有3中参数:
SELINUX={disabled|enforcing|permissive}
基本使用实例:
#关闭当前selinux功能
[[email protected] ~]# setenforce 0
#查看当前selinux状态
[[email protected] ~]# getenforce Permissive
#启用当前selinux功能
[[email protected] ~]# setenforce 1
#再次查看当前selinux功能
[[email protected] ~]# getenforce
解析:这里的设置都是立即生效,使用此命令只能开启或关闭,并不能禁用 selinux。
#查看目前系统完整的selinux状态
[[email protected] ~]# sestatus
解析:因为selinux是需要内核或内核模块来支持的,那么也就需要对应的配置文件来提供读取,这里说明了其主配置目录为/etc/selinux,而当前状态为enabled启用状态,也就是说selinux还是可以通过命令来设置是否开启。而当前模式表示其selinux的具体管理方式。
enforcing: 表示完全安装selinux规则在处理。
permissive:表示只是根据selinux规则来进行警告,而不进行权限处理,但会记录。
修改文件的SELinux标签的命令:chcon restorecon
chcon 命令
chcon - change file SELinux security context
更改文件的selinux安全上下文件
选项与用法:
chcon [option]... CONTXT /path/to/file... #直接对指定的文件写完整的安全上下文字段
chcon [option]... [-u USER] [-r ROLE] [-l RANGE] [-t TYPE] FILE... #根据上下文类型更改
chcon [option]... --reference=RFILE FILE.... #参考RFILE的上下文修改FILE的上下文
-R :如果是目录,将同时递归设置该目录下所有文件
restorecon 命令
restorecon - restore file(s) default SELinux security contexts.
恢复文件或目录默认的SELinux安全上下文
选项与用法:
restorencon [option] /path/to/somewhere
-R:递归恢复处理
SELinux规则管理工具命令:semanage
semanage - SELinux Policy Management tool
semange 命令 注:此命令来自policycoreutils-python RPM包
默认安全文件规则的查询和修改:semanage
semanage 命令
semanage fcontext [-S store] -{a|d|m|l|n|D} [-frstN] file_spec
用法与实例:
查询信息
#查看默认所有安全上下文列表
semanage fcontext -l
#添加安全上下文
semanage fcontext -a -t httpd_sys_content_t ‘/testdir(/.*)?’
#删除安全上下文
semanage fcontext -d -t httpd_sys_content_t ‘/testdir(/,*)?’
端口标签的设置
#查询端口标签
semanage port -l
#添加端口
semanage port -a -t port_label -p tcp|udp POST 例如:
semanage port -a -t http_port_t -p tcp 9527
#删除端口
semanage port -d -t port_label -p tcp|udp POST 例如:
semanage port -d -t http_port -t -p tcp 9527
#修改现有端口为新标签
semanage port -m -t port_label -p tcp|udp POST 例如:
semanage port -m -t http_port_t -p tcp 9527
布尔值规则命令:getsebool setsebool
SELinux布尔值设置
查看bool命令:
getsebool [-a] [boolean]
semanage boolean -l
semanage boolean -l -C #查看修改过的布尔值
设置bool值命令:
setsebool [-P] boolean value (on,off)
setsebool [-P] Boolean=value (0,1)
SELinux日志管理:setrublesshhoot 命令
yum install setrublesshooot* (重启后生效)
setrub会将错误信息写入/var/log/message,使用下面方式查看:
grep ‘setroubleshoot’ /var/log/messages
sealert -l UUID
查看安全时间日志说明
sealert -a /var/log/audit/audit.log
扫描并分析日志
获取SELinux的相关帮助信息
yum -y install selinux-policy-devel #centos7下
yum -y install selinux-policy-doc #centos6下
mandb | makewhatis #更新man文档数据库
man -k _selinux #列出selinux关键字相关文档
实战案例:
1、启用SELinx策略并安装httpd服务,改变网站的默认主目录为/website,添加SELinux文件标签规则,使网站可访问。
#使用yum原安装本地ISO镜像中httpd即可
[[email protected] ~]# yum install httpd -y
#修改配置主配置文件,将DocumentRoot 对应的路径和Direcotry标标签目录改为/webbsite
[[email protected] ~]# vim /etc/httpd/conf/httpd.conf
注意:这两项都要修改,才会完整生效。
#查看修改后的结果
[[email protected] ~]# grep ‘[[:space:]]*DocumentRoot.*\".*\"‘ /etc/httpd/conf/httpd.conf DocumentRoot "/website"
#新建/website目录并给其目录添加文件标签规则
[[email protected] ~]# [ ! -d ‘/website‘ ] && mkdir /website
#查看原首页目录/var/www/html 的文件规则类型
[[email protected] ~]# ls -dZ /var/www/html/ drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 /var/www/html/
#新建index.html文件内容如下
[[email protected] website]# cat index.html <html> <head> <title>Welcome to Website directry!!!</title> </head> <body><div><ul> <li>Welcome to Website directry!!!</li> </ul></div></body> </html>
#查看原有的/var/www目录下的默认规则
[[email protected] website]# semanage fcontext -l | grep --exclude=‘.*?‘ ‘/var/www(/.*)?‘ /var/www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
#给/website及其下文件设置文件规则类型,3种方法
(1)执行设置特定值,使用chcon命令
[[email protected] website]# chcon -t httpd_sys_content_t -R /website/
(2)参考/var/www/html目录的规则来设定
[[email protected] website]# chcon -R --reference=‘/var/www/html/‘ /website/
(3)执行给目录添加规则,然后对目录进行递归默认规则还原
[[email protected] website]# semanage fcontext -l | grep -F ‘/var/www(/.*)?‘ | cut -d‘:‘ -f3 httpd_sys_content_t [[email protected] website]# semanage fcontext -a -t httpd_sys_content_t ‘/website(/.*)?‘ [[email protected] website]# semanage fcontext -l | grep -F ‘/website(/.*)?‘ | cut -d‘:‘ -f3 httpd_sys_content_t [[email protected] website]# restorecon -R /website/ [[email protected] website]# ls -aZ --ignore=‘..‘ /website drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 . -rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 index.html
解析:上述三种方法中,前两种如果执行了restorecon还原默认,而默认selinux规则里没有预设,那么会还原其它的默认值,而第三者方法采用直接在selinux规则中对此目录添加预设规则,这样无论怎么修改,只要使用restorecon就可以还原回来。
#启用selinux功能
[[email protected] website]# setenforce 1
#重启httpd服务
[[email protected] website]# service httpd restart
#使用另一条主机使用links工具访问其主页
[[email protected] ~]# links http://192.168.20.136
解析:显示出/website新建的index.html文件内容表示成功。
2、修改上述网站的http端口为9527,增加SELinux端口标签,使网站可访问
#修改httpd服务配置文件中Listen监听端口
[[email protected] ~]# sed -i ‘s/^\([[:space:]]*Listen\)[[:space:]]\+[0-9]\+/\1 9527/‘ /etc/httpd/conf/httpd.conf [[email protected] ~]# sed -n ‘/^[[:space:]]*Listen[[:space:]]\+[0-9]\+/p‘ /etc/httpd/conf/httpd.conf Listen 9527
#因为上面已经重启了服务,这次使用发送SIGHUP信号来重新调用httpd服务
[[email protected] ~]# pkill -SIGHUP ‘httpd‘
#查看原来的httpd默认监听端口80的端口标签类型
[[email protected] ~]# semanage port -l | grep ‘\<80\>‘ http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
#添加9527端口进入此标签类型
[[email protected] ~]# semanage port -a -t http_port_t -p tcp 9527
#查看9527端口是否在此列表
[[email protected] ~]# semanage port -l | grep ‘\<9527\>‘ http_port_t tcp 9527, 80, 81, 443, 488, 8008, 8009, 8443, 9000
#修改一下/website/index.html的内容
[[email protected] ~]# cat /website/index.html <html> <head> <title>Welcome to Website directry!!!</title> </head> <body><div><ul> <li>This is next two!!!</li> </ul></div></body> </html>
#使用其它主机通过links统计进行访问9527端口
[[email protected] ~]# links http://192.168.20.136:9527
解析:这里显示和上面修改的body标签里的内容一样,说明已经生效。
3、启用相关的SElinux布尔值,使上述网站的用户student的家目录可通过http访问
#添加httpd.conf文件的用户目录访问配置
说明:找到<If Modulemod_userdir.c>标签在里面注释掉UserDir disabled此行,然后添加一个UserDir public_html行,表示在使用用户加目录下有个此文件会被访问。
#在student 用户家目录新建public_html目录
[[email protected] ~]# cd /home/student/ [[email protected] student]# mkdir -m 711 public_html
#拷贝/website/index.html到此目录下并修改
[[email protected] student]# cp /website/index.html ./public_html/
#修改index.html文件的li标签里的内容,随便改,为了区别显示
[[email protected] student]# grep ‘<li.*/li>‘ ./public_html/index.html <li>This is stuent home</li>
#重新给httpd发送SIG信号
[[email protected] student]# killall -HUP -r ‘httpd‘
#再次访问links
解析:这是因为没有开启相关的httpd用户家目录布尔值导致的,于是修改其boolean值。
#查看httpd的用户目录读取,off为关闭,及提供此功能
[[email protected] student]# getsebool -a | grep ‘http.*user‘ httpd_read_user_content --> off
#修改为on,表示启用访问用户家目录
[[email protected] student]# setsebool httpd_read_user_content on
#再次访问
解析:这就成功了,在目录本身对其它人有相应的执行权限以外,还是要添加一个boolean。