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

【转载】SELinux 入门

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

51Testing软件测试网?#R.UT.Q}^

1.背景51Testing软件测试网bE QOt.bE-Bf
51Testing软件测试网 uZESW@(~6y Z
SELinux是「Security-Enhanced Linux」的简称,是美国国家安全局「NSA=The National Security Agency」 和SCC(Secure Computing Corporation)开发的 Linux的一个扩张强制访问控制安全模块。原先是在Fluke上开发的,2000年以 GNU GPL 发布。51Testing软件测试网(a Z1]upt

E;`'h iQ'} @p g0现在以Linux作为因特网服务器是越来越普遍的事了。在我这几年作过的项目里,WEB的开发基本都是基于Linux的,这里有给大公司做的,也给政府部门做的,当然更多的是中小企业做的。这其中给政府做的,我们把SELinux作为一个卖点,接受了不少项目。51Testing软件测试网6i{osjK&Nz

51Testing软件测试网 ?T~.C ?g.m

2.我们需要安全操作系统的理由51Testing软件测试网d:N s\z
51Testing软件测试网MJ;V#~2D
现在不论是政府还是民间企业,大家对信息安全问题是越来越关心了,因为企业的业务平台的服务器上存储着大量的商务机密,个人资料,个人资料它直接关系到个人的隐私问题。特别是我们政府的网站,作为信息公开的平台,它的安全就更显得重要了。这些连到互联网的服务器,不可避免的要受到来自世界各地的各种威胁。最坏的时候我们的服务器被入侵,主页文件被替换,机密文件被盗走。除了来自外部的威胁外,内部人员的不法访问,攻击也是不可忽视的。对于这些攻击或者说是威胁,当然有很多的办法,有防火墙,入侵检测系统,打补丁等等。因为Linux也和其他的商用UNIX一样,不断有各类的安全漏洞被发现。我们对付这些漏洞不得不花很多的人力来堵住它。在这些手段之中,提高OS系统自身的牢固性就显得非常的重要。51Testing软件测试网"u1K5x['K0X
 51Testing软件测试网`6K Jl z }
2.1传统的Linux OS的不足之处51Testing软件测试网4P}$l#mD"|Bw
51Testing软件测试网lQ\&MK9tU
虽然Linux 比起 Windows 来说,它的可靠性,稳定定要好得多,但是他也是和其他的UNIX 一样,有以下这些不足之处。
6Q}$f R2t%py&b4Apg01)存在特权用户root
UK,M O~$^s'z-a0  任何人只要得到root的权限,对于整个系统都可以为所欲为。这一点Windows也一样。51Testing软件测试网f#P^qOc\$cK
2)对于文件的访问权的划分不够细
e#^PM8rj.]0  在linux系统里,对于文件的操作,只有「所有者」,「所有组」,「其他」这3类的划分。
9GuMWq C#s0  对于「其他」这一类里的用户再细细的划分的话就没有办法了。51Testing软件测试网C[N8iJ
3)SUID程序的权限升级
r:y#C}0L'z Q0  如果设置了SUID权限的程序有了漏洞的话,很容易被攻击者所利用。
(e,_)UTB^_2Mw'D04)DAC(Discretionary Access Control)问题
m#p#yW{7e^n0  文件目录的所有者可以对文件进行所有的操作,这给系统整体的管理带来不便。

#a bo|^8G*G0

