Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1145159
  • 博文数量: 153
  • 博客积分: 10576
  • 博客等级: 上将
  • 技术积分: 2137
  • 用 户 组: 普通用户
  • 注册时间: 2007-12-02 21:01
文章分类

全部博文(153)

文章存档

2009年(43)

2008年(110)

分类: LINUX

2009-07-11 11:16:36

如果您关心保护全域可写入的(world-writeable)共享目录(比如 /tmp 或 /var/tmp)不被滥用,那么 Linux® Pluggable Authentication Module (PAM) 可以帮助您。当用户登录您的系统时,pam_namespace 模块为他们创建独立的名称空间。这种独立由 Linux 操作系统强制执行,可以使用户免受多种类型的安全攻击。这篇针对 Linux 系统管理员的文章将展示使用 PAM 启用名称空间的步骤。

要提高安全性,明智的做法是使用多种保护方法(也称为 “深度防御”)。通过这种途径,如果一种方法失败,还有另一种方法在运作,防止进一步入侵。本文将描述一种方法,为您的安全策略添加另一层深度:使用 PAM 多实例化 全域可写共享目录。这就意味着为每个用户创建了一个新的目录实例(比如 /tmp)。

全域可写目录的多实例化可防止以下类型的攻击,如 Russell Coker 在 “Polyinstantiation of directories in an SELinux system” 中所述(请参阅 参考资料):

  • 使用符号链接的竞争条件攻击
  • 将认为是秘密信息或有用信息的文件名称暴露给攻击者
  • 一个用户对另一个用户的攻击
  • 端口监控程序(daemon)对用户的攻击
  • 非根端口监控程序对用户的攻击

然而,多实例化 “不能” 防止以下类型的攻击:

  • 由根端口监控程序对用户的攻击
  • 根(帐户或提升的特权)对任何用户的攻击

登录时,PAM 在系统实例目录中创建多实例化的私有 /tmp 目录;这种重定向对于登录的用户是透明的。用户看到的是标准 /tmp 目录,并可以正常读写。用户不能 看到任何其他用户(包括根用户)的 /tmp 空间或实际 /tmp 文件系统。

多实例化的用户目录既不对根用户隐藏也不能防御根用户。如果您对这个级别的保护感兴趣,SELinux 可以帮助您。无论是否启用了 SELinux,此处提供的配置示例都会有效。请参阅 参考资料,链接到有关使用 SELinux 的更多信息。





回页首


本节展示如何为系统上的用户启用 /tmp 和 /var/tmp 目录的多实例化。还将描述可选的配置步骤以适应 X 窗口或图形显示管理器。我撰写本文时使用的是 Red Hat Enterprise Linux 5.1 (RHEL 5.1),但是您可以在包括 pam_namespace 模块的任何 Linux 发行版上尝试此处描述的过程。

首先,编辑 namespace.conf。

第一个要编辑的文件是 /etc/security/namespace.conf,它控制 pam_namespace 模块。在此文件中,列出您希望在登录时用 PAM 多实例化的目录。PAM 附带的文件中列出了一些示例目录,但被注释掉了。键入 man namespace.conf,查看全面的手册页。此文件中每行的语法是 polydir instance_prefix method list_of_uids

简单地说,下面是这些变量表示的内容:

  • polydir 是要多实例化的目录的绝对路径名。
  • instance_prefix 是新的多实例化用户目录的基础目录。
  • method 可以是用户等级上下文
  • list_of_uids 是一个用户名称的列表,PAM 将 “不会” 多实例化他们的目录。

在本例中没有使用 SELinux,因此必须指定方法的用户。如果需要,可以使用配置文件中的变量 $USER$HOME

清单 1 为系统上的每个用户(除了根用户和管理员)创建一个私有的 /tmp 和 /var/tmp 名称空间实例。


清单 1. /etc/security/namespace.conf
                
#$HOME $HOME/$USER.inst/ user root,adm 
/tmp /tmp/tmp-inst/ user root,adm 
/var/tmp /var/tmp/tmp-inst/ user root,adm 

