设为首页收藏本站language→→ 语言切换

鸿鹄论坛

 找回密码
 论坛注册

QQ登录

先注册再绑定QQ

查看: 30153|回复: 151
收起左侧

Linux配置文档整理-全面解析版

  [复制链接]
发表于 2010-9-10 10:00:31 | 显示全部楼层 |阅读模式
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 tpd 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 linux标准设定吧。

    # 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 linux设它有效无效外,在启动的时候,也可以通过传递参数selinux给内核来控制它。(Fedora 5默认是有效)

    kernel /boot mlinuz-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_ubject_r:user_home_t azureus

    -rw-r--r-- fu fu user_ubject_r:user_home_t Azureus2.jar

    -rw-r--r-- fu fu user_ubject_r:user_home_t Azureus.png

    2)chcon

    更改文件的标签

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

    -rw-r--r-- root root rootbject_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 rootbject_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

    [root@python /]# ps -eZ

    LABEL PID TTY TIME CMD

    system_u:system_r:init_t 1 ? 00:00:00 init

    system_u:system_r:kernel_t 2 ? 00:00:00 ksoftirqd/0

    system_u:system_r:kernel_t 3 ? 00:00:00 watchdog/0

4.3ROLE的确认和变更

    命令id能用来确认自己的 security context

    [root@python ~]# id

    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

    这里,虽然是ROOT用户,但也只是在一般的ROLE和staff_t里运行,如果在enforcing模式下,这时的ROOT对于系统管理工作来说,是什么也干不了。

    [root@python ~]# newrole -r sysadm_r

    Authenticating root.

    口令:

    [root@python ~]# id

    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

    4.4模式切换

    1)getenforce

    得到当前的SELINUX值

    [root@python bin]# getenforce

    Permissive

    2)setenforce

    更改当前的SELINUX值 ,后面可以跟 enforcing,permissive 或者 1, 0。

    [root@python bin]# setenforce permissive

    3)sestatus

    显示当前的 SELinux的信息

    [root@python bin]# sestatus -v

    SELinux status: enabled

    SELinuxfs mount:  linux

    Current mode: permissive

    Mode from config file: permissive

    Policy version: 20

    Policy from config file: refpolicy

    Process contexts:

    Current context: user_u:user_r:user_t

    Init context: system_u:system_r:init_t

    /sbin/mingetty system_u:system_r:getty_t

    /usr/sbin/sshd system_u:system_r:sshd_t

    File contexts:

    Controlling term: user_ubject_r:user_devpts_t

    /etc/passwd system_ubject_r:etc_t

    /etc/shadow system_ubject_r:shadow_t

    /bin/bash system_ubject_r:shell_exec_t

    /bin/login system_ubject_r:login_exec_t

    /bin/sh system_ubject_r:bin_t -> system_ubject_r:shell_exec_t

    /sbin/agetty system_ubject_r:getty_exec_t

    /sbin/init system_ubject_r:init_exec_t

    /sbin/mingetty system_ubject_r:getty_exec_t

    4.5其他重要命令

    1)Audit2allow

    很重要的一个以python写的命令,主要用来处理日志,把日志中的违反策略的动作的记录,转换成 access vector,对开发安全策略非常有用。在refpolicy里,它的功能比以前有了很大的扩展。

    [root@python log]# cat dmesg | audit2allow -m local > local.te

    2)checkmodule -m -o local.mod local.te

    编译模块

    [root@python log]# checkmodule -m -o local.mod local.te

    checkmodule: loading policy configuration from local.te

    checkmodule: policy configuration loaded

    checkmodule: writing binary representation (version 5) to local.mod

    3)semodule_package

    创建新的模块

    [root@python log]# semodule_package -o local.pp -m local.mod

    4)semodule

    可以显示,加载,删除 模块

    加载的例子:

    [root@python log]# semodule -i local.pp

    5)semanage

    这是一个功能强大的策略管理工具,有了它即使没有策略的源代码,也是可以管理安全策略的。因为我主要是介绍用源代码来修改策略的,详细用法大家可以参考它的man页。

   
