首页 > Computer > SELinux管理与配置
2013
04-02

SELinux管理与配置

1.1 SElinux概述

SELinux(Security-Enhanced Linux) 是美国国家安全局(NAS)对于强制访问控 制的实现,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件。大部分使用 SELinux 的人使用的都是SELinux就绪的发行版,例如 Fedora、Red Hat Enterprise Linux (RHEL)、Debian 或 Gentoo。它们都是在内核中启用SELinux 的,并且提供一个可定制的安全策略,还提供很多用户层的库和工具,它们都可以使用 SELinux 的功能。

1.1.1 SElinux特点

1.MAC

对访问的控制彻底化,对所有的文件、目录、端口的访问都是基于策略设定的,可由管理员时行设定。

2.RBAC

对于用户只赋予最小权限。用户被划分成了一些role(角色),即使是root用户,如果不具有sysadm_r角色的话,也不是执行相关的管理。哪里role可以执行哪些domain,也是可以修改的。

3.安全上下文

当启动selinux的时候,所有文件与对象都有安全上下文。进程的安全上下文是域,安全上下文由用户:角色:类型表示。

(1)系统根据pam子系统中的pam_selinux.so模块设定登录者运行程序的安全上下文

(2)rpm包安装会根据rpm包内记录来生成安全上下文,

(3)如果是手工他建的,会根据policy中规定来设置安全上下文,

(4)如果是cp,会重新生成安全上下文。

(5)如果是mv,安全上下文不变。

1.1.2 安全上下文格式

安全上下文由user:role:type三部分组成,下面分别说明其作用:

1.user identity:类似linux系统中的UID,提供身份识别,安全上下文中的一部分。

三种常见的user:

user_u-:   普通用户登录系统后预设;

system_u-:开机过程中系统进程的预设;

root-:    root登录后预设;

在targeted policy中users不是很重要;

在strict policy中比较重要,的有预设的selinuxusers都以 “_u”结尾,root除外。

2.role

文件与目录的role,通常是object_r;

程序的role,通常是system_r;

用户的role,targetedpolicy为system_r;

strict policy为sysadm_r,staff_r,user_r

用户的role,类似于系统中的GID,不同的角色具备不同的权限;用户可以具备多个role;但是同一时间内只能使用一role;

role是RBAC的基础;

3.type

type:用来将主体与客体划分为不同的组,组每个主体和系统中的客体定义了一个类型;为进程运行提供最低的权限环境。

当一个类型与执行的进程关联时,该type也称为domain,也叫安全上下文。

域或安全上下文是一个进程允许操作的列表,决字一个进程可以对哪种类型进行操作。

1.1.3 SElinux配置文件

vi/etc/selinux/config

# This filecontrols the state of SELinux on the system.

# SELINUX= cantake one of these three values:

# enforcing -SELinux security policy is enforced.

# permissive -SELinux prints warnings instead of enforcing.

# disabled -SELinux is fully disabled.

SELINUX=enforcing

#SELINUX=disabled

# SELINUXTYPE=type of policy in use. Possible values are:

# targeted -Only targeted network daemons are protected.

# strict -Full SELinux protection.

SELINUXTYPE=targeted

#SELINUX有「disabled」「permissive」,「enforcing」3种选择。

1.模式的设置

enforcing:强制模式,只要selinux不允许,就无法执行

permissive:警告模式,将该事件记录下来,依然允许执行

disabled:关闭selinux;停用,启用需要重启计算机。

2.策略的设置

targeted:保护常见的网络服务,是selinux的默认值;

stric:提供RBAC的policy,具备完整的保护功能,保护网络服务,一般指令及应用程序。

策略改变后,需要重新启动计算机。

也可以通过命令来修改相关的具体的策略值,也就是修改安全上下文,来提高策略的灵活性。

3.策略的位置

/etc/selinux/<策略名>/policy/

1.2 SElinux命令介绍

1.2.1 查询SElinux状态命令

1.查询selinux状态

[root@redhat~]# sestatus

SELinux status:                 enabled

SELinuxfsmount:                /selinux

Currentmode:                   enforcing

Mode fromconfig file:          enforcing

Policyversion:                 21

Policy fromconfig file:        targeted

2.查询selinux激活状态

[root@redhat~]# selinuxenabled

[root@redhat~]# echo $?

0

如果为-256为非激活状态。

