实战篇:开源系统中的网络进程安全控制

日期: 2015-02-04 作者:羽扇纶巾 来源:TechTarget中国

一、限制进程 几乎所有的服务进程都在限制下运行。并且,大多数以root身份运行的系统进程(比如说passwd进程)都是受限制域性的。当进程受限制时,它只能在自己限制的域内运行,例如Web服务进程httpd只能运行在httpd_t域内。如果一个受限制的进程被黑客攻击并控制了,根据SELinux策略配置,这个黑客也仅仅只能访问这个受限制的域,因此攻击所带来的危害也比传统的Linux小了很多。

以下通过一个具体的限制进程的例子(RHEL或者Fedora系统中的例子)来说明SELinux是如何将进程限制在自己的域内运行的。这个例子以用户非常熟悉且常用的Apache服务器中的httpd进程为例,来介绍S……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

一、限制进程

几乎所有的服务进程都在限制下运行。并且,大多数以root身份运行的系统进程(比如说passwd进程)都是受限制域性的。当进程受限制时,它只能在自己限制的域内运行,例如Web服务进程httpd只能运行在httpd_t域内。如果一个受限制的进程被黑客攻击并控制了,根据SELinux策略配置,这个黑客也仅仅只能访问这个受限制的域,因此攻击所带来的危害也比传统的Linux小了很多。

以下通过一个具体的限制进程的例子(RHEL或者Fedora系统中的例子)来说明SELinux是如何将进程限制在自己的域内运行的。这个例子以用户非常熟悉且常用的Apache服务器中的httpd进程为例,来介绍SELinux是如何阻止httpd进程来访问由其他域管理的文件类型的。

(1)运行sestatus命令来确认Linux中SELinux是运行的,它运行在enforcing模式下(该模式可以简单理解为SELinux的完全运行模式,它可以进行强制访问控制),且确保采用了目标策略,如下命令所示:

# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   enforcing
Mode from config file:          enforcing
Policy version:                 23
Policy from config file:        targeted

上述运行结果表明SELinux运行在enforcing模式下,且采用了目标策略。

(2)采用Linux中的root用户权限,使用如下命令在httpd的工作目录中创建一个新的文件:
#touch /var/www/html/testfile

(3)运行如下命令来查看该文件的SELinux上下文信息:

# ls -Z /var/www/html/testfile
-rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/testfile

从上述结果可以清楚地看到:在默认情况下,Linux用户是非限制的,因此刚创建的testfile文件的SELinux上下文中的类型标记为unconfined_u。RBAC访问控制机制是用于进程的,不是用于文件。并且,角色对于文件来说也没有什么太大的含义,因此上述结果中的object_r角色也仅仅是一个用于文件的通用角色。在/proc目录下,与进程相关的文件可以采用system_r角色。另外,结果中的httpd_sys_content_t类型允许httpd进程访问该文件。

(4)以Linux的root用户身份,运行下述命令来运行httpd进程,如下所示:

# /sbin/service httpd start
启动 httpd:                                               [确定]

(5)切换到一个Linux用户具有权限的目录下,运行如下命令,结果为该命令能够正确的执行并下载文件:

# wget http://localhost/testfile
--2011-05-06 06:46:26--  http://localhost/testfile
正在解析主机 localhost... 127.0.0.1
Connecting to localhost|127.0.0.1|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:0 [text/plain]
Saving to: `testfile'

    [ <=>                                 ] 0           --.-K/s   in 0s

2011-05-06 06:46:26 (0.00 B/s) - `testfile' saved [0/0]

(6)使用chcon命令来对文件的类型进行重新标识。然而,这样的标识不是永久性的修改,一旦系统重启,该标识就会改变回去。对于文件类型的永久性改变,需要采用semanage命令,这个命令在后面将进行详细介绍。下面,以root用户的身份,运行如下命令来将上面步骤中创建的testfile文件的类型改为由Samba进程使用的文件:

# chcon -t samba_share_t /var/www/html/testfile

然后,运行ls –z /var/www/html/testfile命令来查看改变的结果,如下所示:
# ls -Z /var/www/html/testfile
-rw-r--r--  root root unconfined_u:object_r:samba_share_t:s0 /var/www/html/testfile