/tmp 和 /var/tmp 目录不必位于单独的文件系统;它们可以是单个文件系统上的目录。在多实例化生效之前,必须使用文件模式 000 手动创建 /tmp/tmp-inst 和 /var/tmp/tmp-inst 目录。如果没有正确创建目录,登录将会失败。

作为根用户登录时,请键入下列命令以创建这些目录:

# mkdir /tmp/tmp-inst 
# mkdir /var/tmp/tmp-inst 
# chown root:root /tmp/tmp-inst /var/tmp/tmp-inst 
# chmod 000 /tmp/tmp-inst /var/tmp/tmp-inst 

接下来,修改 PAM 配置文件,将 pam_namspace.so 模块添加到从控制台或安全 shell 登录时要运行的模块列表中。编辑 /etc/pam.d/login 和 /etc/pam.d/sshd 文件,将 pam_namespace.so 模块放置在每个文件的最后一行。清单 2 和清单 3 分别显示了在 /etc/pam.d/login 和 /etc/pam.d/sshd 中添加模块的位置:



                
#%PAM-1.0 
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so 
auth include system-auth 
account required pam_nologin.so 
account include system-auth 
password include system-auth 
# pam_selinux.so close should be the first session rule 
session required pam_selinux.so close 
session include system-auth 
session required pam_loginuid.so 
# 
session optional pam_console.so 
# pam_selinux.so open should only be followed by sessions to be executed in the 
  user context 
session required pam_selinux.so open 
session optional pam_keyinit.so force revoke 
# Polyinstantiation: 
session required pam_namespace.so 
            



                
#%PAM-1.0 
auth include system-auth 
account required pam_nologin.so 
account include system-auth 
password include system-auth 
session optional pam_keyinit.so force revoke 
session include system-auth 
session required pam_loginuid.so 
# Polyinstantiation: 
session required pam_namespace.so 
            

由于 X Window 系统使用临时目录的方式不同,对于使用多实例化 /tmp 目录的用户,图形会话可能失败。如果在 /etc/pam.d 目录的任何文件中指定了 pam_namespace,则 PAM 将在登录过程中执行 /etc/security/namespace.init 文件的内容。使用此文件进行必要的更改,以允许 X Windows 正确启动。RHEL 5.1 包含一个默认的 namespace.init 文件,但我在清单 4 中对其作了一些修改。



                
if [ $1 = /tmp ]; then
        if [ ! -f /.tmp/.X11-unix ]; then
                mkdir -p /.tmp/.X11-unix
        fi
        mount --bind /tmp/.X11-unix /.tmp/.X11-unix
        [ -f /tmp/.X0-lock ] && cp -fp -- /tmp/.X0-lock "$2/.X0-lock"
        mkdir -p -- "$2/.X11-unix"
        ln -fs -- /.tmp/.X11-unix/X0 "$2/.X11-unix/X0"
fi
exit 0

配置 Gnome Display Manager (GDM) 很容易。将 pam_namespace.so 模块添加到 /etc/pam.d/gdm 文件中所需模块的列表中。清单 5 显示一个示例。



                
#%PAM-1.0 
auth required pam_env.so 
auth include system-auth 
account required pam_nologin.so 
account include system-auth 
password include system-auth 
session optional pam_keyinit.so force revoke 
session include system-auth 
session required pam_loginuid.so 
session optional pam_console.so 
# Polyinstantiation: 
session required pam_namespace.so 
            

如果正在使用 X Display Manager (XDM) 而不是 GDM,请使用同样的方式配置 /etc/pam.d/xdm 文件。现在图形化登录和命令行登录都将生成多实例化的 /tmp 和 /var/tmp 目录。





回页首


如果在运行 pam_namespace.so 模块时 PAM 遇到错误,尝试登录的用户的登录会话将会失败。直到确保所有的事情都能按预期运行之后,才允许在出错的情况下继续登录。要启用 ignore_config_error 选项,请将其添加到 /etc/pam.d 目录中的每个文件中,添加位置为添加了 pam_namspace.so 模块的行末。