1.2.2 切换SElinux类型

1.切换成警告模式

[root@redhat~]# setenforce 0或setenforce permissive

[root@redhat~]# sestatus

SELinuxstatus:                 enabled

SELinuxfsmount:                /selinux

Currentmode:                   permissive

Mode fromconfig file:          enforcing

Policyversion:                 21

Policy fromconfig file:        targeted

[root@redhat~]# getenforce

Permissive

2.切换成强制模式

[root@redhat~]# setenforce 1

[root@redhat~]# getenforce

Enforcing

注:使用setenforce切换enforcing与permissive模式不需要重启计算机。

1.2.3 检查安全上下文

1.检查帐号的安全上下文

[root@redhat~]# id -Z

root:system_r:unconfined_t:SystemLow-SystemHigh

2.检查进程的安全上下文

[root@redhathome]# ps -Z

LABEL                             PIDTTY          TIME CMD

root:system_r:unconfined_t:SystemLow-SystemHigh2383 pts/0 00:00:00 bash

root:system_r:unconfined_t:SystemLow-SystemHigh2536 pts/0 00:00:00 ps

3.检查文件与目录的安全上下文

[root@redhathome]# ls -Z

drwx——  tom  tom  system_u:object_r:user_home_dir_ttom

1.2.4 修改文件/目录安全上下文与策略

1.chcon命令

chcon -u[user]  对象

      -r[role]

      -t[type]

      -R递归

示例:

chcon -R -tsamba_share_t /tmp/abc

注:安全上下文的简单理解说明,受到selinux保护的进程只能访问标识为自己只够访问的安全上下文的文件与目录。

例如:上面解释为使用smb进程能够访问/tmp/abc目录而设定的安全上下文。

2.getsebool命令

获取本机selinux策略值,也称为bool值。

getsebool-a  命令同sestatus -b

[root@redhatfiles]# getsebool -a

NetworkManager_disable_trans–> off

allow_cvs_read_shadow–> off

allow_daemons_dump_core–> on

allow_daemons_use_tty–> off

allow_execheap–> off

allow_execmem–> on

allow_execmod–> off

allow_execstack–> on

allow_ftpd_anon_write–> off  

allow_ftpd_full_access–> off

httpd_disable_trans–> off   

说明:selinux的设置一般通过两个部分完成的,一个是安全上下文,另一个是策略,策略值是对安全上下文的补充。

3.setsebool命令

setsebool -Pallow_ftpd_anon_write=1

-P 是永久性设置,否则重启之后又恢复预设值。

示例:

[root@redhatfiles]# setsebool -P allow_ftpd_anon_write=1

[root@redhatfiles]# getsebool allow_ftpd_anon_write

allow_ftpd_anon_write–> on

说明:如果仅仅是安全上下文中设置了vsftpd进程对某一个目录的访问,配置文件中也允许可写,但是selinux中策略中不允许可写,仍然不可写。所以基于selinux保护的服务中,安全性要高于很多。

1.3 SElinux应用

selinux的设置分为两个部分,修改安全上下文以及策略,下面收集了一些应用的安全上下文,供配置时使用,对于策略的设置,应根据服务应用的特点来修改相应的策略值。

1.3.1 SElinux与samba

1.samba共享的文件必须用正确的selinux安全上下文标记。

chcon -R -t samba_share_t /tmp/abc

如果共享/home/abc,需要设置整个主目录的安全上下文。

chcon -R -r samba_share_t /home

2.修改策略(只对主目录的策略的修改)

setsebool -P samba_enable_home_dirs=1

setsebool -P allow_smbd_anon_write=1

getsebool 查看

samba_enable_home_dirs –>on

allow_smbd_anon_write –> on

1.3.2 SElinux与nfs

selinux对nfs的限制好像不是很严格,默认状态下,不对nfs的安全上下文进行标记,而且在默认状态的策略下,nfs的目标策略允许nfs_export_all_ro

nfs_export_all_ro

nfs_export_all_rw值为0

所以说默认是允许访问的。

但是如果共享的是/home/abc的话,需要打开相关策略对home的访问。

setsebool -Puse_nfs_home_dirs boolean 1

getsebooluse_nfs_home_dirs

1.3.3 SElinux与ftp

1.如果ftp为匿名用户共享目录的话,应修改安全上下文。

chcon -R -t public_content_t /var/ftp