5. 定制策略

    FC4, RHEL4等都是采用策略1.X版本的,并且是提供策略源代码的RPM包。从FC5开始策略的版本从1.X 升级到2.X。2.X版本的refpolicy(reference policy)最大的一个变化就是引进模块(module)这个概念, 同一套策略源代码就可以支持Multi-LevelSecurity(MLS)和non-MLS。

    http://serefpolicy.sf.net/

    标准的FC5里不提供源代码的RPM包。FC5提供的audit2allow,semanage,semodule也是可以开发一些简单的策略模块的。但是,要是作策略模块的开发,增加一个ROLE之类的,最好还是下载refpolicy的源代码。

    5.1策略源文件的安装

    从CVS服务器下载的源代码是最新的,如果遇到象make的时候出错,那么最好就是把你系统里和SELinux有关的那些包更新到最新的状态。

    从source Forge的CVS服务器下载源代码

    [root@python src]# cd /usr/local/src

    [root@python src]# cvs -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot refpolicy login

    [root@python src]# cvs -z3 -d:pserver:anonymous@cvs.sourceforge.net:/cvsroot refpolicy co -P refpolicy

    [root@python src]# cd refpolicy/

    [root@python src]# make install-src

    安装好了的源代码目录结构如下图所示:

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

    [root@python src]# cd /etc linux/refpolicy/src/policy

    [root@python policy]# cp build.conf build.conf.org

    [root@python policy]# vi build.conf

    [root@python policy]# diff build.conf build.conf.org

    32c32

    < DISTRO = redhat
    ---
    > #DISTRO = redhat
    43c43
    < MONOLITHIC=n
    ---
    > MONOLITHIC=y
    [root@python src]# make conf

    [root@python src]# make

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

    启动后,确认策略的适用情况, 现在的版本是20。

    [fu@python ~]$ /usr/sbin status

    SELinux status: enabled

    SELinuxfs mount:  linux

    Current mode: permissive

    Mode from config file: permissive

    Policy version: 20

    Policy from config file: refpolicy

    5.2给程序定制domain

    开发程序策略的一般步骤

    1.给文件,端口之类的object赋予type 标签

    2.设置 Type Enforcement (Domain 迁移,访问许可)

    3.策略加载

    4.permissive模式下运行程序

    5.确认日志,用audit2allow生成访问许可

    6.重复1,2,3,4,5动作,直到没有违反的日志出现

    7.切换到enforcing模式,正式运用

    因为我们所常用的那些服务的策略模块都已经有了,修改的时候也比较简单。在这里我就举个一般的例子。用点对点下载的朋友估计都跟我一样,在Linux上用 azureus,Amule来下载东西吧。

    接下来以azureus为例,介召如何在FC5里追加一个azureus.pp模块。我们在追加azureus.pp模块之前,azureus是在系统给用户设好的user_t domain里运行。

    [fu@python azureus]$ ps -efZ|grep azureus

    user_u:user_r:user_t fu 1751 1732 0 22:28 pts/3 00:00:00 /bin/bash ./azureus

    接下来我们在追加3个文件。

    1)azureus.fc

    在这里我只定义一个文件,实际要是真的用的,还要定义azureus_t能写的目录等。

    [root@python apps]# more azureus.fc

    /home/fu/azureus -- gen_context(user_ubject_r:azureus_exec_t,s0)

    2)azureus.te

    [root@python apps]# more azureus.te

    policy_module(azureus,1.0.0)

    type azureus_t;

    type azureus_exec_t;

    role user_r types azureus_t;

    require {

    type user_t;

    };

    domain_type(azureus_t)

    domain_entry_file(azureus_t, azureus_exec_t)

    domain_auto_trans(user_t, azureus_exec_t, azureus_t)

    3)azureus.if

    实际上没有别的模块要调用azureus,所以这个文件就是空文件也不要紧。

    [root@python apps]# more azureus.if

    # policy/modules/apps/azureus.if

    ## <summary>Myapp example policy</summary>

    ## <summary>

    ## Execute a domain transition to run azureus.

    ## </summary>

    ## <param name="domain">

    ## Domain allowed to transition.

    ## </param>

    interface(`azureus_domtrans',`

    gen_requires(`

    type azureus_t, azureus_exec_t;

    ')

    domain_auto_trans($1,azureus_exec_t,azureus_t)

    allow $1 azureus_t:fd use;

    allow azureus_t $1:fd use;

    allow $1 azureus_t:fifo_file rw_file_perms;
    allow $1 azureus_t:process sigchld;

    ')

    在/etc linux/refpolicy/src/policy/policy/module.conf 里加入下面一行

    [root@python policy]# tail -1 modules.conf

    azureus = module

    确认/etc linux/refpolicy/src/policy里MONOLITHIC=n

    最后make , make load

    [root@python policy]# pwd
    /etc linux/refpolicy/src/policy

    [root@python policy]# make;make load

    正常终了后,我们可以用 semodule命令来确认 azureus.pp下载下去了没有。

    [root@python policy]# semodule -l |grep azureus

    azureus 1.0.0

看样子是没有问题。好了我们再看看 /home/fu/azureus/azureus的security context,我们刚才在azureus.fc里是期望它是 user_ubject_r:azureus_exec_t ,可是它这个时候还是继承了默认的 user_ubject_r:user_home_t ,如果不是我们期望的文件标签的话,domain是无法从user_t迁移到azureus_t的,因为relabel的话,会对整个文件系统进行重新设标签,很花时间,所以我们用在上面介绍过文件标签更改的命令chcon命令来改标签。

    [root@python azureus]# chcon -t azureus_exec_t azureus

    再看看这次的新标签,果然如我们期望的,变成azureus_exec_t了。

    [root@python policy]# ls -lZ /home/fu/azureus/

    -rwxr-xr-x fu fu user_ubject_r:azureus_exec_t azureus

    -rw-r--r-- fu fu user_ubject_r:user_home_t Azureus2.jar

    接下来退出ROOT用户,以用户fu登录,运行azureus命令。

    [root@python azureus]# ps -efZ|grep azureus

    user_u:user_r:azureus_t fu 8703 8647 0 23:23 pts/1 00:00:00 /bin/bash ./azureus

    user_u:user_r:azureus_t fu 8717 8703 4 23:24 pts/1 00:01:29 java -Djava.ext.dirs=/usr b/jvm/java-1.4.2-gcj-1.4.2.0/jre b/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

    user_u:user_r:user_t root 9347 1956 0 23:59 pts/2 00:00:00 grep azureus

    高兴吧! 成功了。

    在这里我只是演示如何让domain迁移,至于azureus的严格的access vector的设置我都忽略了。

    5.3 给自己增加个专用的ROLE

    在这里我们要增加一个叫madia的ROLE,在追加时要对一些文件进行修改。

    5.3.1 /etc linux/refpolicy/src/policy/policy/modules/kernel下的文件修改

    1) kernel.te

    [root@python kernel]# vi kernel.te

    在role user_r 的下面加上一行

    role madia_r;

    2) domain.te

    [root@python kernel]# vi domain.te

    在 role user_r types domain; 的下面加上一行

    role madia_r type domain;
    5.3.2 /etc linux/refpolicy/src/policy/policy/modules/system下的文件修改

    [root@python system]# vi userdomain.te

    在第5行追加madia_r,如下所示:

    role sysadm_r, staff_r, user_r,madia_r;

    在unpriv_user_template(user)下面加上下面的一行。

    unpriv_user_template(madia)

    5.3.3 /etc linux/refpolicy/src/policy/policy下的文件修改
    1)user

    users和策略1.X里的users差不多。定义用户能利用的ROLE。

    [root@python policy]# vi users

    gen_user(madia, madia, madia_r, s0, s0)

    2)rolemap

    [root@python policy]# vi rolemap

    在user_r user user_t下面加上一行

    madia_r madia madia_t

    5.3.4 重新make 策略

    [root@python policy]# make load

    5.3.5 /etc linux/refpolicy users 文件的修改

    Seusers是系统一般用户和SELinux的用户映射。

    [root@python refpolicy]# vi seusers

    madia:madia

    5.3.6 /etc linux/refpolicy/contexts下的文件修改

    1)default_type
    决定用户登录时的默认ROLE。

    [root@python refpolicy]# vi contexts/default_type

    madia_r:madia_t

    2)default_contexts

    决定用户登录时的默认security context

    [root@python refpolicy]# vi contexts/default_contexts

    system_r:local_login_t madia_r:madia_t staff_r:staff_t user_r:user_t sysadm_r:sysadm_t

    5.3.7 以madia用户重新登录

    最后以用户madia登录,查看是不是 进入madia_t了。

    [madia@python ~]$ id

    uid=501(madia) gid=501(madia) groups=501(madia) context=madia:madia_r:madia_t

    以上我们可以看出,madia用户确实是进入了madia_t 运行了。

    我们在以上的操作中,实际上还有修改遗漏的地方,每当重新make的时候,seusers都会回到原来的设定,有兴趣的朋友可以自己找出哪里还需要修改。

6.最后

    我们现在主要还是targeted策略,因为我们的服务器,基本上也就跑apache,postgresql,tomcat,bind,postfix这几个服务。Targeted能够保护它。我们的目标是将一些影响比较小的,服务比较单一的服务器移植到能运行strict策略的服务器上。当然,即使我们用 SELinux,对于系统的安全也不能掉以轻心,认为有了SELinux就100%安全。

    比如targeted里有unconfined_t,任何在这个domain里运行的都是不被保护的。还有,系统管理员对TE的设置错误造成不能很好的保护,还内核的漏洞,Dos攻击等,SELinux也是无能为力的。

    除了SELinux外,还有LIDS ,TOMOYO LINUX,AppArmor等安全操作系统。大家对LIDS和Apparmor有可能比较熟悉,TOMOYO是 日本NTT数据公司开发的。也许有朋友在选择的时候不知道该用那个好。

    安全级别高<----------------------------------->易用性高

    SELINUX >> TOMOYO >> LIDS >> Apparmor

    个人觉得,SELinux虽然配置起来麻烦了点,但是能达到军事安全级别,要玩的就话,还是SELinux有魅力。

    现在也有人在开发策略的GUI编辑器,如SEEDIT,是日本日立软件工程公司的一个叫中村雄一为中心开发的。有了这些GUI的工具,将来定制策略会越来越容易的。
发表于 2010-9-10 12:07:53 | 显示全部楼层
兄弟   下次发贴的时候最好把相关的资料整理到一块,总结完以后再发上来,方便大家查阅,这样每一个只是点都发一篇实在是太占版面了
沙发 2010-9-10 12:07:53 回复 收起回复
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-9 23:23:17 | 显示全部楼层

Linux安全新高度 安全增强Linux (SELinux) 剖析

[upload=1]   公共网络(比如 Internet)充满着危险。只要将电脑连接到 Internet(即使只连接很短的时间),您就会感受到这一点。攻击者可以利用不安全性来获得对一个系统的访问,获得对信息的未授权访问,或者对一台计算机进行改造,以利用它发送垃圾邮件或攻击其他高端系统(使用 SYN 泛洪攻击,一种分布式拒绝服务攻击)。

  分布式拒绝服务攻击(DDoS)通过 Internet 上的多个系统来实现(所以也称为僵尸电脑),这些系统消耗目标系统上的资源,(利用 TCP 的三向握手)使其不能被合法的用户访问。一种带有 cookie 的四向握手协议(Stream Control Transmission Protocol [SCTP])可以防御这种攻击。

  SELinux 的起源

  SELinux 是一个面向政府和行业的产品,由 NSA、Network Associates、Tresys 以及其他组织设计和开发。尽管 NSA 将其作为一个补丁集引入,但从 2.6 版开始,它就被加入到 Linux 内核中。

  GNU/Linux 非常安全,但它也非常动态:所做的更改会为操作系统带来新的漏洞,这些漏洞可能被攻击者利用,尽管人们都非常关心阻止未授权访问,但是发生入侵后会发生什么呢?

  本文将探究 SELinux 背后的思想及其基本架构。关于SELinux 的完整描述涉及一整本书的内容,所以本文只关注其基本原理,使您了解 SELinux 的重要性及其实现过程。

  访问控制方法

  大多数操作系统使用访问控制来判断一个实体(用户或程序)是否能够访问给定资源。基于 UNIX® 的系统使用一种自主访问控制(discretionary access control,DAC)的形式。此方法通常根据对象所属的分组来限制对对象的访问。例如,GNU/Linux 中的文件有一个所有者、一个分组和一个权限集。权限定义谁可以访问给定文件、谁可以读取它、谁可以向其写入,以及谁可以执行它。这些权限被划分到三个用户集中,分别表示用户(文件所有者)、分组(一个用户组的所有成员)和其他(既不是文件所有者,又不是该分组的成员的所有用户)。

  很多这样的访问控制都会带来一个问题,因为所利用的程序能够继承用户的访问控制。这样,该程序就可以在用户的访问层进行操作。与通过这种方式定义约束相比,使用最小特权原则 更安全:程序只能执行完成任务所需的操作。例如,如果一个程序用于响应 socket 请求,但不需要访问文件系统,那么该程序应该能够监听给定的 socket,但是不能访问文件系统。通过这种方式,如果该程序被攻击者利用,其访问权限显然是最小的。这种控制类型称为强制访问控制(MAC)。

  另一种控制访问的方法是基于角色的访问控制(RBAC)。在 RBAC 中,权限是根据安全系统所授予的角色来提供的。角色的概念与传统的分组概念不同,因为一个分组代表一个或多个用户。一个角色可以代表多个用户,但它也代表一个用户集可以执行的权限。

  SELinux 将 MAC 和 RBAC 都添加到了 GNU/Linux 操作系统中。下一节将探讨 SELinux 实现,以及如何将安全增强透明地添加到 Linux 内核中。

  Linux 安全实现

  在早期的 SELinux 中,它还是一个补丁集,它提供了自己的安全性框架。这存在着一些问题,因为它将 GNU/Linux 限制到一个单独的访问控制架构。Linux 内核继承了一种通用框架,将策略从实现中分离了出来,而不是采用单一的方法。该解决方案就是 Linux 安全模块(Linux Security Module,LSM)框架。LSM 提供了一种通用的安全框架,允许将安全模型实现为可载入内核模块(参见图 1)。

  图 1. SELinux 将安全策略和实施分离

20090728141031813333.gif
在访问内部对象之前对内核代码进行修改,以调用一个代表实施函数的钩子,该实施函数实现安全策略。该函数根据预定义的策略验证操作能否继续进行。安全函数存储在一个安全操作结构中,该结构包含必须受到保护的基本操作。例如,security_socket_create 钩子(security_ops->socket_create)在创建新 socket 之前检查权限,并考虑协议集、类型、协议,以及 socket 是在内核中创建还是在用户空间中创建。清单 1 提供了 socket.c 中用于创建 socket 的示例代码。

  清单 1. 创建 socket 的内核代码

         static int __sock_create(int family, int type, int protocol,
  struct socket **res, int kern)
  {
  int err;
  struct socket *sock;
  /*
  * Check protocol is in range
  */
  if (family < 0 || family >= NPROTO)
  return -EAFNOSUPPORT;
  if (type < 0 || type >= SOCK_MAX)
  return -EINVAL;
  err = security_socket_create(family, type, protocol, kern);
  if (err)
  return err;
  ...

  security_socket_create 函数在 ./linux/include/linux/security.h 中定义。它提供了从 security_socket_create 到 security_ops 结构中动态安装的函数的间接调用(参见清单 2)。

  清单 2. 用于 socket 创建检查的间接调用

         static inline int security_socket_create (int family, int type,
  int protocol, int kern)
  {
  return security_ops->socket_create(family, type, protocol, kern);
  }

  security_ops 结构中的函数通过安全模块安装。在本例中,这些钩子在可载入的 SELinux 内核模块中定义。每个 SELinux 调用在 hooks 文件内部定义,该文件实现从内核函数到特定安全模块的动态调用的间接性(参见清单 3 中的 .../linux/security/selinux/hooks.c 代码)。

  清单 3. SELinux socket 创建检查

         static int selinux_socket_create(int family, int type,
  int protocol, int kern)
  {
  int err = 0;
  struct task_security_struct *tsec;
  if (kern)
  goto out;
  tsec = current->security;
  err = avc_has_perm(tsec->sid, tsec->sid,
  socket_type_to_security_class(family, type,
  protocol), SOCKET__create, NULL);
  out:
  return err;
  }

  清单 3 的核心部分是一个调用,用于验证当前操作是否是当前任务(通过 current->security 定义,其中 current 代表当前正在执行的任务)所允许的。访问向量缓存(Access Vector Cache,AVC)缓存了之前的 SELinux 决策(提高进程的性能)。此调用包括源安全标识符(sid)、安全类(根据请求操作的详细信息构造)、特定 socket 调用,以及可选的辅助审计数据。如果未在缓存中找到决策,那么会调用安全服务器来获取决策(此过程如图 2 所示)。

  图 2. 分层 Linux 安全进程

2009072814103213255555.gif

初始化到 security_ops 中的回调钩子被动态定义为一个可载入内核模块(通过 register_security()),但是在没有载入安全模块时,这些钩子包含伪桩(dummy stub)函数(参见 ./linux/security/dummy.c)。这些桩函数实现标准 Linux DAC 策略。始终存在回调钩子,其中必须提供对象中介(mediation)来保证安全性。这包括任务管理(创建、通知、等待)、程序载入(execve)、文件系统管理(超级块、inode、文件钩子)、IPC(消息队列、共享内存、信号量(semaphore)操作)、模块钩子(插入和删除)、网络钩子(覆盖 socket、netlink、网络设备和其他协议接口)。更多信息请参见 参考资料 小节或回顾 security.h 文件。

  其他方法

  SELinux 是目前最全面的安全框架之一,但它不是惟一的。本节回顾其他一些可用的方法。

  Apparmor

  AppArmor 最初由 Immunix 开发,随后由 Novell 维护,它是 SELinux 的替代方法,也使用了 Linux 安全模块(LSM)框架。由于 SELinux 和 AppArmor 使用了同样的框架,所以它们可以互换。AppArmor 的开发初衷是因为人们认为 SELinux 太过复杂,不适合普通用户管理。Apparmor 包含一个完全可配置的 MAC 模型和一个学习模式,在学习模式中,程序的典型行为可以转换为一个配置文件。

  SELinux 的一个问题在于,它需要一个支持扩展属性的文件系统;而 Apparmor 对文件系统没有任何要求。您可以在 SUSE、OpenSUSE,以及 Ubuntu 的 Gutsy Gibbon 中找到 Apparmor。

  Solaris 10(是受信任的 Solaris)

  Solaris 10 操作系统通过其增强了安全性的 Trusted Extensions 组件提供了强制访问控制。该功能适用于 MAC 和 RBAC。Solaris 通过向所有对象添加敏感性标签实现了这一点,使您能够控制设备、文件、连网访问,甚至窗口管理服务。Solaris 10 中的 RBAC 的优点在于,它通过提供对管理任务(可在以后进行分配)的细粒度控制最小化了对根访问的需求。

  TrustedBSD

  TrustedBSD 是一个正在进行中的项目,主要开发可靠的操作系统扩展,这些扩展最终会加入 FreeBSD 操作系统。它包括构建在 Flux Advanced Security Kernel (Flask) 安全架构之上的强制访问控制,后者包括以插件模块形式提供的类型强制和多级安全(MLS)。TrustedBSD 还合并了来自 Apple Darwin 操作系统的开源 Basic Security Module (BSM) 审计实现(BSM 最初由 Sun 引入)。BSM 是一个审计 API 和文件格式,它支持普通的审计跟踪处理。TrustedBSD 还构成了供 Security Enhanced Darwin (SEDarwin) 使用的框架。

  操作系统虚拟化

  增强操作系统内部安全性的最后一个选择是操作系统虚拟化(也称为虚拟专用服务器(virtual private servers))。一个操作系统拥有多个独立的用户空间实例,可以实现功能分离。操作系统虚拟化对在独立用户空间内部运行的应用程序功能进行了限制。例如,一个用户空间实例也许不能修改内核(载入或移除内核模块),也不能挂载或卸载文件系统。并且不允许修改内核参数(例如,通过 proc 文件系统)。任何修改其他用户实例环境的操作都是不允许的。

  许多操作系统都能实现操作系统虚拟化。GNU/Linux 支持 VServer、Parallels Viruozzo Container 和 OpenVZ。在其他操作系统中,您可以找到容器(Solaris)和 jail(BSD)。在 Linux-VServer 中,每个单独的用户空间实例称为一个安全上下文。在每个安全上下文中,会为专用服务器实例启动一个新的 init。

  结束语

  对于 Linux 内核来说,强制访问控制和基于角色的访问控制都是相对较新的功能。随着 LSM 框架的引入,新的安全模块将会出现。除了对框架的增强,还可以堆叠安全模块,从而允许多个安全模块共存,而且最大限度地覆盖了 Linux 的安全需求。随着对操作系统安全性的深入研究,将会引入新的访问控制方法。
板凳 2010-9-9 23:23:17 回复 收起回复
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-10 09:20:55 | 显示全部楼层

【汇总】解密SELinux安全系统设计

12345.jpg

 SELinux全称是Security Enhanced Linux,由美国国家安全部(National Security Agency)领导开发的GPL项目,它拥有一个灵活而强制性的访问控制结构,旨在提高Linux系统的安全性,提供强健的安全保证,可防御未知攻击,据称相当于B1级的军事安全性能。比MS NT所谓的C2等高得多。应用SELinux后,可以减轻恶意攻击或恶意软件带来的灾难,并提供对机密性和完整性有很高要求的信息很高的安全保障。 编者认为,去了解一个安全系统的设计,有利于加强读者在安全方面的考量,何乐而不为。

一、 认识SELinux

Linux安全新高度 安全增强Linux (SELinux) 剖析
http://bbs.hh010.com/forum.php?mod=viewthread&tid=34479.html


Selinux配置详解
http://bbs.hh010.com/forum.php?m ... mp;amp;toread=1#tpc


用SELinux加强网络安全
http://bbs.hh010.com/forum.php?m ... mp;amp;toread=1#tpc


使用 SELinux 和 Smack 增强轻量级容器
http://bbs.hh010.com/forum.php?mod=viewthread&tid=34498



二、案例分析
http://bbs.hh010.com/forum.php?mod=viewthread&tid=34499

SELinux 的网络安全设计
http://bbs.hh010.com/forum.php?mod=viewthread&tid=34500.html

解决新的SELinux安全级别产生问题(图)
http://bbs.hh010.com/forum.php?mod=viewthread&tid=34501

vsFTPd服务器和防火墙及SELINUX关系
http://bbs.hh010.com/forum.php?mod=viewthread&tid=34502

利用RHEL5来为SELinux做辩护

http://bbs.hh010.com/forum.php?mod=viewthread&tid=34503

RHEL5中不用关闭SELinux而成功启动Samba

http://bbs.hh010.com/forum.php?mod=viewthread&tid=34504

Linux系统安全工具之:Sxid和Skey
http://bbs.hh010.com/forum.php?mod=viewthread&tid=34505

经典:Linux安全配置步骤大全

http://bbs.hh010.com/forum.php?mod=viewthread&tid=34506

使用增强安全性的Linux(SELinux)
http://bbs.hh010.com/forum.php?mod=viewthread&tid=34507

不用关闭selinux而成功启动samba的方法
http://bbs.hh010.com/forum.php?mod=viewthread&tid=34508

SELinux拒绝vsftpd上传文件到用户主目录
http://bbs.hh010.com/forum.php?mod=viewthread&tid=34509

Redhat关闭SELinux的正确步骤
http://bbs.hh010.com/forum.php?mod=viewthread&tid=34510

SELINUX从理解到动手配置
http://bbs.hh010.com/forum.php?mod=viewthread&tid=34511

Snort搭建安全的Linux服务器
http://bbs.hh010.com/forum.php?mod=viewthread&tid=34512

Linux安全的log日志记录服务器
http://bbs.hh010.com/forum.php?mod=viewthread&tid=34513.html

Linux系统下三款常用的网络安全工具简介
http://bbs.hh010.com/forum.php?m ... mp;amp;toread=1#tpc
地板 2010-9-10 09:20:55 回复 收起回复
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-10 10:08:16 | 显示全部楼层

用SELinux加强网络安全

[ SELinux(Security-Enhanced Linux) 是美国国家安全局(NAS)对于强制访问控制的实现,是 Linux® 上最杰出的新安全子系统。NSA是在Linux社区的帮助下开发了一种访问控制体系,在这种访问控制体系的限制下,进程只能访问那些在他的任务中所需要文件。SELinux 默认安装在 Fedora 和 Red Hat Enterprise Linux 上,也可以作为其他发行版上容易安装的包得到。本文是一篇翻译稿件,主要介绍了怎样通过SELinux从而加强网络安全,原文地址如下:http://securityblog.org/brindle/ ... rking-with-selinux/
  在过去的一年中付出了相当多的努力后使得SELinux对网络支持得更好,感谢伟大的SELinux社区,随着支持的进一步发展,它变得对人们越来越有用,人们愿意尝试使用它并提出反馈意见,最终将变得更加有用,受众也更加广泛,因为在SELinux中网络支持还在不断发展(已经有一部分其它想法正在讨论中,可能今后会被包括进来),我将保持本文的更新,请随时关注。

  在SELinux中的网络支持包括很多事情,过去SELinux通过对象类的方式实现细粒度的网络访问控制,这些对象类是网络接口,网络地址和一些套接字对象类(如tcp_socket,udp_socket,rawip_socket等)。

  SELinux策略直接标记出了不同种类的网络对象包括接口(使用netifcon),互联网节点(使用nodecon)和端口(使用portcon),策略的语法结构看起来象下面这样:

netifcon eth0 system_ubject_r:external_netif_t system_ubject_r:
external_packet_t
nodecon 192.168.1.1 255.255.255.255 system_ubject_r:external_node_t;
portcon tcp 21 system_ubject_r:ftp_port_t ;
这些被标记了的对象使用正常的SELinux规则就可以访问了:
allow ftpd_t external_netif_t : netif {tcp_send tcp_recv };
allow ftpd_t external_node_t : node { tcp_send tcp_recv };
allow ftpd_t ftp_port_t : tcp_socket { send_msg recv_msg name_bind };

  策略和规则结合起来实际上指定了ftpd_t绑定到端口21,在端口21上发送和接收tcp消息,在eth0(它的ip地址是192.168.1.1)网卡接口上发送和接收tcp消息,这些规则工作得很好,唯一的问题是它们不能在一条规则中进行描述,因此它们不是连接在一起的。这就意味着如果有另外一套规则指出ftpd_t只能在内部接口上发送和接收dns(名称解析服务)数据包,依靠上面的规则他们也能在外部接口上发送和接收dns数据包,注意这些访问控制也可以用在我稍后要介绍的在SELinux中通过echo 1 >  linux/compat_net使用的compat_net选项上。这些对象的标签最后都将增加到libsemanage中,使用semanage命令可以改变它们,但这个命令不能修改策略。

  在2006年顶级SELinux开发者研讨会期间,我们讨论了如何使网络标记变得更容易、更多地支持典型的网络约束和大部分重要的精密地绑定接口、地址和端口的方法,幸运地是在Linux中netfilter已经支持这些内容以及一些额外的好处,例如网络连接跟踪可以更精确地限制诸如使用动态端口的ftp这些事情。

  可能会想到向iptables中增加一条域分类符来控制更容易一些,因此可能会写一条规则和SELinux域一样定义端口、网络地址、网络接口实现仅允许ftp数据包到达ftpd_t。这可能会用到分布式SELinux策略,但是,可以从SELinux安全服务器移动一部分策略到iptables策略和子系统中去,但我们并不欢迎这样做,因为我们喜欢单一的,集中的,可分析的SELinux策略,实际上让我们使用netfilter和iptables来标记数据包,然后用SELinux规则描述同意或拒绝访问,让我们看看这都是如何使用的:

  iptables -A INPUT -t mangle -p tcp --dport 21 -j SECMARK --selctx system_ubject_r:ftp_packet_t

  这条语句标记了经过端口21的数据包为ftp_ packet_t,SELinux规则只是简单地允许ftpd_t发送和接收这种类型的数据包:

  allow ftpd_t ftp_packet_t : packet { send recv };

  但是这相对于传统的网络控制而言并没有做出更新颖的事情来,让我们再来看看更有趣的内容:

  iptables -A INPUT -t mangle -p tcp --dport 21 -i eth0 -s 192.168.0.1/24 -j SECMARK –selctx system_ubject_r:ftp_packet_t

  这条语句标记了在eth0上,来自192.168.0.1/24,端口21的数据包为ftp_packet_t,因此这就体现了netfilter支持集中处理的好处,另一个iptables规则如下:

  iptables -A INPUT -t mangle -m state --state RELATED,ESTABLISHED -j CONNSECMARK –restore

  它将为与此相关的数据包进行拷贝,因此当ftp客户端尝试通过相关端口(传输时端口是动态指定的)传输一个文件时将接收到相同的标签,它将运用netfilter的连接跟踪特性来允许ftp仅仅接收与其连接有关的数据包,但这并不需要新增加策略规则或对策略进行修改,因为我们正在对标签进行修改。

  这将转变netfilter已经存在的功能,使其能够更精确地指定哪个域能访问哪个数据包,因此它允许你相对于进程而不是机器控制防火墙的功能,如果你在同一台机器上运行有一些不同安全属性的服务那它就有用了,例如:允许你有一个内部的Apache实例访问公司的机密数据,而另外一个外部的Apache实例提供静态的web内容到internet上。

  大多数人都在思考在SELinux中为什么不仅仅是提供对网络的支持,而是要在防火墙规则条目中进行网络访问控制,下面的SELinux网络支持就是标记网络通讯。

  在SELinux中有两种标记网络通讯的方法:NetLabel,它是CIPSO的实现,另外一种是基于IPSec的标记,我将不讨论NetLabel,因为它仅仅提供了SELinux上下文MLS支持,并且主要是应用于传统的可靠的操作系统如HP-UX和Solaris与SELinux进行协作。基于IPSec的标记条目内容,目前只工作在SELinux系统之间。

  因为NetLabel主要为传统的可靠的系统提供MLS支持,我将不讨论它,我将重点介绍基于IPSec的标记。

  在这里将涉及到一些IPSec的知识,如果你对它们还不熟悉请参阅IPSec相关文档,尤其要知道什么是SPD和SA,以及它们在IPSec中的角色。

  首先你需要准备一个支持IPSec的内核,如果你使用的是redhat的系统就很容易了,可以使用目前Fedora rawhide内核或LSSP内核,LSSP内核可以在

http://people.redhat.com/sgrubb/files/lspp/找到,如果不是redhat的系统,可以升级到2.6.22内核,它包含了IPSec的支持。  你还需要一个ipsec工具用来标记,rawhide或LSSP版本也将在这里用到,一旦你安装好所有需要的东西就可以开始使用IPSec标记了,我们将从简单的标记SA开始。  首先,我有一组程序用来测试并确定所有需要的东西都在工作,它们是一个简单的客户端和连接用的服务端,使用getpeercon()返回网络套接字的上下文。client.c【译者注:内容见附录A】
server.c【译者注:内容见附录B】
编译它们并将其连接到libselinux:
gcc -o client client.c -lselinux
gcc -o server server.c –lselinux  首先尝试在没有IPSec的情况运行它们看会发生什么:  我的测试用机是192.168.147.132(主机名:scarecrow)和192.168.147.130(主机名:poisonivy),很明显,请替换为你的ip地址。  在192.168.147.132上运行服务端和客户端后,在其他机器上的输出类似下面这样:[root@poisonivy ~]# ./client 192.168.147.132
getpeercon: Protocol not available Received: Hello, (null) from (null)
[root@scarecrow ~]# . rver
getsockopt: Protocol not available server: got connection from
192.168.147.130, (null)
getpeercon()返回协议不可用,因为在本次连接中没有标记被启用,你可以根据
错误信息来判断你是否使用了标记网络套接字。  如果我们在这两台机器之间不指定一个上下文而产生一个SA,我们将得到同样的结果:[root@scarecrow ~]# cat dev/ipsec tkey.scarecrow.test
spdflush;
flush;
spdadd 192.168.147.130 192.168.147.132 any
-P in ipsec esp/transport//require;
spdadd 192.168.147.132 192.168.147.130 any
-P out ipsec esp/transport//require;
[root@poisonivy ~]# cat dev/ipsec tkey.poisonivy.test
spdflush;
flush;
spdadd 192.168.147.132 192.168.147.130 any
-P in ipsec esp/transport//require;
spdadd 192.168.147.130 192.168.147.132 any
-P out ipsec esp/transport//require;  然后运行:[root@poisonivy ~]# setkey -f dev/ipsec tkey.poisonivy.test
[root@scarecrow ~]# setkey -f dev/ipsec tkey.scarecrow.test  注意:当尝试连接时,要想创建SA两台机器都需要运行racoon。  象之前那样运行服务端和客户端会得到同样的结果,你可以使用setkey –D来查看新创建的SA,注意它是没有标记的SA。  如果我们增加一条-ctx语句到我们的setkey文件中,如:[root@scarecrow ~]# cat dev/ipsec tkey.scarecrow.test
spdflush;
flush;
spdadd 192.168.147.130 192.168.147.132 any
-ctx 1 1 "system_ubject_r:default_t:s0"
-P in ipsec esp/transport//require;
spdadd 192.168.147.132 192.168.147.130 any
-ctx 1 1 "system_ubject_r:default_t:s0"
-P out ipsec esp/transport//require;  你可以使用setkey –DP在每一台机器上查看SPD条目,注意条目的上下文字段。  在其他机器上重复设置setkey文件,注意你不能在标签中使用默认的default_t,它是一个展示发生什么事情的例子,它不是用来创建SA的标签,它将用于一个规则来查看哪个SPD条目与一个域匹配,这将在后面解释。  运行setkey –f收到一个错误的结果:[root@scarecrow ~]# setkey -f dev/ipsec tkey.scarecrow.test
The result of line 8: Permission denied.
The result of line 14: Permission denied.  查看拒绝信息:[root@scarecrow ~]# tail  ar/log/audit/audit.log | grep AVC
type=AVC msg=audit(1179150979.762:33): avc: denied { setcontext } for pid=
21632 comm="setkey" scontext=root:system_r:unconfined_t:s0-s0:c0.c1023
tcontext=system_ubject_r:default_t:s0 tclass=association type=AVC msg=
audit(1179150979.895:34): avc: denied { setcontext } for pid=21632 comm=
"setkey" scontext=root:system_r:unconfined_t:s0-s0:c0.c1023 tcontext=
system_ubject_r:default_t:s0 tclass=association  非常好,它告诉我们可以在哪个IPSec SPD上设置标签了,现在在两台机器上设置许可模式并再次运行setkey,将会成功。[root@poisonivy ~]# ./client 192.168.147.132
Received: Hello, root:system_r:unconfined_t:SystemLow-SystemHigh from root:
system_r:unconfined_t:-SystemHigh  你可以使用setkey –D来查看新创建的SA,注意每个条目中上下文的字段。希望下面这张图能传达SA是如何标记的,注意连接的每一边都有2个SA,一个标记入站一个标记出站,出站SA在每个系统上总是本地域,入站SA在每个系统上总是远程域。attachment=9712]  

20090728135519476.gif

  我很感谢Chris Ashworth制作这张图,它比我想象的更简单易懂。  这就论证了当服务端调用getpeercon()时它看到了root:system_r:unconfined_t:SystemLow-SystemHigh,客户端看到了root:system_r:unconfined_t:-SystemHigh,使用runcon在不同上下文中运行客户端可以看到更多的不同之处:[root@poisonivy ~]# runcon -t httpd_t ./client 192.168.147.132
Received: Hello, root:system_r:httpd_t:SystemLow-SystemHigh from root:
system_r:unconfined_t:-SystemHigh  现在你可以看到服务端调用getpeercon()时的标签是httpd_t,因此现在我们明白了你如何在一个连接的另一端标识进程的上下文了,但是策略如何处理呢?
清除dmesg的内容,设置setenforce 1; setenforce 0,重新开始进程,首先运行setkey,然后运行audit2allow –d,将会显示:allow unconfined_t default_t:association setcontext;
  这意味着unconfined_t尝试和default_t一起设置上下文,因为我们在SPD条目中使用了default_t,所以它是预期的结果,运行dmesg –c清除内核缓冲区,并尝试运行服务端和客户端(使用runcon):

  移除不相干的规则,在客户端我们可以看到类似下面这样的规则:

  allow httpd_t default_t:association polmatch;

  这条规则意味着客户端(作为httpd_t运行)企图再次匹配我们之前增加的SPD条目,这个非常有用,因为你可以使用SELinux策略来强制哪个SPD条目与一个域匹配,例如:你想让一些域使用高强度的加密,而另外一些域使用更快速的,低强度的加密,那么你就可以指定哪个SPD类型与哪个域进行匹配。

  allow httpd_t self:association sendto;

  这条规则指出httpd_t发送数据到标记为httpd_t的团体,意味着它发送到为它创建的团体,注意目前你还不能控制哪个域发送到另一端。

  allow httpd_t unconfined_t:association recvfrom;

  这是最有效的控制,它告诉我们允许httpd_t接收来自一个标记为unconfined_t的团体的消息,标记为unconfined_t的团体运行在unconfined_t下,这就允许你使用策略来决定其他机器使用哪个域向你本地机器发送数据。

  allow unconfined_t default_t:association polmatch;

  这是在这台机器上远程域(服务端)再次匹配入站SPD条目,注意有2条SPD条目被增加进来了,一个为出站通讯一个为入站通讯,两个域分别在本地机器上(为出站)和远程机器上(为入站)匹配SPD条目。

  可能会在服务端收到类似的拒绝信息,仅仅与之前的颠倒过来了,我不想重提了。使用这个技术你要做到心中有数,假设你控制了两个策略(源和目标),你非常肯定哪个域可以域机器进行通讯,哪个是跨过机器的,与SELinux IPC控制类似,但它是跨网络的。

  例如:一个应用了这个技术的应用程序在雇员工作站上有一个内部和外部的浏览器,内部浏览器运行在一个域上,它允许访问公司内部包含了机密的客户信息的web应用服务器,外部浏览器可以访问internet,这就可以减少流氓internet内容泄露你内部数据的风险,这中分离的方式如果没有SELinux高级网络控制支持实现起来将非常困难(甚至是不可能实现的)。

  在SELinux网络环境下同时使用IPSec和netfilter技术你将获得惊人的安全,为了更安全,你需要调式更多的信息。

  值得特别感谢的是那些为这个技术努力工作的人们,将来他们会使网络架构更安全,这些人包括:James Morris, Venkat Yekkirala, Joy Latten, Paul Moore (实现了NetLabel)等

  附录A:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define PORT 3490 // the port client will be connecting to
#define MAXDATASIZE 100 // max number of bytes we can get at once
int main(int argc, char *argv[])
{
int sockfd, numbytes; 
char buf[MAXDATASIZE];
struct hostent *he;
struct sockaddr_in their_addr; // connector's address information
security_context_t con = NULL;
if (argc != 2) {
fprintf(stderr,"usage: client hostnamen");
exit(1);
}
if ((he=gethostbyname(argv[1])) == NULL) { // get the host info
herror("gethostbyname");
exit(1);
}
if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
their_addr.sin_family = AF_INET;  // host byte order
their_addr.sin_port = htons(PORT); // short, network byte order
their_addr.sin_addr = *((struct in_addr *)he->h_addr);
memset(&(their_addr.sin_zero), '', 8); // zero the rest of the struct
if (connect(sockfd, (struct sockaddr *)&their_addr,
sizeof(struct sockaddr)) == -1) {
perror("connect");
exit(1);
}
if ((numbytes=recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) {
perror("recv");
exit(1);
}
if (getpeercon(sockfd, &con)) {
perror("getpeercon");
}
buf[numbytes] = '';
printf("Received: %s from %sn",buf, con);
close(sockfd);
return 0;
}

  附录B:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define MYPORT 3490  // the port users will be connecting to
#define BACKLOG 10   // how many pending connections queue will hold
void sigchld_handler(int s)
{
while(waitpid(-1, NULL, WNOHANG) > 0);
}
int main(void)
{
int sockfd, new_fd; // listen on sock_fd, new connection on new_fd
struct sockaddr_in my_addr;  // my address information
struct sockaddr_in their_addr; // connector's address information
socklen_t sin_size;
struct sigaction sa;
int yes=1;
char buf[255];
socklen_t len=254;
security_context_t con = NULL;
if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
}
if (setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&yes,sizeof(int)) == -1) {
perror("setsockopt");
exit(1);
}
my_addr.sin_family = AF_INET;     // host byte order
my_addr.sin_port = htons(MYPORT);   // short, network byte order

my_addr.sin_addr.s_addr = INADDR_ANY; // automatically fill with my IP
memset(&(my_addr.sin_zero), '', 8); // zero the rest of the struct
if (bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr))
== -1) {
perror("bind");
exit(1);
}
if (listen(sockfd, BACKLOG) == -1) {
perror("listen");
exit(1);
}
sa.sa_handler = sigchld_handler; // reap all dead processes
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_RESTART;
if (sigaction(SIGCHLD, &sa, NULL) == -1) {
perror("sigaction");
exit(1);
}
while(1) { // main accept() loop
sin_size = sizeof(struct sockaddr_in);
if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr,
&sin_size)) == -1) {
perror("accept");
continue;
}
// if (getsockopt(new_fd, SOL_SOCKET, SO_PEERSEC, con, &len)) {
if (getpeercon(new_fd, &con)) {
perror("getsockopt");
}
printf("server: got connection from %s, %sn",
inet_ntoa(their_addr.sin_addr), con);
if (!fork()) { // this is the child process
close(sockfd); // child doesn't need the listener
sprintf(buf, "Hello, %s", con);
if (send(new_fd, buf, strlen(buf), 0) == -1)
perror("send");
close(new_fd);
exit(0);
}
close(new_fd); // parent doesn't need this
}
return 0;
5# 2010-9-10 10:08:16 回复 收起回复
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-10 10:18:41 | 显示全部楼层

使用 SELinux 和 Smack 增强轻量级容器

安全 Linux 容器实现指南

    轻量级容器 又称作 Virtual Private Servers (VPS) 或 Jails,它们是经常用于限制不可信应用程序或用户的工具。但是最近构造的轻量级容器没有提供充分的安全保证。使用 SELinux 或 Smack 策略增强这些容器之后,就可以在 Linux? 中实现更加安全的容器。本文介绍如何创建受 Linux 安全模块保护的更加安全的容器。SELinux 和 Smack 策略的开发都在进行当中,并且在各自社区的帮助下不断得到改善。
    人们听到容器时的第一反应是 “如何才能创建安全的容器?”。本文通过使用 Linux 安全模块(Linux Security Modules,LSM)增强容器的安全性来解决这个问题。本文特别演示了如何设定安全目标,并通过 Smack 和 SELinux 安全模块实现目标。

    要了解 Linux 容器的背景知识,请阅读 “linux.chinaitlab.com/administer/777960_2.html" target=_blank>LXC:Linux 容器工具”(developerWorks,2009 年 2 月)。

    Linux 容器是根据几种 Linux 技术构建的概念性工件:

    资源名称空间 允许在容器内部查找进程、文件、SYSV IPC 资源、网络接口等等。
    控制组(Control groups)允许限制放置到容器中的资源。
    功能绑定(Capability bounding)设置 限制容器的访问特权。
    必须协调使用这些技术,以实现符合设想的容器。目前已有两个项目提供这个功能:

    Libvirt 是能够使用 Xen 管理程序、qemu 模拟器、kvmis 甚至是轻量级容器创建虚拟机的大型项目。
    Liblxc 是一个较小的库和用户空间命令集合,它们的目的之一是帮助内核开发人员快速轻松地测试容器的功能。
    因为 “LXC:Linux 容器工具” 是基于 liblxc 编写的,所以我在这里继续使用 liblxc;不过这里完成的操作也能够使用 libvirt 的容器支持轻松完成。

    主要元素 1:LSM

    在开始之前,如果不太了解 LSM,现在可以快速浏览一下。根据 Wikipedia 中的定义:Linux Security Modules (LSM) 是一个允许 Linux 内核支持各种计算机安全模型的框架,同时也避免依赖于特定安全实现。这个框架由 GNU General Public License 条款授权使用,并且是 Linux 2.6 之后的 Linux 内核的标准部分。设计 LSM 的目的是为成功实现强制访问控制模块提供一切必要元素,同时最小化对 Linux 内核的更改。LSM 避免了 Systrace 中的系统调用插入,因为它不支持多处理器内核,并且容易受 TOCTTOU (race) 攻击。相反,当某个用户级别的系统将要访问重要的内部内核对象(比如 inode 和任务控制块)时,LSM 将在内核中插入 “钩子(hook)”(向上调用模块)。这个项目专门用于解决访问控制问题,以避免对主流内核进行大量的复杂修改。该项目并不打算成为通用的 “钩子” 或 “向上调用” 机制,也不支持虚拟化。LSM 访问控制的目标与解决系统审计问题密切相关,但又有所区别。审计要求记录每次访问尝试。LSM 不能解决这个问题,因为这需要大量的钩子,以检测内核 “短路” 故障系统在什么地方发出调用,并在接近重要对象时返回错误代码。

    系统安全包括两个有些冲突的目标。第一个目标是实现完整的细粒度访问控制。必须对有可能泄露或损坏信息的位置实施控制。过于粗粒度的控制和不进行控制没有区别。例如,如果必须将所有文件归为一种类型,并且有任何一个文件是公开的,则所有文件都是公开的。

    另一方面,配置必须简单,否则管理员就需要管理很多访问(但是再次强调,这和不进行控制是一样的)。例如,如果使程序正常工作需要大量访问规则,那么管理员就会为程序添加许多访问权限,而不是测试这些访问规则是否有必要。

    Linux 中的两个基本安全模块使用不同的方法来平衡这个矛盾。

    SELinux 首先对所有东西实施控制,同时使用强大的策略语言简化策略的管理。
    Smack 主要提供简单的访问控制。

    主要元素 2:SELinux

    到目前为止,SELinux 是针对 Linux 的最有名的 MAC 系统(强制访问控制)。尽管仍然有人反对它,但流行的 Fedora? 发行版从几年前开始就和 SELinux 一起部署,这是它取得成功的有力证明。

    SELinux 使用模块化策略语言配置,因此用户可以轻松更新已安装的策略。这种语言还提供一些接口,允许使用更高级的语句表达一组低级的语句。

    在本文中,我们将使用一个新的接口来定义容器。虽然为容器添加许多访问权限使接口本身变得非常大,但是使用接口创建新的容器却很简单。这个接口很有希望成为核心发布策略的一部分。

    主要元素 3:Smack

    Smack 是简化的强制访问控制内核(Simplified Mandatory Access Control Kernel)的缩写。它首先使用简单的文本标签标记所有进程、文件和网络流量。使用创建进程的标签创建最新的文件。通常存在一些带有明确定义的访问规则的默认类型。进程常常可以对具有同一标签的对象进行读写。绕过 Smack 访问规则的特权由 POSIX 功能控制,因此带有 CAP_MAC_OVERRIDE 的任务可以覆盖规则;带有 CAP_MAC_ADMIN 的任务可以更改规则和标签。“POSIX file capabilities: Parceling the power of root”(参考资料)演示了这些特权。

安全目标

    我们不能盲目地应用策略并期望带来某些价值,而是应该首先定义明确的安全目标。Smack 的简单性实际上限定了可实现的目标的范围,我们将力求实现以下目标:

    使用提供 Web 和 ssh 服务的隔离的文件系统创建容器。
    容器应该是独立的,以保护彼此的安全。容器 vs1 不能读取另一个容器 vs2 的文件或中断它的任务。
    主机的关键文件不受容器的影响。
    外部能够访问容器中的 Web 服务器和 ssh 服务器。

    一般设置

    在本文中,我们将进行两个实验:首先设置由 SELinux 保护的容器,然后设置由 Smack 保护的容器。这两个实验演示了大部分初级设置。

    您可以使用真实的机器来完成这两个实验,但是使用虚拟机更加方便。要使用 qemu 或 kvm,可以通过 qemu-img create vm.img 10G 创建一个硬盘。

    使用命令 kvm -hda vm.img -cdrom cdrom.iso -boot d -m 512M 从 CDROM 引导虚拟机。要获得 CDROM 映像,可以从 fedoraproject.org/get-fedora 下载 Fedora 10 for i386 的安装 DVD。用下载获得的文件的名称替换上一命令中的 cdrom.iso。安装过程基本可以使用默认值,但一定不要选择 office and productivity,而是选择 software development。此外,还需要使用 yum 包管理器安装 bridge-utils、debootstrap 和 ncurses-devel rpms。

    现在需要编译一个定制内核。下载内核源代码 rpm 并对其使用补丁 enable-netns.patch(参见 下载 小节)以提供网络名称空间(在 2.6.29 中为上游(upstream),但在 Fedora 10 中不是),然后更改配置并完成编译和安装。这需要作为根用户用以下指令来实现:

   yumdownloader --source kernel
rpm -i kernel*
cd rpmbuild
rpmbuild -bc SPECS/kernel-*
cd BUILD/kernel-2.6.27 nux-2.6*
patch -p1 < ~/enable-netns.patch
make menuconfig
make && make modules_install && make install



    对于这两个实验,在 make menuconfig 步骤中都需要选择 Network Namespaces(在 Networking support -> Networking options 菜单下)。对于 Smack 实验,还需要进入 Security options 菜单,取消选定 SELinux,并选择下一个选项 Smack。您还需要将 /boot/grub/grub.conf 中的 default 引导项改为 0 而不是 1。

    现在我们试试 liblxc。“LXC:Linux 容器工具” 详细描述了 liblxc 的基本用法,因此这里不再细谈。仅需使用 container_setup.sh 脚本(参见 下载 小节)设置网桥(bridge),容器网络设备将在此进行对话。它还会清除防火墙(默认情况下不处理网桥),并且在进行 Smack 实验时设置 Smack 策略(我们稍后将在文件 /etc/smackaccesses 中创建)。每次重新引导之后必须运行 container_setup.sh,或者设置为在引导时自动运行它(如果知道怎么做的话)。

    现在已经准备好虚拟机!我们来试试 liblxc。可以从 lxc.sf.net 通过 cvs 下载最新的源代码,并按照以下方法编译它:

   cvs -d:pserver:anonymous@lxc.cvs.sourceforge.net:/cvsroot/lxc login
cvs -z3 -d:pserver:anonymous@lxc.cvs.sourceforge.net:/cvsroot/lxc co -P lxc
cd lxc
./bootstrap && ./configure && make && make install



    现在,如果您查看 README 文档的话,将发现有好几个入口点可以选择。容器是非常轻量级的,因为它们与系统共享许多资源 —— 包括文件系统。但我们的目标是提供一些简单的隔离,因此将使用脚本 lxc-debian 为每个容器创建完整的 debian chroot 映像。首先创建一个名为 vsplain 的容器:

mkdir  splain
cd  splain
lxc-debian create
    container name: vsplain
    hostname: vsplain
    IP 10.0.2.20
    gateway: 10.0.2.2



    这个容器的配置存储在 /usr/local ar/lxc splain 目录下。如果查找名为 cgroup 的文件,将会看到一些以 devices. 开头的行。这些是设备白名单 cgroup 的指令,它协调由容器执行的设备创建、读和写。

    使用命令 lxc-start -n vsplain 启动这个容器。这时将出现登录提示。通过不需要密码的根用户名登录到容器。最后,当容器运行时,则需要执行下面的命令:

   apt-get install openssh-server
apt-get install apache



    现在可以使用 ssh 技术安全地从 kvm 主机转移到容器,并使用 vsplain 和主机的 ip 地址(分别是 10.0.2.20 和 10.0.2.15)查看它的 Web 页面。您随时可以通过命令 lxc-stop -n vsplain 从 kvm 主机的根终端关闭容器。

    在这里,通过从这个模板克隆两个新的虚拟机可以节省一些时间。关闭 vm 并执行:

    cp vm.img selinux.img
cp vm.img smack.img


受 SELinux 保护的容器

    我们将在容器上使用的 SELinux 策略包含一个 策略模块;这个模块已经发布到 refpolicy -- SELinux Reference Policy 开发邮件列表。将这个策略分别下载到 /root/vs 目录下的 vs.if、vs.fc 和 vs.te 文件中。像下面这样编译和安装新的模块:

   cp vm.img selinux.img
cp vm.img smack.img



    然后使用 lxc-debian 创建 /vs1 and /vs2 容器,并且使用


mkdir /vs1; cd /vs1
lxc-debian create
    container name: vs1
    hostname: vs1
    address: 10.0.2.21
    gateway: 10.0.2.2
    arch: 2 (i386)
mkdir /vs2; cd /vs2
lxc-debian create
    container name: vs2
    hostname: vs2
    address: 10.0.2.22
    gateway: 10.0.2.2
    arch: 2 (i386)
fixfiles relabel /vs1
fixfiles relabel /vs2



    重新标记它们的文件系统。
    在启动容器时(例如通过使用命令 lxc-start -n vs1),很可能会收到一些关于 SELinux 访问拒绝的审计消息。但不要担心 —— 容器将正常启动,并且会启用网络服务并 隔离容器。如果在启动容器之前使用 mount --bind / /vs1/rootfs.vs1/mnt 帮助容器 vs1 进行伪装,那么您将会发现,即使是根用户,也会重用 ls /mnt/root。

    为了了解其中的原理,我们看看 vs.if 接口文件。这个文件定义一个称为 container 的接口,它带有一个参数(即容器将要定义的基本名称)。vs.te 文件使用容器名 vs1 和 vs2 两次调用这个函数。在这个接口中,$1 被扩展到这个参数,因此当我们调用 container(vs1) 时,$1_t 就会变成 vs1_t(从这里开始,假设我们定义的是 vs1)。

    包含 vs1_exec_t 内容的行是最重要的。这个容器以 vs1_t 类型运行。当 unconfined_t 执行容器的 /sbin/init(类型为 vs1_exec_t)时,它将进入这种类型。

    剩余的策略主要是授与容器充分的特权,以访问系统的各个部分:网络端口、设备和控制台等。该接口很长,这是由现有 SELinux 引用策略的细粒度特性决定的。正如我们将要看到的一样,受 Smack 保护的容器具有更加简单的策略;但是它在系统服务行为失误时提供的灵活保护要少得多。

    还有一件事情需要做。需要注意的是,虽然容器不能够重写它的 $1_exec_t(即 /sbin/init),但它能够执行

    mv /sbin /sbin.bak
mkdir /sbin
touch /sbin/init



    生成的 /sbin/init 的类型为 vs1_file_t。容器管理员为什么需要这样做呢?因为它会在 unconfined_t 域中启动容器,包括 ssh daemon,这使他能够获得有特权的 shell,并且能够绕过我们将要实施的 SELinux 限制。

    为了避免这样做,需要通过定制脚本实际启动容器,并在启动容器前将 sbin/init 重新标记为 vs1_exec_t。事实上,如果容器管理员不介意的话,可以将一个 init 原始副本复制回容器中并重新标记它。但我们仅重新标记现有的 init:

    cat >> /vs1/vs1.sh << EOF
#!/bin/sh
chcon -t vs1_exec_t /vs1/rootfs.vs1/sbin/init
lxc-start -n vs1
EOF
chmod u+x /vs1/vs1.sh



    现在需要使用 /vs1/vs1.sh 启动容器,而不是使用 lxc-start 手工启动。

受 Smack 保护的容器

    在启用 Smack 时重新编译内核。您必须能够进入 /root/rpmbuild/BUILD/kernel*/linux* 目录的 make menuconfig,然后转到 security 菜单禁用 SELinux 并启用 Smack。接下来仅需重复步骤 make && make modules_install && make install。

    此外,也要停止用户空间对 SELinux 的配置。这可以在 SELinux 管理 GUI 上实现,或编辑 /etc/selinux/config 并设置 SELINUX=disabled。要在引导时安装 Smack 策略还需要几个步骤:

mkdir /smack
cd /usr/src
wget http://schaufler-ca.com/data/080616/smack-util-0.1.tar
tar xf smack-util-0.1.tar; cd smack-util-0.1
make && cp smackload /bin



    实际的 Smack 策略类似于清单 1:


    清单 1. smackaccesses

vs1 _ rwa
_ vs1 rwa
vs2 _ rwa
_ vs2 rwa
_ host rwax
host _ rwax



    应该将它复制到一个名为 /etc/smackaccesses 的文件中。下次运行 /bin/container_setup.sh 时会将这个文件加载到 smackload。

    这个策略十分简单。默认情况下,任何标签都可以读取标记有 _ 的数据。我们为容器不能访问的主机的私有数据定义一个新标签 host;并且将这个标签应用到 container_setup.sh 脚本中的 cgroups 文件系统。其他敏感文件,比如 /etc/shadow,应该使用这个标签。

    我们对 vs1 和 vs2 进行定义以标记容器。默认情况下,它们能够访问自己的数据。我们添加一个规则使它们可以写 _,从而允许发送网络包。由于 vs1 不能访问 vs2 数据(反之亦然),因此容器之间是彼此独立的。

    如前所述,由 CAP_MAC_ADMIN 和 CAP_MAC_OVERRIDE 功能决定定义或绕过 Smack 规则的能力。因此,容器不应该具有这些能力。这可以通过 helper 程序 dropmacadmin.c 来实现(参见 下载 小节)。必须静态地编译它,因为来自主机的容器有不同的版本:

   gcc -o dropmacadmin dropmacadmin.c -static
cp dropmacadmin /bin/



    创建一个称为 vs1 的新容器:

  mkdir /vs1; cd /vs1
lxc-debian create
    container name: vs1
    hostname: vs1
    address: 10.0.2.21
    router: 10.0.2.2
    arch: 2 (i386)



    使用标签 vs1 标记 vs1 文件系统中的所有文件:

    for f in `find /vs1/rootfs.vs1`; do
    attr -S -s SMACK64 -V vs1 $f
done

现在需要创建一个能够安全启动容器的脚本。这意味着它能将自己的进程标签设置为 vs1,并通过 dropmacadmin 打包容器的 /sbin/init。如下所示:

cat >> /vs1/vs1.sh << EOF
#!/bin/sh
cp /bin/dropmacadmin /vs1/rootfs.vs1/bin/
attr -S -s SMACK64 -V vs1 /vs1/rootfs.vs1/bin/dropmacadmin
echo vs1 > /proc/self/attr/current
lxc-start -n vs1 /bin/dropmacadmin /sbin/init
EOF
chmod u+x /vs1/vs1.sh



    再做一件事情就可以让 vs1 在其即将装载的 tmpfs 文件系统上执行写操作:


sed -i 's/defaults/defaults,smackfsroot=vs1,smackfsdef=vs1/' \\
    /vs1/rootfs.vs1/etc/fstab



    这导致在 /dev/shm 上装载 tmpfs 文件系统,以带上 vs1 标签,从而让 vs1 可以对它执行写操作。否则,vs1 init 脚本将不能在设置网络时创建需要使用的 /dev/shm/network 目录。类似地,如果希望使用基于 ram 的 /tmp,使用相同的选项即可。

    现在,我们再次帮助 vs1 进行伪装。像创建 vs1 那样创建 vs2,在每个步骤中将 vs1 替换为 vs2。然后在 vs1 的 /mnt 下绑定装载根文件系统:

  mount --bind /vs1 /vs1
mount --make-runbindable /vs1
mount --rbind / /vs1/rootfs.vs1/mnt



    使用 vs1.sh 启动容器。注意,您还可以从 kvm 主机看到 vs1 和 vs2 上的 Web 页面。此外还要注意,vs1 不能通过网络访问 vs2。它也不能查看 vs2 的文件:

vs1:~# ls /mnt/
  (directory listing)
vs1:~# ls /mnt/vs2/rootfs.vs2
  ls:/mnt/vs2/rootfs.vs2: Permission denied
vs1:~# mkdir /cgroup
vs1:~# mount -t cgroup cgroup /cgroup
vs1:~# ls /cgroup
  ls:/mnt/vs3: Permission denied
vs1:~# mknod /dev/sda1 b 8 1
  mknod: `/dev/sda1': Operation not permitted
vs1:~# mount /mnt/dev/sda1 /tmp
  mount: permission denied



    它能查看主机文件系统。对于需要保护的任何东西,可以使用 host 标签进行标记。在 cgroup 文件系统上就采用了这种做法,这正是 ls /cgroup 失败的原因。

    最后,设备白名单 cgroup 防止我们创建磁盘设备,或在它存在的情况下装载它(因为这需要通过 /mnt 来完成)。

    当然,我们的设置方式让容器管理员可以删除 /mnt/dev/sda1,或用其他方法扰乱主机,因此除了用于演示外,这种绑定装载是不如人意的!

    注意,在 SELinux 系统上,默认(且容易的)路由允许容器通过网络彼此进行对话,而在 Smack 中则恰好相反。目前,允许容器彼此对话还是比较困难的。不久以后,将可以在 IP 地址上设置标签,并且允许建立策略以实现容器之间的通信。

    在如何建立 Smack 网络方面还有另一个问题。命令 kill -9 -1 终止系统上的每个任务。当这个操作由容器中的任务执行时,它将仅终止同一容器中的任务。这种行为已经在上游内核中得到修复,但我们使用的 Fedora 10 内核还存在该问题。因此,每个任务都会发出一个 -9 信号。

    在受 SELinux 保护的容器中,SELinux 阻止该信号通过容器边界,因此 kill -9 -1 实际上是安全的。但在 Smack 中,默认情况下任务被标记为 _(就像网络一样),因此由于我们允许容器执行 _ 写操作以写到网络中,并且终止任务在 Smack 中被认为是写访问,所以允许容器管理员在整个系统上终止任何任务。

    另一个缺点(SELinux 容器仍然存在该缺点)与 Unix98 伪终端有关。打开两个图形化终端。在第一个终端中,启动 vs1 并查看 /dev/pts。您将看见至少两个条目(0 和 1),它们分别属于每个终端。可以从 vs1 容器写入到与另一个终端对应的条目。

    对于 Fedora 内核,有两个解决方案。可以使用设备白名单 cgroup 拒绝容器打开设备。但是这必须在容器每次启动时手动操作,以允许它访问自己的终端;或者应用 SELinux 和 Smack 标签,结果是一样的。

    更新的 2.6.29 内核支持 devpts 名称空间。容器必须重新装载 /dev/pts,在这个操作之后,它将不能访问属于主机或其他容器的 devpts 条目。


    结束语

    本文介绍了构建受 LSM 保护的容器所需的工具,但还有很多工作需要做:

    对于 Smack,必须选择需要标记为 host 的文件。
    对于 SELinux,应该对其进行调优,然后将一个 container 接口放置到上游引用策略。
    尽管这些工作正在进行当中,在获得更多关于受 LSM 保护的容器的经验之前,您不应该完全信赖这些机制来阻止不可信的根用户。

    尽管目前在创建容器方面还没有最佳实践,但仍然有一些想法是值得考虑的。首先,记住您正试图实现两个有些矛盾的目标:最小化容器(以及主机)之间的复制,同时需要确保安全隔离。实现这些目标的方法之一是,创建一个最小的完整 rootfs,其中不运行任何容器,并且将它的类型标记为所有容器都可以读取的类型。然后使用 lxc-sshd 脚本的定制版本创建每个基于原型的实际容器,以为容器的大部分文件系统创建只读装载,同时为容器提供一个可以存储文件的私有可写位置(比如 /scratch)。由于每个容器都有一个私有的装载名称空间,所以它能够绑定装载任何私有的和/或对于其私有共享目录可写的文件或目录。例如,如果它需要一个私有 /lib,则可以执行 mount --bind /scratch/rootfs/lib /lib。同样地,管理员也能确保每个容器都在启动时执行 mount --bind /scratch/shadow /etc/shadow。

    对于 SELinux 和 Smack,我演示的这个方法的一个明显缺点就是容器管理员不能在自己的容器的内部利用 LSM 控制信息流。并且为简单起见,容器中的所有任务都使用 MAC 策略统一处理。在另一篇文章中,我将探讨如何允许容器管理员指定自己的 LSM 策略,同时又能够约束它们。

    致谢

    Smack 的作者 Casey Schaufler 为构建受 Smack 保护的容器提供了帮助,Dan Walsh 提供了关于 SELinux 策略的反馈。我在此对他们表示衷心感谢!
6# 2010-9-10 10:18:41 回复 收起回复
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-10 10:23:00 | 显示全部楼层

SELinux案例分析

一、SELinux简介

RedHat Enterprise Linux AS 3.0/4.0中安全方面的最大变化就在于集成了SELinux的支持。

SELinux的全称是Security-Enhanced Linux,是由美国国家安全局NSA开发的访问控制体制。

SELinux可以最大限度地保证Linux系统的安全。至于它的作用到底有多大,举一个简单的例子可以证明:

没有SELinux保护的Linux的安全级别和Windows一样,是C2级,但经过保护SELinux保护的Linux,安全级别则可以达到B1级。如:我们把/tmp目录下的所有文件和目录权限设置为0777,这样在没有SELinux保护的情况下,任何人都可以访问/tmp 下的内容。而在SELinux环境下,尽管目录权限允许你访问/tmp下的内容,但SELinux的安全策略会继续检查你是否可以访问。

NSA推出的SELinux安全体系结构称为 Flask,在这一结构中,安全性策略的逻辑和通用接口一起封装在与操作系统独立的组件中,这个单独的组件称为安全服务器。SELinux的安全服务器定义了一种混合的安全性策略,由类型实施 (TE)、基于角色的访问控制 (RBAC) 和多级安全(MLS) 组成。通过替换安全服务器,可以支持不同的安全策略。SELinux使用策略配置语言定义安全策略,然后通过checkpolicy 编译成二进制形式,存储在文件(如目标策略/etc linux/targeted/policy/policy.18)中,在内核引导时读到内核空间。这意味着安全性策略在每次系统引导时都会有所不同。

SELinux的策略分为两种,一个是目标(targeted)策略,另一个是严格(strict)策略。有限策略仅针对部分系统网络服务和进程执行SELinux策略,而严厉策略是执行全局的NSA默认策略。有限策略模式下,9个(可能更多)系统服务受SELinux监控,几乎所有的网络服务都受控。配置文件是/etc linux/config,一般测试过程中使用“permissive”模式,这样仅会在违反SELinux规则时发出警告,然后修改规则,最后由用户觉得是否执行严格“enforcing”的策略,禁止违反规则策略的行为。

规则决定SELinux的工作行为和方式,策略决定具体的安全细节如文件系统,文件一致性。


在安装过程中,可以选择“激活”、“警告”或者“关闭”SELinux。默认设置为“激活”。

安装之后,可以在“应用程序”-->“系统设置”-->“安全级别”,或者直接在控制台窗口输入“system-config- securitylevel”来打开“安全级别”设置窗口。在“SELinux”选项页中,我们不但可以设置“启用”或者“禁用”SELinux,而且还可以对已经内置的SELinux策略进行修改。

SELinux相关命令:

ls -Z

ps -Z

id -Z

分别可以看到文件,进程和用户的SELinux属性。

chcon 改变文件的SELinux属性。

getenforce tenforce查看和设置SELinux的当前工作模式。

修改配置文件/etc linux/config后,需要重启系统来启动SELinux新的工作模式。


二、案例分析

Apache - "Document root must be a directory" 问题?

有可能和这个问题并发的问题还有 403 Forbidden 禁止访问的问题。

现象描述:

不使用系统默认的  ar/www ml作为系统的Document Root,自己新建一个目录后修改/etc tpd/conf tpd.conf 中的配置,然后重起Apache的Daemon,发现Apache无法起动,系统报错:

  Document root must be a directory

但是,我们设置的DocumentRoot 的确是一个目录,而且apache用户具有可读权限。

另一种情况:新建一个虚拟目录或文件后,无法访问,显示 Forbidden, 403 Error,但文件或目录有可读权限。

问题产生的原因:

一开始想来想去想不出为什么,但是给我感觉是权限的问题,用传统的Linux的思维方式来看,权限绝对没有问题。但是仔细一想,SELinux是不是会有其他安全的设定?

检查 avcmessage,查看  ar/log/messages文件,发现有类似以下内容的这样一段:

Dec 24 17:54:59 hostname kernel: audit(1098222899.827:0): avc:

denied{ getattr } forpid=19029 exe=/usr/sbin tpd

path= ar/www ml/about.html dev=dm-0 ino=373900

scontext=root:system_r:httpd_t tcontext=user_ubject_r:user_home_t

tclass=file

嘿嘿,问题找到了,果然是SELinux的新特性搞的鬼。我把目录或文件设成了user_home_t类型,因此apache的进程没有权限,无法访问。针对Apache的进程所使用的SELinux target policy规定了apache的进程只能访问httpd_sys_content_t类型的目录或文件。

解决办法:

很简单,把目录或文件的策略类型改成 httpd_sys_content_t 就可以了。

# chcon -t httpd_sys_content_t [file_name | dir_name]

然后可以用 ls -laZ 命令查看文件目录的策略类型。
7# 2010-9-10 10:23:00 回复 收起回复
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-10 10:25:54 | 显示全部楼层

SELinux 的网络安全设计

号称全世界最安全的操作系统,由美国国安局所推行的SELinux ,在日前发表它对安全政策的支持文件。其中包含它的Flask架构与AVC组件,提供相当弹性的支持操作系统的程序管理、档案管理、网络连结管理等方面的信息安全要求,以达到建构安全服务器的目的。
  
  AVC是access vector cache的缩写,这个技术可以提升SELinux因为执行安全检查任务所损失的效能。透过avc_init()等函数与相关的数据结构如:
  typedef struct avc_audit_data {
  char type;
  #define AVC_AUDIT_DATA_FS 1
  #define AVC_AUDIT_DATA_NET 2
  union {
  struct {
  struct dentry *dentry;
  struct inode *inode;
  } fs;
  struct {
  char *netif;
  struct sk_buff *skb;
  struct sock *sk;
  __u16 port;
  __u32 daddr;
  } net;
  } u;
  } avc_audit_data_t;
  等,来组成kernel呼叫的界面,再配合对安全服务器所提供的avc_ss_grant等函数来完成整个加速机制。
8# 2010-9-10 10:25:54 回复 收起回复
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-10 10:29:23 | 显示全部楼层

解决新的SELinux安全级别产生问题(图)

在Fedora Core 3 Linux发布版中,你运行PHP或者类似的其它脚本的文件或者目录操作的时候,可能会出现这样一个异常:"failed to open stream: Permission denied in ..."。这很容易让我们联想到权限问题,那么我们按照常规会把这个文件或者目录的权限设置为777,但是很遗憾,在这个版本中这样做或许并不能解决这个问题。
  
  这是因为新的SELinux内核只允许apache用户仅仅在/tmp目录中进行这样的操作(或许有别的可能和原因),解决这个问题必须关闭SELinux的安全级别的相关特性,允许apache用户可以操作其它目录,请看下面的详细步骤和图示:
  
  有如下PHP代码:
  if (!file_exists("count")) //如果文件count不存在
  {
  $file=fopen("count","w+"); //创建count文件并写入
  fwrite ($file,"000001"); //写入
  fclose ($file); //关闭文件
  }
  
  运行之后,出现异常:
  Warning: fopen(count): failed to open stream: Permission denied in /var/www/html/count.php on line 4
  
  Warning: fwrite(): supplied argument is not a valid stream resource in /var/www/html/count.php on line 5
  
  Warning: fclose(): supplied argument is not a valid stream resource in /var/www/html/count.php on line 6
  
  打开“应用程序”->“系统设置”->“安全级别”:
   2005.11.26.10.4.27.8.122222.jpg

 
    2005.11.26.10.4.35.8.233333.jpg

  确定修改之后,记得一定要重新启动防火墙和Apache服务器。再次运行上面的代码,程序运行正常。
9# 2010-9-10 10:29:23 回复 收起回复
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-10 10:31:26 | 显示全部楼层

vsFTPd服务器和防火墙及SELINUX关系

1.vsFTPd的服务器和防火墙及SELINUX的关系

    在论坛上看到有些弟兄说vsFTPd服务器启动正常,但却不能访问或用户不能上传文件,我感觉应该是防火墙或SELINUX的事;可能FTPD服务器被防火墙或SELINUX的安全机制防住了。所以您必须要让防火墙通过ftp,当然也要让SELINUX通过ftp服务器才行;

    在Fedora/Redhat/CentOS中,您要设置一下防火墙,可以把防火墙关掉,或者在自定义中让ftp “通过”防火墙;

    [root@localhost ~]# system-config-securitylevel-tui

    或者运行一下如下的命令,清除防火墙规则(通用);

    [root@localhost beinan]# iptables -F

    关于SELINUX服务器的解说 ,可能老手或新手对SELINUX都有点麻烦,建议您SELINUX;或者让vsFTPd服务器跳过SELINUX启动;这在Fedora/Redhat/CentOS中这样启动vsFTPd服务器是有效的;

    当然您可也可以关掉SELINUX,在/etc linux/config 配置文件如下;

    /etc linux/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=Disabled #这样就把SELINUX服务器关掉了,请重新启动系统;
    # SELINUXTYPE= type of policy in use. Possible values are:
    # targeted - Only targeted network daemons are protected.
    # strict - Full SELinux protection.
    SELINUXTYPE=targeted

    2.500 OOPS: vsftpd: refusing to run with writable anonymous root

    如果我们已经把vsFTPd服务器启动好了,但登录测试是会出现类似下面的提示;

    500 OOPS: vsftpd: refusing to run with writable anonymous root

    这表示ftp用户的家目录的权限不对,应该改过才对;

    [root@localhost ~]# more /etc/passwd |grep ftp
    ftp:x:1000:1000:FTP User: ar/ftp:/sbin/nologin

    我们发现ftp用户的家目录在 ar/ftp,就是这个 ar/ftp的权限不对所致,这个目录的权限是不能打开所有权限的;是您运行了chmod 777  ar/ftp所致;如果没有ftp用户这个家目录,当然您要自己建一个;

    如下FTP用户的家目录是不能针对所有用户、用户组、其它用户组完全开放;

    [root@localhost ~]# ls -ld  ar/ftp
    drwxrwxrwx 3 root root 4096 2005-03-23  ar/ftp

    修正这个错误,应该用下面的办法;

    [root@localhost ~]# chown root:root  ar/ftp
    [root@localhost ~]# chmod 755  ar/ftp

    有的弟兄可能会说,那匿名用户的可读、可下载、可上传怎么办呢?这也简单,在 ar/ftp下再建一个目录,权限是777的就行了,再改一改vsftpd.conf就OK了;没有什么难的;

    vsFTPd出于安全考虑,是不准让ftp用户的家目录的权限是完全没有限制的,您可以去读一下vsFTPd的文档就明白的了;否则也不能称为最安全的FTP服务器了,对不对?
10# 2010-9-10 10:31:26 回复 收起回复
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-10 10:32:44 | 显示全部楼层

利用RHEL5来为SELinux做辩护

安全增强Linux(Security Enhanced Linux),也就是SELinux的推出被称为是IT管理者们确保Linux系统安全和平稳运行的一种可自由支配的强大工具。SELinux是由美国国家安全局(NAS)开发的强制访问控制的实现,目前,SELinux已经被整合到大部分主流Linux版本之中。

  “SELinux可以阻止偷窃行为,可以阻止垃圾信息传播并防止“蠕虫”攻击网站。”Red Hat公司的首席软件工程师Dan Walsh说,他同时也是SELinux工程的一名正式参与者。据Walsh所说,IT管理者们应该让SELinux在数据中心的方方面面随时都处于打开状态。

  问题是,如今许多用户都让SELinux处于关闭状态(SELinux已经内置到Red Hat 企业版Linux系统当中)。

  SELinux开放源码安全技术在其确保高度安全方面被广泛认可的同时,同时也被认为过于复杂。RHEL 5(Red Hat 企业版Linux 5系统)包含了大量的新工具和管理特征以解决这一问题,但这是否已经太晚了呢?

  SELinux: 事实与认知

  “SELinux最大的问题在于人们对它的认知,”位于加利福尼亚的Saugus联盟学区的信息服务与技术主管Jim Klein说,“它因为早期缺少配置工具和故障排除工具而恶名在先,这正是人们选择关闭它的原因。”

  Klein说,对于SELinux倡导者来说不幸的是,当管理者为系统检查故障时,第一个问题往往是“SElinux是打开的吗?”他还说,在他的数据中心SELinux是关闭的,而且除非地区转向使用RHEL5的计划完成,他是不打算让它恢复活动状态的。

  尽管如此,Red Hat公司的Walsh还是说SELinux的“复杂性问题”会逐渐得到解决。在San Diego举行的Red Hat年度峰会中,Walsh表示他最近分解了SELinux,目前应用安全技术在Red Hat企业版Linux5系统中是默认打开的。RHEL4中也是包含SELinux的,但只有RHEL5出现以后,Walsh和其他SELinux专家才可以放心宣称“让SELinux处处打开”。

  “RHEL4像是该项技术的范例,”Walsh说,“我们将其划分为一定数量的域,或者说是15个可由应用程序访问的目标程序组。”

  然而,在RHEL5之中目标程序组达到了200个。Walsh又一次重申,“RHEL5的目标是让SELinux无处不开。”

  SELinux: 复杂,但故障排解器可以提供帮助

  身为作家和SELinux专家的Frank Meyer对SELinux的了解程度可以超越大多数人。

  他说:“我并不想谴责专门提出‘复杂性’问题的人。但这种感知的产生是因为SELinux具有保护Linux内核提供的任何事务的能力,而Linux内核本身就很复杂。”

  依Meyer看来,当用户声称SELinux因为太过复杂而不能有效配置时,就相当于在声称他们不能应用Linux内核是因为他们不知道该如何写一个设备驱动程序。“从逻辑上来说,这是没有意义的。”他说。

  为了回应这种感知,Red Hat已经在RHEL5中引入了SELinux故障排解器(Troubleshooter),故障排解器(Troubleshooter)也被称为故障排解集合(settroubleshoot),是一个为存取向量高速缓存(AVC)消息监视稽核记录文件的工具。

  根据Fedora项目网站所言,用户、系统管理员和开发者经常遇到AVC拒绝的冲突。Fedora项目网站是开展大部分SELinux与Red HatLinux构架测试的地方。当SELinux经过充分调试和合理配置之后,AVC拒绝只会由实际的安全性入侵触发。然而,由于SELinux仍然是新技术,策略尚处于开发状态,因此大部分的AVC拒绝并不是由实际的安全性入侵引起的。此外,用户尚处于学习配置SELinux的过程中,也是AVC拒绝发生的一个原因。

  目前,当AVC拒绝发生时,故障排解器就会运行SELinux插件数据库来寻找匹配,并向用户发送一条包含问题描述和建议方案的消息。像Meyer和Walsh这样的行业观察者认为,这一工具对于帮助用户区分真正问题和虚假警报大有帮助,而区分真正问题和虚假警报正是阻碍SELinux在IT管理者中应用的主要原因。

  Klein说,故障排解器是一项受欢迎的附加工具,但对帮助解决SELinux的认知问题来说可能出现得太晚了。他说,故障排解器及其同类是“管理者们认真考虑是否重新启用SELinux的出发点,”但是,“困难在于说服那些已经把SELinux看作‘所有问题根源’的人员不要在问题出现时就简单地把它关闭。”

  Klein说,至今为止,Saugus已经将大部分服务器上的SELinux关闭。在等待SELinux工具和策略的成熟化的过程中,以传统设置作为保证应用程序安全的默认设置。
11# 2010-9-10 10:32:44 回复 收起回复
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-10 10:34:25 | 显示全部楼层

RHEL5中不用关闭SELinux而成功启动Samba

RHEL5中的samba服务器启动后,能看到共享目录,但是不能访问共享目录,告知权限不够。此时可以通过如下命令:

    tail  ar/log/message看到如此提示:

    '/home/lyy' does not exist or permission denied when connecting to [lyy] Error was 权限不够

    SELinux is preventing the samba daemon from reading users home directories.For complete SELinux messages. run sealert -l a0c1c154-bc37-44f5-a6eb-cfc88fed18b9

    根据提示运行:

    sealert -l a0c1c154-bc37-44f5-a6eb-cfc88fed18b9

    可看到另外更详细的提示,再根据提示

    Allowing Access

    If you want samba to share home directories you need to turn on the

    samba_enable_home_dirs boolean: "setsebool -P samba_enable_home_dirs=1"

    The following command will allow this access:

    setsebool -P samba_enable_home_dirs=1

    运行:

    setsebool -P samba_enable_home_dirs=1

    等运行成功后,就能正常访问目录了。-P参数是永久有效的意思。

    注意setsebool放在/usr/sbin中,如果系统提示setsebool命令找不到,加入上述路径即可。
12# 2010-9-10 10:34:25 回复 收起回复
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-10 10:36:34 | 显示全部楼层

Linux系统安全工具之:Sxid和Skey

下面介绍一些可以用于 Linux 的安全工具,这些工具对于固化您的服务器将起到一定的作用,可以解决各方面的问题。我们的重点只是想让您了解这些工具,对安装配置以及使用不会给出很详细的介绍。一些安全问题例如 suid 是什么,缓冲溢出是什么等概念性的东西也不属于本文讨论的范围。

  介绍这些工具的目的只是给您一个提示的方向,并不是让您拘泥于这些工具。毕竟安全是一个过程,不是一个产品。

  一、Sxid

  sxid 是一个系统监控程序。它可以监视系统中 suid,sgid 文件以及没有属主的变化。并且以可选的形式报告这些改变,你可以在配置文件中设置用 email 的形式通知这些改变,也可以不使用 email 而直接在标准输出上显示这些变化。Suid,sgid 文件以及没有属主的文件很有可能是别人放置的后门程序,这些都是您所要特别注意的。

  你可以从下面的网址获得 sxid:ftp://marcus.seva.net/pub/sxid/

  如果您安装过其他工具,那么您一定也会安装这个工具,它在安装上没有什么特别的地方。

  缺省安装的时候,配置文件为 /usr/local/etc/sxid.conf,这个文件中有很明显的注释很容易看懂。在这个文件中定义了 sxid 的工作方式。日志文件缺省为  ar/log/sxid.log,日志文件的循环次数在 sxid.conf 文件中定义。您可以在配置固定后把 sxid.conf 设置为不可改变,把 sxid.log 设置为只可添加(使用 chattr 命令)。

  您可以用 sxid -k 加上 -k 选项来进行检查,这时检查很灵活,既不记入日志,也不会发出 email。这样您就可以随时做检查。但是我还是建议您把检查放入 crontab 中,使用 crontab -e 编辑加入下面的条目:

  0 4 * * * /usr/bin/sxid

  表示每天上午 4 点执行这个程序。

  如果您还想了解更详细的信息,可以参考:

  man sxid

  man 5 sxid.conf

  二、Skey

  您认为您的密码安全吗?即使您的密码很长,有很多特殊字符,解密工具很难破解,但您的密码在网络中传送时是以明文形式的,在以太网中随便一个嗅探器就可以截取您的密码。现在在交换环境中也能实现这种技术。在这种情况下,skey 对您来说是一个选择。

  Skey 是一次性口令的一个工具。它是一个基于客户服务器的应用程序。首先在服务器端可以用 keyinit 命令为每个用户建立一个 skey 客户,这个命令需要指定一个秘密口令,然后就可以为客户端的用户产生一次性口令列表。当用户通过 telnet,ftp 等与服务器进行连接时就可以按照一次性口令列表中的口令顺序输入自己的密码,下次再连接时候密码就换成了列表中的下一个。

  可以从下面的网址获得 skey:ftp://ftp.cc.gatech.edu/ac121/Li ... k/sunacm/other/skey

  skey 的服务器端使用有下面的步骤:

  1.使用下面的命令初始化用户 mary:

  keyinit mary

  keyinit 每次为用户生成 99 个一次性口令,这时就会在 /etc/skeykeys 文件建立这个用户,该文件中保存了服务器端计算下一个一次性口令的一些信息。用上面的 keyinit 命令时就会在 /etc/skeykeys 中有下面的记录:

  mary 0099 to25065 be9406d891ac86fb Mar 11, 2001 04:23:12

  上面的记录中从左到右依次是用户名,要使用的一次性口令序号,口令的种类,16 进制表示的口令,日期和时间。

  2.将一次性口令列表提供给 mary

  您可以打印出口令列表然后送给 mary。这样比较安全,密码不会在网络中传递。

  3.为 mary 修改缺省的登陆 shell 为 /usr/local/bin/keysh

  由于 PAM 的作用,mary 登陆时要输入密码,她输入这个一次性口令后服务器端要对这个口令进行校验,校验通过连接就被许可了。

  可能有些用户不喜欢书面的口令列表,用户可以使用 key 命令在自己的客户端得到一次性口令。您可以通过开两个窗口,一个对服务器进行连接获得一次性口令的种类和序号,然后在另一个窗口用 key 命令根据口令的种类和序号获得所要的密码。但是必须提醒您,您这样的方便是以一定的危险性为代价的。

  如果您的缺省的 99 个口令用完了,您可以使用 keyinit -s 刷新口令列表。

  在 /usr/src/skey/misc 目录中有许多其他的替换 keysh 的提供其他服务的程序,例如:su,login,ftp 等等。这样您可以应付不同的服务的连接请求了。

  为了安全,您最好设置一下/etc/skeykeys 文件的属性和权限。
13# 2010-9-10 10:36:34 回复 收起回复
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-10 10:39:39 | 显示全部楼层

经典:Linux安全配置步骤大全

一、磁盘分区

  1、如果是新安装系统,对磁盘分区应考虑安全性:

  1)根目录(/)、用户目录(/home)、临时目录(/tmp)和 ar目录应分开到不同的磁盘分区;

  2)以上各目录所在分区的磁盘空间大小应充分考虑,避免因某些原因造成分区空间用完而导致系统崩溃;

  2、对于/tmp和 ar目录所在分区,大多数情况下不需要有suid属性的程序,所以应为这些分区添加nosuid属性;

  方法一:修改/etc/fstab文件,添加nosuid属性字。例如:

  /dev a2 /tmp ext2 exec,dev,nosuid,rw 0 0

  方法二:如果对/etc/fstab文件操作不熟,建议通过linuxconf程序来修改。

  运行linuxconf程序;

  选择"File systems"下的"Access local drive";

  选择需要修改属性的磁盘分区;

  选择"No setuid programs allowed"选项;

  根据需要选择其它可选项;

  正常退出。(一般会提示重新mount该分区)

  二、安装

  1、对于非测试主机,不应安装过多的软件包。这样可以降低因软件包而导致出现安全漏洞的可能性。

  2、对于非测试主机,在选择主机启动服务时不应选择非必需的服务。例如routed、ypbind等。

  三、安全配置与增强

  内核升级。起码要升级至2.2.16以上版本。

  GNU libc共享库升级。(警告:如果没有经验,不可轻易尝试。可暂缓。)

  关闭危险的网络服务。echo、chargen、shell、login、finger、NFS、RPC等

  关闭非必需的网络服务。talk、ntalk、pop-2等

  常见网络服务安全配置与升级

  确保网络服务所使用版本为当前最新和最安全的版本。

  取消匿名FTP访问

  去除非必需的suid程序

  使用tcpwrapper

  使用ipchains防火墙

  日志系统syslogd

  一些细节:

  1.操作系统内部的log file是检测是否有网络入侵的重要线索,当然这个假定你的logfile不被侵入者所破坏,如果你有台服务器用专线直接连到Internet上,这意味着你的IP地址是永久固定的地址,你会发现有很多人对你的系统做telnet/ftp登录尝试,试着运行#more  ar/log cure   grep refused 去检查。

  2. 限制具有SUID权限标志的程序数量,具有该权限标志的程序以root身份运行,是一个潜在的安全漏洞,当然,有些程序是必须要具有该标志的,象passwd程序。

  3.BIOS安全。设置BIOS密码且修改引导次序禁止从软盘启动系统。

  4. 用户口令。用户口令是Linux安全的一个最基本的起点,很多人使用的用户口令就是简单的‘password,这等于给侵入者敞开了大门,虽然从理论上说没有不能确解的用户口令,只要有足够的时间和资源可以利用。比较好的用户口令是那些只有他自己能够容易记得并理解的一串字符,并且绝对不要在任何地方写出来。

  5./etc/exports 文件。如果你使用NFS网络文件系统服务,那么确保你的/etc/exports具有最严格的存取权限设置,不意味着不要使用任何通配符,不允许root写权限,mount成只读文件系统。编辑文件/etc/exports并且加:例如:

  /dir/to/export host1.mydomain.com(ro,root_squash)

  /dir/to/export host2.mydomain.com(ro,root_squash)

  /dir/to/export 是你想输出的目录,host.mydomain.com是登录这个目录的机器名,

  ro意味着mount成只读系统,root_squash禁止root写入该目录。

  为了让上面的改变生效,运行/usr/sbin/exportfs -a

  6.确信/etc/inetd.conf的所有者是root,且文件权限设置为600 。

