您的位置:首页 > 运维架构 > Linux

浅析 SELinux

2015-06-27 14:58 579 查看
为什么有的时候我们非要把SELinux=disabled设置成这样
什么是SELinux?(访问控制体系,实现系统安全性达到军方级别)

百度解释:是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统。NSA是在Linux社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件。

怎么用呢?
[root@hack1 ~]# cat /etc/redhat-release
CentOS release 6.6 (Final)
[root@hack1 ~]# uname -a
Linux hack1 2.6.32-504.12.2.el6.i686 #1 SMP Wed Mar 11 19:05:53 UTC 2015 i686 i686 i386 GNU/Linux
[root@hack1 ~]# 这是我的系统
[root@hack1 selinux]# ls
config restorecond.conf restorecond_user.conf semanage.conf targeted
[root@hack1 selinux]# pwd
/etc/selinux
[root@hack1 selinux]# cat config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
[root@hack1 selinux]#
现在解释目录在/etc/selinux下,配置文件config
SELINUX可以有三个参数

enforcing级别:Linux下selinux所设置的安全策略都会被启用.所有与selinux安全策略有关的服务或者程序都会被策略阻止.permissive级别:Linux下selinux所设置的安全策略都会被启动,但是所有与selinux安全策略有关的服务或者程序不会被策略组织,但是会收到警告.disabled级别:关闭selinux,相当于系统没有安装selinux一样.
怎么实现策略呢?通过二进制和content(安全上下文(context secure),含义就是:一个进程到底能访问哪些文件取决于发起进程的用户的权限和访问的文件的权限设定),至于怎么通过二进制和content可以看下面的这个链接http://www.myhack58.com/Article/48/66/2012/36288.htm
常用的命令[root@hack1 selinux]# getsebool -a #查看系统中所有“开关形式”的规则
abrt_anon_write --> off
abrt_handle_event --> off
allow_console_login --> on
allow_cvs_read_shadow --> off。。。。。。[root@hack1 selinux]# getenforce #查看selinux 的status
Enforcing[root@hack1 selinux]#setenforce 0/1 #设置selinux的status(临时生效)ls -Z #查看文件的标签[root@hack1 selinux]# ls -Z 可以看出不同的标签
-rw-r--r--. root root system_u:object_r:selinux_config_t:s0 config
-rw-r--r--. root root system_u:object_r:selinux_config_t:s0 restorecond.conf
-rw-r--r--. root root system_u:object_r:selinux_config_t:s0 restorecond_user.conf
[root@hack1 selinux]# ls -Z /root
-rw-------. root root system_u:object_r:admin_home_t:s0 anaconda-ks.cfg
-rw-r--r--. root root system_u:object_r:admin_home_t:s0 install.log
-rw-r--r--. root root system_u:object_r:admin_home_t:s0 install.log.syslog
[root@hack1 selinux]# ls -Z /home/lxf/
-rw-rw-r--. lxf lxf unconfined_u:object_r:user_home_t:s0 c.log
[root@hack1 selinux]#

ps auxZ #查看进程的标签(用户:角色:类型)
ps auxZ | grep httpd #查看httpd的标签
ls -dZ /var/www/html #查看此目录的标签(链接里边的案例就是通过copy不同地方的文件,不能实现同样的访问,原因就来源于selinux
#上面进程和目录被selinux定义的类型相同,所以能被访问
chcon -t #改文件类型
-R #该目录类型(递归修改)
--reference
chcon -R --reference=/var/www/html /www #参照/www更改/var/www/html文件类型
chcon -t default_t /www/index.html #更改文件类型为default_t
restorecon -R #恢复目录的文件原有默认属性
-F #强制恢复
-v #显示信息

restorecon -R -v -F /www #强制恢复/www目录的默认属性
semanage fcontext #更改文件安全上下文(永久性更改)
getsebool -a | grep httpd #查看httpd服务能用的“开关”

如何开启/关闭这些规则:
setsebool httpd_enable_cgi=1 #开启
setsebool httpd_enable_cgi=1 #关闭

[root@hack1 selinux]# getsebool -a |grep httpd 通过这个应该可以知道为什么关闭selinux
allow_httpd_anon_write --> off
allow_httpd_mod_auth_ntlm_winbind --> off
allow_httpd_mod_auth_pam --> off
allow_httpd_sys_script_anon_write --> off
httpd_builtin_scripting --> on
httpd_can_check_spam --> off
httpd_can_network_connect --> off
httpd_can_network_connect_cobbler --> off
httpd_can_network_connect_db --> off
httpd_can_network_memcache --> off
httpd_can_network_relay --> off
httpd_can_sendmail --> off
httpd_dbus_avahi --> on
httpd_dbus_sssd --> off
httpd_enable_cgi --> on
httpd_enable_ftp_server --> off
httpd_enable_homedirs --> off
httpd_execmem --> off
httpd_manage_ipa --> off
httpd_read_user_content --> off
httpd_run_preupgrade --> off
httpd_run_stickshift --> off
httpd_serve_cobbler_files --> off
httpd_setrlimit --> off
httpd_ssi_exec --> off
httpd_tmp_exec --> off
httpd_tty_comm --> on
httpd_unified --> on
httpd_use_cifs --> off
httpd_use_fusefs --> off
httpd_use_gpg --> off
httpd_use_nfs --> off
httpd_use_openstack --> off
httpd_verify_dns --> off
[root@hack1 selinux]#

