首页 > 代码库 > Selinux介绍
Selinux介绍
一、SElinux(Secure Enhanced Linux):安全增强的Linux
SElinux是一个在内核中实践的强制访问控制(MAC)安全性机制,由美国国家安全局NSA(The National Security Agency)和SCC(Secure
Computing Corporation的)开发的针对计算机基础结构安全开发的一个全新的Linux安全策略机制。SELinux可以允许系统管理员更加灵活的来定义安全策略。
SELinux是一个内核级别的安全机制,从Linux2.6内核之后就将SELinux集成在了内核当中,因为SELinux是内核级别的,所以我们对于其配置文件的修改都是需要重新启动操作系统才能生效的。
现在主流发现的Linux版本里面都集成了SELinux机制,CentOS/RHEL都会默认开启SELinux机制。
二、DAC和MAC的区别
DAC(Discretionary Access Control):自主访问控制
DAC环境下的进程是无束缚的
MAC(Mandatory Access Control):强制访问控制
MAC环境下的策略的规则决定控制的严格程度
MAC环境下的进程是可以被限制的
策略用来定义被限制的进程能够使用哪些资源(文件和端口)
默认情况下,没有被明确允许的行为将被拒绝
三、SElinux模式
Enforcing: 这个缺省模式会在系统上启用并实施 SELinux 的安全性政策,拒绝访问 及记录行动
Permissive: 在 Permissive 模式下,SELinux 会被启用但不会实施安全性政策,而 只会发出警告及记录行动。Permissive 模式在排除 SELinux 的问题时很有用
Disabled: SELinux 已被停用
如何查看及设定当前系统上SElinux的工作模式:
查看:getenforce
设定:setenforce [0|1];0表示设置为Permissive模式,1表示设置为Enforcing模式。此设定方式当前有效,重启系统后失效。
SElinux配置文件:
/etc/sysconfig/selinux。修改此文件后,需要重启系统才生效。
四、Selinux策略
在SELinux中,我们是通过定义策略来控制哪些域可以访问哪些上下文。SElinux策略分类:
minimum:CentOS7,修改过的targeted,只对选择的网络服务。
mls:提供MLS(多级安全)机制的安全性
minimum 和mls 稳定性不足,未加以应用
strict:每个进程都受到selinux的控制
targeted:目标型策略,仅有限个进程受到selinux的控制,只监控容易被入侵的进程。依赖保护常见的网络服务。CentOS/RHEL中采用的默认策略。
使用sestatus命令查看当前使用的SElinux模式及配置文件中的配置:
五、SElinux安全上下文
在传统的linux中,一切皆文件,有用户、组、权限来进行访问控制。
在SElinux中,一切皆对象,由存放在Inode的扩展属性域的安全元素所控制其访问。所有文件、资源端口和进程都具备叫做安全上下文(Security context)的标签。
如何查看文件的安全上下文:
ll -Z /Path/to/somefile
如何查看进程的安全上下文:
ps -Z
安全上下文由五个元素组成:
user:role:type:sensitivity:category
user:指的是SElinux用户,root表示root账户身份,user_u表示普通用户无特权用户,system_u表示系统进程,通过用户可以确认身份类型,一般搭配角色使用。身份和不同的角色搭配时有权限不同,虽然可以使用su命令切换用户但对于SElinux的用户并没有发生改变,账户之间切换时此用户身份不变,在targeted策略环境下用户标识没有实质性作用。
role:object_r一般为文件目录的角色、system_r一般为进程的角色,在targeted策略环境中用户的角色一般为system_r。用户的角色类似用户组的概念,不同的角色具有不同的身份权限,一个用户可以具备多个角色,但是同一时间只能使用一个角色。在targeted策略环境下角色没有实质作用,在targeted策略环境中所有的进程文件的角色都是system_r角色。
type:文件和进程都有一个类型,SElinux依据类型的相关组合来限制存取权限。
Sensitivity: 限制访问的需要,由组织定义的分层安全级别,如unclassified, secret,top,secret,一个对象有且只有一个sensitivity,分0-15 级,s0最低,Target策略默认使用s0
Category :对于特定组织划分不分层的分类,如FBI Secret,NSA secret,一个对象可以有多个categroy,c0-c1023共1024个分类,Targeted策略不使用cateaory
六、SElinux的配置
1、临时配置:setenforce
2、永久配置:vim /etc/sysconfig/selinux
3、给文件或目录重新打安全标签
chcon [OPTION]... [-u USER] [-r ROLE] [-t TYPE] FILE...
chcon [OPTION]... --reference=RFILE FILE...
常用选项
-R :递归打标
例:在/var/www/html,新建了一个目录test,目录下的index.html文件的安全上下文类型为httpd_sys_content_t,现在修改ks.cfg、hello.txt的安全类型与index.html的类型一致。
修改方法一:直接修改
]#chcon -t httpd_sys_content_t ks.cfg
修改方法二:参考index.html文件修改hello.txt文件
]#chcon --reference index.html hello.txt
将test目录下的文件的角色都修改为system_u
]#chcon -R -u system_u test/
4、恢复目录或文件默认的安全上下文:
estorecon [-R] /path/to/somefile
5、默认安全上下文查询与修改
使用semanager来管理。需要安装policycoreutils-python包
查看默认的安全上下文:]#semanage fcontext -l | grep httpd
修改默认安全上下文:
semanager fcontext -a -t type file
例:修改random.txt的默认类型为,httpd_sys_content_t,之后恢复安全类型至默认类型
删除默认安全上下文
semanager fcontext -d -t type file
七、Selinux端口标签
1、查看端口标签
semanage port –l
2、添加端口
semanage port -a -t port_label -p tcp|udp PORT
例:将9812端口添加为http_port_t的默认端口
semanage port -a -t http_port_t -p tcp 9812
3、删除端口
semanage port -d -t port_label -p tcp|udp PORT
例:将9812端口从为http_port_t的默认端口中删除
semanage port -d -t http_port_t -p tcp 9812
4、修改
semanage port -m -t port_label -p tcp|udp PORT
例:将http_port_t的默认端口9812改为http_port_t的默认端口
semanage port -m -t http_port_t -p tcp 9812
八、SElinux的布尔值
可以通过布尔值微调 SELinux政策而不必重新编译政策的源代码。这些选项包括允许用户在 Samba下分享他们的主目录,或者允许Apache从用户的主目录伺服文件。否则这些都会被 SELinux 政策所拒绝。
1、查看bool 命令:
getsebool [-a] [boolean]
semanage boolean –l
semanage boolean -l –C 查看修改过的布尔值
2、设置bool 值命令:
setsebool [-P] boolean value
setsebool [-P] Boolean=value
实战演练:
1、启用SELinux策略并安装httpd服务,改变网站的默认主目录为/website,添加SELinux文件标签规则,使网站可访问。
查看是否启用selinux
创建/website目录,并设置安全上下文
编辑httpd.conf文件,修改默认目录
]#vim /etc/httpd/conf/httpd.conf
2、修改上述网站的http端口为9527,增加SELinux端口标签,使网站可访问。
修改httpd服务监听端口
]#vim /etc/httpd/conf/httpd.conf
将9527设置为httpd监听端口
3、启用相关的SELinux布尔值,使上述网站的用户student的家目录可通过http访问。
配置完成,清空防火墙策略,做访问测试。
附:一些常见的布尔类型释义
allow_ftpd_full_access(FTP)
容许 ftpd 全权访问系统
allow_ftpd_anon_write(FTP)
容许 ftpd 将文件上载到置标为 public_content_rw_t 的目录
allow_ftpd_use_cifs(FTP)
容许 ftp 服务器在公开传输服务使用 cifs
allow_ftpd_use_nfs(FTP)
容许 ftp servers 在公开传输服务使用 nfs
allow_httpd_anon_write(HTTPD 服务)
容许 httpd 守护程序将文件写入置标为 public_content_rw_t 的目录
allow_httpd_mod_auth_pam(HTTPD 服务)
容许 Apache 使用 mod_auth_pam.
allow_httpd_sys_script_anon_write(HTTPD 服务)
容许 httpd 脚本将文件写入置标为 public_content_rw_t 的目录
allow_smbd_anon_write(Samba)
容许 Samba 将文件写入置标为 public_content_rw_t 的目录
allow_ssh_keysign(SSH)
容许 ssh 执行 ssh-keysign
SELinux 停止保护 clamscan
ftp_home_dir(FTP)
容许 ftp 在用户的主目录读/写文件
httpd_builtin_scripting(HTTPD 服务)
容许 HTTPD 支持内置脚本
httpd_can_network_connect_db(HTTPD 服务)
容许 HTTPD 脚本及模块通过网络与数据库连接
httpd_can_network_connect(HTTPD 服务)
容许 HTTPD 脚本及模块与网络连接
httpd_can_network_relay(HTTPD 服务)
容许 httpd 扮演中继器的角色
httpd_disable_trans(HTTPD 服务)
SELinux 停止保护 httpd 守护程序
httpd_enable_cgi(HTTPD 服务)
容许 HTTPD 支持 cgi
httpd_enable_ftp_server(HTTPD 服务)
容许 HTTPD 以 ftp 服务器的身份去执行
httpd_enable_homedirs(HTTPD 服务)
容许 HTTPD 阅读用户的主目录
httpd_rotatelogs_disable_trans(SELinux 服务保护)
SELinux 停止保护 httpd rotatelogs
httpd_ssi_exec(HTTPD 服务)
容许 HTTPD 在系统 CGI 脚本的同一本地里执行 SSI 执行档
httpd_suexec_disable_trans(HTTPD 服务)
SELinux 停止保护 http suexec
httpd_tty_comm(HTTPD 服务)
统一 HTTPD 与终端機的沟通。处理凭证时需用
httpd_unified(HTTPD 服务)
统一 HTTPD 处理所有内容文件
Selinux介绍