SElinux是基于MAC策略的。
DAC:Discretionary Access Control自由访问控制
MAC:Mandatory Access Control 强制访问控制
• DAC环境下进程是无束缚的
• MAC环境下策略的规则决定控制的严格程度
• MAC环境下进程可以被限制的
• 策略被用来定义被限制的进程能够使用那些资源(文件和端口)
• 默认情况下,没有被明确允许的行为将被拒绝
SELinux定义了系统中每个【用户】、【进程】、【应用】和【文件】的访问和转变的权限,然后它使用一个安全策略来控制这些实体(用户、进程、应用和文件)之间的交互,安全策略指定如何严格或宽松地进行检查。连Root账户也只能在策略范围能运作。
SELinux工作类型:
Centos 6 和 7 默认的工作类型为targeted, 用来保护常见的网络服务,仅有限进程受到selinux控制,只监控容易被入侵的进程。
SELinux安全上下文
在SELinux中,一切皆对象(object),由存放在inode的扩展属性域的安全元素所控制其访问
所有文件和端口资源和进程都具备安全标签:安全上下文(security context)
安全上下文有五个元素组成,以冒号分隔
user:role:type:sensitivity:category
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
实际上下文:存放在文件系统中,ls –Z ; ps –Z
文件权限属性中出现这个点,就表明有selinux标签。可以使用 -Z 选项来查看
期望(默认)上下文:存放在二进制的SELinux策略库(映射目录和期望安全上下文)中
查看SElinux策略库
# semanage fcontext -l
此软件包在最小化安装时并未包含
# yum install policycoreutils-python.x86_64
启用与关闭SElinux
# vi /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - 强制,每个受限的进程都必然受限
# permissive - 允许,每个受限的进程违规操作不会被禁止,但会被记录于审计日志
# disabled - 禁用
SELINUX=enforcing
enforcing 与 disabled 这2种状态之间的转换,必须要重启系统。从disabled切换至enforcing时,重启后会扫描并重设安全上下文,所以会有花费而外的时间。
查看SElinux状态
# getenforce 获取selinux当前状态
Enforcing
#sestatus 获取selinux当前状态与配置文件状态
SELinux status: enabled
SELinuxfs mount: /sys/fs/selinux
SELinux root directory: /etc/selinux
Loaded policy name: targeted
Current mode: enforcing
Mode from config file: enforcing
Policy MLS status: enabled
Policy deny_unknown status: allowed
Max kernel policy version: 28
设置SElinux当前状态
#setenforce 1 将当前状态设置为Enforcing
#setenforce 0 将当前状态设置为 permissive
与SElinux相关的配置文件:
/boot/grub/grub.conf
在内核参数后添加selinux=0 禁用SELinux
selinux的主配置文件存放的目录
/etc/selinux/
/etc/sysconfig/selinux > /etc/selinux/config
文件复制到其他位置后,标签将会发生变化
#ll -Z
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.html
#cp index.html /root
#ll -Z /root/index.html
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 /root/index.html
修改SELinux安全标签
给文件重新打安全标签:
chcon [OPTION]... [-u USER] [-r ROLE] [-tTYPE] FILE...
#chcon -t admin_home_t index.html
chcon [OPTION]... --reference=RFILE FILE...
-R:递归打标;
从策略库恢复目录或文件默认的安全上下文,
restorecon [-R] /path/to/somewhere
默认安全上下文查询与修改
semanage
-l:查询。
-a:增加,你可以增加一些目录的默认安全上下文类型设置。
-m:修改。
-d:删除
下面为配合semanage的子对象
import
Import local customizations导入
export
Output local customizations导出
login
Manage login mappings between linux users and SELinux confined users
user
Manage SELinux confined users (Roles and levels for an SELinux user)
port
Manage network port type definitions 网络端口
interface
Manage network interface type definitions 网卡
module
Manage SELinux policy modules 模块
node
Manage network node type definitions
fcontext
Manage file context mapping definitions 文件
boolean
Manage booleans to selectively enable functionality
permissive
Manage process type enforcement mode 权限
dontaudit
Disable/Enable dontaudit rules in policy
实例
查看默认的安全上下文
semanage fcontext –l
添加安全上下文
semanage fcontext -a –t httpd_sys_content_t ‘/testdir(/.*)?’规则支持BRE扩展正则表达式
restorecon –Rv /testdir
删除安全上下文
semanage fcontext -d –t httpd_sys_content_t ‘/testdir(/.*)?’规则支持BRE扩展正则表达式
查看端口标签
semanage port –l
#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
添加端口
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
SELinux布尔值
布尔型规则:
getsebool
setsebool
查看bool命令:
getsebool [-a] [boolean]
semanage boolean –l
semanage boolean -l –C 查看修改过的布尔值
这2个栏位中的on 或 off 代表的是当前状态或数据库中的值
SELinux boolean State Default Description
privoxy_connect_any (on , on) Allow privoxy to connect any
mount_anyfile (on , off) Allow mount to anyfile
设置bool值命令:
-P 写入磁盘保存
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
扫描并分析日志
实例:
1、启用SELinux策略并安装httpd服务,改变网站的默认主目录为/web,添加SELinux文件标签规则,使网站可访问
2、修改上述网站的http端口为9527,增加SELinux端口标签,使网站可访问
实验环境:VMware Workstation Pro 14(试用版)
系统平台:
CentOS Linux release 7.4.1708 (Core) 内核 3.10.0-693.el7.x86_64
操作如下:
1.查看当前SElinux状态
#sestatus
2.安装http服务
#yum install httpd -y
3.改变网站默认目录为/web,并且http端口为9527
# mkdir /web 创建网站根目录
# echo "Welcome to SElinux" > /web/index.html 生成网页文件
#sed -i '/^DocumentRoot/c\DocumentRoot "/web"' /etc/httpd/conf/httpd.conf 修改httpd配置文件
#sed -i '/^<Directory "\/var\/www"/c\<Directory "/web">' /etc/httpd/conf/httpd.conf 修改httpd配置文件
#sed -i '/^Listen/c\Listen 9527' /etc/httpd/conf/httpd.conf 修改httpd配置文件
4.设置SElinux相关
#semanage fcontext -a -t httpd_sys_content_t '/web(/.*)?' 添加SElinux安全标签到策略库
#semanage fcontext -l|grep ^/web 验证
/web(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
#restorecon -R /web 从SElinux策略库恢复安全标签到网站根目录
#ll -Z 验证
#semanage port -a -t http_port_t -p tcp 9527 添加SElinux的http的网络端口
#semanage port -l|grep http_port_t 验证
http_port_t tcp 9527, 80, 81, 443, 488, 8008, 8009, 8443, 9000
5.启动http服务并访问
#systemctl start httpd && lsof -i:9527 启动httpd服务并验证
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 6475 root 4u IPv6 47831 0t0 TCP *:9527 (LISTEN)
httpd 6476 apache 4u IPv6 47831 0t0 TCP *:9527 (LISTEN)
httpd 6477 apache 4u IPv6 47831 0t0 TCP *:9527 (LISTEN)
httpd 6478 apache 4u IPv6 47831 0t0 TCP *:9527 (LISTEN)
httpd 6479 apache 4u IPv6 47831 0t0 TCP *:9527 (LISTEN)
httpd 6480 apache 4u IPv6 47831 0t0 TCP *:9527 (LISTEN)
访问网站成功

本文转自 ljpwinxp 51CTO博客,原文链接:http://blog.51cto.com/191226139/2059255