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

【转载】SELinux 入门

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

51Testing软件测试网L u R apeO.D` ^ U

1.背景
-mi8z3n&s\S4`)z0
51Testing软件测试网TIfZ H D)S
SELinux是「Security-Enhanced Linux」的简称,是美国国家安全局「NSA=The National Security Agency」 和SCC(Secure Computing Corporation)开发的 Linux的一个扩张强制访问控制安全模块。原先是在Fluke上开发的,2000年以 GNU GPL 发布。51Testing软件测试网!C3_5X2]^Y

51Testing软件测试网0Po*c+h5z7jv1y

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

i0n/PAOc#W0

r ~|/nuOkO02.我们需要安全操作系统的理由
&o2?;F'A^ bb'o0
#L#pT ~(k }0现在不论是政府还是民间企业,大家对信息安全问题是越来越关心了,因为企业的业务平台的服务器上存储着大量的商务机密,个人资料,个人资料它直接关系到个人的隐私问题。特别是我们政府的网站,作为信息公开的平台,它的安全就更显得重要了。这些连到互联网的服务器,不可避免的要受到来自世界各地的各种威胁。最坏的时候我们的服务器被入侵,主页文件被替换,机密文件被盗走。除了来自外部的威胁外,内部人员的不法访问,攻击也是不可忽视的。对于这些攻击或者说是威胁,当然有很多的办法,有防火墙,入侵检测系统,打补丁等等。因为Linux也和其他的商用UNIX一样,不断有各类的安全漏洞被发现。我们对付这些漏洞不得不花很多的人力来堵住它。在这些手段之中,提高OS系统自身的牢固性就显得非常的重要。
_)^a*ZJ#j0l]6D0 
WVWi j,u-J-}*E02.1传统的Linux OS的不足之处51Testing软件测试网)v,t~i X

:@ r2h/Fe+]O;`f0虽然Linux 比起 Windows 来说,它的可靠性,稳定定要好得多,但是他也是和其他的UNIX 一样,有以下这些不足之处。51Testing软件测试网J6V*X7^g ^6r
1)存在特权用户root
6o6I$dr4l1?0  任何人只要得到root的权限,对于整个系统都可以为所欲为。这一点Windows也一样。51Testing软件测试网Mo9Fsp]o
2)对于文件的访问权的划分不够细
F'SW:E;R K/sl Z0  在linux系统里,对于文件的操作,只有「所有者」,「所有组」,「其他」这3类的划分。51Testing软件测试网xZg|Oy1[
  对于「其他」这一类里的用户再细细的划分的话就没有办法了。
&l%_n Nz@5Bl_03)SUID程序的权限升级
O%s5y;W2`%?3_d%z0R0  如果设置了SUID权限的程序有了漏洞的话,很容易被攻击者所利用。51Testing软件测试网7wF5R y(i.L
4)DAC(Discretionary Access Control)问题
l \S;jY5jkI F&_0  文件目录的所有者可以对文件进行所有的操作,这给系统整体的管理带来不便。