[root@deep]# chmod 600 /etc/inetd.conf
ENSURE that the owner is root.
[root@deep]# stat /etc/inetd.conf
File: "/etc/inetd.conf"
Size: 2869 Filetype: Regular File
Mode: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Device: 8,6 Inode: 18219 Links: 1
Access: Wed Sep 22 16:24:16 1999(00000.00:10:44)
Modify: Mon Sep 20 10:22:44 1999(00002.06:12:16)
Change:Mon Sep 20 10:22:44 1999(00002.06:12:16)
            
    编辑/etc/inetd.conf禁止以下服务:

  ftp, telnet, shell, login, exec, talk, ntalk, imap, pop-2, pop-3, finger,

  auth, etc. 除非你真的想用它。

  特别是禁止那些r命令.如果你用ssh/scp,那么你也可以禁止掉telnet/ftp。

  为了使改变生效,运行#killall -HUP inetd

  你也可以运行#chattr +i /etc/inetd.conf使该文件具有不可更改属性。

  只有root才能解开,用命令

  #chattr -i /etc/inetd.conf

  7. TCP_WRAPPERS

  默认地,Redhat Linux允许所有的请求,用TCP_WRAPPERS增强你的站点的安全性是举手

  之劳,你可以放入

  “ALL: ALL”到/etc/hosts.deny中禁止所有的请求,然后放那些明确允许的请求到

  /etc/hosts.allow中,如:

  sshd: 192.168.1.10/255.255.255.0 gate.openarch.com

  对IP地址192.168.1.10和主机名gate.openarch.com,允许通过ssh连接。

  配置完了之后,用tcpdchk检查

  [root@deep]# tcpdchk

  tcpchk是TCP_Wrapper配置检查工具,

  它检查你的tcp wrapper配置并报告所有发现的潜在/存在的问题。

  8. 别名文件aliases

  编辑别名文件/etc/aliases(也可能是/etc/mail/aliases),移走/注释掉下面的行。