chcon -R -t public_content_rw_t /var/ftp/incoming

2.策略的设置

setsebool -P allow_ftpd_anon_write =1

getsebool allow_ftpd_anon_write

allow_ftpd_anon_write–> on

1.3.4 SElinux与http

apache的主目录如果修改为其它位置,selinux就会限制客户的访问。

1.修改安全上下文:

chcon -R -t httpd_sys_content_t /home/html

由于网页都需要进行匿名访问,所以要允许匿名访问。

2.修改策略:

setsebool -P allow_ftpd_anon_write = 1

setsebool -P allow_httpd_anon_write = 1

setsebool -P allow_<协议名>_anon_write =1

关闭selinux对httpd的保护

httpd_disable_trans=0

1.3.5 SElinux与公共目录共享

如果ftp,samba,web都访问共享目录的话,该文件的安全上下文应为:

public_content_t

public_content_rw_t

其它各服务的策略的bool值,应根据具体情况做相应的修改。

1.3.6 SElinux配置总结

以上内容的selinux的配置实验还需要进行相关验证,以便在实际环境中能够直接应用,相关的内容还需要继续补充。

对于多于牛毛的策略,可以用过滤还查看一个服务相当开启哪些策略。

——————————————————————————

SELinux主要配制文件

SELinux主要配制文件位于/etc/selinux/下。在网络中的服务器,建议开启SELinx,以提高系统的安全性。我这里通过命令方式来改变SELinx的安全策略,就不在对SELinux的配制文件做具体说明。

SELinux常用的命令

ls –Z |ps –Z | id –Z

分别用于查看文件(夹)、进程和用户的SELinx属性。最常用的是ls -Z

  sestatus

查看当前SELinux的运行状态

  setenforce

在SELinux为启动模式下,用此命令可以暂时停用SELinux

  getsebool

查看当前Policy(策略)的布尔值

  setsebool

设置Policy的布尔值,以启用或停用某项Policy

   chcon

改变文件或文件夹的content标记

SELinux实用案例

SELinux对Apache的保护

新安装的wordpress位于/vogins/share/wordpress下,按照系统的默认策略,/vogins,/vogins/share的SELinux属性为file_t,而这是不允许httpd进程直接访问的。为此,需要做如下高调整:

1) 改变/vogins,/vogins/share的SELinux属性

Shell>chcon –t var_t /vogins

Shell>chcon –t var_t /vogins/share

2) 改变wrodpress目录的SELinux属性

Shell>chcon –R –t httpd_sys_content_t wordpress

3) 允许apache进程访问mysql

setsebool -Phttpd_can_network_connect=1

4) 关于Apache里虚拟主机的配制就里就不多说,重新启动apache,就可以正常访问wordpress

Shell>/etc/init.d/httpd start

注意:如果出现不能访问的情况,请查看/var/log/messages里的日志。一般来说,按照提示就可以解决了。

LINUX 中SELINUX 的禁用方式

经网上查看资料,发现是SELinux在作怪,现在记录下来,以后继续完善
1、临时禁用SELinux:
root@server# setenforce 0
这样重启服务器之后,还是会启动SELinux,
2、永久禁用:
打开服务器上的SELinux配置文件,默认为:/etc/selinux/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 – SELinux is fully disabled.
SELINUX=enforcing
# SELINUXTYPE= type of policy in use. Possible values are:
#       targeted – Only targeted network daemons are protected.
#       strict – Full SELinux protection.
SELINUXTYPE=targeted
将上面的
SELINUX=enforcing 改为:SELINUX=disable  禁用SeLinux

1.背景

SELinux是「Security-Enhanced Linux」的简称,是美国国家安全局「NSA=The National Security Agency」 和SCC(Secure Computing Corporation)开发的 Linux的一个扩张强制访问控制安全模块。原先是在Fluke上开发的,2000年以 GNU GPL 发布。

现在以Linux作为因特网服务器是越来越普遍的事了。在我这几年作过的项目里,WEB的开发基本都是基于Linux的,这里有给大公司做的,也给政府部门做的,当然更多的是中小企业做的。这其中给政府做的,我们把SELinux作为一个卖点,接受了不少项目。

2.我们需要安全操作系统的理由