(7)在传统的Linux中httpd进程可以访问testfile文件,下面需要尝试一下在SELinux中,该进程是否能够成功访问testfile文件。如步骤(5)所示,再次运行该命令进行文件下载工作,发现命令运行失败,文件没有权限下载,运行结果如下所示:

# wget http://localhost/testfile
--2011-05-06 07:04:14--  http://localhost/testfile
正在解析主机 localhost... 127.0.0.1
Connecting to localhost|127.0.0.1|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 403 Forbidden
2011-05-06 07:04:14 错误 403:Forbidden。

通过上述7个步骤的详细演示可以得知:虽然传统的Linux的DAC机制允许httpd进程访问testfile文件,然而SELinux的MAC机制却拒绝该访问操作。原因在于:该文件的类型(samba_share_t)httpd进程不能访问,因此SELinux拒绝了该操作。同时,SELinux对这些操作日志进行了详细的记载,以方便系统管理员事后进行审计和处理,可以查看/var/log/messages文件,如下所示:

May  6 07:04:14 wjl setroubleshoot: SELinux is preventing httpd (httpd_t) "getattr" to /var/www/html/testfile (samba_share_t). For complete SELinux messages. run sealert -l da48547d-9103-4a01-95ef-03fc1e48092e
May  6 07:04:14 wjl setroubleshoot: SELinux is preventing httpd (httpd_t) "getattr" to /var/www/html/testfile (samba_share_t). For complete SELinux messages. run sealert -l da48547d-9103-4a01-95ef-03fc1e48092e

另外,相关的错误日志也可以查看/var/log/audit/audit.log文件,如下所示:

type=AVC msg=audit(1241564654.246:26): avc:  denied  { getattr } for  pid=2744 comm="httpd" path="/var/www/html/testfile" dev=sda1 ino=471358 scontext=unconfined_u:system_r:httpd_t:s0 tcontext=unconfined_u:object_r:samba_share_t:s0 tclass=file
type=SYSCALL msg=audit(1241564654.246:26): arch=40000003 syscall=196 success=no exit=-13 a0=b94aeea8 a1=bfb26bec a2=54dff4 a3=2008171 items=0 ppid=2741 pid=2744 auid=500 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=1 comm="httpd" exe="/usr/sbin/httpd" subj=unconfined_u:system_r:httpd_t:s0 key=(null)

并且,由于该操作牵涉到httpd服务进程,由于该服务也有自己的日志文件,因此,也可以通过/var/log/httpd/error_log文件进行查看,如下所示:

[Wed May 06 07:04:14 2011] [error] [client 127.0.0.1] (13)Permission denied: access to /testfiledenied

二、限制和非限制用户

每个传统的Linux用户在SELinux中都被映射为一个SELinux用户。这使得Linux用户能够继承在SELinux用户上的访问控制。用户可以使用semanage login –l命令来查看两类用户之间的具体映射情况,如下所示:

# semanage login -l

登录名                 SELinux 用户            MLS/MCS 范围

__default__               unconfined_u              s0
root                      unconfined_u              s0-s0:c0.c1023
system_u                  system_u                  s0-s0:c0.c1023

举个例子,在Fedora 10中,Linux用户默认被映射到SELinux的_default_login中,从而映射为unconfined_u用户类型。

下面通过一个更加具体的在SELinux中添加新用户的例子,来说明SELinux是怎么来映射Linux用户的。该例子的具体操作步骤如下:

(1)以root用户身份,运行useradd命令,添加一个新用户liyang:
#useradd liyang

(2)以root用户身份,运行passwd命令,修改该用户的密码:
#passwd liyang

(3)退出当前的root运行身份,以liyang的身份重新登录Linux。重新登录后,SELinux将为用户liyang生成SELinux上下文,查看该用户的上下文:
# id -Z
unconfined_u:unconfined_r:unconfined_t:s0

可以清楚地看到,当Linux添加一个新用户时,SELinux将默认地映射该用户为unconfined_u类型,角色为unconfined_r,以及unconfined_t级别。

限制和非限制用户都需要接受可执行和可写的内存检查,并且受MCS和MLS机制的约束。如果一个非限制的用户执行了一个从unconfined_t域向一个允许的域转变的应用程序,非限制用户仍要接受那个转表到的域的限制。这个就保证了即使一个用户是非限制的,这个应用也是受限的,因此,软件的漏洞所引起的风险就能得到限制。