2Y:{b!Po~/O051Testing软件测试网2z-PAn3W?'E5dI

对于以上这些的不足,防火墙,入侵检测系统都是无能为力的。
C2m(|#nu@%z7W#x0在这种背景下,对于访问权限大幅强化的OS SELinux来说,它的魅力的无穷的。51Testing软件测试网 uEdq&b1`'Y
51Testing软件测试网;o(aU{-XvE
2.2 SELinux的优点51Testing软件测试网 {$T,zPS#P}

f ]SA1qjbZ1Y0SELinux系统比起通常的Linux系统来,安全性能要高的多,它通过对于用户,进程权限的最小化,即使受到攻击,进程或者用户权限被夺去,也不会对整个系统造成重大影响。51Testing软件测试网)Wz}*` KF/b)P%Jzs;D3UI

51Testing软件测试网|)\h#gP3w'{h

接下来我来介绍SELinux的一些特点。51Testing软件测试网N+qpD+YF}
特点1:MAC(Mandatory Access Control)―――对访问的控制彻底化
$|"s#lvP:~^9c0对于所有的文件,目录,端口这类的资源的访问,都可以是基于策略设定的,这些策略是由管理员定制的、一般用户是没有权限更改的。51Testing软件测试网2I'U'_Ea#Zy;s

9QbO"h$S7HR"Z#V'Tn0特点2: TE (Type Enforcement)――― 对于进程只付与最小的权限
%| W`%^ jI `x.wN0Te概念在 SELinux里非常的重要。它的特点是对所有的文件都赋予一个叫type的文件类型标签,对于所有的进程也赋予各自的一个叫 domain的 标签。Domain标签能够执行的操作也是由access vector在策略里定好的。
$KZ Z3QW!s pw0我们熟悉的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)。
1sy;z-q8z-B B${)p&D051Testing软件测试网7Tf6@h"kH8A
特点3: domain迁移 ―― 防止权限升级
r"p$[/\4zH{p0在用户环境里运行点对点下载软件azureus,你当前的domain是fu_t, 但是,你考虑到安全问题,你打算让他在azureus_t里运行,你要是在terminal里用命令启动azureus的话,它的进程的domain就会默认继承你实行的shell的fu_t。
Ew$P(n8RP0有了domain迁移的话,我们就可以让azureus在我们指定的azureus_t里运行,在安全上面,这种做法更可取,它不会影响到你的fu_t。51Testing软件测试网a6jpXDf ~&dt
下面是domain迁移指示的例子:51Testing软件测试网k9V5_r6B/M%aD/W
domain_auto_trans(fu_t, azureus_exec_t, azureus_t)51Testing软件测试网S zT't2z)Zq!o
意思就是,当在 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命令来手动启动。
g_*X"keJ8?X)o lC's051Testing软件测试网%skyfKmo b
特点4: RBAC(role base access control) ――――― 对于用户只付与最小的权限
kdT;})AU0对于用户来说,被划分成一些ROLE,即使是ROOT用户,你要是不在sysadm_r里,也还是不能实行sysadm_t管理操作的。因为,那些ROLE可以执行那些domain也是在策略里设定的。ROLE也是可以迁移的,但是也只能安策略规定的迁移。51Testing软件测试网^d icU(h
51Testing软件测试网vs#~&\&R
3. 控制切换51Testing软件测试网o!C6Yx z0G+sI
从fedora core 2开始, 2.6内核的版本都支持selinux.我们看看 Fedora core 5 里的/etc/sysconfig/selinux标准设定吧。
*n4C"Dm2a.Z@0# This file controls the state of SELinux on the system.51Testing软件测试网kUD$gk
# SELINUX= can take one of these three values:51Testing软件测试网'X+r)R-Nq$_ J Y
# enforcing - SELinux security policy is enforced.51Testing软件测试网]c@R4~#sk
# permissive - SELinux prints warnings instead of enforcing.51Testing软件测试网gX2g1IJz:Ol)?
# disabled - SELinux is fully disabled.51Testing软件测试网(x9`VQx S,_p
SELINUX=enforcing51Testing软件测试网${(HXg j3v
#SELINUX=disabled
ocK2MN-]5Ps x0# SELINUXTYPE= type of policy in use. Possible values are:51Testing软件测试网0s*_'WSD @.OU T m
# targeted - Only targeted network daemons are protected.51Testing软件测试网YQVc8]#p
# strict - Full SELinux protection.
Q Q'c,X`0SELINUXTYPE=targeted

bAS,IO0

W"CB4{ ~0SELINUX有「disabled」「permissive」,「enforcing」3种选择。

!u8T1\(Lo4w*|0

e/jSZ%Y/V)Cg0Disabled就不用说了,permissive就是Selinux有效,但是即使你违反了策略的话它让你继续操作,但是把你的违反的内容记录下来。在我们开发策略的时候非常的有用。
P/n*?7GMFq0相当于Debug模式。
6p-hvv+VU0Enforcing就是你违反了策略,你就无法继续操作下去。51Testing软件测试网2^4E`K9a*VP-qZVp

51Testing软件测试网9m6s-} r1JF

SELINUXTYPE呢,现在主要有2大类,一类就是红帽子开发的targeted,它只是对于,主要的网络服务进行保护,比如 apache ,sendmail, bind,postgresql等,不属于那些domain的就都让他们在unconfined_t里,可导入性高,可用性好但是不能对整体进行保护。
$[ @Pb%Xuz)KR0另一类是Strict,是NAS开发的,能对整个系统进行保护,但是设定复杂,我认为虽然它复杂,但是一些基本的会了,还是可以玩得动的。51Testing软件测试网\$te*A*f |

51Testing软件测试网'f n&T4B e9a;Q.a

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

51Testing软件测试网%I ]%QbRr1v

kernel /boot/vmlinuz-2.6.15-1.2054_FC5 ro root=LABEL=/ rhgb quiet selinux=0
#o!?'g0Fk#gC [0上面的变更可以让它无效。

O*hX'e[o%f051Testing软件测试网%j+l;|t r~Qhs+v

[root@python sysconfig]# /usr/sbin/getenforce51Testing软件测试网 q1sw$hY
Enforcing51Testing软件测试网I|m0y/t}
确认有效后重新对文件系统赋予标签:
Q8H4W.z)V9I3kpCN0[root@python sysconfig]# /sbin/fixfiles relabel51Testing软件测试网!|oy6x|D6Es
或者51Testing软件测试网8uw(g?P'a Z$s
[root@python /]# touch /.autorelabel51Testing软件测试网x1]'\[zWJF5B9?
然后 reboot ,你就在secure的Linux环境下工作了。51Testing软件测试网 c s s!Ze`H

2T1g7_8YU-N"R04. SELinux的基本操作
DK _}8o|0
 
5Blu E e WE.L0SELinux是个经过安全强化的Linux操作系统,实际上,基本上原来的运用软件没有必要修改就能在它上面运行。真正做了特别修改的RPM包只要50多个。像文件系统EXT3都是经过了扩展。对于一些原有的命令也进行了扩展,另外还增加了一些新的命令,接下来我们就来看看这些命令。51Testing软件测试网5l(v|)BQ2R

2VCYh#nw04.1 文件操作
,Dz*F ap9H051Testing软件测试网%l$g)QPwE/b"_
1)ls命令51Testing软件测试网2EHJw"l;h-m8G
在命令后加个 -Z 或者加 –context
"QX#B U Q Huf0[root@python azureus]# ls -Z51Testing软件测试网t"l'jHwa*w,y kdl k_
-rwxr-xr-x fu fu user_u:object_r:user_home_t azureus
~I$Y.ooNd}-C};T0-rw-r--r-- fu fu user_u:object_r:user_home_t Azureus2.jar51Testing软件测试网kOQ} kQytn
-rw-r--r-- fu fu user_u:object_r:user_home_t Azureus.png51Testing软件测试网E#m [a1M