# Basic system aliases -- these MUST be present.
MAILER-DAEMON: postmaster
postmaster: root
# General redirections for pseudo accounts.
bin: root
daemon: root
#games: root ?remove or comment out.
#ingres: root ?remove or comment out.
nobody: root
#system: root ?remove or comment out.
#toor: root ?remove or comment out.
#uucp: root ?remove or comment out.
# Well-known aliases.
#manager: root ?remove or comment out.
#dumper: root ?remove or comment out.
#operator: root ?remove or comment out.
# trap decode to catch security attacks
#decode: root
# Person who should get roots mail
#root: marc
            
    最后更新后不要忘记运行/usr/bin/newaliases,使改变生效。

  9.阻止你的系统响应任何从外部/内部来的ping请求。

  既然没有人能ping通你的机器并收到响应,你可以大大增强你的站点的安全性。你可以加下面的一行命令到/etc/rc.d/rc.local,以使每次启动后自动运行。

  echo 1 >; /proc/sys/net/ipv4/icmp_echo_ignore_all

  10. 不要显示出操作系统和版本信息。

  如果你希望某个人远程登录到你的服务器时不要显示操作系统和版本信息,你能改变

  /etc/inetd.conf中的一行象下面这样:

  telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd -h

  加-h标志在最后使得telnet后台不要显示系统信息,而仅仅显示login:

  11.The /etc/host.conf file

  编辑host.conf文件(vi /etc/host.conf)且加下面的行:

# Lookup names via DNS first then fall back to /etc/hosts.
order bind,hosts
# We dont have machines with multiple IP addresses on the same card
(like virtual server,IP Aliasing).
multi off
# Check for IP address spoofing.
nospoof on
IP Spoofing: IP-Spoofing is a security exploit that works by tricking
computers in a trust relationship that you are someone that you really arent.

12. The /etc curetty file

  该文件指定了允许root登录的tty设备,/etc curetty被/bin/login程序读取,它的

  格式是一行一个被允许的名字列表,如你可以编辑/etc curetty且注释出下面的行。

tty1 #tty2 #tty3 #tty4 #tty5 #tty6 #tty7 #tty8  



意味着root仅仅被允许在tty1终端登录。
 13. 特别的帐号

  禁止所有默认的被操作系统本身启动的且不需要的帐号,当你第一次装上系统时就应该做此检查,Linux提供了各种帐号,你可能不需要,如果你不需要这个帐号,就移走它,你有的帐号越多,就越容易受到攻击。

  为删除你系统上的用户,用下面的命令:

[root@deep]# userdel username 为删除你系统上的组用户帐号,用下面的命令: [root@deep]# groupdel username 在终端上打入下面的命令删掉下面的用户。 [root@deep]# userdel adm [root@deep]# userdel lp [root@deep]# userdel sync [root@deep]# userdel shutdown [root@deep]# userdel halt [root@deep]# userdel mail 如果你不用sendmail服务器,procmail.mailx,就删除这个帐号。 [root@deep]# userdel news [root@deep]# userdel uucp [root@deep]# userdel operator [root@deep]# userdel games 如果你不用X windows 服务器,就删掉这个帐号。 [root@deep]# userdel gopher [root@deep]# userdel ftp 如果你不允许匿名FTP,就删掉这个用户帐号。打入下面的命令删除组帐号 [root@deep]# groupdel adm [root@deep]# groupdel lp [root@deep]# groupdel mail 如不用Sendmail服务器,删除这个组帐号 [root@deep]# groupdel news [root@deep]# groupdel uucp [root@deep]# groupdel games 如你不用X Windows,删除这个组帐号 [root@deep]# groupdel dip [root@deep]# groupdel pppusers [root@deep]# groupdel popusers 如果你不用POP服务器,删除这个组帐号 [root@deep]# groupdel slipusers 用下面的命令加需要的用户帐号 [root@deep]# useradd username 用下面的命令改变用户口令 [root@deep]# passwd username 用chattr命令给下面的文件加上不可更改属性。 [root@deep]# chattr +i /etc/passwd [root@deep]# chattr +i /etc/shadow [root@deep]# chattr +i /etc/group [root@deep]# chattr +i /etc/gshadow  