三、管控非限制进程

非限制的进程运行在非限制域中。比如,init进程运行在非限制的initrc_t域中,非限制的kernel进程运行在kernel_t域中,非限制的用户运行在unconfined_t域中。对于非限制的进程,SELinux策略规则仍然适用,然而有关允许进程运行在非限制域中的规则允许几乎所有的访问。因此,如果一个非限制进程被黑客控制的话,那么SELinux将不能阻止黑客获取对系统资源和数据的访问权限,当然DAC规则仍然适用,因为SELinux机制是在DAC层次上附加一层对Linux的增强,而不是简单地替代DAC。

下面将给出一个具体的例子来说明Apache Http服务器(httpd进程)在非限制的条件下运行,是如何能够访问本应由Samba服务器访问的数据的。值得注意的是:在Red Hat Linux和Fedora 10中,httpd进程默认是限制运行在httpd_t域中的。下面的例子假设用户系统中安装了httpd、wget(一种类似于Windows系统下Flashget软件的多线程下载工具)、settroubleshoot-server、audit等工具包,并且SELinux机制运行在enforcing模式下。

(1)运行sestatus命令来确认Linux中SELinux是运行的,且运行在enforcing模式下,运行结果如下所示:

# sestatus
SELinux status:                 enabled
SELinuxfs mount:                /selinux
Current mode:                   enforcing
Mode from config file:          enforcing
Policy version:                 23
Policy from config file:        targeted

(2)以root用户身份,创建一个新的测试文件testfile2,该文件路径为httpd进程的工作目录下,如下所示:
#touch /var/www/html/testfile2

(3)使用ls –z命令来查看新创建的文件的SELinux上下文信息,如下所示:
# ls -Z /var/www/html/testfile2
-rw-r--r--  root root unconfined_u:object_r:httpd_sys_content_t:s0 /var/www/html/testfile2

从上述结果中可以清楚看到:Linux用户默认运行在非限制域中,所以testfile2文件上下文信息标识为unconfined_u。并且,RBAC用于进程,而不是文件。另外,对于文件来说角色也没有特别的含义,因此赋予其object_r为较为通用的角色。而httpd_sys_content类型则允许httpd进程对该文件进行访问。

(4)采用chron命令暂时对文件的标识进行改变。一旦系统重启,该改变将会失效。若要永久改变文件的标识,可以采用semanage命令进行操作。使用root用户身份,运行如下命令来将文件类型改为由Samba服务器可访问的类型:
#chcon –t samba_share_t /var/www/html/testfile2

然后,采用ls –z命令来查看修改后的结果:
# ls -Z /var/www/html/testfile2
-rw-r--r--  root root unconfined_u:object_r:samba_share_t:s0 /var/www/html/testfile2

(5)在将httpd进程从限制修改为非限制之前,需要将该进程停止,使用如下命令:
#/sbin/service httpd stop

(6)以root用户身份运行如下命令,来改变httpd进程的类型,以将其从限制改为非限制:
#chcon –t unconfined_exec_t /usr/sbin/httpd
然后,使用ls -z命令来查看进程,以确保修改生效,如下所示:
# ls -Z /usr/sbin/httpd
-rwxr-xr-x  root root system_u:object_r:unconfined_exec_t:s0 /usr/sbin/httpd

(7)为了使httpd在运行时该修改生效,需要重新启动httpd进程,如下所示:
#/sbin/service httpd start

(8)采用ps –ez | grep httpd命令来查看httpd进程运行在非限制域中的情况,如下所示:
# ps -eZ | grep httpd
unconfined_u:system_r:unconfined_t:s0 2921 ?   00:00:00 httpd
unconfined_u:system_r:unconfined_t:s0 2923 ?   00:00:00 httpd
unconfined_u:system_r:unconfined_t:s0 2924 ?   00:00:00 httpd
unconfined_u:system_r:unconfined_t:s0 2925 ?   00:00:00 httpd
unconfined_u:system_r:unconfined_t:s0 2926 ?   00:00:00 httpd
unconfined_u:system_r:unconfined_t:s0 2927 ?   00:00:00 httpd
unconfined_u:system_r:unconfined_t:s0 2928 ?   00:00:00 httpd
unconfined_u:system_r:unconfined_t:s0 2929 ?   00:00:00 httpd
unconfined_u:system_r:unconfined_t:s0 2930 ?   00:00:00 httpd
unconfined_u:system_r:unconfined_t:s0 2931 ?   00:00:00 httpd

