SELinux完全解读

来源:互联网 发布:职称计算机模拟软件 编辑:程序博客网 时间:2024/06/11 14:34

  • selinuxservice enhanced linux 安全增强的Linux
  • CONFIG_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set
  • 继承了源目录的安全标签
  • 写日志
  • 写入成功
  • 覆盖
  • 安全标签跟当前目录不匹配无法正常写日志
  • 此时网站可访问
  • 网站目录迁移
  • 如果不带属性复制
  • 此时不能访问需要修改安全上下文
  • 此时又可以访问了
  • 此时无法启动端口没在selinux数据库列表
  • 解决方法添加端口到期望安全上下文
  • 访问http1721625519yongge
  • 此时仍无法访问
  • 根据日志开启
  • 成功访问
    • exercise

selinux(service enhanced linux )安全增强的Linux

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_SECURITY_SELINUX_POLICYDB_VERSION_MAX is not set

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_rType|指定数据类型,规则中定义何种进程类型访问何种文件Target 策略基于type 实现, 多服务共用:public_content_tSensitivity|限制访问的需要,由组织定义的分层安全级别,如unclassified, secret,top,secret,一个对象有且只有一个sensitivity, 分0-15 级,s0 最低,Target 策略默认使用s0Category |对于特定组织划分不分层的分类,如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 objectchcon [OPTION]... [-u USER] [-r ROLE] [-tTYPE] 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 PORTsemanage port -a -t http_port_t -p tcp 9527### 删除端口semanage port -d -t  port_label -p  tcp|udp PORTsemanage port -d -t http_port_t -p tcp 9527### 修改现有端口为新标签(修改后的端口号必须在其他服务中存在,相当于将其他服务的端口抢过来,原服务端口列表不在拥有此端口)semanage port -m -t  port_label -p  tcp|udp PORTsemanage port -m -t http_port_t -p tcp 9527

vim /etc/httpd/conf/httpd.conf
Listen 3131
service httpd restart

此时无法启动,端口没在selinux数据库列表

[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 –lsemanage boolean -l –C  查看修改过的布尔值### 设置bool 值命令:setsebool [-P] boolean value (on,off) )setsebool [-P] Boolean=value (01## SELinux 日志管理yum install setroubleshoot(重启生效)### 将错误的信息写入/var/log/messagegrep setroubleshoot /var/log/messagessealert -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

访问http://172.16.255.19/~yongge/

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

成功访问

“`

exercise

  1. 启用SELinux 策略并安装httpd 服务,改变网站的默认主
    目录为/website, 添加SELinux 文件标签规则,使网站可访问
  2. 修改上述网站的http 端口为9527 ,增加SELinux 端口标签
    ,使网站可访问
  3. 启用相关的SELinux 布尔值,使上述网站的用户student
    的家目录可通过http 访问
  4. 编写脚本selinux.sh ,实现开启或禁用SELinux
原创粉丝点击