14. 阻止任何人su作为root.

  如果你不想任何人能够su作为root,你能编辑/etc/pam.d/su加下面的行:

auth sufficient  b curity/pam_rootok.so debug
auth required  b curity/pam_wheel.so group=isd
            
意味着仅仅isd组的用户可以su作为root.

  然后,如果你希望用户admin能su作为root.就运行下面的命令。

  [root@deep]# usermod -G10 admin

  16. 资源限制

  对你的系统上所有的用户设置资源限制可以防止DoS类型攻击(denial of service attacks)

  如最大进程数,内存数量等。例如,对所有用户的限制象下面这样:

编辑/etc curity mits.con加: * hard core 0 * hard rss 5000 * hard nproc 20

你也必须编辑/etc/pam.d/login文件加/检查这一行的存在。

  session required  b curity/pam_limits.so

  上面的命令禁止core files“core 0”,限制进程数为“nproc 50“,且限制内存使用    为5M“rss 5000”。

  17. The /etc lo.conf file

  a) Add: restricted

  加这一行到每一个引导映像下面,就这表明如果你引导时用(linux single),则需要一个password.

  b) Add: password=some_password

  当与restricted联合用,且正常引导时,需要用户输入密码,你也要确保lilo.conf  文件不能被不属于root的用户可读,也免看到密码明文。下面是例子:

编辑/etc lo.conf加: boot=/dev/sda map=/boot/map install=/boot/boot.b prompt timeout=50 Default=linux restricted ?add this line. password=some_password ?add this line. image=/boot mlinuz-2.2.12-20 label=linux initrd=/boot/initrd-2.2.12-10.img root=/dev/sda6 read-only [root@deep]# chmod 600 /etc lo.conf (不再能被其他用户可读). [root@deep]# /sbin lo -v (更新lilo配置). [root@deep]# chattr +i /etc lo.conf(阻止该文件被修改)  

      18. 禁止 Control-Alt-Delete 重启动机器命令

[root@deep]# vi /etc/inittab
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
To
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now
[root@deep]# /sbin/init q
  19. 重新设置/etc/rc.d/init.d/目录下所有文件的许可权限
[root@deep]# chmod -R 700 /etc/rc.d/init.d/*

  仅仅root可以读,写,执行上述所有script file.

  20. The /etc/rc.d/rc.local file

  默认地,当你login到linux server时,它告诉你linux版本名,内核版本名和服务器

  主机名。它给了你太多的信息,如果你就希望得到提示login: ,编辑/etc/rc.d/rc.local放#在下面的行前面


# This will overwrite /etc/issue at every boot. So, make any changes you
# want to make to /etc/issue here or you will lose them when you reboot.
#echo "" >; /etc/issue
#echo "$R" >;>; /etc/issue
#echo "Kernel $(uname -r) on $a $(uname -m)" >;>; /etc/issue
#
#cp -f /etc/issue /etc/issue.net
#echo >;>; /etc/issue
            


然后,做下面的事情:
[root@deep]# rm -f /etc/issue
[root@deep]# rm -f /etc/issue.net
[root@deep]# touch /etc/issue
[root@deep]# touch /etc/issue.net

  21. 被root拥有的程序的位。

  移走那些被root拥有程序的s位标志,当然有些程序需要这个,用命令‘chmod a-s’完成这个。

  注:前面带(*)号的那些程序一般不需要拥有s位标志。

[root@deep]# find / -type f \\( -perm -04000 -o -perm -02000 \\) \\-exec ls –lg {} \\;
-rwsr-xr-x 1 root root 33120 Mar 21 1999 /usr/bin/at
*-rwsr-xr-x 1 root root 30560 Apr 15 20:03 /usr/bin age
*-rwsr-xr-x 1 root root 29492 Apr 15 20:03 /usr/bin/gpasswd
-rwsr-xr-x 1 root root 3208 Mar 22 1999 /usr/bin/disable-paste
-rwxr-sr-x 1 root man 32320 Apr 9 1999 /usr/bin/man
-r-s--x--x 1 root root 10704 Apr 14 17:21 /usr/bin/passwd
-rws--x--x 2 root root 517916 Apr 6 1999 /usr/bin/suidperl
-rws--x--x 2 root root 517916 Apr 6 1999 /usr/bin/sperl5.00503
-rwxr-sr-x 1 root mail 11432 Apr 6 1999 /usr/bin/lockfile
-rwsr-sr-x 1 root mail 64468 Apr 6 1999 /usr/bin/procmail
-rwsr-xr-x 1 root root 21848 Aug 27 11:06 /usr/bin/crontab
-rwxr-sr-x 1 root slocate 15032 Apr 19 14:55 /usr/bin/slocate
*-r-xr-sr-x 1 root tty 6212 Apr 17 11:29 /usr/bin/wall
*-rws--x--x 1 root root 14088 Apr 17 12:57 /usr/bin fn
*-rws--x--x 1 root root 13800 Apr 17 12:57 /usr/bin sh
*-rws--x--x 1 root root 5576 Apr 17 12:57 /usr/bin/newgrp
*-rwxr-sr-x 1 root tty 8392 Apr 17 12:57 /usr/bin/write
-rwsr-x--- 1 root squid 14076 Oct 7 14:48 /usr b/squid/pinger
-rwxr-sr-x 1 root utmp 15587 Jun 9 09:30 /usr/sbin/utempter
*-rwsr-xr-x 1 root root 5736 Apr 19 15:39 /usr/sbin/usernetctl
*-rwsr-xr-x 1 root bin 16488 Jul 6 09:35 /usr/sbin/traceroute
-rwsr-sr-x 1 root root 299364 Apr 19 16:38 /usr/sbin ndmail
-rwsr-xr-x 1 root root 34131 Apr 16 18:49 /usr bexec/pt_chown
-rwsr-xr-x 1 root root 13208 Apr 13 14:58 /bin/su
*-rwsr-xr-x 1 root root 52788 Apr 17 15:16 /bin/mount
*-rwsr-xr-x 1 root root 26508 Apr 17 20:26 /bin/umount
*-rwsr-xr-x 1 root root 17652 Jul 6 09:33 /bin/ping
-rwsr-xr-x 1 root root 20164 Apr 17 12:57 /bin/login
*-rwxr-sr-x 1 root root 3860 Apr 19 15:39 /sbin/netreport
-r-sr-xr-x 1 root root 46472 Apr 17 16:26 /sbin/pwdb_chkpwd
[root@deep]# chmod a-s /usr/bin age
[root@deep]# chmod a-s /usr/bin/gpasswd
[root@deep]# chmod a-s /usr/bin/wall
[root@deep]# chmod a-s /usr/bin fn
[root@deep]# chmod a-s /usr/bin sh
[root@deep]# chmod a-s /usr/bin/newgrp
[root@deep]# chmod a-s /usr/bin/write
[root@deep]# chmod a-s /usr/sbin/usernetctl
[root@deep]# chmod a-s /usr/sbin/traceroute
[root@deep]# chmod a-s /bin/mount
[root@deep]# chmod a-s /bin/umount
[root@deep]# chmod a-s /bin/ping
[root@deep]# chmod a-s /sbin/netreport
         
     你可以用下面的命令查找所有带s位标志的程序:

  [root@deep]# find / -type f \\( -perm -04000 -o -perm -02000 \\) \\-exec ls -lg {} \\;

  >; suid-sgid-results

  把结果输出到文件suid-sgid-results中。

  为了查找所有可写的文件和目录,用下面的命令:

  [root@deep]# find / -type f \\( -perm -2 -o -perm -20 \\) -exec ls -lg {} \\; >; ww-files-results

  [root@deep]# find / -type d \\( -perm -2 -o -perm -20 \\) -exec ls -ldg {} \\; >; ww-directories-results

  用下面的命令查找没有拥有者的文件:

  [root@deep]# find / -nouser -o -nogroup >; unowed-results

  用下面的命令查找所有的.rhosts文件:

  [root@deep]# find /home -name .rhosts >; rhost-results

  建议替换的常见网络服务应用程序

  WuFTPD

  WuFTD从1994年就开始就不断地出现安全漏洞,黑客很容易就可以获得远程root访问(Remote Root Access)的权限,而且很多安全漏洞甚至不需要在FTP服务器上有一个有效的帐号。最近,WuFTP也是频频出现安全漏洞。

  它的最好的替代程序是ProFTPD。ProFTPD很容易配置,在多数情况下速度也比较快,而且它的源代码也比较干净(缓冲溢出的错误比较少)。有许多重要的站点使用ProFTPD。sourceforge.net就是一个很好的例子(这个站点共有3,000个开放源代码的项目,其负荷并不小啊!)。一些Linux的发行商在它们的主FTP站点上使用的也是ProFTPD,只有两个主要Linux的发行商(SuSE和Caldera)使用WuFTPD。

  ProFTPD的另一个优点就是既可以从inetd运行又可以作为单独的daemon运行。这样就可以很容易解决inetd带来的一些问题,如:拒绝服务的攻击(denial of service attack),等等。系统越简单,就越容易保证系统的安全。WuFTPD要么重新审核一遍全部的源代码(非常困难),要么完全重写一遍代码,否则 WuFTPD必然要被ProFTPD代替。

  Telnet

  Telnet是非常非常不安全的,它用明文来传送密码。它的安全的替代程序是OpenSSH。

  OpenSSH在Linux上已经非常成熟和稳定了,而且在Windows平台上也有很多免费的客户端软件。Linux的发行商应该采用OpenBSD的策略:安装OpenSSH并把它设置为默认的,安装Telnet但是不把它设置成默认的。对于不在美国的Linux发行商,很容易就可以在Linux的发行版中加上OpenSSH。美国的Linux发行商就要想一些别的办法了(例如:Red Hat在德国的FTP服务器上(ftp.redhat.de)就有最新的OpenSSH的rpm软件包)。

  Telnet是无可救药的程序。要保证系统的安全必须用OpenSSH这样的软件来替代它。

  Sendmail

  最近这些年,Sendmail的安全性已经提高很多了(以前它通常是黑客重点攻击的程序)。然而,Sendmail还是有一个很严重的问题。一旦出现了安全漏洞(例如:最近出现的Linux内核错误),Sendmail就是被黑客重点攻击的程序,因为Sendmail是以root权限运行而且代码很庞大容易出问题。

  几乎所有的Linux发行商都把Sendmail作为默认的配置,只有少数几个把Postfix或Qmail作为可选的软件包。但是,很少有Linux的发行商在自己的邮件服务器上使用Sendmail。SuSE和Red Hat都使用基于Qmail的系统。

  Sendmail并不一定会被别的程序完全替代。但是它的两个替代程序Qmail和Postfix都比它安全、速度快,而且特别是Postfix比它容易配置和维护。

  su

  su是用来改变当前用户的ID,转换成别的用户。你可以以普通用户登录,当需要以root身份做一些事的时候,只要执行“su”命令,然后输入root的密码。su本身是没有问题的,但是它会让人养成不好的习惯。如果一个系统有多个管理员,必须都给他们root的口令。

  su的一个替代程序是sudo。Red Hat 6.2中包含这个软件。sudo允许你设置哪个用户哪个组可以以root身份执行哪些程序。你还可以根据用户登录的位置对他们加以限制(如果有人“破”了一个用户的口令,并用这个帐号从远程计算机登录,你可以限制他使用sudo)。Debian也有一个类似的程序叫super,与sudo比较各有优缺点。

  让用户养成良好的习惯。使用root帐号并让多个人知道root的密码并不是一个好的习惯。这就是www.apache.org被入侵的原因,因为它有多个系统管理员他们都有root的特权。一个乱成一团的系统是很容易被入侵的。

  named

  大部分Linux的发行商都解决了这个问题。named以前是以root运行的,因此当named出现新的漏洞的时候,很容易就可以入侵一些很重要的计算机并获得root权限。现在只要用命令行的一些参数就能让named以非root的用户运行。而且,现在绝大多数Linux的发行商都让named以普通用户的权限运行。命令格式通常为:named -u ; -g ;

  INN

  在INN的文档中已经明确地指出:“禁止这项功能(verifycancels),这项功能是没有用的而且将被除掉”。大约在一个月前,一个黑客发布了当 “verifycancels”生效的时候入侵INN的方法。Red Hat是把“verifycancels”设为有效的。任何setuid tgid的程序或网络服务程序都要正确地安装并且进行检查以保证尽量没有安全漏洞。

  安全守则

  1. 废除系统所有默认的帐号和密码。

  2. 在用户合法性得到验证前不要显示公司题头、在线帮助以及其它信息。

  3. 废除“黑客”可以攻击系统的网络服务。

  4. 使用6到8位的字母数字式密码。

  5. 限制用户尝试登录到系统的次数。

  6. 记录违反安全性的情况并对安全记录进行复查。

  7. 对于重要信息,上网传输前要先进行加密。

  8. 重视专家提出的建议,安装他们推荐的系统“补丁”。

  9. 限制不需密码即可访问的主机文件。

  10.修改网络配置文件,以便将来自外部的TCP连接限制到最少数量的端口。不允许诸如tftp,sunrpc,printer,rlogin或rexec之类的协议。

  11.用upas代替sendmail。sendmail有太多已知漏洞,很难修补完全。

  12.去掉对操作并非至关重要又极少使用的程序。

  13.使用chmod将所有系统目录变更为711模式。这样,攻击者们将无法看到它们当中有什么东西,而用户仍可执行。

  14.只要可能,就将磁盘安装为只读模式。其实,仅有少数目录需读写状态。

  15.将系统软件升级为最新版本。老版本可能已被研究并被成功攻击,最新版本一般包括了这些问题的补救。
14# 2010-9-10 10:39:39 回复 收起回复
回复 支持 反对

使用道具 举报

 楼主| 发表于 2010-9-10 10:41:05 | 显示全部楼层

使用增强安全性的Linux(SELinux)

 增强安全性的Linux(SELinux)是美国安全部的一个研发项目,它的目的在于增强开发代码的Linux内核,以提供更强的保护措施,防止一些关于安全方面的应用程序走弯路,减轻恶意软件带来的灾难。
  
  普通的Linux 与SELinux相比较
  
  普通的Linux系统的安全性是依赖内核的,这个依赖是通过setuid tgid产生的。在传统的安全机制下,暴露了一些应用授权问题、配置问题或进程运行造成整个系统的安全问题。这些问题在现在的操作系统中都存在,这是由于他们的复杂性和与其它程序的互用性造成的。
  
  SELinux只单单依赖于系统的内核和安全配置政策。一旦你正确配置了系统,不正常的应用程序配置或错误将只返回错误给用户的程序和它的系统后台程序。其它用户程序的安全性和他们的后台程序仍然可以正常运行,并保持着它们的安全系统结构。
  
  用简单一点的话说就是:没有任何的程序配置错误可以造成整个系统的崩溃。
  
  安装SELinux SELinux的内核、工具、程序/工具包,还有文档都可以到增强安全性的Linux网站上上下载你必须有一个已经存在的Linux系统来编译你的新内核,这样才能访问没有更改的系统补丁包。
  
  开发者使用红帽Linux来测试目前的这个版本。这个Linux和目前的Linux应用程序非常兼容,并且它包含了一个考虑到安全问题的系统调用。
  
  另外,你可以编译这个内核,使它在允许的状态下运行。这个模式允许审计安全配置政策,并决定安装用户应用程序和系统操作所需要的许可。你不需要重新安装系统,可以随时通过改变这个操作的模式来增强系统的功能。
  
  为什么要使用SELinux? 最好的使用SELinux的原因就是,它可以增强访问控制来限制用户程序访问的最低权限。
  
  其它好的改进是:
  
  对内核对象和服务的访问控制 对进程初始化、继承和程序执行的访问控制 对文件系统、目录、文件和打开文件描述的访问控制 对端口、信息和网络接口的访问控制。 最后的思考 SELinux减少了防止系统崩溃所需要调整的用户和系统程序。你现在就可以使用补丁包升级Linux,使它符合你的计划需要。
  
  因为SELinux目前仍然是一个开发项目,NSA并没有向用户推荐使用这个系统来保存比较重要的信息。但是,在去年,我曾经运行过SELinux,并没有遇到过任何的系统崩溃情况。
  
  是否好用,由你自己测试、自己决定。它是免费的,而且非常好用!
15# 2010-9-10 10:41:05 回复 收起回复
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 论坛注册

本版积分规则

QQ|Archiver|手机版|小黑屋|sitemap|鸿鹄论坛 ( 京ICP备14027439号 )  

GMT+8, 2025-1-24 05:33 , Processed in 0.071324 second(s), 11 queries , Redis On.  

  Powered by Discuz!

  © 2001-2025 HH010.COM

快速回复 返回顶部 返回列表