naotang的测试成长空间,记录工作中的问题,学习中的心得。 个人网站:www.naotang.com

【转载】SELinux 入门

上一篇 / 下一篇  2008-04-15 11:08:30 / 个人分类:操作系统

51Testing软件测试网b ON-sW

1.背景
5Sg@(kpxvQ ]0
51Testing软件测试网Yd)gI"d C
SELinux是「Security-Enhanced Linux」的简称,是美国国家安全局「NSA=The National Security Agency」 和SCC(Secure Computing Corporation)开发的 Linux的一个扩张强制访问控制安全模块。原先是在Fluke上开发的,2000年以 GNU GPL 发布。

_'L4n n3`0U R2g*|0

1r{R&?x ]E}.[0现在以Linux作为因特网服务器是越来越普遍的事了。在我这几年作过的项目里,WEB的开发基本都是基于Linux的,这里有给大公司做的,也给政府部门做的,当然更多的是中小企业做的。这其中给政府做的,我们把SELinux作为一个卖点,接受了不少项目。51Testing软件测试网"]/NC5^%b'Y

51Testing软件测试网e w_Xe]%r4s9K

2.我们需要安全操作系统的理由
K4?I3S$Q Y},oPu051Testing软件测试网[5JfnJa0D-L6d
现在不论是政府还是民间企业,大家对信息安全问题是越来越关心了,因为企业的业务平台的服务器上存储着大量的商务机密,个人资料,个人资料它直接关系到个人的隐私问题。特别是我们政府的网站,作为信息公开的平台,它的安全就更显得重要了。这些连到互联网的服务器,不可避免的要受到来自世界各地的各种威胁。最坏的时候我们的服务器被入侵,主页文件被替换,机密文件被盗走。除了来自外部的威胁外,内部人员的不法访问,攻击也是不可忽视的。对于这些攻击或者说是威胁,当然有很多的办法,有防火墙,入侵检测系统,打补丁等等。因为Linux也和其他的商用UNIX一样,不断有各类的安全漏洞被发现。我们对付这些漏洞不得不花很多的人力来堵住它。在这些手段之中,提高OS系统自身的牢固性就显得非常的重要。51Testing软件测试网 b"|B1ikP n
 51Testing软件测试网N y-`fb
2.1传统的Linux OS的不足之处
P#s0h"R!T IZ%~c051Testing软件测试网K2Dj5Q!?2n3lg}_
虽然Linux 比起 Windows 来说,它的可靠性,稳定定要好得多,但是他也是和其他的UNIX 一样,有以下这些不足之处。51Testing软件测试网7LK\gT$K
1)存在特权用户root
M3J8i,Yn2x.B g3K0  任何人只要得到root的权限,对于整个系统都可以为所欲为。这一点Windows也一样。
~7a,en2r,C FO6m"Z0T02)对于文件的访问权的划分不够细51Testing软件测试网9AZ*k _$zH)Y
  在linux系统里,对于文件的操作,只有「所有者」,「所有组」,「其他」这3类的划分。
I!v ui$y0  对于「其他」这一类里的用户再细细的划分的话就没有办法了。
0CyvC6tY(c%q ]03)SUID程序的权限升级51Testing软件测试网*o#n-HZ!u!s5hkx
  如果设置了SUID权限的程序有了漏洞的话,很容易被攻击者所利用。
G+pg'}J{04)DAC(Discretionary Access Control)问题
t Pg7I\p C1FD K A0  文件目录的所有者可以对文件进行所有的操作,这给系统整体的管理带来不便。51Testing软件测试网R#z u Z-MT)B

'\'U xZeJ0对于以上这些的不足,防火墙,入侵检测系统都是无能为力的。
g(hg u s q!Ha0在这种背景下,对于访问权限大幅强化的OS SELinux来说,它的魅力的无穷的。51Testing软件测试网nT^(\5CI4|:IS

#{z a8H"Jv n J,E02.2 SELinux的优点
Ekn}] d:lh.]){051Testing软件测试网v&`!~dn*s
SELinux系统比起通常的Linux系统来,安全性能要高的多,它通过对于用户,进程权限的最小化,即使受到攻击,进程或者用户权限被夺去,也不会对整个系统造成重大影响。51Testing软件测试网 A8?$U^:yYGx H+L

51Testing软件测试网2{ `)xt~.uJ4?

接下来我来介绍SELinux的一些特点。51Testing软件测试网 Cd#\ EH
特点1:MAC(Mandatory Access Control)―――对访问的控制彻底化51Testing软件测试网fNy k6I3^
对于所有的文件,目录,端口这类的资源的访问,都可以是基于策略设定的,这些策略是由管理员定制的、一般用户是没有权限更改的。

aCNY&`Mrnl051Testing软件测试网0vf[)?y

特点2: TE (Type Enforcement)――― 对于进程只付与最小的权限51Testing软件测试网 dZ)j0jT&|
Te概念在 SELinux里非常的重要。它的特点是对所有的文件都赋予一个叫type的文件类型标签,对于所有的进程也赋予各自的一个叫 domain的 标签。Domain标签能够执行的操作也是由access vector在策略里定好的。51Testing软件测试网 Bs@2b3|aMw_w
我们熟悉的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)。
.Z _+L1y`)VM051Testing软件测试网Mk?i-H ~%B3g
特点3: domain迁移 ―― 防止权限升级
GRL%qy `#p$L bK0在用户环境里运行点对点下载软件azureus,你当前的domain是fu_t, 但是,你考虑到安全问题,你打算让他在azureus_t里运行,你要是在terminal里用命令启动azureus的话,它的进程的domain就会默认继承你实行的shell的fu_t。51Testing软件测试网)I7cA:dIjL-q`9H
有了domain迁移的话,我们就可以让azureus在我们指定的azureus_t里运行,在安全上面,这种做法更可取,它不会影响到你的fu_t。
Hv-URh0B$XaJ1G/P0下面是domain迁移指示的例子:
DK d%x6ccq0domain_auto_trans(fu_t, azureus_exec_t, azureus_t)51Testing软件测试网$k7_diMjK
意思就是,当在 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命令来手动启动。
{%s h|[I8X0
,s7w[*D| xu0特点4: RBAC(role base access control) ――――― 对于用户只付与最小的权限
z5T}5`6T0对于用户来说,被划分成一些ROLE,即使是ROOT用户,你要是不在sysadm_r里,也还是不能实行sysadm_t管理操作的。因为,那些ROLE可以执行那些domain也是在策略里设定的。ROLE也是可以迁移的,但是也只能安策略规定的迁移。51Testing软件测试网%`-ZD Mg1sV;X7]P9u'Sr
51Testing软件测试网;AASq#ax&R/Lj7R
3. 控制切换51Testing软件测试网_Vt^$o3?
从fedora core 2开始, 2.6内核的版本都支持selinux.我们看看 Fedora core 5 里的/etc/sysconfig/selinux标准设定吧。51Testing软件测试网vg4a.AU6| Q6v}/a
# This file controls the state of SELinux on the system.51Testing软件测试网V*L [X3Q
# SELINUX= can take one of these three values:
bglOq0# enforcing - SELinux security policy is enforced.
BaC9io&zS0g J'~0# permissive - SELinux prints warnings instead of enforcing.51Testing软件测试网P)K2Q kR,z O3H5H
# disabled - SELinux is fully disabled.
%k+J2pMv_"A%k3l0SELINUX=enforcing
5a#fxmkp0#SELINUX=disabled51Testing软件测试网p]mc*z!t,v5T-Iy
# SELINUXTYPE= type of policy in use. Possible values are:51Testing软件测试网 kIZ P4s8G1l
# targeted - Only targeted network daemons are protected.
-w#@? c |j~*Z(?0# strict - Full SELinux protection.
+q4gTF;UOCQ@0SELINUXTYPE=targeted51Testing软件测试网:t^'G,u5b!i{k