P'SE'A(iK0对于以上这些的不足,防火墙,入侵检测系统都是无能为力的。51Testing软件测试网/PA4a _L
在这种背景下,对于访问权限大幅强化的OS SELinux来说,它的魅力的无穷的。
D{8f)JP)Nc051Testing软件测试网u8f~Dtn(?(QY
2.2 SELinux的优点51Testing软件测试网 r2`K#s*|OKX*~

&Y h/XO!sU)?+AJ0SELinux系统比起通常的Linux系统来,安全性能要高的多,它通过对于用户,进程权限的最小化,即使受到攻击,进程或者用户权限被夺去,也不会对整个系统造成重大影响。51Testing软件测试网KA,v/i#};O;b

51Testing软件测试网BkhY W B5JV'|,N

接下来我来介绍SELinux的一些特点。
Nq#cdP0特点1:MAC(Mandatory Access Control)―――对访问的控制彻底化51Testing软件测试网/N0D;X8RZ
对于所有的文件,目录,端口这类的资源的访问,都可以是基于策略设定的,这些策略是由管理员定制的、一般用户是没有权限更改的。51Testing软件测试网G:dU;Zl$D\-C+j

51Testing软件测试网$P$STW J!]'f

特点2: TE (Type Enforcement)――― 对于进程只付与最小的权限51Testing软件测试网x9q KoiQVS^R
Te概念在 SELinux里非常的重要。它的特点是对所有的文件都赋予一个叫type的文件类型标签,对于所有的进程也赋予各自的一个叫 domain的 标签。Domain标签能够执行的操作也是由access vector在策略里定好的。
&hJ}C.J,U*Q$V0我们熟悉的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)。
_&IqGS y#F(S7p t051Testing软件测试网3vHU"t"g9v4L9h/Tz
特点3: domain迁移 ―― 防止权限升级51Testing软件测试网1r!A SA e2q&J
在用户环境里运行点对点下载软件azureus,你当前的domain是fu_t, 但是,你考虑到安全问题,你打算让他在azureus_t里运行,你要是在terminal里用命令启动azureus的话,它的进程的domain就会默认继承你实行的shell的fu_t。51Testing软件测试网,v6Az(el3^Q g EFrN
有了domain迁移的话,我们就可以让azureus在我们指定的azureus_t里运行,在安全上面,这种做法更可取,它不会影响到你的fu_t。
0{1_c/zNfGI+P0下面是domain迁移指示的例子:51Testing软件测试网iKVN`Q'{OS
domain_auto_trans(fu_t, azureus_exec_t, azureus_t)
N;f't4rT1C$d4Sg0意思就是,当在 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命令来手动启动。
f*m!p~J3_g0
5y1d~_ZtU7{8L.S0特点4: RBAC(role base access control) ――――― 对于用户只付与最小的权限51Testing软件测试网 N+bS7AK)u
对于用户来说,被划分成一些ROLE,即使是ROOT用户,你要是不在sysadm_r里,也还是不能实行sysadm_t管理操作的。因为,那些ROLE可以执行那些domain也是在策略里设定的。ROLE也是可以迁移的,但是也只能安策略规定的迁移。
9?p)E ]?8AU051Testing软件测试网V0t{%o|
3. 控制切换
+F5J0H8k;g0从fedora core 2开始, 2.6内核的版本都支持selinux.我们看看 Fedora core 5 里的/etc/sysconfig/selinux标准设定吧。
&X(u'F0YG"m I+c1e0# This file controls the state of SELinux on the system.51Testing软件测试网tFR;B3si&b
# SELINUX= can take one of these three values:51Testing软件测试网.]s yV9qY
# enforcing - SELinux security policy is enforced.51Testing软件测试网nz"U{GN\
# permissive - SELinux prints warnings instead of enforcing.
j)e1H0X&j0l/Vv6?0# disabled - SELinux is fully disabled.
-?D1Br3M0h0SELINUX=enforcing51Testing软件测试网` P ~%R P8?x
#SELINUX=disabled
]K0M#xCZ0# SELINUXTYPE= type of policy in use. Possible values are:
@-h5oF8gzM^0# targeted - Only targeted network daemons are protected.51Testing软件测试网 h,N~2fg a
# strict - Full SELinux protection.51Testing软件测试网L.]/[e7c F}1g
SELINUXTYPE=targeted

?B5k-O#c H6mk0

?"D Zgw,P@2t0SELINUX有「disabled」「permissive」,「enforcing」3种选择。

_Ie x;HX7s9Fv0

zUb/JX-m-I0Disabled就不用说了,permissive就是Selinux有效,但是即使你违反了策略的话它让你继续操作,但是把你的违反的内容记录下来。在我们开发策略的时候非常的有用。51Testing软件测试网5lU z4W%H1Nw`
相当于Debug模式。51Testing软件测试网dt lx*Z X
Enforcing就是你违反了策略,你就无法继续操作下去。

3j-pyo&Ct1}(ay m0

5q @!~(]Su#}q7Z0SELINUXTYPE呢,现在主要有2大类,一类就是红帽子开发的targeted,它只是对于,主要的网络服务进行保护,比如 apache ,sendmail, bind,postgresql等,不属于那些domain的就都让他们在unconfined_t里,可导入性高,可用性好但是不能对整体进行保护。
4uS/S/}:N.s jq8?$^ @0另一类是Strict,是NAS开发的,能对整个系统进行保护,但是设定复杂,我认为虽然它复杂,但是一些基本的会了,还是可以玩得动的。51Testing软件测试网[m3Ng0i%C9GH

$VTb4N3n5YS0我们除了在/etc/sysconfig/selinux设它有效无效外,在启动的时候,也可以通过传递参数selinux给内核来控制它。(Fedora 5默认是有效)51Testing软件测试网-L [1TF o7M*`"M-x

51Testing软件测试网)Ga9a5]-e2AU{N

kernel /boot/vmlinuz-2.6.15-1.2054_FC5 ro root=LABEL=/ rhgb quiet selinux=051Testing软件测试网S7N,y6]N~f
上面的变更可以让它无效。

(GR H'ek}051Testing软件测试网'C9U h/~'y2F!w

[root@python sysconfig]# /usr/sbin/getenforce
Cwr8Qmtx_*y0Enforcing51Testing软件测试网4G~5E,lB
确认有效后重新对文件系统赋予标签:
6h*kz+i y@J0[root@python sysconfig]# /sbin/fixfiles relabel
ov;w#w}U-d&g0或者
o q\(x5MGj0[root@python /]# touch /.autorelabel
+l PB$e,Q;G0然后 reboot ,你就在secure的Linux环境下工作了。51Testing软件测试网1zE[1gq

5aO*TE.Q I+K1K`!X04. SELinux的基本操作
J\$w N8Au0H0
 51Testing软件测试网2v#Hk h$b2{xlC
SELinux是个经过安全强化的Linux操作系统,实际上,基本上原来的运用软件没有必要修改就能在它上面运行。真正做了特别修改的RPM包只要50多个。像文件系统EXT3都是经过了扩展。对于一些原有的命令也进行了扩展,另外还增加了一些新的命令,接下来我们就来看看这些命令。
ZJc*MJ2B T K$dbu%@051Testing软件测试网 e}2L"Z7jW%w
4.1 文件操作
8I1x]1Xx#\y-y#p0
h'Im/k-kk~,s01)ls命令
2xyd%T{&rbVW0在命令后加个 -Z 或者加 –context51Testing软件测试网[m'ist1X
[root@python azureus]# ls -Z
-NWe0B9t.Z$U0-rwxr-xr-x fu fu user_u:object_r:user_home_t azureus51Testing软件测试网-K-L9l"u{
-rw-r--r-- fu fu user_u:object_r:user_home_t Azureus2.jar
&YEmN*J7f.J0-rw-r--r-- fu fu user_u:object_r:user_home_t Azureus.png51Testing软件测试网 C~eC:a e pR

51Testing软件测试网)~m%Y xu M nn

2)chcon
5tIz/en'l9f"v5{0更改文件的标签51Testing软件测试网H8U){0mU*~
[root@python tmp]# ls --context test.txt
*T5y"r,x.S&^0-rw-r--r-- root root root:object_r:staff_tmp_t test.txt