现在不论是政府还是民间企业,大家对信息安全问题是越来越关心了,因为企业的业务平台的服务器上存储着大量的商务机密,个人资料,个人资料它直接关系到个人的隐私问题。特别是我们政府的网站,作为信息公开的平台,它的安全就更显得重要了。这些连到互联网的服务器,不可避免的要受到来自世界各地的各种威胁。最坏的时候我们的服务器被入侵,主页文件被替换,机密文件被盗走。除了来自外部的威胁外,内部人员的不法访问,攻击也是不可忽视的。对于这些攻击或者说是威胁,当然有很多的办法,有防火墙,入侵检测系统,打补丁等等。因为Linux也和其他的商用UNIX一样,不断有各类的安全漏洞被发现。我们对付这些漏洞不得不花很多的人力来堵住它。在这些手段之中,提高OS系统自身的牢固性就显得非常的重要。

2.1传统的Linux OS的不足之处

虽然Linux 比起 Windows 来说,它的可靠性,稳定定要好得多,但是他也是和其他的UNIX 一样,有以下这些不足之处。

1)存在特权用户root

  任何人只要得到root的权限,对于整个系统都可以为所欲为。这一点Windows也一样。

2)对于文件的访问权的划分不够细

  在linux系统里,对于文件的操作,只有「所有者」,「所有组」,「其他」这3类的划分。

  对于「其他」这一类里的用户再细细的划分的话就没有办法了。

3)SUID程序的权限升级

  如果设置了SUID权限的程序有了漏洞的话,很容易被攻击者所利用。

4)DAC(Discretionary Access Control)问题

  文件目录的所有者可以对文件进行所有的操作,这给系统整体的管理带来不便。

对于以上这些的不足,防火墙,入侵检测系统都是无能为力的。

在这种背景下,对于访问权限大幅强化的OS SELinux来说,它的魅力的无穷的。

2.2 SELinux的优点

SELinux系统比起通常的Linux系统来,安全性能要高的多,它通过对于用户,进程权限的最小化,即使受到攻击,进程或者用户权限被夺去,也不会对整个系统造成重大影响。

接下来我来介绍SELinux的一些特点。

特点1:MAC(Mandatory Access Control)―――对访问的控制彻底化

对于所有的文件,目录,端口这类的资源的访问,都可以是基于策略设定的,这些策略是由管理员定制的、一般用户是没有权限更改的。

特点2: TE (Type Enforcement)――― 对于进程只付与最小的权限
Te概念在 SELinux里非常的重要。它的特点是对所有的文件都赋予一个叫type的文件类型标签,对于所有的进程也赋予各自的一个叫 domain的 标签。Domain标签能够执行的操作也是由access vector在策略里定好的。

我们熟悉的apache服务器,httpd进程只能在httpd_t 里运行,这个httpd_t 的domain能执行的操作,比如能读网页内容文件赋予httpd_sys_content_t, 密码文件赋予shadow_t, TCP的80端口赋予 http_port_t等等。如果在access vector里我们不允许 http_t来对http_port_t进行操作的花,Apache启动都启动不了。反过来说,我们只允许80端口,只允许读取被标为 httpd_sys_content_t的文件,httpd_t就不能用别的端口,也不能更改那些被标为httpd_sys_content_t的文件(read only)。

特点3: domain迁移 ―― 防止权限升级

在用户环境里运行点对点下载软件 azureus,你当前的domain是fu_t, 但是,你考虑到安全问题,你打算让他在azureus_t里运行,你要是在terminal里用命令启动azureus的话,它的进程的domain就会默认继承你实行的shell的fu_t。

有了domain迁移的话,我们就可以让azureus在我们指定的azureus_t里运行,在安全上面,这种做法更可取,它不会影响到你的fu_t。

下面是domain迁移指示的例子:

domain_auto_trans(fu_t, azureus_exec_t, azureus_t)

意思就是,当在 fu_t domain里,实行了 被标为 azureus_exec_t的文件时,domain 从fu_t迁移到 azureus_t 。下面是Apache启动的迁移图。注意了,因为从哪一个domain能迁移到httpd_t是在策略里定好了,所以要是我们手动 (/etc/init.d/httpd start)启动apache的话,可能仍然留在sysadm_t里,这样就不能完成正确的迁移。要用run_init命令来手动启动。

特点4: RBAC(role base access control) ――――― 对于用户只付与最小的权限