4|{h,C W0SELINUX有「disabled」「permissive」,「enforcing」3种选择。51Testing软件测试网3j;]6rcC*Y `H%zm'L

51Testing软件测试网 jYE-iSx

Disabled就不用说了,permissive就是Selinux有效,但是即使你违反了策略的话它让你继续操作,但是把你的违反的内容记录下来。在我们开发策略的时候非常的有用。51Testing软件测试网 }i${2a,t4S!Eb4F5[
相当于Debug模式。51Testing软件测试网I'Xm+Ok)_.j yv
Enforcing就是你违反了策略,你就无法继续操作下去。51Testing软件测试网+dA_F4W3SgB

j1S)y z{8[_2| hK0SELINUXTYPE呢,现在主要有2大类,一类就是红帽子开发的targeted,它只是对于,主要的网络服务进行保护,比如 apache ,sendmail, bind,postgresql等,不属于那些domain的就都让他们在unconfined_t里,可导入性高,可用性好但是不能对整体进行保护。51Testing软件测试网q^4[2RG,t Cf
另一类是Strict,是NAS开发的,能对整个系统进行保护,但是设定复杂,我认为虽然它复杂,但是一些基本的会了,还是可以玩得动的。51Testing软件测试网6dwg^L-y?:PR.^

51Testing软件测试网?$H/h:|X8w Q'P(s\6W

我们除了在/etc/sysconfig/selinux设它有效无效外,在启动的时候,也可以通过传递参数selinux给内核来控制它。(Fedora 5默认是有效)51Testing软件测试网tzT)ewg(iF-P?

2R:I*c'KA8PE0kernel /boot/vmlinuz-2.6.15-1.2054_FC5 ro root=LABEL=/ rhgb quiet selinux=0
I h6ujHP!e*F7w0上面的变更可以让它无效。51Testing软件测试网[i0M7[gB'X

*I7]'UrccR.AB0[root@python sysconfig]# /usr/sbin/getenforce51Testing软件测试网+[ q#w F}
Enforcing51Testing软件测试网_9N I6Y"a hB i
确认有效后重新对文件系统赋予标签:51Testing软件测试网/~A)Hv k9CW4rR
[root@python sysconfig]# /sbin/fixfiles relabel51Testing软件测试网J6l\8t'DeR V V4v
或者51Testing软件测试网piQ7v1lsV y7C
[root@python /]# touch /.autorelabel51Testing软件测试网G$S[!BL9L.s^e#S
然后 reboot ,你就在secure的Linux环境下工作了。51Testing软件测试网2K ^F['TQ ?
51Testing软件测试网 b J `#XF:F G
4. SELinux的基本操作
AI+y#Mi)B{$mYM0
 51Testing软件测试网ZVFK(isg
SELinux是个经过安全强化的Linux操作系统,实际上,基本上原来的运用软件没有必要修改就能在它上面运行。真正做了特别修改的RPM包只要50多个。像文件系统EXT3都是经过了扩展。对于一些原有的命令也进行了扩展,另外还增加了一些新的命令,接下来我们就来看看这些命令。
ZQ.ib|"r h){051Testing软件测试网5E4F|&s+J R2D8e
4.1 文件操作
JeQ)YMy`9J0
h-^9iqf3QnY01)ls命令51Testing软件测试网 h)lQ#Sz5O9QE
在命令后加个 -Z 或者加 –context51Testing软件测试网,Z;d j qF?2u`2H"lo
[root@python azureus]# ls -Z51Testing软件测试网LK0k8PR
-rwxr-xr-x fu fu user_u:object_r:user_home_t azureus
.t+D&A0rp4o"F2X*U0-rw-r--r-- fu fu user_u:object_r:user_home_t Azureus2.jar51Testing软件测试网 X"f'E l A#O-r
-rw-r--r-- fu fu user_u:object_r:user_home_t Azureus.png