~/ww-R g:S5?7KD(y051Testing软件测试网*Z/xX&~K;R

[root@python tmp]# chcon -t etc_t test.txt51Testing软件测试网aw8|J D!t
[root@python tmp]# ls -lZ test.txt
l/d2SG4u N0-rw-r--r-- root root root:object_r:etc_t test.txt

DmZ RD3mrk{051Testing软件测试网$mD} P$N3g+l(o

3)restorecon51Testing软件测试网i.{4f-ne1G
当这个文件在策略里有定义是,可以恢复原来的 文件标签。51Testing软件测试网hBf NYJ

|.H I/ub)C"h04)setfiles51Testing软件测试网'NoM!e;k
跟chcon一样可以更改一部分文件的标签,不需要对整个文件系统重新设定标签。

-Y@0`%Ej%F7W051Testing软件测试网+no&c2_fy,jOZ

5)fixfiles
9b3e EMU` A"~.Nnbm0一般是对整个文件系统的, 后面一般跟 relabel,对整个系统 relabel后,一般我们都重新启动。如果,在根目录下有.autorelabel空文件的话,每次重新启动时都调用 fixfiles relabel51Testing软件测试网 o y3x](UUe

51Testing软件测试网cU ~(u8r:d~

6)star
"h \LPf*@M0就是tar在SELinux下的互换命令,能把文件的标签也一起备份起来。

8p)s h@\'n7{051Testing软件测试网G8b|)vd/O

7)cp51Testing软件测试网-o6PTS@a*E
可以跟 -Z, --context=CONTEXT 在拷贝的时候指定目的地文件的security context

,|B)jq'nj aKC0

"Fr;EE/k+m.K*a08)find51Testing软件测试网%d)y6HZMQB;rA
可以跟 –context 查特定的type的文件。51Testing软件测试网3w(k y8kyIS5S's
例子:
)|pZ'R/\&rY0find /home/fu/ --context fu:fu_r:amule_t -exec ls -Z {} \:51Testing软件测试网5[yz,YE(Lj$nc6}y