(9)在有权限许可的目录下,运行如下命令来测试httpd进程运行在非限制情况下的效果,如下所示:
# wget http://localhost/testfile2
--2011-05-06 07:24:47--  http://localhost/testfile2
正在解析主机 localhost... 127.0.0.1
Connecting to localhost|127.0.0.1|:80... 已连接。
已发出 HTTP 请求,正在等待回应... 200 OK
长度:0 [text/plain]
Saving to: `testfile2'

    [ <=>                                                    ] 0           --.-K/s   in 0s

2011-05-06 07:24:47 (0.00 B/s) - `testfile2' saved [0/0]

上述的运行结果显示,该命令能够成功运行。虽然httpd进程原来没有访问标记为samba_share_t类型文件的权限,然而由于修改,httpd进程现在运行在非限制环境下(unconfined_t),所以SELinux转为执行DAC机制,而wget命令可以访问该文件,所以成功执行。

(10)测试结束后,需要使用如下命令来恢复该httpd进程本来的运行限制:
#restorecon –v /user/sbin/httpd

然而,采用如下命令来进行查看,发现httpd进程又从非限制状态恢复为限制状态:
# ls -Z /usr/sbin/httpd
-rwxr-xr-x  root root system_u:object_r:httpd_exec_t:s0 /usr/sbin/httpd

(11)使用如下命令重新启动httpd,以时修改在httpd进程运行时生效,并通过ps –ez命令来查看进程的运行状态:

#/sbin/service httpd restart
# ps -eZ | grep httpd
unconfined_u:system_r:httpd_t:s0 2963 ?        00:00:00 httpd
unconfined_u:system_r:httpd_t:s0 2965 ?        00:00:00 httpd
unconfined_u:system_r:httpd_t:s0 2966 ?        00:00:00 httpd
unconfined_u:system_r:httpd_t:s0 2967 ?        00:00:00 httpd
unconfined_u:system_r:httpd_t:s0 2968 ?        00:00:00 httpd
unconfined_u:system_r:httpd_t:s0 2969 ?        00:00:00 httpd
unconfined_u:system_r:httpd_t:s0 2970 ?        00:00:00 httpd
unconfined_u:system_r:httpd_t:s0 2971 ?        00:00:00 httpd
unconfined_u:system_r:httpd_t:s0 2972 ?        00:00:00 httpd
unconfined_u:system_r:httpd_t:s0 2973 ?        00:00:00 httpd

到此为止,上述例子详细的演示了SELinux是如何通过限制进程的运行来保证Linux系统安全的,也看到了如果将进程改为unconfined运行状态的安全隐患,因此提醒广大用户在实际应用过程中切忌不要随便将进程默认的限制运行状态改为非限制状态,以免给Linux系统带来不必要的麻烦和安全隐患。

作者

羽扇纶巾
羽扇纶巾

自由撰稿人。

相关推荐

  • SDN技术存漏洞 供应商为开拓市场牺牲安全

    在黑帽大会上,研究人员展示了攻击交换机系统的恶意软件,表明有些SDN技术包含严重的安全隐患,并且,技术提供商没有妥善处理这些问题……

  • 常见无线局域网设置安全几种隐患(下)

    网络的安全稳定,不能仅仅依靠设备的性能和个人技术,一些细节性的地方更值得大家去注意。本文作者为大家细数了常见的一些无线局域网设置安全的细节。

  • 常见无线局域网设置安全几种隐患(上)

    无线网络的可移动性、安装简单、高灵活性和扩展能力,作为对传统有线网络的延伸,在许多特殊环境中得到了广泛应用。但在无线局域网的安全性更值得我们去注意。

  • 论风险评估之网络评估(下)

    我们时常都在谈论这样的问题:网络具有怎样的风险,存在怎样的安全隐患,并由此引发怎样的安全问题。那在网络安全领域,风险究竟指的是什么呢?