如果您关心保护全域可写入的(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 上构建下一个开发项目。
讨论
- 参阅 ,由 Dan Walsh 撰写,他是 “”(Red Hat Magazine,2007 年 5 月)的作者。
- 通过 全新的 developerWorks 空间 中的博客、论坛、播客和社区主题,参与 developerWorks 社区。