例如,在 /etc/pam.d/login 文件中,编辑包含 pam_namspace.so 模块的行,如下所示:

session required pam_namespace.so ignore_config_error

要获得完整的选项列表,请查看 pam_namespace 手册页。在用户登录后,检查文件 /var/log/secure 的错误。确信 PAM 配置正确之后,删除 ignore_config_error 选项。





回页首


在修改并保存配置文件之后,选择一个非根用户帐户进行测试,然后从系统中退出此用户的所有实例。重新登录,将为此用户创建新的多实例化 /tmp 和 /var/tmp 目录。清单 6 和清单 7 分别显示了从系统和从用户角度看到的操作。在此例中,用户名称是 robb



                
[robb@testbox tmp]$ cd /tmp 
[robb@testbox tmp]$ touch foo 
[robb@testbox tmp]$ ls 
foo 



                
[root@testbox ~]# ls /tmp 
tmp-inst 
[root@testbox ~]# ls /tmp/tmp-inst/ 
robb 
[root@testbox ~]# ls /tmp/tmp-inst/robb/ 
foo 

由于多实例化,robb 的 /tmp 目录被隔离到 /tmp/tmp-inst/ 下单独的目录中,而且 robb 无法看到系统 /tmp 目录或其中的任何文件。





回页首


尽管多实例化不能防止所有攻击,但它是您的安全工具包的一个有用的补充,而且配置十分简单。您可以自由体验对其他目录(比如 /home)的多实例化。借助 ignore_config_error 选项,错误将不再致命,但不要忘记在完成测试配置之后删除此选项。



学习
  • 您可以参阅本文在 developerWorks 全球站点上的 英文原文

  • “”, 作者 Russell Coker 描述了与共享目录(比如 /tmp and /var/tmp)相关的问题,以及与使用多个 SELinux 安全上下文访问单个主目录相关的问题。

  • 应用挂载名称空间”(developerWorks,2007 年 9 月)介绍了如何构建自己的文件系统设置,同时又不受 sysadmin 规定结构的约束;您将发现高级 Linux 挂载功能的一些实用应用程序。

  • 安全编程: 最小化特权”(developerWorks,2004 年 5 月)讨论如何通过最小化特权模块、授予的特权以及特权的有效时间来最小化特权。

  • “”(Red Hat Magazine,2007 年 5 月)详尽地描述了 RHEL5 的 SELinux。

  • (LWN.net, 2005 年 11 月)上的这篇文章回答了 “一个进程既希望克隆自己的名称空间,又希望访问最近挂载的 CD” 问题,并附有详细的特征、语义学、挂载状态描述和实现问题的列表。

  • 从头开始生成 SELinux”(developerWorks,2006 年 5 月)讲述如何构建针对 SELinux 的 Gentoo 系统。

  • 了解如何使用管理员友好的安全管理层 ”(developerWorks,2008 年 2 月)讲述如何使用 SELinux 中的 RBAC,以及 SELinux 策略、内核和用户空间如何协作来加强 RBAC,并将用户绑定到类型增强策略。

  • 下列参考资料可以帮助您使用 SELinux:、 和 。

  • 在 NSA 网站上了解有关 Security-Enhanced Linux 的更多内容。

  • developerWorks Linux 专区 中查找 Linux 开发人员的更多资源,并浏览我们的 最流行的文章和教程

  • 查看 developerWorks 上所有的 Linux 技巧Linux 教程

  • 随时关注 developerWorks 技术事件和网络广播


获得产品和技术
  • 查阅 。

  • 订购 SEK for Linux, 这是两张 DVD,其中包括来自 Linux from DB2®、Lotus®、Rational®、Tivoli® 和 WebSphere® 的最新的 IBM 试用软件。

  • 试用可以从 developerWorks 直接下载的 IBM 试用软件,在 Linux 上构建下一个开发项目。


讨论
阅读(1665) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~