51Testing软件测试网*]v{G;g

2)chcon
g%AHg5P&n)C#B0更改文件的标签51Testing软件测试网'fWQ q"EV~"B
[root@python tmp]# ls --context test.txt51Testing软件测试网T8Z2m~7V&J!M
-rw-r--r-- root root root:object_r:staff_tmp_t test.txt

nw'CC FI051Testing软件测试网C2j-s}'Y

[root@python tmp]# chcon -t etc_t test.txt
7xKkZr'L!P.B~0[root@python tmp]# ls -lZ test.txt
lOh7O8j1@0-rw-r--r-- root root root:object_r:etc_t test.txt51Testing软件测试网5Nr,I+w9v,A

WE+S!i0n Gy?03)restorecon
4fR-HQ+])l0当这个文件在策略里有定义是,可以恢复原来的 文件标签。51Testing软件测试网}L Dz"w$IW9S

51Testing软件测试网4Q IW!Lc;fB

4)setfiles51Testing软件测试网+JeK_ @8cX/y;q
跟chcon一样可以更改一部分文件的标签,不需要对整个文件系统重新设定标签。

SE1r!d#O;Y051Testing软件测试网b3T C9^e7S2?e6~+e

5)fixfiles51Testing软件测试网G |2h]i5U3F
一般是对整个文件系统的, 后面一般跟 relabel,对整个系统 relabel后,一般我们都重新启动。如果,在根目录下有.autorelabel空文件的话,每次重新启动时都调用 fixfiles relabel

^?x@ye&Da)p051Testing软件测试网(DGkH%y-s4]W

6)star51Testing软件测试网{+[P"d~}
就是tar在SELinux下的互换命令,能把文件的标签也一起备份起来。

q2Y$zO^8wO0

KD;g6[8H+}f U07)cp
B:WhfY1afl ] E0可以跟 -Z, --context=CONTEXT 在拷贝的时候指定目的地文件的security context51Testing软件测试网@d w*O.m_ f

51Testing软件测试网 Q#D+JJ{o W;z m

8)find51Testing软件测试网,ZG&M`j.I"y;Guw/G
可以跟 –context 查特定的type的文件。
8f+f-S z ?JbT"?0例子:51Testing软件测试网 \W)i G0tk [ `
find /home/fu/ --context fu:fu_r:amule_t -exec ls -Z {} \:

/s {9Yj!\C[Y0h051Testing软件测试网&tuu0d.gP/WOe$Q

9)run_init51Testing软件测试网,Y7c}a$q.xy
在sysadm_t里手动启动一些如Apache之类的程序,也可以让它正常进行,domain迁移。51Testing软件测试网~'L#H7W8c(S+J^
51Testing软件测试网!x/BU h8XY`b
4.2进程domain的确认51Testing软件测试网XE L'[&Po:lI

&s#}!mF$v-c'u0程序现在在那个domain里运行,我们可以在ps 命令后加 -Z
,zx['kd.gsA0[root@python /]# ps -eZ
4d3Z lc]:i0LABEL PID TTY TIME CMD51Testing软件测试网2H.v4jn%wb
system_u:system_r:init_t 1 ? 00:00:00 init51Testing软件测试网 HZn:J3t0[c.p
system_u:system_r:kernel_t 2 ? 00:00:00 ksoftirqd/051Testing软件测试网MhZ9c;U4x,D P
system_u:system_r:kernel_t 3 ? 00:00:00 watchdog/051Testing软件测试网x.LR LO(sH'N_

"j XI$G:ls04.3ROLE的确认和变更51Testing软件测试网,N1QJR?6v~2h

8e ?BB3D}0命令id能用来确认自己的 security context
cp qVsLV}0[root@python ~]# id
R `D"i1A0uid=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
JeF[1o-`2Y9W0这里,虽然是ROOT用户,但也只是在一般的ROLE和staff_t里运行,如果在enforcing模式下,这时的ROOT对于系统管理工作来说,是什么也干不了。

M;?U-|cc(y%}051Testing软件测试网_8o ?i3P.|VB*\o

[root@python ~]# newrole -r sysadm_r
#Z%y x3In-L`7|0Authenticating root.
m9?8gpc/Z.@}*BHq0口令:51Testing软件测试网*}3@vu/EHM
[root@python ~]# id
ZU(Z5I\M _;V1_l0uid=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_t51Testing软件测试网W-f#l,i1r-Qn

.a!{0u3g)?+n*Iz~04.4模式切换
:DO c+Q&Cy:u ?051Testing软件测试网f wZ8q dkneH
1)getenforce
4njN*zVOT0得到当前的SELINUX值
ZZ O LT$W6G!\}0[root@python bin]# getenforce
A-Wf b,\%E2SIe[0Permissive
s$^:|9}4Qp Y0
-S-P0C*CG/~02)setenforce
3f4@Na;kwUX0更改当前的SELINUX值 ,后面可以跟 enforcing,permissive 或者 1, 0。51Testing软件测试网2R^ g'm,r
[root@python bin]# setenforce permissive

U[5K)N#W&Q1L7y o051Testing软件测试网?#S#\TKcj

3)sestatus
}|3T}9Rni?*d L6I0显示当前的 SELinux的信息
M)dey]4\0[root@python bin]# sestatus -v51Testing软件测试网j-r Xi.R?M
SELinux status: enabled51Testing软件测试网:x,McU*x1}
SELinuxfs mount: /selinux
m.s5Dt8Y$r#c0Current mode: permissive
S#[?b)Fs0Mode from config file: permissive
@^Z2Dmd3{EV0Policy version: 20
,prl_ge,r\3dP0Policy from config file: refpolicy51Testing软件测试网"~@FXVHz

51Testing软件测试网Bh%v;}"`|~$J

Process contexts:
;Cvq8j@8Fu _0Current context: user_u:user_r:user_t
DN4{4\ n'`]#ePurO!I/dD0Init context: system_u:system_r:init_t
G8f2c wF+X|Qc_0/sbin/mingetty system_u:system_r:getty_t51Testing软件测试网'Ug$s.XE1?.Su&y#h
/usr/sbin/sshd system_u:system_r:sshd_t51Testing软件测试网3sq6yE _

)oZ%k,q:z0File contexts:51Testing软件测试网#[,x7Z?K Z
Controlling term: user_u:object_r:user_devpts_t
c$_'E_Gm-]0/etc/passwd system_u:object_r:etc_t51Testing软件测试网rt#iv7D x
/etc/shadow system_u:object_r:shadow_t51Testing软件测试网!_2pm%\j&m
/bin/bash system_u:object_r:shell_exec_t51Testing软件测试网epL P Hxg&sd
/bin/login system_u:object_r:login_exec_t51Testing软件测试网t&VHUb`'YdI
/bin/sh system_u:object_r:bin_t -> system_u:object_r:shell_exec_t
};`!M ^9J0/sbin/agetty system_u:object_r:getty_exec_t
Fe J7Q.a5TF A;p9EO0N0/sbin/init system_u:object_r:init_exec_t
C t;V _6U0/sbin/mingetty system_u:object_r:getty_exec_t51Testing软件测试网5R4\UJ(C8Qu)ud:[

-Q,TEr6c Zsh04.5其他重要命令51Testing软件测试网r%~;~8Y7l
51Testing软件测试网fR&S[!AZT,a
1)Audit2allow
FxhR8n5_m7C0很重要的一个以python写的命令,主要用来处理日志,把日志中的违反策略的动作的记录,转换成 access vector,对开发安全策略非常有用。在refpolicy里,它的功能比以前有了很大的扩展。51Testing软件测试网 n#TMj$_1G5`d
[root@python log]# cat dmesg | audit2allow -m local > local.te

g-N UHVF4p0

V dW_`%W6j+{'B02)checkmodule -m -o local.mod local.te
Fm$E#| i[/`0编译模块
,{.u H^|4kZV#y0[root@python log]# checkmodule -m -o local.mod local.te51Testing软件测试网0h+Oxgw+}
checkmodule: loading policy configuration from local.te51Testing软件测试网 X8@Lj6VF
checkmodule: policy configuration loaded
*@n3J*o,? d7]_jA B0checkmodule: writing binary representation (version 5) to local.mod

{[!GbG\)W0

JL/D#M]hz03)semodule_package51Testing软件测试网cv'a'S:s
创建新的模块
e'u uF%M_ t0[root@python log]# semodule_package -o local.pp -m local.mod

A*oCRN l nm051Testing软件测试网/FiEkb5B}

4)semodule51Testing软件测试网q j/B ^u&k'[
可以显示,加载,删除 模块
*b#@\PKM o0加载的例子:51Testing软件测试网~/i1eoo
[root@python log]# semodule -i local.pp51Testing软件测试网+@nZ1k.x {m

