SELinux知识点
SELinux
软件安全性
《关于UNIX的安全》中Dennis Ritchie提到:“首先要面对的事实是,UNIX的开发者并没有考虑安全问题,单这一点就单会引发大量的漏洞”。主要是因为防火墙通常不具备查杀病毒的能力,只能对数据包过滤,不会拆解数据包,无法确认数据安全
安全防护机制
- 访问控制防护:涉及用户对网络资源的访问,包括用户身份认证、口令加密、更新和鉴别。
- 网络隔离防护:通过软件或硬件对网络实施隔离,如局域网、防火墙、隔离卡等。
Linux访问控制模型
-
进程的身份验证是如何影响SELinux机制的?
-
进程的身份验证通过EUID 和RUID来实现,其中RUID表示实际运行进程的用户身份,而EUID则是启动该进程的用户身份。当进程执行具有SUID权限的命令时,其EUID会发生变化,变为命令所有者的身份,从而影响了进程作为主体时的行为和权限。
-
进程是以哪个用户产生的,则进程的权限就是该用户的权限 例如,Apache的工作进程若以apache用户运行,那么apache用户对/etc/passwd文件的访问权限就决定了该进程能否访问此文件。若Apache工作进程被劫持,对方也将拥有apache用户的权限,进而可能访问/etc/passwd文件。
DAC和MAC
-
==客体(object):被访问的对象。==一般指文件或设备,但在某些情况下,进程也可以作为客体 例如 而apache其工作进程则是被控制的对象,即客体
-
==主体(subject):发起访问的实体。==通常是运行中的进程,特别是具有有效用户身份的进程 例如 apache的守护进程作为主体
-
动作(Action):主体对客体执行的操作。
-
规则库
- 自主访问控制(DAC):由属主自主决定是否将自己客体的访问权或部分访问权授予其他主体。
- ==强制访问控制(MAC):对所有主体及其所控制的客体通过规则库实施强制访问控制,SELinux即为此类行为控制。主体为进程,客体包括进程、文件、设备等。==
SELinux简介
- SELinux = NSA(MAC)+ Linux:SELinux是Linux的扩展强制访问控制安全模块。
- 特性:提高Linux系统内部安全等级,赋予进程和用户最小权限,防止权限升级,即使受攻击权限被夺,也不会严重影响整个系统。
安全上下文
在SELinux中,访问控制属性叫做安全上下文。
安全上下文格式:用户:角色:类型
- == ls -lZ file -ldZ dir #-Z 查看指定文件安全上下文信息 ==
- == ps -auxZ #查看进程的安全上下文 例如==
- /etc/httpd/conf/httpd.conf的类型为httpd_config_t。
- /home/install.log的类型为admin_home_t。
- /tmp/a.txt的类型为user_tmp_t。
SELinux原理
当一个主体试图访问一个客体时,内核中的策略执行会检查规则库中的规则,如果主体的安全上下文类型和客体的安全上下文类型与规则匹配,则允许操作;否则,拒绝该操作。所以可以通过修改客体的安全上下文,使其符合规则要求,从而实现对资源的正常访问和管理。例如,使用命令修改file的安全上下文,将其还原回旧的安全设置,以解决由于安全上下文不符合规则导致的访问受阻问题。
- **注意 **当主体(进程)访问客体时,主体和客体的安全上下文[类型]必须符合规则库中的要求才能访问成功
SELinux的类型
- 级别
- 完全开启:enforcing。
- 警告模式:permissive。
- 禁用模式:disabled。
- 类型
- 严格类型:strict(mls)。
- 目标类型:targeted(针对大多数服务)。
- 部分控制:minimum(基本不使用)。
- 操作命令
- 临时关闭/开启:setenforce 0/1。
- 获取状态:getenforce / sestatus -v。
修改文件类型
实验:SELinux开启状态下修改httpd的网页路径。
- 解决思路
- 获取httpd默认网页目录的type。
- 修改自定义网页目录的类型 = 默认目录类型(-R递归)。
- 注意事项:一般先创建目录,再修改目录type,修改后在此目录下创建的文件自动继承目录type,无需单独修改或递归(已存在的需递归,新建立的自动继承)。
- 相关命令
- 查看:ls -ldZ /var/www/html。
- 修改:chcon [-R] [-t type] 文件,-R连同该目录下次目录同时修改,-t接安全性本文的类型字段,-u修改用户,-r修改角色(chcon不仅能修改type,还可修改角色、身份等安全上下文中的三个组成单元)。
- 还原:restorecon [-Rv]档案或目录,-R连同次目录一起修改,-v将过程显示到屏幕上。
yum -y install httpd
mkdir /www
echo "xxxx" > /www/index.html
systemctl start httpd
vim /etc/httpd/conf/httpd.conf
#把默认网页目录documentroot改成/www
systemctl restart httpd
setenforce 0
getenforce
ls -dlZ /var/www/html
#修改安全上下文的类型 -t就是指类型type -R就是递归创建 -u:修改用户 -r:修改角色
chcon -t httpd_sys_content_t -R /www
ls -dlZ /www
systemctl restart httpd
setenforce 1
getenforce
#发现网页能正常访问
restorecon -R /www #还原回去的命令
实验1:Samba新增共享区间
- yum -y install samba Samba创建/share并创建文件1.txt。
- 添加系统用户声明成samba用户:pdbedit -a username。
- 开启服务:systemctl start smb 。
#开启selinux 搭建samba服务
yum -y install samba
mkdir /share
cd /etc/samba/
cp -a smb.conf.example smb.conf
vim smb.conf
[www]
comment = www files
path = /share
writable = yes
browseable = yes
useradd www
pdbedit -a www
systemctl enable --now smb
chown -R www.www /share/
登录共享区间:smbclient –U zhangsan //192.168.216.12/www,发现无法登陆,
- 解决方案 在服务器上修改安全上下文 chcon -t samba_share_t /share。
#在Linux服务器上的测试
getsebool -a| grep samba | grep home #输入这个查看上下文是否打开
setsebool -P samba_enable_home_dirs=1 #开启家目录访问功能
Managing Boole(管理SElinux布尔值)
SELinux的布尔值类似开关,精确控制SElinux对某个服务某个选项的保护。例如samba服务,使用samba的用户模式登录自己家目录测试权限,或使用vsftpd的本地用户登录自己家目录(CentOS 7之后vsftpd相关布尔值被删除),发现无权限查看家目录下文件。
- 相关命令
- 查看:getsebool -a | grep samba_enable_home_dirs、ftp_home_dir(CentOS 6中生效)。
- 修改:setsebool –P samba_enable_home_dirs = 1(1或者on),开启家目录访问功能。
实验2:修改httpd的默认监听端口为10086
问题:修改后无法正常使用。
前提:yum -y install policycoreutils-python。
查看:semanage port -l | egrep -w “(http_port_t|http_cache_port_t)”
添加:semanage port -a -t http_port_t -p tcp 端口
#开启selinux
vim /etc/selinux/config
reboot
yum -y install httpd
yum -y install policycoreutils-python
#添加网页文件内容
vim /var/www/html/index.html
#修改http的监听端口
vim /etc/httpd/conf/httpd.conf
listen 10086
systemctl restart httpd
#重新启动发现报错 要修改安全上下文
journalctl -xe
#查看http的安全上下文 发现没有10086
semanage port -l | grep http
http_cache_port_t tcp 8080, 8118, 8123, 10001-10010
http_cache_port_t udp 3130
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
#添加http的安全上下文 端口是10086
semanage port -a -t http_port_t -p tcp 10086
#重新启动后就没有报错了
systemctl restart httpd