分类: 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” 中所述(请参阅 参考资料):
然而,多实例化 “不能” 防止以下类型的攻击:
登录时,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 名称空间实例。
#$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
选项,错误将不再致命,但不要忘记在完成测试配置之后删除此选项。