对于用户来说,被划分成一些ROLE,即使是ROOT用户,你要是不在sysadm_r里,也还是不能实行sysadm_t管理操作的。因为,那些ROLE可以执行那些domain也是在策略里设定的。ROLE也是可以迁移的,但是也只能安策略规定的迁移。

3. 控制切换

从fedora core 2开始, 2.6内核的版本都支持selinux.我们看看 Fedora core 5 里的/etc/sysconfig/selinux标准设定吧。

# 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 – SELinux is fully disabled.

SELINUX=enforcing

#SELINUX=disabled
# SELINUXTYPE= type of policy in use. Possible values are:

# targeted – Only targeted network daemons are protected.

# strict – Full SELinux protection.

SELINUXTYPE=targeted

SELINUX有「disabled」「permissive」,「enforcing」3种选择。

Disabled就不用说了,permissive就是Selinux有效,但是即使你违反了策略的话它让你继续操作,但是把你的违反的内容记录下来。在我们开发策略的时候非常的有用。

相当于Debug模式。

Enforcing就是你违反了策略,你就无法继续操作下去。

SELINUXTYPE 呢,现在主要有2大类,一类就是红帽子开发的targeted,它只是对于,主要的网络服务进行保护,比如 apache ,sendmail, bind,postgresql等,不属于那些domain的就都让他们在unconfined_t里,可导入性高,可用性好但是不能对整体进行保护。

另一类是Strict,是NAS开发的,能对整个系统进行保护,但是设定复杂,我认为虽然它复杂,但是一些基本的会了,还是可以玩得动的。

我们除了在/etc/sysconfig/selinux设它有效无效外,在启动的时候,也可以通过传递参数selinux给内核来控制它。(Fedora 5默认是有效)

kernel /boot/vmlinuz-2.6.15-1.2054_FC5 ro root=LABEL=/ rhgb quiet selinux=0

上面的变更可以让它无效。

[root@python sysconfig]# /usr/sbin/getenforce

Enforcing

确认有效后重新对文件系统赋予标签:

[root@python sysconfig]# /sbin/fixfiles relabel

或者

[root@python /]# touch /.autorelabel

然后 reboot ,你就在secure的Linux环境下工作了。
4. SELinux的基本操作

SELinux 是个经过安全强化的Linux操作系统,实际上,基本上原来的运用软件没有必要修改就能在它上面运行。真正做了特别修改的RPM包只要50多个。像文件系统EXT3都是经过了扩展。对于一些原有的命令也进行了扩展,另外还增加了一些新的命令,接下来我们就来看看这些命令。

4.1 文件操作

1)ls命令

在命令后加个 -Z 或者加 –context

[root@python azureus]# ls -Z

-rwxr-xr-x fu fu user_u:object_r:user_home_t azureus

-rw-r–r– fu fu user_u:object_r:user_home_t Azureus2.jar

-rw-r–r– fu fu user_u:object_r:user_home_t Azureus.png

2)chcon

更改文件的标签

[root@python tmp]# ls –context test.txt

-rw-r–r– root root root:object_r:staff_tmp_t test.txt

[root@python tmp]# chcon -t etc_t test.txt

[root@python tmp]# ls -lZ test.txt

-rw-r–r– root root root:object_r:etc_t test.txt

3)restorecon

当这个文件在策略里有定义是,可以恢复原来的 文件标签。

4)setfiles

跟chcon一样可以更改一部分文件的标签,不需要对整个文件系统重新设定标签。

5)fixfiles

一般是对整个文件系统的, 后面一般跟 relabel,对整个系统 relabel后,一般我们都重新启动。如果,在根目录下有.autorelabel空文件的话,每次重新启动时都调用 fixfiles relabel

6)star

就是tar在SELinux下的互换命令,能把文件的标签也一起备份起来。

7)cp

可以跟 -Z, –context=CONTEXT 在拷贝的时候指定目的地文件的security context

8)find

可以跟 –context 查特定的type的文件。

例子:

find /home/fu/ –context fu:fu_r:amule_t -exec ls -Z {} :

9)run_init

在sysadm_t里手动启动一些如Apache之类的程序,也可以让它正常进行,domain迁移。

4.2进程domain的确认

程序现在在那个domain里运行,我们可以在ps 命令后加 -Z

最后编辑:
作者:wy182000
这个作者貌似有点懒,什么都没有留下。

留下一个回复