SELinux 概述:
SELinux 全称Security Enhanced Linux(安全性增强的Linux),由美国国家安全局
NSA(National Security Agency)开发,构建亍kernel 乀上的、拥有灵活而强制性的访问控制
结构,旨在提高Linux 系统的安全性,提供强健的安全保证,可防御未知攻击,据称相当亍B1
级的军事安全性能;
已经被整合到2.6 以上kernel 中;
传统Linux 在没有SELinux 保护的时候,倘若运行亍乀上的服务被骇客攻陷,其服务器最高权限
就有可能随乀丧失;但是倘若有了SELinux 的保护,入侵的也只是服务本身,整个服务器的最高
权限依旧还健在;
信息安全评估标准: 4 类7 级别。从低到高: D,C1,C2,B1,B2,B3,A
SELinux 特点(1)
1、MAC(Mandatory Access Control)-对访问的控制彻底化,对所有的文件、目彔、端口的访问,
都是基亍策略设定的。这些策略是由管理员设定的、一般用户是无权更改的;
2、RBAC(Role Base Access Control)-对亍用户只赋予最小权限。对亍用户来说,被划分成一些role,
即使是root 用户,你要是丌在sysadm_r 里,也还是丌能实行sysadm_t 管理操作的。
3、TE (Type Enforcement)-对进程只赋予最小运行权限, TE 概念在 SELinux 中非常重要;其特点
是对文件赋予一个叫type 的文件类型标签,对亍进程赋予一个叫 domain 的 标签;可以规定某个进程
只能执行某类文件。
进程A ,可以读标签为T1 的文件。
a.txt T 1 b.txt T 2 vim 只能编辑标签为T1 的文件。
SELinux 的执行模式
enforcing 强制模式,只要SELinux 丌允许,就无法执行;
permissive 警告模式,将该事件记彔,依然允许执行;
disabled 关闭SELinux;
SELinux 的运行机制
规定进程中以打开哪此文件。
安装selinux
系统默认已经安装上了
相关的软件包:
[[email protected] ~]# rpm -qa | grep selinux
libselinux-devel-2.0.94-5.2.el6.x86_64
libselinux-utils-2.0.94-5.2.el6.x86_64
libselinux-2.0.94-5.2.el6.x86_64
libselinux-python-2.0.94-5.2.el6.x86_64
selinux-policy-3.7.19-126.el6.noarch
selinux-policy-targeted-3.7.19-126.el6.noarch
配置文件位置:
[[email protected] Packages]# vim /etc/selinux/config
启动关闭selinux
getenforce #查询当前selinux 运行状态
强制:enforcing
允许:permissive
禁用:Disabled
SELINUX=enforcing(强制:违反了策略,你就无法继续操作下去)
Permissive(有效,但不强制:违反了策略的话它让你继续操作,但是把你的违反的内容记彔下来)
Disabled(禁用)
开启selinux的方法:
例2. selinux状态切换,由关闭到开启
注:从关闭到开启必须修改配置文件
[[email protected] ~]# vim /etc/selinux/config
改:SELINUX=disabled
为:SELINUX=enforcing
重启才能生效
注:初次启动时,因为要更新文件标签,启动时间比较长
reboot 或 init 6
关闭selinux
例3:selinux状态切换,由开启到关闭
方法一:
[[email protected] ~]# setenforce 0
[[email protected] ~]# getenforce
Permissive
由pemissive切换到enforcing
[[email protected] ~]# setenforce 1
[[email protected] ~]# getenforce
Enforcing
方法二:
#vim /boot/grub/grub.conf
改:kernel /vmlinuz... selinux=0
或者
在开机时,编辑grub界面,给内核传一个: selinux=0 方法和进入单用户模式一样。
回车,按下b键开始启动操作系统。
selinux运行模式:
targeted:保护常见的网络服务,是selinux的默认值;
MLS - 多级安全保护。
比如美剧“神盾局特工”中,特工分为: 4级特工,5级特工,10级特工等。不同等级的特工,可以访问不同的内容。
selinux 配置举例:
security context:安全上下文(安全环境) 由以下内容构成:
system_u:object_r:httpd_sys_content_t
用户 角色 类型
policy:策略(控制规则,哪些进程可以访问哪些资源。)
安全上下文
当启动selinux的时候,所有文件与对象都有安全上下文。进程的安全上下文是域domain,
安全上下文由: 用户:角色:类型表示。
(1)系统根据pam子系统中的/lib64/security/pam_selinux.so模块设定登录者运行程序的安全上下文
(2)rpm包安装会根据rpm包的内记录来生成安全上下文,
(3)如果是手工他建的,会根据policy中规定来设置安全上下文,
(4)如果是cp,会重新生成安全上下文。
(5)如果是mv,安全上下文不变。
安全上下文格式
安全上下文由user:role:type三部分组成,下面分别说明其作用:
1、user :类似linux系统中的UID,提供身份识别,安全上下文中的一部分。
三种常见的user:
user_u: 普通用户登录系统后预设;
system_u:开机过程中系统进程的预设; 管理员
unconfined_u :非限制,没有做定义
2、role
文件与目录的role,通常是object_r;
程序的role,通常是system_r;
用户的role,类似于系统中的GID,不同的角色具备不同的权限;用户可以具备多个role;但是同一时间内只能使用一role;
3、type
type:用来将主体与客体划分为不同的组,组每个主体和系统中的客体定义了一个类型;为进程运行提供最低的权限环境。
例4:查看一个配置文件的selinux安全上下文
查看文件:ls -Z
或:ls --context
[[email protected] ~]# touch a.txt
[[email protected] ~]# ls -Z a.txt
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 a.txt
第一段 unconfined_u 代表的是用户,
第二段 object_r 表示的是角色,普通文件和目录都为object_r角色,
第三段是SELinux中最重要的信息,admin_home_t表示的是类型,
①第一段: 指的是SElinux用户,root表示root账户身份,user_u表示普通用户无特权用户,system_u表示系统用户,通过用户可以确认身份类型,一般搭配角色使用。
②object_r object_r一般为文件和目录的角色、system_r一般为进程的角色,在targeted策略环境中用户的角色一般为system_r。
③admin_home 文件和进程都有一个类型
例5:查看一个目录的安全上下文
[[email protected] ~]# ls -Zd /root/
dr-xr-x---. root root system_u:object_r:admin_home_t:s0 /root/
system_u表示系统用户
object_r object_r一般为文件和目录的角色
admin_home_t 表示管理员的家目录
例6:查看普通用户宿主目录的安全上下文
[[email protected] ~]# useradd rm
[[email protected] ~]# ls -Zd /home/rm/
drwx------. rm rm unconfined_u:object_r:user_home_dir_t:s0 /home/rm/
[[email protected] ~]# ls -Z /etc/passwd
-rw-r--r--. root root system_u:object_r:etc_t:s0 /etc/passwd
4、chcon
说明:变文件目录的selinux属性标签。
使用方式:
chcon [OPTION]... CONTEXT FILE...
chcon [OPTION]... --reference(参考)=RFILE FILE...
参数如下:
-u USER:set user USER in the target security context
-r ROLE:set role ROLE in the target security context
-t TYPE:set type TYPE in the target security context
注:selinux开启后,进程只能访问标识为自己只够访问的安全上下文的文件与目录。
例7:修改文件的安全上下文
[[email protected] ~]# ls -Z /etc/hosts
-rw-r--r--. root root system_u:object_r:net_conf_t:s0 /etc/hosts
[[email protected] ~]# ls -Zd /var/
drwxr-xr-x. root root system_u:object_r:var_t:s0 /var/
改:
[[email protected] ~]# chcon -t var_t /etc/hosts
[[email protected] ~]# ls -Z /etc/hosts
-rw-r--r--. root root system_u:object_r:var_t:s0 /etc/hosts
例8:修改目录及目录下所有文件的安全上下文
[[email protected] ~]# mkdir /tmp/abc
[[email protected] ~]# ls -Zd /tmp/abc/
drwxr-xr-x. root root unconfined_u:object_r:user_tmp_t:s0 /tmp/abc/
修改上下文:
[[email protected] ~]# chcon -R -t samba_share_t /tmp/abc/
[[email protected] ~]# ls -Zd /tmp/abc/
drwxr-xr-x. root root unconfined_u:object_r:samba_share_t:s0 /tmp/abc/
例9:当不知道是什么类型时,参考一下服务中其它文件
[[email protected] ~]# echo "2016-4-11" > a.html
[[email protected] ~]# mv a.html /var/www/html/
[[email protected] ~]# echo "2016-4-12" > /var/www/html/b.html
[[email protected] ~]# ls -Z /var/www/html/
-rw-r--r--. root root unconfined_u:object_r:admin_home_t:s0 a.html
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 b.html
启动httpd服务
[[email protected] ~]# service httpd restart
测试:
http://192.168.31.245/b.html ok
http://192.168.31.245/a.html 不ok
临时关闭selinux
[[email protected] ~]# setenforce 0
测试:
http://192.168.31.245/b.html
http://192.168.31.245/a.html
修改安全上下文
[[email protected] ~]# chcon --reference=/var/www/html/ /var/www/html/a.html
[[email protected] ~]# ls -Z /var/www/html/
-rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 a.html
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 b.html
[[email protected] ~]# setenforce 1
测试:
http://192.168.31.245/b.html
http://192.168.31.245/a.html
复制一个文件或目录时,安全上下文,会改变为目标目录的类型
[[email protected] ~]# echo aaaaaa > c.html
[[email protected] ~]# cp c.html /var/www/html/
[[email protected] ~]# ls -Z /var/www/html/
-rw-r--r--. root root system_u:object_r:httpd_sys_content_t:s0 a.html
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 b.html
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 c.html
测试:
http://192.168.31.245/c.html
5、命令:restorecon
说明:恢复档案目录的预设的security Context
规则来源:/etc/selinux/targeted/contexts/files/目录内的file_contexts与file_contexts.local
查看系统中保存好的规则:
[[email protected] ~]# ls /etc/selinux/targeted/contexts/files/
file_contexts file_contexts.homedirs media
[[email protected] ~]# cd /etc/selinux/targeted/contexts/files/
[[email protected] files]# vim file_contexts #查看
/.* system_u:object_r:default_t:s0
/[^/]+ -- system_u:object_r:etc_runtime_t:s0
/a?quota\.(user|group) -- system_u:object_r:quota_db_t:s0
比如: www
restorecon常用参数如下:
-r | -R:包含子目录和目录下的文件
-v:显示执行过程
[[email protected] ~]# ls -Z /etc/ntp.conf
-rw-r--r--. root root system_u:object_r:net_conf_t:s0 /etc/ntp.conf
[[email protected] ~]# chcon -t var_t /etc/ntp.conf
[[email protected] ~]# ls -Z /etc/ntp.conf
-rw-r--r--. root root system_u:object_r:var_t:s0 /etc/ntp.conf
[[email protected] ~]# restorecon -v /etc/ntp.conf
restorecon reset /etc/ntp.conf context system_u:object_r:var_t:s0->system_u:object_r:net_conf_t:s0
以上内容是安全上下文的内容
selinux策略
1、getsebool命令 查看selinux策略。策略:作用,指定进程可以访问哪些文件
例:获取本机selinux策略值,也称为bool值。
[[email protected]]# getsebool -a
NetworkManager_disable_trans--> off
allow_cvs_read_shadow--> off
allow_daemons_dump_core--> on
说明:selinux的设置一般通过两个部分完成的,一个是安全上下文,另一个是策略,策略值是对安全上下文的补充。
说明:SELinux规范了许多boolean数值清单档案,提供开启或关闭功能存取项目,而这些值都存放在/selinux/booleans/目录内相关文件中,这些文件中的值只有两种:1(启用)或 0(关闭)
例:查看bool值
[[email protected] ~]# ls /selinux/booleans/ | more
abrt_anon_write
abrt_handle_event
allow_console_login
[[email protected] ~]# cat /selinux/booleans/allow_ftpd_anon_write
0 0
说明:设定selinux bool数值清单表与内容
使用方式:setsebool [ -P ] boolean value | bool1=val1 bool2=val2 bool3=val3......
参数: -P 是永久性设置,否则重启之后又恢复预设值。
例1:使用系统用户登录ftp后,会自动切换自己的家目录。
在开启selinux的情况下,允许普通用户可以登陆ftp并且上传下载文件
[[email protected] ~]# useradd rm
[[email protected] ~]# echo 123456 | passwd --stdin rm
[[email protected] ~]# yum -y install vsftpd
[[email protected] ~]# service vsftpd start
[[email protected] ~]# setenforce 1
测试:使用rm登录ftp
无法登陆
解决:
[[email protected] ~]# getsebool -a | grep ftp_home
ftp_home_dir --> off
[[email protected] ~]# setsebool -P ftp_home_dir=on
例2:设置允许ftp服务器匿名用户登录后,可以创建文件
默认修改vsftpd.conf的情况下只允许匿名用户进行登录并允许下载,不允许上传。
修改ftp配置文件,开启上传和写入功能
[[email protected] ~]# service vsftpd restart
service vsftpd restart
测试:
仍然是创建失败,显示为权限不允许
改selinux:
[[email protected] ~]# setenforce 0
[[email protected] ~]# chmod 777 /var/ftp/pub/
[[email protected] ~]# getsebool -a | grep allow_ftpd
allow_ftpd_anon_write --> off
[[email protected] ~]# setsebool -P allow_ftpd_anon_write=on
再进行测试:
[[email protected] ~]# setenforce 1
解决,修改文件类型:
[[email protected] ~]# ls -Zd /var/ftp/pub/
drwxrwxrwx. root root system_u:object_r:public_content_t:s0 /var/ftp/pub/
[[email protected] ~]# chcon -t public_content_rw_t /var/ftp/pub/