安全

3.1. GDM 用户和组

为了安全,建议用一个专用的用户和组 ID 来进行适当的操作。在大多数系统上,这个用户和组一般是“gdm”,但是可以被配置为任何一个用户或组。所有的 GDM 图形程序都以这个用户的身份运行,以使与用户交互的程序都运行在沙盒中。这个用户和组应该具有有限制的特权。

“gdm”用户唯一需要的特权是读写 <var>/run/gdm 中的 Xauth 文件的能力。<var>/run/gdm 目录应该有 root:gdm 属主,以及 1777 的权限设置。

在任何情况下,您都不应该把 GDM 用户/组配置给一个能轻易访问到的用户,比如 nobody 用户。一些用户获得了访问 Xauth 密钥,能窥伺或控制运行与会话相关联的 GUI 程序,或者执行在它之上的拒绝服务攻击。确保系统配置正确是非常重要的,设定只有“gdm”用户才能访问这些文件,并且登录这个账户是很不容易。例如,账户应该设定为无密码,或者不允许非 root 用户登录这个帐户。

GDM 欢迎界面配置存储于 GConf 中。要允许 GDM 用户更改配置,就需要“gdm”用户有一个可写的 $HOME 目录。用户可以配置默认的 GConf 到希望的样子,以避免需要提供给“gdm”用户一个可写的 $HOME 目录。但是,如果不能写入状态信息到 GConf 配置,一些功能可能被禁用。

3.2. PAM

GDM 使用 PAM 作为登录认证。PAM 代表可插入的认证模块,被您计算机上大多数需要认证的程序使用。它允许管理员为不同的登录程序 (例如 ssh,登录界面,屏幕保护等) 配置特定的认证行为。

PAM 是复杂和高度可配置的,本文档不打算在细节上解释这些。而是,它打算给出 PAM 配置与 GDM 的关系,GDM 是怎样配置 PAM 的,以及已知的问题的一个概述。需要操作 PAM 配置的用户需要进一步阅读 PAM 文档,以理解怎样配置 PAM 和理解在这节中使用的条目。

PAM 配置在不同的操作系统上有不同但相似的界面,所以查看 pam.dpam.conf 手册页以获取更多细节。请确定您阅读 PAM 文档并且了解您要对您的配置做的改变对安全的影响。

注意,默认地,GDM 使用“gdm”这个 PAM 服务名作默认登录用,以及使用“gdm-autologin”PAM服务名作自动登录用。这些服务可能没有在您的 pam.d 或 pam.conf 配置文件中定义。如果没有这些条目,GDM 将使用默认的 PAM 行为。在大多数系统上,这应该可以工作的很好。但是,如果 gdm-autologin 服务没有定义,自动登录功能将可能不能失效。

PostLogin 脚本在 pam_open_session 被调用之前运行,PreSession 在其之后。这允许系统管理员向登录程序添加任何脚本,无论在 PAM 初始化会话之前还是之后。

如果您想使 GDM 使用其他的认证机制(如指纹识别或智能卡),您应该使用希望使用的认证类型的 PAM 服务模块,而不是试图直接修改 GDM 的源代码。请阅读您系统上的 PAM 文档。怎样做到这一点经常在

邮件列表上讨论,所以,您可以参考这个列表的归档获取更多信息。

为了能够同时使用多种认证方式,例如既可使用智能卡也可使用用户名和口令登录系统,PAM 做了一些限制。使这可以工作有一些技巧,当设置这种配置时,最好研究下这个问题一般是怎么解决的。

如果自动登录在一个系统上不工作,检查在 PAM 配置文件中是否定义了“gdm-autologin”PAM 栈。为了使它工作,必须使用一个不做任何认证的 PAM 模块,或者简单的对它所有的公共界面返回 PAM_SUCCESS。假定您的系统上有个 pam_allow.so PAM 模块可以做到这一点,启用“gdm-autologin”的 PAM 配置可能会类似这样:

       gdm-autologin auth  required    pam_unix_cred.so.1
       gdm-autologin auth  sufficient  pam_allow.so.1
       gdm-autologin account  sufficient  pam_allow.so.1
       gdm-autologin session  sufficient  pam_allow.so.1
       gdm-autologin password  sufficient  pam_allow.so.1

上边的设置将导致没有最后的日志项生成。如果想要一个最后日志项,请对这个会话使用下面的方法:

       gdm-autologin session required pam_unix_session.so.1