扩展阅读
SE Linux 可以为你的系统提供较棒的安全防护。 使用者能被分配预先定义好的角色,以便他们不能存取文件或者访问他们不拥有的程序。 这可不是简单的 " chmod 777" 同等物操作。 这在角色, 或他所在的安全上下文已经限制接触的文件和其他的资源的使用者定义中是不同于一般的 Unix 许可权限的,除了在一种比较受约束的流行之外。 带一个用户的.rhosts 文件在一个一般的 Unix 系统上申请。 如果他们使它成为任何人可写入 , 那么任何能登录的人都可以作危险的操作。 在 SE Linux 之下,你能控制其它用户是否有能力改变他们的.rhosts文件, 以及阻止其他的人写入 , 就算拥有者已经使它成为任何人可写入。
一个通常的疑问是 SE Linux 的权限设置如何与标准的 Unix 的权限设置共存。 当你做特定的操作的时候, Unix 权限首先被检查。 如果他们允许你的操作 , 那么然后, SE Linux 将会检查并且允许或拒绝使用者的使用。 但是如果 Unix 许可不让你做某事,在那里的运行的操作被禁止和 SE Linux 检查没关系。 另外的一个例子是,如果有一个设置了SUID的可执行文件,如/usr/bin/passwd 他可以运行命令chmod 666 /etc/shadow,SE Linux 会阻止任何人非法的这样设置文件。
2.2 术语
接下来的术语将在本文当中经常出现, 也是来自SE Linux的基本概念. It is somewhat tricky to define one word without including the other terms so I realise my definitions include things that need defining(译者注:这句实在不敢乱译,sorry。不过不耽误学习;-)) )
2.2.1 (身份)identity

在 SE Linux 中,身份的概念不同于传统的Unix uid (user id). 它们可以共存于一个系统, 但却是十分不同的概念。 在SE Linux中的身份是安全上下文的一部分,它会影响哪个域可以进入,也就是本质上的可以被执行。一个SE Linux 的身份(identity)会跟标准的Unix登录名有很相似的文本表示 (大部分情况下它们是这样), 无论如何,了解它们是两个完全不同的概念是很重要的。 运行su 命令不会改变SE Linux中的身份(identity)。(译者注:我在红帽系统中做的实验却不是这样,不过这无所谓,可能红帽系统的策略设置不同,我目前还没来得及研究具体是什么问题,只是猜测。)
6

Getting Started with SE Linux HOWTO:the new SE Linux
举例:
一个无特权用户 faye 运行 id 命令 (在启动SE Linux的情况下) 可以看到用户的安全上下文:
context=faye:user_r:user_t
安全上下文中的身份部分就是 "faye"。 现在, 如果 faye su切换成 root 再运行id, 他将发现安全上下文仍然是:
context=faye:user_r:user_t
身份保持相同, 跟没切换到root时一样。, 不管怎样,如果faye 身份被允许进入sysadm_r 角色并转换成了sysadm_r (这里可以使用newrole -r 命令),再运行id 命令,他将看到:
context=faye:sysadm_r:sysadm_t
身份字段保持一样但是角色和域(第二和第三字段)的字段已经变了。这样保持身份的方式是用户职责所必需的。身份将影响系统决定哪个角色和域可以被什么身份所使用,这将对系统安全期决定性的作用。
2.2.2 域

所有进程都在域中运行。域直接决定了进程的访问。 域基本上是一个进程允许做的操作的列表, 或者说它决定了一个进程可以对哪些类型进行操作。 域就好像一个标准UNIX的uid的概念。 假设一个属于root用户的可执行程序被设置了setuid。 在这个系统上的任何用户,只要可以执行这个程序,它就有可能获得root的权限。这是一个很大的安全漏洞。 再有SE Linux的系统上, 如果一个正在执行的进程想要转换进入特权域执行时,如果这个进程的角色被设置成不允许进入特权与的话, 这个进程就不能执行。
常见的例子是sysadm_t是系统管理域, user_t 是无特权用户域。 Init运行在init_t 域, named 运行在 named_t 域。
2.2.3 类型

类型分配给一个对象并决定谁可以访问这个对象。 它的定义和域基本相同, 不同就是域是对进程的应用而类型是分配给目录,文件,和套接字的。
2.2.4 角色

角色决定了那些域可以使用。 有关哪些与可以被哪些角色使用可以预先定义在策略的配置文件里。如果一个策略数据库中定义了一个角色不可以使用一个域, 它将被拒绝。
7
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: