SELinux 是一个安全体系结构, 由NSA(美国国家安全局)和SELinux联合项目.
基于内核的安全框架
UGO acl SELinux firewalld
SELinux 是用于确定哪个进程可以访问哪些文件/目录/端口的一组安全规则;
SELinux 标签(上下文):
system_u:object_r:admin_home_t:s0
用户 角色 类型 敏感度
只关心类型:
安全策略:
哪些进程可以访问哪些类型的上下文
但是SELinux 安全策略,特别麻烦,不需要用户自己写,对于用户 只要打开相应的策略即可.
SELinux布尔值:
就是SELinux策略开关;
1)Enabling and Monitoring SELinux
[root@server0 ~]# ls -lZ
[root@server0 ~]# ls -ldZ /tmp/
[root@server0 ~]# ps auxZ 查看进程的上下文
[root@server0 ~]# semanage port --list 查看端口的上下文类型
2)Changing SELinux Modes
SELinux的打开与关闭:
1. SELinux 临时开启enforcing 或permissive setenforce 1|0
2. 永久的开启与关闭 /etc/selinux/config SELINUX=permissive
注意:从disabled 调整为其它状态,必须要重启系统才会生效;
[root@server0 ~]# getenforce 查看当前SELinux的状态
SELinux的模式有三种:
1. enforcing - SELinux security policy is enforced. 强制开启 代表记录警告且阻止可疑行为
2. permissive - SELinux prints warnings instead of enforcing. 允许状态 表示仅记录警告,不阻止可疑行为
3. disabled - No SELinux policy is loaded. 关闭状态 SELinux被禁用
3)Changing SELinux Contexts(上下文)
初始上下文:
默认情况下,创建的文件上下文会自动继承上级目录的SELinux上下文;
如: vim / touch / cp 会自动继承上级目录的SELinux上下文
但是
mv / cp -a 会保留原始文件的上下文
例如: 自定目录 /custom 做一个server0.example.com
第一步:安装Apache软件
[root@server0 ~]# yum install httpd- -y
第二步:创建一个目录 /custom 并创建一个index.html
第三步:修改httpd的主配置文件/etc/httpd/conf/httpd.conf
DocumentRoot "/var/www/html"
修改
DocumentRoot "/custom"
<Directory "/var/www/html">
修改
<Directory "/custom">
第四步:重启httpd服务
[root@server0 ~]# systemctl restart httpd
[root@server0 ~]# systemctl enable httpd.service
第五步:测试
注意: 请先关闭firewalld
[root@server0 ~]# systemctl stop firewalld.service
这时会看到:
Forbidden
You don't have permission to access / on this server.
第六步:修改/custom 这个目录以级这个目录下面的所有文件的上下文
***yu
[root@server0 ~]# man 8 semanage-fcontext
SYNOPSIS
semanage fcontext [-h] [-n] [-N] [-S STORE] [ --add ( -t TYPE -f FTYPE -r RANGE -s SEUSER | -e EQUAL ) FILE_SPEC ) |
--delete ( -t TYPE -f FTYPE | -e EQUAL ) FILE_SPEC ) | --deleteall | --extract | --list [-C] | --modify ( -t TYPE -f FTYPE
-r RANGE -s SEUSER | -e EQUAL ) FILE_SPEC ) ]
-l 注意查看这个参数
-l, --list
List records of the specified object type
EXAMPLE
remember to run restorecon after you set the file context
Add file-context for everything under /web
# semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?"
# restorecon -R -v /web
[root@localhost /]# semanage fcontext -l | grep ftp | more
--- 查找与文件共享相关的标签
/etc/(x)?inetd\.d/tftp regular file system_u:object_r:tftpd_etc_t:s0
/srv/([^/]*/)?ftp(/.*)? all files system_u:object_r:public_content_t:s0
/var/ftp(/.*)? all files system_u:object_r:public_content_t:s0
# semanage fcontext -a -t httpd_sys_content_t "/web(/.*)?" //设置上下文
# restorecon -R -v /web //默认情况下,设置完上下文是不生效的,必须执行恢复上下文
[root@server0 ~]# semanage fcontext -a -t httpd_sys_content_t "/custom(/.*)?"
[root@server0 ~]# restorecon -Rv /custom/
-a 增加
-t 类型 httpd_sys_content_t
"/custom(/.*)?" 正则表达式,匹配目标目录 ? 匹配0次或1次
4)Changing SELinux Booleans
查看所有的布尔值信息:
[root@server0 ~]# getsebool -a
设置Bool值(永久)
[root@server0 ~]# setsebool -P
例如: 基于用户家目录的网页访问
第一步:安装httpd软件
第二步:开启httpd的用户家目录访问
[root@server0 ~]# vim /etc/httpd/conf.d/userdir.conf
UserDir enable
UserDir public_html
第三步:重启httpd服务
第四步: 在student的家目录当中,创建 public_html 的目录,并在目录下面创建一个index.html文件;
第五步:将 /home/student 这个目录允许 apache用户可读;
[student@server0 public_html]$ chmod 771 /home/student/
第六步:测试
http://server0.example.com/~student/index.html
会看到现象:
Forbidden
You don't have permission to access /~student/index.html on this server.
第七步: 开启相关的bool值
[root@server0 ~]# setsebool -P httpd_enable_homedirs on
5)Troubleshooting SELinux
[root@server0 ~]# tail -f /var/log/messages
[root@server0 ~]# sealert -l 8375a757-58d2-41ad-abc4-5b37c7342f5f
练习:
[root@server0 ~]# lab selinux setup
再去访问 http://local/lab-content
[root@server0 ~]# lab selinux grade
Confirming SELinux is in enforcing mode...PASS
Confirming files are in expected location...PASS
Confirming the Apache DocumentRoot is unchanged...PASS
Confirming the web content is accessible...PASS
6)端口上下文修改
比如: 修改SSH的端口为2222
第一步:修改配置文件:
[root@server0 ~]# sed -i '17a\Port 2222' /etc/ssh/sshd_config
第二步: 重启sshd服务,并关闭防火墙;
[root@server0 ~]# systemctl restart sshd.service
[root@server0 ~]# systemctl stop firewalld.service
第三步: 添加SELinux端口的上下文
[root@localhost samba]# semanage port -l | grep ssh
ssh_port_t tcp 22
semanage port -a -t PORT_TYPE -p tcp 2222
[root@server0 ~]# semanage port -a -t ssh_port_t -p tcp 2222
-p PROTO, --proto PROTO
Protocol for the specified port (tcp|udp) or internet protocol version for the specified node (ipv4|ipv6).