SELinux: Secure Enhanced Linux,是美国国家安全局(NSA=The National Security Agency) 和SCC(SecureComputing Corporation) 开发的 的 Linux 的一 个强制 访问 控制的安全模块.2000年 年以 以GNU GPL 发布, ,Linux 内核2.6 版本后集成在内核中
“`
grep -i selinux /boot/config-3.10.0-514.el7.x86_64
CONFIG_SECURITY_SELINUX=y
CONFIG_SECURITY_SELINUX_BOOTPARAM=y
CONFIG_SECURITY_SELINUX_BOOTPARAM_VALUE=1
CONFIG_SECURITY_SELINUX_DISABLE=y
CONFIG_SECURITY_SELINUX_DEVELOP=y
CONFIG_SECURITY_SELINUX_AVC_STATS=y
CONFIG_SECURITY_SELINUX_CHECKREQPROT_VALUE=1
CONFIG_DEFAULT_SECURITY_SELINUX=y
CONFIG_DEFAULT_SECURITY=”selinux”
# 软件的安全性
## 选择安全系数较高的系统
## 提高现有系统的安全性
# 计算机的安全等级
## D 最低的安全级别,提供最少的安全防护,系统访问无限制。DOS
## C 访问控制的权限,能够实现可控的安全防护,个人账户管理,审计和资源隔离 Unix Linux windowNT
## B 支持多级安全,通过硬件对安全数据进行保护
## A 最高级别,提供验证设计,要求数据从生产到传输都能够实现状态跟踪
# 访问控制:
## 基本要素:
- 主体:主动的实体,用户、服务、进程等
- 客体: 被动的实体,包括数据、文件等
- 规则:主体对客体访问的策略集合
## 基本类型:
### DAC (Discretionary Access Control )访问控制:自主访问控制
通过权限列表(访问控制列表)来限定特定主体对特定客体可以执行什么操作。
#### 特点:
1. 每个主体都拥有一个用户名或组来获取操作权限
2. 每个客体都拥有一个限定主体对其访问的访问控制列表
3. 访问时,基于访问控制列表检查主体用户标示以实现授权或拒绝。
### MAC(Mandatory Access Control)访问控制:强制访问控制
#### 特点:
1. 主体被分配一个安全等级 机密
2. 客体被分配一个安全等级 绝密
3. 访问时,对主体和客体的安全级别进行对比,最终获得授权或拒绝。基于sandbox 沙箱 虚拟化技术
#### 折中方案:将部分服务或进程纳入到MAC的访问控制范围即可。
对跨网络访问的服务或进程启用MAC访问控制机制
## 配置文件:
- boot/grub/grub.conf 优先级比/etc/config高
使用selinux=0 禁用SELinux
- /etc/sysconfig/selinux 修改后必须重启生效
- /etc/selinux/config
- CentOS7 /boot/grub2/grub.cfg 下面启动选项最后添加selinux=0为禁用
linux16 /vmlinuz-3.10.0-514.el7.x86_64 root=/dev/mapper/cl-root ro crashkernel=auto rd.lvm.lv=cl/root rd.lvm.lv=cl/swap rhgb quiet L ANG=zh_CN.UTF-8
- /etc/selinux/targeted/contexts/files/ 存放target默认的规则(用segmanage fcontext -l查看)
SELINUX={disabled|enforcing|permissive}
## 工作模式:
### strict 严格模式 ,centos5每个进程都会受到Selinux的控制
### targeted 宽松模式,用来保护常见的网络服务, 仅有限进程受到selinux
控制,只监控容易被入侵的进程,centos4 只保护13 个服务,
centos5 保护88
### minimum :centos7, 修改过的targeted ,只对选择的网络服务
### mls: 提供MLS (多级安全)机制的安全性
### minimum 和mls稳定性不足,未加以应用
## 查看开启状态 sestatus
sestatus
SELinux status: enabled
Current mode: enforcing
## SELinux 安全上下文
### 传统Linux ,一切皆文件,由用户,组,权限控制访问
### 在SELinux 中,一切皆对象(object),由存放在inode的扩展属性域的安全元素所控制其访问
### 所有文件和端口资源和进程都 具备安全标签: 安全上下文(security context)
## 安全上下文有五个元素组成:
field | complication
---|---
User| 指示登录系统的用户类型,如root,user_u,system_u,多数本地进程都属于自由(unconfined )进程
Role| 定义文件,进程和用户的用途:文件:object_r,进程和用户:system_r
Type|指定数据类型,规则中定义何种进程类型访问何种文件Target 策略基于type 实现, 多服务共用:public_content_t
Sensitivity|限制访问的需要,由组织定义的分层安全级别,如unclassified, secret,top,secret,一个对象有且只有一个sensitivity, 分0-15 级,s0 最低,Target 策略默认使用s0
Category |对于特定组织划分不分层的分类,如FBI Secret,NSA secret, 一个对象可以有多个categroy,c0-c1023共1024个分类,Target策略不使用category
== 多服务共用,type设为:public_content_t==
### 格式user:role:type:sensitivity:category
user_u:object_r:tmp_t:s0:c0
[root@liyong: /root]# ll -aZ test.sh
-rw-r–r–. root root unconfined_u:object_r:admin_home_t:s0 test.sh
默认没有启用category
### 实际上下文:存放在文件系统中,ls –Z;ps –auxZ
### 期望( 默认) 上下文:存放在二进制的SELinux策略库(映射目录和期望安全上下文)中
## 格式:subjcet operation object
- subject: (主体)进程
- object: 进程 文件
- operation:操作 (open close read write chown chmod )
- SELinux 中对所有的文件都赋予一个type 的文件类型标签,对
于所有的进程也赋予各自的一个domain 的标签。domain 标签
能够执行的操作由安全策略里定义
- 当一个subject 试图访问一个object ,Kernel 中的策略执行服
务器将检查AVC ( 访问矢量缓存Access Vector Cache), 在 在AVC中,subject 和object 的权限被缓存(cached),查找“应用,用+文件”的安全环境。然后根据查询结果允许或拒绝访问
- 安全策略:定义主体读取对象的规则数据库,规则中记录了哪个类型的主体使用哪个方法读取哪一个对象是允许还是拒绝的,并且定义了哪种行为是充许或拒绝
## 生效条件:
1. SELinux是否生效,取决于subject和object是否处于同一个操作空间
2. 操作类型必须满足条件
## 安全标签:用户:角色:类型
## 查看与配置:
### 查看文件安全标签(安全上下文security context):ls -lZ
### 查看进程安全标签:ps auxZ
### 安全上下文的5要素:
## 启动状态:
### enforcing 强制开启,每个受限的进程都必然受限
### permissive 允许,每个受限的进程违规操作不会被禁止,但会被记录于审计日志
### disabled 禁用(禁用后新建文件没有安全标签,ll权限位最后面没有.)
## 临时启动:
- getenforce 查看当前SELinux状态
- setenforce 0(关闭)|1(启动)
### 注意cp和mv时安全标签变动区别
- cp 如果加-a则保留源文件安全标签,不带-a则继承目标目录的安全标签,覆盖将保持原有安全标签
- mv 保持原文件安全标签
[root@liyong: /root]ll -Z /var/log/messages
-rw——-. root root system_u:object_r:var_log_t:s0 /var/log/messages
[root@liyong: /root] cp /var/log/messages ~
[root@liyong: /root]ll -Z ~/messages
-rw——-. root root unconfined_u:object_r:admin_home_t:s0 /root/messages
[root@liyong: /root]# logger 111111111
[root@liyong: /root]# tail -1 /var/log/messages
May 17 10:36:33 liyong root: 111111111
[root@liyong: /root]cp ~/messages /var/log/messages
[root@lee: /root]# ls -Z /var/log/messages
-rw——-. root root unconfined_u:object_r:var_log_t:s0 /var/log/messages
[root@lee: /root]# ll -Z ~/messages /var/log/messages
-rw——-. root root unconfined_u:object_r:admin_home_t:s0 /root/messages
-rw——-. root root unconfined_u:object_r:var_log_t:s0 /var/log/messages
[root@lee: /root]# mv ~/messages /var/log/
mv:是否覆盖”/var/log/messages”? y
[root@lee: /root]# ll -Z /var/log/messages
-rw——-. root root unconfined_u:object_r:admin_home_t:s0 /var/log/messages
[root@lee: /root]# logger 2222222
[root@lee: /root]# tail -1 /var/log/messages
May 17 02:01:11 lee rsyslogd: [origin software=”rsyslogd” swVersion=”5.8.10” x-pid=”2572” x-info=”http://www.rsyslog.com”] start
[root@lee: /root]# service rsyslog restart
### 修改安全标签:
chcon -urtR object
chcon [OPTION]... [-u USER] [-r ROLE] [-t
TYPE] FILE...
chcon [OPTION]... --reference=RFILE FILE...
-R
选项| 作用
---|---
-u | 用户
-r| 角色
-t| 类型(域)
-R |递归
### 恢复目录或文件默认的安全 上下文:
restorecon [-R] /path/to/somewhere
-R 递归
[root@lee: /root]# service httpd start
[root@lee: /root]# iptables -F
[root@lee: /root]# echo ‘test page’ > /var/www/html/index.html
[root@lee: /root]# ll -Z /var/www/html/index.html
-rw-r–r–. root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/index.html
[root@lee: /root]# mkdir -p /app/webite
[306][root@lee: /root]# cp -av /var/www/html/index.html /app/webite/
[root@lee: /root]# ll -Z /app/webite/index.html
-rw-r–r–. root root unconfined_u:object_r:httpd_sys_content_t:s0 /app/webite/index.html
[root@lee: /root]# vim /etc/httpd/conf/httpd.conf
DocumentRoot “/app/wesite/”
[312][root@lee: /root]# service httpd reload
[root@lee: /root]# echo ‘welcom to my page’ > /app/wesite/index.html
[root@lee: /root]# rm -f /app/wesite/index.html
[317][root@lee: /root]# cp /var/www/html/index.html /app/wesite/
[318][root@lee: /root]# ll -Z /app/wesite/index.html
-rw-r–r–. root root unconfined_u:object_r:default_t:s0 /app/wesite/index.html
chcon -R –reference=/var/www/html/ /app/wesite/
或者
chcon -R -t httpd_sys_content_t /app/wesite/
或者更新数据库
[root@lee: /root]# chcon -t admin_home_t /app/wesite/index.html
yum provides */semanage
yum install -y policycoreutils-python-2.0.83-30.1.el6_8.x86_64
semanage fcontext -l|grep “/app/website”
semanage fcontext -a -t httpd_sys_content_t ‘/app/website(/.*)?’
semanage fcontext -l|grep “/app/website”
## 日志文件:/var/log/audit/audit.log
## 默认安全上下文查询与修改Semanage :来自policycoreutils-python包 包
### 查看默认的安全上下文(可能呢与ls- Z看到的实际的安全上下文不一致)
semanage fcontext –l(读取的/etc/selinux/target/contexts/下的文件)
### 添加安全上下文(添加至数据库)
semanage fcontext -a –t httpd_sys_content_t
'/testdir(/.*)?'
restorecon –Rv /testdir #根据数据库来恢复(期望上下文)
### 删除安全上下文
semanage fcontext -d –t httpd_sys_content_t
'/testdir(/.*)?'
## Selinux的端口标签
### 查看端口标签
semanage port –l
### 添加端口
semanage port -a -t port_label -p tcp|udp PORT
semanage port -a -t http_port_t -p tcp 9527
### 删除端口
semanage port -d -t port_label -p tcp|udp PORT
semanage port -d -t http_port_t -p tcp 9527
### 修改现有端口为新标签(修改后的端口号必须在其他服务中存在,相当于将其他服务的端口抢过来,原服务端口列表不在拥有此端口)
semanage port -m -t port_label -p tcp|udp PORT
semanage port -m -t http_port_t -p tcp 9527
vim /etc/httpd/conf/httpd.conf
Listen 3131
service httpd restart
[root@lee: /root]# semanage port -l|grep http
http_cache_port_t tcp 3128, 8080, 8118, 8123, 10001-10010
http_cache_port_t udp 3130
http_port_t tcp 80, 81, 443, 488, 8008, 8009, 8443, 9000
pegasus_http_port_t tcp 5988
pegasus_https_port_t tcp 5989
[root@lee: /root]# semanage port -a -t http_port_t -p tcp 3131
semanage port -l|grep http_port_t
http_port_t tcp 3131, 80, 81, 443, 488, 8008, 8009, 8443, 9000
service httpd restart #可以启动了
## SELinux 布尔值(记录服务的行为是否允许)
getsebool -a | grep ftp
allow_ftpd_anon_write –> off #匿名写
allow_ftpd_full_access –> off
allow_ftpd_use_cifs –> off
allow_ftpd_use_nfs –> off
ftp_home_dir –> off
ftpd_connect_db –> off
ftpd_use_fusefs –> off
ftpd_use_passive_mode –> off
httpd_enable_ftp_server –> off
tftp_anon_write –> off
tftp_use_cifs –> off
tftp_use_nfs –> off
布尔型规则:
- getsebool
- setsebool
### 查看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 日志管理
yum install setroubleshoot(重启生效)
### 将错误的信息写入/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 -k _selinux
## demo
yum install setroubleshoot(重启生效)
reboot
iptables -F
systemctl start httpd
vim /etc/httpd/conf.d/userdir.conf
#UserDir disabled
UserDir public_html
su - yongge
cd ~
[yongge@liyong: /home/yongge] mkdirpublichtml[yongge@liyong:/home/yongge] chmod 755 ~/public_html/
[yongge@liyong: /home/yongge]$ chmod 711 ../yongge
或者
setfacl -m u:apache:x /home/yongge
echo ‘yongge site’ > index.html
tail /var/log/message
semanage boolean -l |grep httpd
[root@liyong: yongge]# setsebool httpd_enable_homedirs=1
[root@liyong: yongge]# semanage boolean -l|grep httpd_en
httpd_enable_cgi (开 , 开) 允许 httpd cgi 支持
httpd_enable_homedirs (开(当前状态) , 关(数据库状态)) 允许 httpd # 读取主目录
httpd_enable_ftp_server (关 , 关) 允许 httpd 在 ftp 端口侦听从而作为 FTP 服务器使用。
tail /var/log/message
setsebool httpd_read_user_content=1
永久生效(改数据库)setsebool -P httpd_read_user_content=1
“`