6y+z H|l@9IL i9a4f09)run_init
s.` x/\ J^alW0w0在sysadm_t里手动启动一些如Apache之类的程序,也可以让它正常进行,domain迁移。
WLP y pL;pr0
j&M+n\c04.2进程domain的确认51Testing软件测试网6uAj*W.F(z"O1Z
51Testing软件测试网 W;].[._G$j gsm
程序现在在那个domain里运行,我们可以在ps 命令后加 -Z51Testing软件测试网gij1a#t&F^t8{
[root@python /]# ps -eZ51Testing软件测试网DV+k D {]3f%B
LABEL PID TTY TIME CMD51Testing软件测试网TF!q.ruS[
system_u:system_r:init_t 1 ? 00:00:00 init51Testing软件测试网}].[W,C7}
system_u:system_r:kernel_t 2 ? 00:00:00 ksoftirqd/0
zyQ-ht3V6vD4v0system_u:system_r:kernel_t 3 ? 00:00:00 watchdog/051Testing软件测试网I)n%A4K%D6u)iZ6dX9N3P

I H3XD MtBNN04.3ROLE的确认和变更51Testing软件测试网"]s2tLm

n ~m TK0命令id能用来确认自己的 security context51Testing软件测试网cL.G*V+s#bD/N3B
[root@python ~]# id
"m4a*D7]#E7`M%K B0n0uid=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_t51Testing软件测试网KcO P@LS9I1Z H
这里,虽然是ROOT用户,但也只是在一般的ROLE和staff_t里运行,如果在enforcing模式下,这时的ROOT对于系统管理工作来说,是什么也干不了。51Testing软件测试网:|%N:h*UB@Yc

51Testing软件测试网6` H8G9`-_0D"`mNx

