使用多实例化提高安全性

上一篇 / 下一篇  2008-05-10 17:40:55 / 个人分类:Linux

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

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

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

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

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

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

PAM 和 polyinstantiation 工作原理

登录时,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。

编辑 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 配置文件,将 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 中添加模块的位置:


清单 2. 将 PAM 模块添加到 /etc/pam.d/login
#%PAM-1.0 
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so 
auth includesystem-auth 
account required pam_nologin.so 
account includesystem-auth 
password includesystem-auth 
# pam_selinux.so close should be the first session rule 
session required pam_selinux.so close 
session includesystem-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


清单 3. 将 PAM 模块添加到 /etc/pam.d/sshd
#%PAM-1.0 
auth includesystem-auth 
account required pam_nologin.so 
account includesystem-auth 
password includesystem-auth 
session optional pam_keyinit.so force revoke 
session includesystem-auth 
session required pam_loginuid.so# Polyinstantiation: 
session required pam_namespace.so

启用 X Windows

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


清单 4. 使 X Windows 正确启动
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

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


清单 5. 配置 Gnome Display Manager
#%PAM-1.0 
auth required pam_env.so 
auth includesystem-auth 
account required pam_nologin.so 
account includesystem-auth 
password includesystem-auth 
session optional pam_keyinit.so force revoke 
session includesystem-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。


清单 6. 从用户角度看到的控制台会话
[robb@testbox tmp]$ cd /tmp 
[robb@testbox tmp]$ touch foo 
[robb@testbox tmp]$ ls 
foo


清单 7. 系统上的根用户看到的控制台会话
[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 目录或其中的任何文件。





回页首


结束语

分享这篇文章……

 

digg提交到 Digg
del.icio.us发布到 del.icio.us
SlashdotSlashdot 一下!

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



参考资料

学习

获得产品和技术

讨论


关于作者

author photo

Robb Romans 是ibmUser Technologies 小组的一名作家,他专注于 Linux、Cell Broadband Engine Architecture 和开源软件。他目前在 Information Development 团队工作,在此之前,Robb 是一名致力于 Linux 安全性和嵌入式 Linux 的开发者。


TAG: Linux

 

评分:0

我来说两句

Open Toolbar