51Testing软件测试网C5N8L#}a;wR4~$M

5)semanage
X,^rMp0这是一个功能强大的策略管理工具,有了它即使没有策略的源代码,也是可以管理安全策略的。因为我主要是介绍用源代码来修改策略的,详细用法大家可以参考它的man页。51Testing软件测试网"FwT o[mi I
51Testing软件测试网:^MPH2Mx
5. 定制策略
c)ef'X1gO0

Q b$qV/Tr(@Y?@0FC4,RHEL4等都是采用策略1.X版本的,并且是提供策略源代码的RPM包。从FC5开始策略的版本从1.X 升级到2.X。2.X版本的refpolicy(reference policy)最大的一个变化就是引进模块(module)这个概念, 同一套策略源代码就可以支持Multi-LevelSecurity(MLS)和non-MLS。
"{3Z xF} TA0http://serefpolicy.sf.net/
+n S%gTE4Wq-wG0标准的FC5里不提供源代码的RPM包。FC5提供的audit2allow,semanage,semodule也是可以开发一些简单的策略模块的。但是,要是作策略模块的开发,增加一个ROLE之类的,最好还是下载refpolicy的源代码。51Testing软件测试网r,E e#j5YMA[I"M

6e)k;^y8H05.1策略源文件的安装
[ ?"wVf3~(~8V051Testing软件测试网(n*O)Ae1~b
从CVS服务器下载的源代码是最新的,如果遇到象make的时候出错,那么最好就是把你系统里和SELinux有关的那些包更新到最新的状态。51Testing软件测试网*R~1LiG.]
从source Forge的CVS服务器下载源代码51Testing软件测试网8MX$X|7` P#L#NhF#L
[root@python src]# cd /usr/local/src51Testing软件测试网Ws?w5vuV1~ H_0o;\
[root@python src]# cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/serefpolicy login51Testing软件测试网zWE \sW-m!Id3|
[root@python src]# cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/serefpolicy co -P refpolicy

;\6Q,Vh G @#uZ6Jy%u0

0Yi9G1k:_(W0[root@python src]# cd refpolicy/

BxZ s(xyQ$E a051Testing软件测试网;hH-]G Kf8d

[root@python src]# make install-src

:BLj {$W0

H N2_iB:U#r.[ B0每一个模块有3个文件构成,比如上图的sudo.fc 就是和 命令sudo相关的文件的定义标签,(file context rabel),sudo.te是Type Enforcement定义,包括TE访问规则等,sudo.if是一个外部模块调用这个模块的接口定义。51Testing软件测试网D+B!R#V6I*Hf0F So;E

X?]i*k0[root@python src]# cd /etc/selinux/refpolicy/src/policy
0Z8]"uSjK+{x2a0[root@python policy]# cp build.conf build.conf.org
O-s%d{$a6R p/U E0[root@python policy]# vi build.conf
^;L]c]0[root@python policy]# diff build.conf build.conf.org
1@ w'?/w^Z&x"a DS^032c3251Testing软件测试网6D%|]]Vf9oM@Qm
< DISTRO = redhat51Testing软件测试网H.V+^ k7@z7SR'vl
---
T6PT8v2p%SR(]Ce0> #DISTRO = redhat
QKcYi/D%E!o~"R043c43
V,}Q"ySB_0< MONOLITHIC=n51Testing软件测试网Ae-Y4H%Z+z P"t
---51Testing软件测试网C9D&cWA*x IX5?
> MONOLITHIC=y51Testing软件测试网-D8J,pt.mq'L5P leB
[root@python src]# make conf51Testing软件测试网PUn]_iSg_\
[root@python src]# make51Testing软件测试网+TS3Uat"@IX#b'D

'y,_])^N t2? f0这样,在/etc/selinux/refpolicy/src/policy下生成很多的以pp为后缀的文件,这些就是SELinux模块。接下来我们修改/etc/sysconfig/selinux,设成SELINUXTYPE=refpolicy,然后reboot.51Testing软件测试网u8S n;D%T G0Q

O2Z*WPn0启动后,确认策略的适用情况, 现在的版本是20。51Testing软件测试网#`p'zc3el)V1km
[fu@python ~]$ /usr/sbin/sestatus51Testing软件测试网0HL4[i)hE$f
SELinux status: enabled51Testing软件测试网7psE.K.A }
SELinuxfs mount: /selinux51Testing软件测试网 g-@!Dv U7tYE
Current mode: permissive51Testing软件测试网(B&S@i4G/kz
Mode from config file: permissive51Testing软件测试网-pP'v'P1@y8D f
Policy version: 20
*yI(B1I:^1oD$v0Policy from config file: refpolicy
L8h`%}.i.fh]\o|h-C051Testing软件测试网h$U$o)KF
5.2给程序定制domain51Testing软件测试网Hn8V#oMX
51Testing软件测试网A)T-_0BiO:Cl"@
开发程序策略的一般步骤
-G6[gmM-N01.给文件,端口之类的object赋予type 标签51Testing软件测试网,Z:kjS&v6}
2.设置 Type Enforcement (Domain 迁移,访问许可)
u&eA7~y4o03.策略加载51Testing软件测试网_i z5s7u[g
4.permissive模式下运行程序
$~+`Pq0K5?05.确认日志,用audit2allow生成访问许可51Testing软件测试网ay` L8QeJ_@f9YS/b7A
6.重复1,2,3,4,5动作,直到没有违反的日志出现
~'|g&]"X07.切换到enforcing模式,正式运用
c[$V1IQ!uu7T051Testing软件测试网+G|/]Pj(jn
因为我们所常用的那些服务的策略模块都已经有了,修改的时候也比较简单。在这里我就举个一般的例子。用点对点下载的朋友估计都跟我一样,在Linux上用 azureus,Amule来下载东西吧。51Testing软件测试网WZ1c `%m'oo
接下来以azureus为例,介召如何在FC5里追加一个azureus.pp模块。我们在追加azureus.pp模块之前,azureus是在系统给用户设好的user_t domain里运行。
"bUu2G9YL0[fu@python azureus]$ ps -efZ|grep azureus51Testing软件测试网&Ur.]8z,m7F
user_u:user_r:user_t fu 1751 1732 0 22:28 pts/3 00:00:00 /bin/bash ./azureus51Testing软件测试网*\_-F|2E
51Testing软件测试网c)G#f.U@)T
接下来我们在追加3个文件。
XS(dE(F^01)azureus.fc
/m/`d"r }s1~*v6v~0在这里我只定义一个文件,实际要是真的用的,还要定义azureus_t能写的目录等。51Testing软件测试网[X \_S(o;O_#E w
[root@python apps]# more azureus.fc
5V?M!L"c0/home/fu/azureus -- gen_context(user_u:object_r:azureus_exec_t,s0)51Testing软件测试网(uyL`j8ev E3|d [

Z el-n)D6X:c`5E02)azureus.te
-zB {%E!LZ s0[root@python apps]# more azureus.te51Testing软件测试网"` P*wF'O7R3q
policy_module(azureus,1.0.0)
%O|i okl0type azureus_t;
Ez[x)a0type azureus_exec_t;51Testing软件测试网]DL"?I:mOX
role user_r types azureus_t;
3pz1EU'TfeC'eU"L&U%zY0require {
7VAq6?-_"x-i0type user_t;51Testing软件测试网n/_5h/~+w2D&\k
};51Testing软件测试网eOpL7K"hR*K0nJ,r
domain_type(azureus_t)51Testing软件测试网"y*s0hPz c
domain_entry_file(azureus_t, azureus_exec_t)
? R C(~?Wk0domain_auto_trans(user_t, azureus_exec_t, azureus_t)51Testing软件测试网.g$@"{&\j?X4K9Y

51Testing软件测试网5v2g,|4Mk8x7O

51Testing软件测试网U`4r(XL.k o
3)azureus.if
*g5t [Z C2\0实际上没有别的模块要调用azureus,所以这个文件就是空文件也不要紧。51Testing软件测试网m7]}!T&a| W8]l2[
[root@python apps]# more azureus.if51Testing软件测试网 e"f7K'Ol3vVGA
# policy/modules/apps/azureus.if51Testing软件测试网2}%J^0j6Q
## <summary>Myapp example policy</summary>51Testing软件测试网Y$l(X o4Hpwq
## <summary>51Testing软件测试网(cq.\Vg3Q$B
## Execute a domain transition to run azureus.51Testing软件测试网 A*rD@MuS7Cg
## </summary>
I4wN+uz8[0## <param name="domain">51Testing软件测试网3tH](s{;cw
## Domain allowed to transition.51Testing软件测试网] O$^&Br:j @*H
## </param>51Testing软件测试网!x VwIg5pV x2E
interface(`azureus_domtrans',`51Testing软件测试网B%X2R)dTr$YU
gen_requires(`51Testing软件测试网.C.J`o M%O3S
type azureus_t, azureus_exec_t;
W/sQOO0')
s l4Q^4zs%P0domain_auto_trans($1,azureus_exec_t,azureus_t)
D$I8sM1cb6A.i%`0allow $1 azureus_t:fd use;
G0]0Y|@ n?n O0allow azureus_t $1:fd use;51Testing软件测试网.MBz)^;x!Sx
allow $1 azureus_t:fifo_file rw_file_perms;
3{3} vL3jI a0allow $1 azureus_t:process sigchld;
0LX(w^4U,m lLv#g%`0')
)c&PIdM5[:^([@8L8W0在/etc/selinux/refpolicy/src/policy/policy/module.conf 里加入下面一行
[-eC#y5MW*ZP z3O7W0[root@python policy]# tail -1 modules.conf51Testing软件测试网&^ X F k m @8i7}!{
azureus = module

n [gaH:pA+t)X m_051Testing软件测试网-\4p{0Pna pR

确认/etc/selinux/refpolicy/src/policy里MONOLITHIC=n51Testing软件测试网 ML]9dC$q
最后make , make load51Testing软件测试网0R.S-MFk:y,u"^
[root@python policy]# pwd51Testing软件测试网Oqro9h_u(R#K/{DgF
/etc/selinux/refpolicy/src/policy
jo E8? v0[root@python policy]# make;make load
C0|xd9?4^ ScD6H0
IPQ7j.Q.];I/^ \0正常终了后,我们可以用 semodule命令来确认 azureus.pp下载下去了没有。
-u{3[e1Ge0[root@python policy]# semodule -l |grep azureus51Testing软件测试网{-n J;J:LBWd
azureus 1.0.0
5J-DVL n051Testing软件测试网-p][3v6f8O@:v
看样子是没有问题。好了我们再看看 /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命令来改标签。51Testing软件测试网$s"I(O!ON
[root@python azureus]# chcon -t azureus_exec_t azureus
zd?6qhCYK`051Testing软件测试网#sMRB.T9h+i
再看看这次的新标签,果然如我们期望的,变成azureus_exec_t了。51Testing软件测试网!G u{Zg9qu*s1a
[root@python policy]# ls -lZ /home/fu/azureus/
ql8SR(J"H0-rwxr-xr-x fu fu user_u:object_r:azureus_exec_t azureus51Testing软件测试网u.]@"?+G:|P3L%Z
-rw-r--r-- fu fu user_u:object_r:user_home_t Azureus2.jar
l6}/Z b'U9lB8j0
j;~)cp3u r4^0接下来退出ROOT用户,以用户fu登录,运行azureus命令。
t7oX X{;hyvT0[root@python azureus]# ps -efZ|grep azureus51Testing软件测试网7p omf,m,Y
user_u:user_r:azureus_t fu 8703 8647 0 23:23 pts/1 00:00:00 /bin/bash ./azureus51Testing软件测试网n3Q'BA!t@iB6|
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软件测试网qa5`*cL"\#@|O$A
user_u:user_r:user_t root 9347 1956 0 23:59 pts/2 00:00:00 grep azureus

G:}3fn3]W'~3B"|051Testing软件测试网9nnJ oXY0o&NBy

高兴吧! 成功了。51Testing软件测试网 nn oq ["e
在这里只是演示如何让domain迁移,至于azureus的严格的access vector的设置都忽略了。
H3In:I H |5T*z+J051Testing软件测试网p"A"s IiWgUY
5.3 给自己增加个专用的ROLE
#TLl L^g0在这里我们要增加一个叫madia的ROLE,在追加时要对一些文件进行修改。51Testing软件测试网oY;[a/V2m
51Testing软件测试网t*NG,n.bms'BGd
5.3.1 /etc/selinux/refpolicy/src/policy/policy/modules/kernel下的文件修改51Testing软件测试网q;U0m @D,Iy!M A mqz
1) kernel.te51Testing软件测试网0H6y5V s6sFu']6M
[root@python kernel]# vi kernel.te51Testing软件测试网n,i Gq9U
在role user_r 的下面加上一行51Testing软件测试网5e2hRBB3i1T F
role madia_r;
\6\| ea2y u,^6h02) domain.te
~cmB#}:@ m QR9J0[root@python kernel]# vi domain.te
AZ:{$Dh w)Y]Q0在 role user_r types domain; 的下面加上一行51Testing软件测试网 dqE'x@"[} Zx1J
role madia_r type domain;
:X W&j+^P t-_051Testing软件测试网s-Y Q)m{7q fm
5.3.2 /etc/selinux/refpolicy/src/policy/policy/modules/system下的文件修改51Testing软件测试网4a }*@(Z1O1X-B
[root@python system]# vi userdomain.te
V7oC2D9|0在第5行追加madia_r,如下所示:
!v5ta&])wm0role sysadm_r, staff_r, user_r,madia_r;51Testing软件测试网 h?s ETvx`
在unpriv_user_template(user)下面加上下面的一行。
$m~J1}+AI&xS0unpriv_user_template(madia)
fTr)m4c3r ]]1Aw0
/O jf#j UHe;w ~6N05.3.3 /etc/selinux/refpolicy/src/policy/policy下的文件修改
Yo'A#} ^t$vHWYu01)user
^ ZC ?`FWX`0users和策略1.X里的users差不多。定义用户能利用的ROLE。51Testing软件测试网A4U Sq R;E
[root@python policy]# vi users51Testing软件测试网q#Y0eY2Dw
gen_user(madia, madia, madia_r, s0, s0)
A Xd/pAQ8}!B02)rolemap
&A3O$zM*W4w0[root@python policy]# vi rolemap
\v.@)j'TV0在user_r user user_t下面加上一行51Testing软件测试网 G(bbo)k
madia_r madia madia_t
e$V"S(k&ODy051Testing软件测试网 y(qCF4J#Qm
5.3.4 重新make 策略
l8V`5` f[0[root@python policy]# make load
V$|+ob t2g7A"t0
n1h7r}[,[j05.3.5 /etc/selinux/refpolicy/seusers 文件的修改
(k$Wnt@ C0Seusers是系统一般用户和SELinux的用户映射。51Testing软件测试网C5_5m9Ag:jY1P
[root@python refpolicy]# vi seusers
#V5UVe?9x0madia:madia
c:F!e|6Qe0
?a,N{ ^OS4Q05.3.6 /etc/selinux/refpolicy/contexts下的文件修改51Testing软件测试网:l LUCys-i\
1)default_type
rf8};dg5c1w1lnh0决定用户登录时的默认ROLE。
(BO:Ow;GR r3[4Wcv0[root@python refpolicy]# vi contexts/default_type51Testing软件测试网C~Qo0R,L!C
madia_r:madia_t51Testing软件测试网 AxyW;^
2)default_contexts
@v*tW I0决定用户登录时的默认security context
ipi$C8g|H0[root@python refpolicy]# vi contexts/default_contexts51Testing软件测试网c;v8Ur\R
system_r:local_login_t madia_r:madia_t staff_r:staff_t user_r:user_t sysadm_r:sysadm_t51Testing软件测试网^6LU(] []"_+}

/K"G~A1d3Q05.3.7 以madia用户重新登录
Z c"?8h c8pP"mnJ8]0最后以用户madia登录,查看是不是 进入madia_t了。
r*?2ddP y0[madia@python ~]$ id
+WA8mG N(|0uid=501(madia) gid=501(madia) groups=501(madia) context=madia:madia_r:madia_t51Testing软件测试网m&I}O}M!O
以上我们可以看出,madia用户确实是进入了madia_t 运行了。
!Gm#BJV J5l0我们在以上的操作中,实际上还有修改遗漏的地方,每当重新make的时候,seusers都会回到原来的设定,有兴趣的朋友可以自己找出哪里还需要修改。
4cYz/f ]+d`0
p2]6_:iU ^06.最后
T)T8rF(s*x0我们现在主要还是targeted策略,因为我们的服务器,基本上也就跑apache,postgresql,tomcat,bind,postfix这几个服务。Targeted能够保护它。我们的目标是将一些影响比较小的,服务比较单一的服务器移植到能运行strict策略的服务器上。当然,即使我们用SELinux,对于系统的安全也不能掉以轻心,认为有了SELinux就100%安全。
B2haMI(iL0比如targeted里有unconfined_t,任何在这个domain里运行的都是不被保护的。还有,系统管理员对TE的设置错误造成不能很好的保护,还内核的漏洞,Dos攻击等,SELinux也是无能为力的。51Testing软件测试网 h^"bb&Ss!^
除了SELinux外,还有LIDS ,TOMOYO LINUX,AppArmor等安全操作系统。大家对LIDS和AppArmor有可能比较熟悉,TOMOYO是 日本NTT数据公司开发的。也许有朋友在选择的时候不知道该用那个好。
(g-Gzul@\0安全级别高<----------------------------------->易用性高
AbZJ'`!m0SELINUX >> TOMOYO >> LIDS >> AppArmor51Testing软件测试网w cz6]"a4V/X


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