如果计算机由多个人使用,这时自动登录就不合适了,您将可能希望允许一些用户不输入他们的口令就可以登录。这个功能可以作为单个用户选项,使用 gnome-system-tools 中的 users-admin 工具来启用;这由在要求口令之前检查用户是否 Unix 组“nopasswdlogin”的成员来实现。要使这可以工作,“gdm”服务的 PAM 配置文件必须包含类似于如下一行:

      gdm auth  sufficient  pam_succeed_if.so  user ingroup nopasswdlogin

3.3. utmp 和 wtmp

GDM 经会话登录和注销生成 utmp 和 wtmp 用户账户数据库条目。utmp 数据库包含用户访问和审计信息,这些可以通过例如 fingerlastloginwho这些命令访问。wtmp 数据库包含用户访问和伸进信息的 utmp 数据库历史。参考您系统上的 utmp and wtmp 手册页以获取更多信息。

3.4. Xserver 认证方案

Xserver 认证文件存储于启动时 <var>/run/gdm 的一个新建的子目录。这些文件用于存储和在 X 客户端和 X 服务器之间共享“password”。这个“password”对于每次登录是唯一的,所以从一个会话的用户并不能窥探另一个会话上的用户。

GDM 只支持 MIT-MAGIC-COOKIE-1 Xserver 认证方案。通常从其他方案获得的好处非常少,并且至今也没有为实现它们做出的努力。尤其要小心地使用 XDMCP,因为 Xserver 认证 cookie 以明文通过线路。如果可以嗅探,攻击者就可以容易的在您登录时嗅探您的认证口令,无论使用何种认证方案。如果可以嗅探且是不可取的,此时您应该使用 ssh 作为 X 连接的隧道而不是使用 XDMCP。您可以将 XDMCP 看成一种图形化的 telnet,其有同样的安全问题。多数情况下,ssh -Y 应该会优于 GDM 的 XDMCP 功能。

3.5. XDMCP 安全

即使您的显示受到 cookies 的保护,输入口令时的 XEvent 和因而的按键仍然是通过明文发送的。捕获它是很容易的。

XDMCP 主要用于运行瘦客户机,比如在终端实验室。那些瘦客户机只需要到访问服务器的网络连接,这使这些瘦客户机在一个外部不能访问的分离网络中并且只能连接到服务器好像是最好的安全策略。仅有的需要从外部访问的点就是服务器。这种设置绝不应该使用一个未管理的集线器或其他可嗅探的网络。

3.6. XDMCP 访问控制

XDMCP 访问控制是使用的 TCP wrappers。也可以不带 TCP wrappers 地编译 GDM,所以这个功能可能不被一些操作系统支持。

您应该在文件 <etc>/hosts.allow<etc>/hosts.deny中使用守护进程名字 gdm。例如要禁止从 .evil.domain 访问计算机,请添加

gdm: .evil.domain

<etc>/hosts.deny。您也可能需要添加

gdm: .your.domain

到您的 <etc>/hosts.allow,如果您通常禁止从所有主机的所有服务。参看 hosts.allow(5) 手册页以获取更多细节。

3.7. 防火墙安全

即使是 GDM 尝试尽量智能地防止使攻击者 对 XDMCP 有机可乘,仍然建议您在您的防火墙上阻塞 XMDCP 端口(一般是 UDP 端口 177),除非真的需要。GDM 防止拒绝服务攻击,但是 X 协议仍然继承了不安全,并且只应该在可控的环境中使用。同样,每个远程连接消耗许多资源,所以通过 XDMCP 进行拒绝服务攻击比攻击一个网页服务器容易的多。

阻塞所有的 Xserver 端口也是明智的,它们您防火墙上的 TCP 端口 6000+ (对应每个显示号)。注意 GDM 也会使用显示号 20 和根据服务需要较大的号。

X 在通过国际互联网使用时不是一个非常安全的协议,XDMCP 甚至更不安全。

3.8. PolicyKit

GDM 可以配置为使用 PolicyKit,以允许系统管理员控制登录窗口是否应该在欢迎窗口提供关机和重启按钮。

这些按钮是由 org.freedesktop.consolekit.system.stop-multiple-usersorg.freedesktop.consolekit.system.restart-multiple-users 动作分别控制。这些动作的策略可以使用 polkit-gnome-authorization 工具或 polkit-auth 命令行程序。

3.9. RBAC (基于角色的访问控制)

GDM 可以被设置为使用 RBAC 替代 PolicyKit。这是,RBAC 的配置将被用于控制登录窗口是否在欢迎屏幕提供关机和重启键。

例如,在 Oracle Solaris 上,“solaris.system.shutdown”认证被用于控制此项。简单修改 /etc/user_attr 文件即可使 “gdm”用户使用这个认证。