y n B1eB051Testing软件测试网AH6Pu[2K0q&B

2)chcon
*]&T Wsh5rF2TB1L0更改文件的标签51Testing软件测试网0R,n4K]A lR
[root@python tmp]# ls --context test.txt
"VR8}+Z{/UB0A;{ P0-rw-r--r-- root root root:object_r:staff_tmp_t test.txt51Testing软件测试网)N2L6H@gQ

51Testing软件测试网 z3Q _'sb ]H6z"F

[root@python tmp]# chcon -t etc_t test.txt51Testing软件测试网Y%J(Ox"v^5Nv4O!v
[root@python tmp]# ls -lZ test.txt
:iSowUP UW n0-rw-r--r-- root root root:object_r:etc_t test.txt

't6yb.A&{nrh051Testing软件测试网)e5a KP&Yz"M`

3)restorecon51Testing软件测试网ZuJIN4y
当这个文件在策略里有定义是,可以恢复原来的 文件标签。

.SP8\2v7aE:{U051Testing软件测试网u#r%yECG*r

4)setfiles
IXIM;~2} `j G0跟chcon一样可以更改一部分文件的标签,不需要对整个文件系统重新设定标签。

fUh4D\hk1|;^G0

S O0Z8`$Nv5r]05)fixfiles51Testing软件测试网Mv!]K*_7S0x
一般是对整个文件系统的, 后面一般跟 relabel,对整个系统 relabel后,一般我们都重新启动。如果,在根目录下有.autorelabel空文件的话,每次重新启动时都调用 fixfiles relabel51Testing软件测试网 Jv$wEWE?

51Testing软件测试网k8g O:S5?vuh1f

6)star51Testing软件测试网y(MVmLH\
就是tar在SELinux下的互换命令,能把文件的标签也一起备份起来。

I4f-_ g.^Ir,a0

3_6?/r!?P.^*cp i?07)cp51Testing软件测试网E$~3CGzA|V
可以跟 -Z, --context=CONTEXT 在拷贝的时候指定目的地文件的security context51Testing软件测试网{S/}3kI3z|4h3F'cI

ij_(ksV:_08)find
&A#F,c-]5x0可以跟 –context 查特定的type的文件。51Testing软件测试网#MI5C ]5sB
例子:51Testing软件测试网h,E'K4H A)jJW R
find /home/fu/ --context fu:fu_r:amule_t -exec ls -Z {} \:

e {8[H:^h051Testing软件测试网o3PBD'K R'p

9)run_init51Testing软件测试网#|/|eSl5p_NT
在sysadm_t里手动启动一些如Apache之类的程序,也可以让它正常进行,domain迁移。51Testing软件测试网n,`9r[S

AFV.[ U6h ^04.2进程domain的确认
M+dG6N3~4PK0
4v*uu[J0程序现在在那个domain里运行,我们可以在ps 命令后加 -Z
#@7GWE ]!H0[root@python /]# ps -eZ51Testing软件测试网6U$H-}A a {4`1g0C E
LABEL PID TTY TIME CMD
z+J }0[ |y0system_u:system_r:init_t 1 ? 00:00:00 init51Testing软件测试网'@^Yk}oV
system_u:system_r:kernel_t 2 ? 00:00:00 ksoftirqd/0
+i%xcV!rf9Br0system_u:system_r:kernel_t 3 ? 00:00:00 watchdog/0
%R!|N:J(S7~s051Testing软件测试网mb$v/U h
4.3ROLE的确认和变更51Testing软件测试网QXhU-d(U
51Testing软件测试网 y5MN~+G9ZOs
命令id能用来确认自己的 security context51Testing软件测试网0Yr v'u1]
[root@python ~]# id51Testing软件测试网S)N|/v ak+Hy
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=root:staff_r:staff_t
WtuP6tn0这里,虽然是ROOT用户,但也只是在一般的ROLE和staff_t里运行,如果在enforcing模式下,这时的ROOT对于系统管理工作来说,是什么也干不了。51Testing软件测试网1u a ei'L ~8n:|[j,o,nr

51Testing软件测试网CS2g)`f:~&W c

[root@python ~]# newrole -r sysadm_r
vjS6R$?x h4`k0Authenticating root.51Testing软件测试网C/fh2HD E
口令:
$IX*G1R&~u&o1p[0[root@python ~]# id51Testing软件测试网_h@6t0ZStc3~
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel) context=root:sysadm_r:sysadm_t
V*f%~J,h-LiS8Y*B051Testing软件测试网_q*An9T@
4.4模式切换51Testing软件测试网$Q^@;j%|
51Testing软件测试网;R3x(Nf?VT@ Vq{
1)getenforce51Testing软件测试网+N"bhlN,|Yz}
得到当前的SELINUX值
+pi-A,m hi0[root@python bin]# getenforce51Testing软件测试网 |.m Zk/d/GK0}TLL
Permissive
ZR!N'k p;XE R051Testing软件测试网mLMph"^
2)setenforce
$SpwhA)^.wAF0更改当前的SELINUX值 ,后面可以跟 enforcing,permissive 或者 1, 0。51Testing软件测试网K&p%a2CR{ @
[root@python bin]# setenforce permissive

*_4my2wt051Testing软件测试网N[+] @[q

3)sestatus
/N#ooP0| m0显示当前的 SELinux的信息51Testing软件测试网9M'ys](qD
[root@python bin]# sestatus -v51Testing软件测试网Tf-[ ?1Vj
SELinux status: enabled
I @)a!ZOC8R0SELinuxfs mount: /selinux51Testing软件测试网w(hN}bv$s
Current mode: permissive
s v.|,q1zv0Mode from config file: permissive51Testing软件测试网~w8?#^8V:x.@d
Policy version: 2051Testing软件测试网@8D i+S:V8i
Policy from config file: refpolicy51Testing软件测试网6iq};]BzM;s1e2[

51Testing软件测试网h\8y IRfJT

Process contexts:51Testing软件测试网M0K%L%R)s9x
Current context: user_u:user_r:user_t51Testing软件测试网(U2UC/Y t"A _2F7QZ
Init context: system_u:system_r:init_t51Testing软件测试网6f%?E{6WD D5g O
/sbin/mingetty system_u:system_r:getty_t51Testing软件测试网4\1\5d%w ~?|*I8J
/usr/sbin/sshd system_u:system_r:sshd_t51Testing软件测试网8A~WW,M2U r'g

yp1EDX3N j2k0File contexts:
E#Z"|9G W@:c/n k/`0Controlling term: user_u:object_r:user_devpts_t51Testing软件测试网m|YUEm
/etc/passwd system_u:object_r:etc_t51Testing软件测试网w__ h:fk%c
/etc/shadow system_u:object_r:shadow_t
S2tx6w,_'_x0/bin/bash system_u:object_r:shell_exec_t51Testing软件测试网gjN ]y']5t
/bin/login system_u:object_r:login_exec_t51Testing软件测试网,[BP3W%BE
/bin/sh system_u:object_r:bin_t -> system_u:object_r:shell_exec_t51Testing软件测试网~tF8ajm y
/sbin/agetty system_u:object_r:getty_exec_t
9oW3Q;?7Ca6w0/sbin/init system_u:object_r:init_exec_t
3[ Uy5v/b%J!C{pI-@0/sbin/mingetty system_u:object_r:getty_exec_t51Testing软件测试网7v&Nxt0KW ZF#V
51Testing软件测试网b [7~(r uE
4.5其他重要命令51Testing软件测试网/N2\ a[[ C [^,h/z

6ZRZ2c[ [(}2w-PO9_]01)Audit2allow
:s&A1HSg1WK6l}0很重要的一个以python写的命令,主要用来处理日志,把日志中的违反策略的动作的记录,转换成 access vector,对开发安全策略非常有用。在refpolicy里,它的功能比以前有了很大的扩展。
ZMvnL'A3}({0[root@python log]# cat dmesg | audit2allow -m local > local.te

tdLz$QM5e a0

/hzgD/mB6yu3a02)checkmodule -m -o local.mod local.te
-l__0f7H0编译模块
+}NZo y:P*Q0[root@python log]# checkmodule -m -o local.mod local.te51Testing软件测试网.N:C~h1w(q!x
checkmodule: loading policy configuration from local.te
TZF-j(M"Rql4[0checkmodule: policy configuration loaded51Testing软件测试网/~9]{8q]Y-~i dQ
checkmodule: writing binary representation (version 5) to local.mod51Testing软件测试网,f-z{gd"~1^0Y

51Testing软件测试网@ti v He~.[R

3)semodule_package
wS{7[.v$S3v0创建新的模块51Testing软件测试网nLy5w4?t
[root@python log]# semodule_package -o local.pp -m local.mod

2Y's6G wXL051Testing软件测试网e?0fnnl0S&m$q{

4)semodule51Testing软件测试网]&r&sUt4U-f-qA
可以显示,加载,删除 模块51Testing软件测试网 ~.hUuF6t3W,t;v
加载的例子:
g `RAU0[root@python log]# semodule -i local.pp51Testing软件测试网{mn-_Mz

51Testing软件测试网*~/x!V(H)E`

5)semanage
nuFi,m,sV"N.v0这是一个功能强大的策略管理工具,有了它即使没有策略的源代码,也是可以管理安全策略的。因为我主要是介绍用源代码来修改策略的,详细用法大家可以参考它的man页。
vs]_n A L0_051Testing软件测试网(c ~m]0aR6I
5. 定制策略
/J.L8W a$v/B!A0
51Testing软件测试网:Y#X$Vn W:i
FC4,RHEL4等都是采用策略1.X版本的,并且是提供策略源代码的RPM包。从FC5开始策略的版本从1.X 升级到2.X。2.X版本的refpolicy(reference policy)最大的一个变化就是引进模块(module)这个概念, 同一套策略源代码就可以支持Multi-LevelSecurity(MLS)和non-MLS。
xhd#v!U+mq0http://serefpolicy.sf.net/
C+zKT V%Gc0标准的FC5里不提供源代码的RPM包。FC5提供的audit2allow,semanage,semodule也是可以开发一些简单的策略模块的。但是,要是作策略模块的开发,增加一个ROLE之类的,最好还是下载refpolicy的源代码。51Testing软件测试网/O6O(MG}|v

+D;_ Ev~q05.1策略源文件的安装
ZT |!p.Wd@"a0
wvtl |Y;G0从CVS服务器下载的源代码是最新的,如果遇到象make的时候出错,那么最好就是把你系统里和SELinux有关的那些包更新到最新的状态。
W&C/Z8td:s4f%O8Y0从source Forge的CVS服务器下载源代码
6\RM:O'irU9H1y0[root@python src]# cd /usr/local/src51Testing软件测试网 Gcs2EG4E1kx5|
[root@python src]# cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/serefpolicy login
Pc%rA/Iro0[root@python src]# cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/serefpolicy co -P refpolicy51Testing软件测试网:J"Y)` Bl+Thb'K._1v

51Testing软件测试网agVWI?

[root@python src]# cd refpolicy/51Testing软件测试网P0k^FJ)@\

51Testing软件测试网2t6Jg:|HZ W:daK

[root@python src]# make install-src51Testing软件测试网3d3Ib!H wk

51Testing软件测试网%S'Z'E3hO$P V

每一个模块有3个文件构成,比如上图的sudo.fc 就是和 命令sudo相关的文件的定义标签,(file context rabel),sudo.te是Type Enforcement定义,包括TE访问规则等,sudo.if是一个外部模块调用这个模块的接口定义。

p:XC2A{ kq;di051Testing软件测试网#zL!Q qC8H

[root@python src]# cd /etc/selinux/refpolicy/src/policy51Testing软件测试网-@KAr$W.k)s
[root@python policy]# cp build.conf build.conf.org51Testing软件测试网j[f8XSX
[root@python policy]# vi build.conf51Testing软件测试网8M,f%y gQ?G R
[root@python policy]# diff build.conf build.conf.org
3MXu'C"Mj032c32
KM}(h(I e4p0< DISTRO = redhat51Testing软件测试网V nj:^-T2y/WLh:k7M
---
SZGYoI^J0> #DISTRO = redhat
t)S$Wq9I E%b|043c4351Testing软件测试网l b%Y%v!QE"]
< MONOLITHIC=n51Testing软件测试网&HZm8\}#oJC
---51Testing软件测试网"L G5dby;C5clir6[
> MONOLITHIC=y
c'F*F S:F"~:|2d3a"d0[root@python src]# make conf51Testing软件测试网h~ ucRF%^ [
[root@python src]# make

)cC-f ?4S2^051Testing软件测试网g-Oh?!n+u%e,Ct f3F'w

这样,在/etc/selinux/refpolicy/src/policy下生成很多的以pp为后缀的文件,这些就是SELinux模块。接下来我们修改/etc/sysconfig/selinux,设成SELINUXTYPE=refpolicy,然后reboot.

C^9HLT0] L0

4?X-H[s0启动后,确认策略的适用情况, 现在的版本是20。51Testing软件测试网0q9NL(t(}jo_H
[fu@python ~]$ /usr/sbin/sestatus
T(MAm8w0SELinux status: enabled
"] [C._.Q1Z k w.NS0SELinuxfs mount: /selinux
u4`0iWscv,\ T7Y0Current mode: permissive
u\.cB8Z9a$iPcP;i0Mode from config file: permissive51Testing软件测试网]?R@,NVSn8j
Policy version: 20
~M6?+|L0L2Pj0Policy from config file: refpolicy51Testing软件测试网H-H4X ^3c7C3l5w@ p
51Testing软件测试网+BJWZM^4H9a
5.2给程序定制domain
_a6L;^6_S]7e j051Testing软件测试网1JY)XZ {:O Gs
开发程序策略的一般步骤
^ b9?2n(iUs01.给文件,端口之类的object赋予type 标签
g$_d6u.b9PP V:Fe02.设置 Type Enforcement (Domain 迁移,访问许可)
1} l+j*Yp{ AA03.策略加载
Z;v!glwm7oI04.permissive模式下运行程序51Testing软件测试网eZU&p&}L
5.确认日志,用audit2allow生成访问许可51Testing软件测试网0t:Hk$_;i/qd/j
6.重复1,2,3,4,5动作,直到没有违反的日志出现
)\8^/@VeH^07.切换到enforcing模式,正式运用51Testing软件测试网 yBz-L/Y E
51Testing软件测试网T3M c SyX3w-y_:W
因为我们所常用的那些服务的策略模块都已经有了,修改的时候也比较简单。在这里我就举个一般的例子。用点对点下载的朋友估计都跟我一样,在Linux上用 azureus,Amule来下载东西吧。
s'X3zY-vzF {0接下来以azureus为例,介召如何在FC5里追加一个azureus.pp模块。我们在追加azureus.pp模块之前,azureus是在系统给用户设好的user_t domain里运行。51Testing软件测试网e.KW3P0J8|1o
[fu@python azureus]$ ps -efZ|grep azureus
t|Z1B$Ul0user_u:user_r:user_t fu 1751 1732 0 22:28 pts/3 00:00:00 /bin/bash ./azureus
$XU-W*EiQ051Testing软件测试网@V"I+erT
接下来我们在追加3个文件。
v\:?;p2\-Ag01)azureus.fc
Ra0_"l?0在这里我只定义一个文件,实际要是真的用的,还要定义azureus_t能写的目录等。
}0Da f+CRa0\^Au0[root@python apps]# more azureus.fc51Testing软件测试网;JsEs%h![
/home/fu/azureus -- gen_context(user_u:object_r:azureus_exec_t,s0)

$w)V h:sij&@0

Qw5K@7q3_)Gj02)azureus.te
y#a^EP)y0[root@python apps]# more azureus.te
Wkta6a@e0policy_module(azureus,1.0.0)
9],@ ZYR1u0type azureus_t;
oWN4o)Qo F7Fy0type azureus_exec_t;
G @"BM(V0} EI0role user_r types azureus_t;51Testing软件测试网YUC A3r#bf
require {51Testing软件测试网i%U&W2v4Rx&{
type user_t;51Testing软件测试网.`+G8z3j0Bu%T
};51Testing软件测试网@&V}CLv!@Ea7J
domain_type(azureus_t)51Testing软件测试网i} a"a&J$ZXY.m2^
domain_entry_file(azureus_t, azureus_exec_t)51Testing软件测试网qvs_;X
domain_auto_trans(user_t, azureus_exec_t, azureus_t)

2?9H4O1o_ x.y-P)b(g051Testing软件测试网E}"mHE9x XwY


!C`_qC%w03)azureus.if
Q+tz}*|.@[L6e l0实际上没有别的模块要调用azureus,所以这个文件就是空文件也不要紧。51Testing软件测试网(BA;xO1N i_$p
[root@python apps]# more azureus.if
I!M!A-IOBD0# policy/modules/apps/azureus.if51Testing软件测试网1f8W2O ^8V$N?$P
## <summary>Myapp example policy</summary>51Testing软件测试网&Z0O d'}5Y
## <summary>
y9{.Hap:r/E)A0## Execute a domain transition to run azureus.51Testing软件测试网$^+A)u7ls?-H7H
## </summary>
T ^O i|RA{d0## <param name="domain">
F ]1ZY4P8gg0## Domain allowed to transition.51Testing软件测试网*b#aV[OU#`o
## </param>
Xu-Y#_b.pXQ1bh0interface(`azureus_domtrans',`51Testing软件测试网,{aq2dg#FLk @Xt
gen_requires(`51Testing软件测试网-\+_4V\~9k6r
type azureus_t, azureus_exec_t;51Testing软件测试网 B:H V6hIH3IR ` Z
')
{E%c&MMm0domain_auto_trans($1,azureus_exec_t,azureus_t)51Testing软件测试网i+{B4Z1R)Gj
allow $1 azureus_t:fd use;51Testing软件测试网M#nRRJ
allow azureus_t $1:fd use;51Testing软件测试网?,{/T5Fu1L&d\
allow $1 azureus_t:fifo_file rw_file_perms;
)~m)O1Uwe d bA0allow $1 azureus_t:process sigchld;51Testing软件测试网cQ QgVsF/J
')51Testing软件测试网O P u k| P,E*}
在/etc/selinux/refpolicy/src/policy/policy/module.conf 里加入下面一行
PM3U7g,UV NUb0[root@python policy]# tail -1 modules.conf
#q4BxM\pu|,o!e0azureus = module

P2iN;u8f1pJ IA;`K0

1A&H;i"_ a0确认/etc/selinux/refpolicy/src/policy里MONOLITHIC=n51Testing软件测试网 a5EOKc`]({(B
最后make , make load51Testing软件测试网z:apT R|j
[root@python policy]# pwd51Testing软件测试网0j0|7Vj.[ _!NB
/etc/selinux/refpolicy/src/policy
zUUj[\ g0[root@python policy]# make;make load
N&n j mdZR051Testing软件测试网 ]} G)tM,a.m`
正常终了后,我们可以用 semodule命令来确认 azureus.pp下载下去了没有。51Testing软件测试网 SVT"En w4k
[root@python policy]# semodule -l |grep azureus
[X/UH4c0azureus 1.0.0
X7Af S)l vp0
K%B3x*mIyl0看样子是没有问题。好了我们再看看 /home/fu/azureus/azureus的security context,我们刚才在azureus.fc里是期望它是 user_u:object_r:azureus_exec_t ,可是它这个时候还是继承了默认的 user_u:object_r:user_home_t ,如果不是我们期望的文件标签的话,domain是无法从user_t迁移到azureus_t的,因为relabel的话,会对整个文件系统进行重新设标签,很花时间,所以我们用在上面介绍过文件标签更改的命令chcon命令来改标签。
/d0z??2mb2c0[root@python azureus]# chcon -t azureus_exec_t azureus
!C3U6u;C\}`0
*Ko:];`&|Ao0再看看这次的新标签,果然如我们期望的,变成azureus_exec_t了。
A c U9I/H[U7S0[root@python policy]# ls -lZ /home/fu/azureus/51Testing软件测试网1gf9M3a&Is.l0~
-rwxr-xr-x fu fu user_u:object_r:azureus_exec_t azureus
2t&O7zHy x0-rw-r--r-- fu fu user_u:object_r:user_home_t Azureus2.jar
mg%Gi.L5}P Q j0
7Y(dr Ef xnoA-F0接下来退出ROOT用户,以用户fu登录,运行azureus命令。51Testing软件测试网~xU#IQ"cKrE?
[root@python azureus]# ps -efZ|grep azureus51Testing软件测试网AQ]4]q!f
user_u:user_r:azureus_t fu 8703 8647 0 23:23 pts/1 00:00:00 /bin/bash ./azureus51Testing软件测试网 u5a.F }2n
user_u:user_r:azureus_t fu 8717 8703 4 23:24 pts/1 00:01:29 java -Djava.ext.dirs=/usr/lib/jvm/java-1.4.2-gcj-1.4.2.0/jre/lib/ext -Xms16m -Xmx128m -cp /home/fu/azureus/Azureus2.jar:/home/fu/azureus/swt.jar -Djava.library.path=/home/fu/azureus -Dazureus.install.path=/home/fu/azureus org.gudy.azureus2.ui.swt.Main51Testing软件测试网y/Y.^0l/`
user_u:user_r:user_t root 9347 1956 0 23:59 pts/2 00:00:00 grep azureus

4i0k?#K9W$S051Testing软件测试网 y*IXib/C

高兴吧! 成功了。
5j$T`T,kO0在这里只是演示如何让domain迁移,至于azureus的严格的access vector的设置都忽略了。51Testing软件测试网}-Q S!['F$d

/b+t"\\h3`sD xf05.3 给自己增加个专用的ROLE51Testing软件测试网? ta,G1g
在这里我们要增加一个叫madia的ROLE,在追加时要对一些文件进行修改。51Testing软件测试网4I[p.gbf6C
51Testing软件测试网(\[ahOKP3M
5.3.1 /etc/selinux/refpolicy/src/policy/policy/modules/kernel下的文件修改51Testing软件测试网5m&O:@ z,qm~
1) kernel.te
6t,a.D-J6R+F0[root@python kernel]# vi kernel.te
j R9P%x"~8Lv]:N0在role user_r 的下面加上一行51Testing软件测试网,b|%r5F }8gizh
role madia_r;51Testing软件测试网;}t6~ ]7a%S` u't
2) domain.te
r5e X G1v#UT~z0[root@python kernel]# vi domain.te
bw/y'KRO^Dnw0在 role user_r types domain; 的下面加上一行
V1Z)v E7@A!z8q;gj0role madia_r type domain;
;qP:oj@r;ga6F+U0
.~4?swI05.3.2 /etc/selinux/refpolicy/src/policy/policy/modules/system下的文件修改
J,ts#c;Qs0[root@python system]# vi userdomain.te51Testing软件测试网mRh.QG Y @
在第5行追加madia_r,如下所示:
0q ^5K*V,C!h0role sysadm_r, staff_r, user_r,madia_r;
5zj&Z&kP2Ak0在unpriv_user_template(user)下面加上下面的一行。
,T)T2_%\{0unpriv_user_template(madia)
*]5}+Yp a S,w051Testing软件测试网I$pJ D0u _\B
5.3.3 /etc/selinux/refpolicy/src/policy/policy下的文件修改
C_@KV*E2n%B01)user51Testing软件测试网'a~2R$g o-U8z
users和策略1.X里的users差不多。定义用户能利用的ROLE。51Testing软件测试网 Ol`%{2M|r
[root@python policy]# vi users51Testing软件测试网:Ee m],a
gen_user(madia, madia, madia_r, s0, s0)
2ku)t Fu3[-^8c!FG02)rolemap
`-wBk8};` C0[root@python policy]# vi rolemap51Testing软件测试网E)_7U_{%B(Sx~
在user_r user user_t下面加上一行
,P q\Z)jM0M4z5a&r0madia_r madia madia_t51Testing软件测试网xH-U Jn,HO
51Testing软件测试网'rHBH"`@
5.3.4 重新make 策略
2Gy4}J1d'ad"B0[root@python policy]# make load
*Z8]|$^HJ|0
%v0I9b5vheh*j05.3.5 /etc/selinux/refpolicy/seusers 文件的修改51Testing软件测试网}NE(_0mP r8V
Seusers是系统一般用户和SELinux的用户映射。51Testing软件测试网`-eGE$K
[root@python refpolicy]# vi seusers
C/K\,mC\D5?0madia:madia
r@-Is qT0
*N`,r'w(j05.3.6 /etc/selinux/refpolicy/contexts下的文件修改51Testing软件测试网\tq/T!_?)_-U U
1)default_type51Testing软件测试网*s^tV-Kk
决定用户登录时的默认ROLE。
X,]:Xl1Zdw0[root@python refpolicy]# vi contexts/default_type
Pumd_-S#t0madia_r:madia_t
x'{)@)mG02)default_contexts51Testing软件测试网!dV1`8x;m2Q
决定用户登录时的默认security context51Testing软件测试网K4E5hh/vw+O.Y
[root@python refpolicy]# vi contexts/default_contexts
I:mzvtF0system_r:local_login_t madia_r:madia_t staff_r:staff_t user_r:user_t sysadm_r:sysadm_t
$\/ER d+] Y'j:h051Testing软件测试网5{r mEvl
5.3.7 以madia用户重新登录
iLal^pi-b;|0最后以用户madia登录,查看是不是 进入madia_t了。
L3r5R m]]2e7P dY0[madia@python ~]$ id
E W-d8c.V5{1K0a0uid=501(madia) gid=501(madia) groups=501(madia) context=madia:madia_r:madia_t
cw-Ht6mR sc0以上我们可以看出,madia用户确实是进入了madia_t 运行了。
iRo/_K)X0我们在以上的操作中,实际上还有修改遗漏的地方,每当重新make的时候,seusers都会回到原来的设定,有兴趣的朋友可以自己找出哪里还需要修改。
7R&D D\ h7X)n051Testing软件测试网*@i9a U;dI8}
6.最后
(X\ KzR5M9By|~0我们现在主要还是targeted策略,因为我们的服务器,基本上也就跑apache,postgresql,tomcat,bind,postfix这几个服务。Targeted能够保护它。我们的目标是将一些影响比较小的,服务比较单一的服务器移植到能运行strict策略的服务器上。当然,即使我们用SELinux,对于系统的安全也不能掉以轻心,认为有了SELinux就100%安全。
A5^m4n/u5ZE!N0比如targeted里有unconfined_t,任何在这个domain里运行的都是不被保护的。还有,系统管理员对TE的设置错误造成不能很好的保护,还内核的漏洞,Dos攻击等,SELinux也是无能为力的。
'_,hX"z `L0除了SELinux外,还有LIDS ,TOMOYO LINUX,AppArmor等安全操作系统。大家对LIDS和AppArmor有可能比较熟悉,TOMOYO是 日本NTT数据公司开发的。也许有朋友在选择的时候不知道该用那个好。51Testing软件测试网I p;C9D8ST}|
安全级别高<----------------------------------->易用性高
h*@o6e-u;H-t$b0SELINUX >> TOMOYO >> LIDS >> AppArmor

)WQ*D-Jt H)Y%L0

TAG: Linux SElinux chcon setenforce sestatus getenforce 操作系统

引用 删除 lassummer   /   2009-12-01 16:27:42
-5
wangniandong的个人空间 引用 删除 wangniandong   /   2009-07-07 13:26:35
1
 

评分:0

我来说两句

Open Toolbar