[root@python ~]# newrole -r sysadm_r
(j3mc4Z fH$tn0Authenticating root.51Testing软件测试网F${!@k t[XO
口令:51Testing软件测试网?fM!VaY-T7@x
[root@python ~]# id51Testing软件测试网B%Xn1N|Hj.w p i
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
C y(R(yM'C T(v1f0
r*C0x'btfm-~04.4模式切换
yI.p#QCm6{6G051Testing软件测试网1W4_2Oj?T isD
1)getenforce51Testing软件测试网 Y)eL ?q@ Yj
得到当前的SELINUX值51Testing软件测试网!Z Q4V5[ i9\a'r
[root@python bin]# getenforce51Testing软件测试网v|#t s e9r
Permissive
\ TO#Gu3qQc rM cE+q0
K6ZS R5SQ(I02)setenforce
8a2t0S_PB+^0更改当前的SELINUX值 ,后面可以跟 enforcing,permissive 或者 1, 0。
VSo)gJ0[root@python bin]# setenforce permissive51Testing软件测试网g)b4D s7d0a7z!\

51Testing软件测试网3`n5F6y oF4h

3)sestatus51Testing软件测试网$cu1P]'Y+e
显示当前的 SELinux的信息51Testing软件测试网J l.Fo\!a_a\
[root@python bin]# sestatus -v
X5~(s PB'T Q wU0SELinux status: enabled
#dO"k'Bh$g*y-W0SELinuxfs mount: /selinux
#fwBMDi_T;|0Current mode: permissive51Testing软件测试网`*P2?A(p4i(`)_9u
Mode from config file: permissive51Testing软件测试网/BPEi O.s#^
Policy version: 20
HTc5]#fV0Policy from config file: refpolicy

`+K1C5c_5|N0

0|!L~-\]8J`g8e2]0Process contexts:
NR W2wx0Current context: user_u:user_r:user_t51Testing软件测试网gwS ?3S9`'T
Init context: system_u:system_r:init_t
L+J ` Wp+R&Ua7\ p0/sbin/mingetty system_u:system_r:getty_t51Testing软件测试网4Z [!UkmH.MD,x
/usr/sbin/sshd system_u:system_r:sshd_t

n AklW0

8s oh,c!W+?0File contexts:51Testing软件测试网i2] S[ww T`
Controlling term: user_u:object_r:user_devpts_t51Testing软件测试网"{8XwpIx}
/etc/passwd system_u:object_r:etc_t51Testing软件测试网YG8J:w w4j
/etc/shadow system_u:object_r:shadow_t51Testing软件测试网b@F5z Pw
/bin/bash system_u:object_r:shell_exec_t
0L;aa9S!Ta f/^0/bin/login system_u:object_r:login_exec_t51Testing软件测试网A ~D9p(PS'F*L
/bin/sh system_u:object_r:bin_t -> system_u:object_r:shell_exec_t
tZ f.V k8[ z5Y,Z$TY0/sbin/agetty system_u:object_r:getty_exec_t51Testing软件测试网*qd3v$otH
/sbin/init system_u:object_r:init_exec_t
1pq;D1MwU0/sbin/mingetty system_u:object_r:getty_exec_t
0gu'jV6X{0
O+V7o Wba04.5其他重要命令51Testing软件测试网xc+M a N;r o,r
51Testing软件测试网3e:q ls%?1cX9~
1)Audit2allow
3J@0FnS+b,`A M!u0很重要的一个以python写的命令,主要用来处理日志,把日志中的违反策略的动作的记录,转换成 access vector,对开发安全策略非常有用。在refpolicy里,它的功能比以前有了很大的扩展。51Testing软件测试网1iK C4~ l!DH$[2O/W
[root@python log]# cat dmesg | audit2allow -m local > local.te

3}R4P3?M']Q }051Testing软件测试网 X)x n/wm

2)checkmodule -m -o local.mod local.te
UPqQI]3E2yA3\0编译模块51Testing软件测试网`$kWR?v7dtLz
[root@python log]# checkmodule -m -o local.mod local.te
$Q {H&b\:Jh'Sx9q0checkmodule: loading policy configuration from local.te51Testing软件测试网*C&IP1X7x:O(Imn
checkmodule: policy configuration loaded51Testing软件测试网3j/Xt%cw|6e}{
checkmodule: writing binary representation (version 5) to local.mod

(O`]|LRw,]0Y;?Zm0

@ Y*PK ?owG03)semodule_package51Testing软件测试网f?v,i&J+Lj,U
创建新的模块
;Hd~ l3~-B0[root@python log]# semodule_package -o local.pp -m local.mod

#|%mT:Ju$[051Testing软件测试网4R8Ef-[K$o:x

4)semodule
_(}*u1Vk@ ao5O0可以显示,加载,删除 模块
_a R;t'M p0加载的例子:51Testing软件测试网{4{4F+T,G X
[root@python log]# semodule -i local.pp51Testing软件测试网4ox7zx6FF

JWs-I+Y05)semanage51Testing软件测试网#\K4|3IB
这是一个功能强大的策略管理工具,有了它即使没有策略的源代码,也是可以管理安全策略的。因为我主要是介绍用源代码来修改策略的,详细用法大家可以参考它的man页。
vT0Z;S9g7@^(hp051Testing软件测试网&W3o/J7[D/jw
5. 定制策略
h$t0DNQQ0
51Testing软件测试网%H9Zq`&~)`o9]i d
FC4,RHEL4等都是采用策略1.X版本的,并且是提供策略源代码的RPM包。从FC5开始策略的版本从1.X 升级到2.X。2.X版本的refpolicy(reference policy)最大的一个变化就是引进模块(module)这个概念, 同一套策略源代码就可以支持Multi-LevelSecurity(MLS)和non-MLS。51Testing软件测试网+BG4o jG$Hq#R
http://serefpolicy.sf.net/
1V.r'w+PN0标准的FC5里不提供源代码的RPM包。FC5提供的audit2allow,semanage,semodule也是可以开发一些简单的策略模块的。但是,要是作策略模块的开发,增加一个ROLE之类的,最好还是下载refpolicy的源代码。51Testing软件测试网-jbc'p;t+}If
51Testing软件测试网!cL[1v!s
5.1策略源文件的安装
a p4nm&x]9Sn051Testing软件测试网f\&?Gqz0S?3RS8x
从CVS服务器下载的源代码是最新的,如果遇到象make的时候出错,那么最好就是把你系统里和SELinux有关的那些包更新到最新的状态。
OgQiH3qA y0从source Forge的CVS服务器下载源代码
;`jrS#p&N"O0[root@python src]# cd /usr/local/src51Testing软件测试网W]Bn&w2R
[root@python src]# cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/serefpolicy login
$Goe(`Yy:V2D/Z'L0[root@python src]# cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot/serefpolicy co -P refpolicy

#m3M.P9Or%?$[%E?{0

2uDD$mZ!kCq jE0[root@python src]# cd refpolicy/

&D6@0q5r C)PPA R@0

2_nVAwgr*C W|g0[root@python src]# make install-src

yA7A P0pxMI051Testing软件测试网YU~m {Nr

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

As6~ YO0

;fnj+d'a#hW0[root@python src]# cd /etc/selinux/refpolicy/src/policy
W7\ [t#T$ENDjT0[root@python policy]# cp build.conf build.conf.org
.B!m2cU#p{"w9ben Y0[root@python policy]# vi build.conf
9},Cq D'p0[root@python policy]# diff build.conf build.conf.org
&w6Yeg-p.?z032c3251Testing软件测试网Gr TPF1@$A:bd
< DISTRO = redhat51Testing软件测试网Xv:|ScAeQ,U?
---
O`E7Iow+SO#c0F9z0> #DISTRO = redhat51Testing软件测试网h8g1q r`
43c43
1EEoYV-Dl q0< MONOLITHIC=n
Y@ rN3I^(K0---51Testing软件测试网*tkZn'opO)Ml
> MONOLITHIC=y51Testing软件测试网 \0`#QK*sb
[root@python src]# make conf
-_NHT0l(KO;X0[root@python src]# make

WhX o } b-s051Testing软件测试网*Qg!N Ao _ eP ?

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

7a Sz.Xdsjhp:s4bu0

bx m.Nv Y$N4{b$j5pP3Y0启动后,确认策略的适用情况, 现在的版本是20。51Testing软件测试网2hgaC1B2m b
[fu@python ~]$ /usr/sbin/sestatus51Testing软件测试网!wI'U+B FU.p1_y
SELinux status: enabled
)pYe.Ll)_6Zj jD0SELinuxfs mount: /selinux51Testing软件测试网[ SK+Ssh }
Current mode: permissive51Testing软件测试网 mb*|"t9osD
Mode from config file: permissive
D$F\a"PoC-q)`zZ0Policy version: 20
!Pu!['x.P(kwA0Policy from config file: refpolicy
Q5H8lX(Pzef~051Testing软件测试网h"y\N'D^@$~_ fB
5.2给程序定制domain51Testing软件测试网#bRTU+M d

2cIHXp G5fp(I7]0开发程序策略的一般步骤
{)G?6@? U i;G+L;Z*h01.给文件,端口之类的object赋予type 标签51Testing软件测试网#nH]9^)w8OD
2.设置 Type Enforcement (Domain 迁移,访问许可)
.k| jm'RV03.策略加载51Testing软件测试网~r6Bn,~
4.permissive模式下运行程序51Testing软件测试网*hP&^-l(Hz5y.V TV
5.确认日志,用audit2allow生成访问许可
;I;my7h3wK d-p06.重复1,2,3,4,5动作,直到没有违反的日志出现
_#Z1PV8flV07.切换到enforcing模式,正式运用51Testing软件测试网!zBVo @,V EF"wB.\

\W,R3H!|0因为我们所常用的那些服务的策略模块都已经有了,修改的时候也比较简单。在这里我就举个一般的例子。用点对点下载的朋友估计都跟我一样,在Linux上用 azureus,Amule来下载东西吧。51Testing软件测试网/j6u+r.z zC`^.a
接下来以azureus为例,介召如何在FC5里追加一个azureus.pp模块。我们在追加azureus.pp模块之前,azureus是在系统给用户设好的user_t domain里运行。51Testing软件测试网8C'[0t5JZ4A }+y
[fu@python azureus]$ ps -efZ|grep azureus51Testing软件测试网*H1_Gh XR
user_u:user_r:user_t fu 1751 1732 0 22:28 pts/3 00:00:00 /bin/bash ./azureus
YM(u e\Y5BP T0
6P L/?-|A3T#]0接下来我们在追加3个文件。
4EDD(i:tvC"g(m _01)azureus.fc51Testing软件测试网 x C1~"A%\!i
在这里我只定义一个文件,实际要是真的用的,还要定义azureus_t能写的目录等。
"An4pr0UP DES0[root@python apps]# more azureus.fc
/pX)g B0N2N0/home/fu/azureus -- gen_context(user_u:object_r:azureus_exec_t,s0)51Testing软件测试网*`Jl9K9kfC"TF

/Ee!wn[j*w `'`02)azureus.te51Testing软件测试网8i"p ["K#|Y+A
[root@python apps]# more azureus.te51Testing软件测试网k0r.R gi%F.e
policy_module(azureus,1.0.0)51Testing软件测试网|"g0eML,e
type azureus_t;51Testing软件测试网ua?:?;w Z
type azureus_exec_t;51Testing软件测试网P/S6Y)M_/]m+Y&]*?
role user_r types azureus_t;51Testing软件测试网.tt*X9v[&cz
require {51Testing软件测试网Wb#qp9]
type user_t;
q3}7\.`z0z0};
`'\/r L!WxF[2l0domain_type(azureus_t)51Testing软件测试网 zV jH4tZ&\z7y7P
domain_entry_file(azureus_t, azureus_exec_t)
_U6Q[8i K-Ge&H/\v0domain_auto_trans(user_t, azureus_exec_t, azureus_t)

`_ q:Q{f:d8]0

!o$s(v&fHR051Testing软件测试网4w&|5V4T'Xn1V
3)azureus.if
L0^sx"`%Hx G0实际上没有别的模块要调用azureus,所以这个文件就是空文件也不要紧。
}:\ crUr ]m0[root@python apps]# more azureus.if51Testing软件测试网8eGv&h2U+P5_1R
# policy/modules/apps/azureus.if51Testing软件测试网z.GnL3bs}&E
## <summary>Myapp example policy</summary>51Testing软件测试网0Z;SQ+J*gS
## <summary>
hn"ZG7Kr-FX0## Execute a domain transition to run azureus.
7Q"sm;\ F'y(R%I \0## </summary>51Testing软件测试网/Q U0n#i k,m
## <param name="domain">
Ud%H T2W0## Domain allowed to transition.
N2b$gN\,uK0## </param>
9g1r}8@5g!O0interface(`azureus_domtrans',`
5PS d?mFgu3y0gen_requires(`51Testing软件测试网o0dt3r|l9c7I,n,C
type azureus_t, azureus_exec_t;
9g0tA0TP^qO }0')
BD\m0b-khw,[0domain_auto_trans($1,azureus_exec_t,azureus_t)51Testing软件测试网2C!F'r0}J
allow $1 azureus_t:fd use;51Testing软件测试网4L(R*c5LD7OCKZ
allow azureus_t $1:fd use;
J`z+~d,T Spv0allow $1 azureus_t:fifo_file rw_file_perms;51Testing软件测试网q4s7P.}@8qRe
allow $1 azureus_t:process sigchld;51Testing软件测试网LFpYe Spc&~.V1G
')
7u!r\*K {,vP2L0在/etc/selinux/refpolicy/src/policy/policy/module.conf 里加入下面一行
WN FnpW|0[root@python policy]# tail -1 modules.conf51Testing软件测试网:\)YM YJ {4[
azureus = module51Testing软件测试网m$K6l4Bf*]SN

Q(SoK@0确认/etc/selinux/refpolicy/src/policy里MONOLITHIC=n
6t ]r|L!b0最后make , make load51Testing软件测试网 p"u?ze
[root@python policy]# pwd
F3QozNT[0/etc/selinux/refpolicy/src/policy
Vy6jPn1c|m0[root@python policy]# make;make load51Testing软件测试网 aP_ Lv3{F
51Testing软件测试网i9\&i _a'V&?'I)A
正常终了后,我们可以用 semodule命令来确认 azureus.pp下载下去了没有。
2|6|%{ MW'y I#I#Af0[root@python policy]# semodule -l |grep azureus
+I;A.{V(}/H)^1p0azureus 1.0.051Testing软件测试网Z9BD CIu

i6G$BX)};c0看样子是没有问题。好了我们再看看 /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命令来改标签。
Z(oYal:[4bP)N;Q0[root@python azureus]# chcon -t azureus_exec_t azureus
'elNVcS051Testing软件测试网G`hP;G/YV3E
再看看这次的新标签,果然如我们期望的,变成azureus_exec_t了。
{tA!cw0[root@python policy]# ls -lZ /home/fu/azureus/
*TU RmkL0-rwxr-xr-x fu fu user_u:object_r:azureus_exec_t azureus51Testing软件测试网n(l O'`PF N/j
-rw-r--r-- fu fu user_u:object_r:user_home_t Azureus2.jar51Testing软件测试网X*v"My9mx:yv7B x
51Testing软件测试网 gNA/JXKQ&A+A7U
接下来退出ROOT用户,以用户fu登录,运行azureus命令。
uW!Fy7wp0[root@python azureus]# ps -efZ|grep azureus
*r$G/FevP+[9X0user_u:user_r:azureus_t fu 8703 8647 0 23:23 pts/1 00:00:00 /bin/bash ./azureus
Y}pSf0user_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.Main
;n[ kg&Z0user_u:user_r:user_t root 9347 1956 0 23:59 pts/2 00:00:00 grep azureus

Owq ]D/f0mN0

t;] u4SU]2b.cUT0高兴吧! 成功了。
FjQ+y"D0f0在这里只是演示如何让domain迁移,至于azureus的严格的access vector的设置都忽略了。
pd[T n,R j#eT051Testing软件测试网sd7n"E1ZlX
5.3 给自己增加个专用的ROLE51Testing软件测试网SU&rO;Y8VPEZ0T!xt
在这里我们要增加一个叫madia的ROLE,在追加时要对一些文件进行修改。51Testing软件测试网&iB+Ug)npK~^
51Testing软件测试网Kb1QKe
5.3.1 /etc/selinux/refpolicy/src/policy/policy/modules/kernel下的文件修改51Testing软件测试网o][m f(e g!\8r;_a
1) kernel.te
J[4b|6Bkz|-[0[root@python kernel]# vi kernel.te
0j(i,ya7v0在role user_r 的下面加上一行
$ndU Y1uy0role madia_r;
@"~ V#x[D02) domain.te
9N~~QZ-FjJ|O5d'q0[root@python kernel]# vi domain.te51Testing软件测试网/K2IK-pa
在 role user_r types domain; 的下面加上一行
8`JRru;b)vST:uc0role madia_r type domain;
H)a Q|`M0
DuS!e8Eq[l/p,N05.3.2 /etc/selinux/refpolicy/src/policy/policy/modules/system下的文件修改51Testing软件测试网.S.D(lM!k&a~]
[root@python system]# vi userdomain.te51Testing软件测试网c:N2{5D:^ LZ
在第5行追加madia_r,如下所示:
:]aA \p\0role sysadm_r, staff_r, user_r,madia_r;51Testing软件测试网+p"\ B5H)hP:~J(@@
在unpriv_user_template(user)下面加上下面的一行。51Testing软件测试网q4V6`'h"I#e'M vO
unpriv_user_template(madia)
-G1s}3S*K`qk051Testing软件测试网-y"@zrQ8Ohy4R}}}
5.3.3 /etc/selinux/refpolicy/src/policy/policy下的文件修改
#ApIL1H1o X(Mh s01)user
4n(x8[-R0Pzvq0users和策略1.X里的users差不多。定义用户能利用的ROLE。51Testing软件测试网 Q(N C G'yB
[root@python policy]# vi users
p*R.[~D0gen_user(madia, madia, madia_r, s0, s0)
N,M&yq/S0N02)rolemap51Testing软件测试网'w:@2uu5C2@^
[root@python policy]# vi rolemap
uE%|\L#l lnT t0在user_r user user_t下面加上一行51Testing软件测试网*~*udDW0xbl9|
madia_r madia madia_t51Testing软件测试网9F7UKF9a&[.asrY$J
51Testing软件测试网OR.V@ ?r E
5.3.4 重新make 策略
0o5~PO1m1v0[root@python policy]# make load
ep-q9EiZ"T F`.v051Testing软件测试网uOC Q+W Av-P
5.3.5 /etc/selinux/refpolicy/seusers 文件的修改
0@ IQw!jo0Seusers是系统一般用户和SELinux的用户映射。51Testing软件测试网k7_DWBv/s-Cp
[root@python refpolicy]# vi seusers
J2^4~k_&iq0madia:madia
{J:e b*XV/PU051Testing软件测试网y!G+_Q2k
5.3.6 /etc/selinux/refpolicy/contexts下的文件修改
L a L]w01)default_type
kcXY9](qA TfH,A0决定用户登录时的默认ROLE。51Testing软件测试网.G&G5xO o.v \
[root@python refpolicy]# vi contexts/default_type51Testing软件测试网B/A p v,g I%_0o
madia_r:madia_t51Testing软件测试网)N'H#Yd [ Uoh
2)default_contexts
Z Z0lmh$N3s#d b0决定用户登录时的默认security context51Testing软件测试网.n6v"rOKg
[root@python refpolicy]# vi contexts/default_contexts
mq*r%J*M0system_r:local_login_t madia_r:madia_t staff_r:staff_t user_r:user_t sysadm_r:sysadm_t
B2oU?L0
f8Jg K%?,|1X0~05.3.7 以madia用户重新登录
gu n6a4k.Z0最后以用户madia登录,查看是不是 进入madia_t了。51Testing软件测试网0M|d!Etf
[madia@python ~]$ id
Ei:Y#pW0uid=501(madia) gid=501(madia) groups=501(madia) context=madia:madia_r:madia_t
"]Sj8GAOH0以上我们可以看出,madia用户确实是进入了madia_t 运行了。51Testing软件测试网 ^#Cy%^!\.N(S
我们在以上的操作中,实际上还有修改遗漏的地方,每当重新make的时候,seusers都会回到原来的设定,有兴趣的朋友可以自己找出哪里还需要修改。
e8OP4q+^q\e1C5F0
2{0L Gt1C6^k06.最后
dJ,?f&pB}mr$m$Q&x&w0我们现在主要还是targeted策略,因为我们的服务器,基本上也就跑apache,postgresql,tomcat,bind,postfix这几个服务。Targeted能够保护它。我们的目标是将一些影响比较小的,服务比较单一的服务器移植到能运行strict策略的服务器上。当然,即使我们用SELinux,对于系统的安全也不能掉以轻心,认为有了SELinux就100%安全。51Testing软件测试网4oOl9cuXQ2c
比如targeted里有unconfined_t,任何在这个domain里运行的都是不被保护的。还有,系统管理员对TE的设置错误造成不能很好的保护,还内核的漏洞,Dos攻击等,SELinux也是无能为力的。
cQu/_ HJjQ,HZ0除了SELinux外,还有LIDS ,TOMOYO LINUX,AppArmor等安全操作系统。大家对LIDS和AppArmor有可能比较熟悉,TOMOYO是 日本NTT数据公司开发的。也许有朋友在选择的时候不知道该用那个好。
4vmw!deJ |(a0安全级别高<----------------------------------->易用性高51Testing软件测试网0a1MO HAE sK6QmXm
SELINUX >> TOMOYO >> LIDS >> AppArmor51Testing软件测试网s$X6D1]2_8]


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