GDM 如何向 X Server 进行身份验证?

GDM 如何向 X Server 进行身份验证?

鉴于您通常必须通过存储在.xauthority用户主目录中的文件中的“magic cookie”对 X 服务器进行身份验证:How does GDM (像大多数登录进程一样,我假设以 root 身份运行)连接到 X服务器为了绘制登录显示?它是否使用存储在 root 用户主目录中的任何 .xauthority 文件,或者是否完全绕过身份验证?

答案1

在我的系统上ps发现这个:

/usr/bin/Xorg -br :0 vt7 -nolisten tcp -auth /var/lib/xdm/authdir/authfiles/A:0-wEJjac

显示管理器使用 auth 文件作为参数启动 X。它可以直接使用该文件。

编辑1:

就我而言,它是 KDM,而不是 GDM。

答案2

测试一下你的理论。暂时从根/root目录中移动这些文件,然后查看这些文件是否:

  1. 导致您出现问题,导致您无法再登录
  2. 导致文件重新生成/root

GDM 参考手册

我想看一下GNOME 显示管理器参考手册。查看文档,root 似乎不以任何方式与 X 交互。它使用用户的有效用户 ID 分叉另一个进程来执行此操作。

摘自GDM 参考手册 - GDM 守护进程部分

GDM 的编写考虑到了简单性和安全性。整体的设计理念是这样的:

启动时,gdm 守护进程解析其配置文件 gdm.conf。对于每个本地显示,gdm 分叉一个 Xserver 和一个从属进程。然后,主 gdm 进程将侦听来自远程显示的 XDMCP 请求并监视本地显示会话。

gdm 从属进程打开显示屏并启动图形登录程序 gdmlogin。 gdmlogin 作为专用用户运行,并通过管道与从属进程异步通信。

GDM 在很大程度上依赖于 PAM(可插入身份验证模块)的存在,但支持旧系统上的常规 crypt() 和影子密码。

远程显示器可以连接到 GDM 主机上的 XDMCP 端口。 gdm 将授予对 TCP Wrappers 配置文件中 gdm 服务部分中指定的主机的访问权限。 GDM 不支持没有 TCP 包装器的系统上的远程显示访问控制。不过,XDMCP 支持可以完全关闭。

GDM数据库

似乎它是特定于发行版的身份验证文件存储位置。对于 Red Hat 发行版,它们位于/var/run/gdm,对于其他操作系统,它们位于/var/lib/xdm

这是我的 Fedora 目录:

$ pwd
/var/run/gdm

$ tree 
.
├── auth-for-gdm-8DkDnQ
│   └── database
└── auth-for-saml-PSW952
    └── database

2 directories, 2 files

所以我有 2 个身份验证目录,一个用于 user gdm,一个用于我, user saml

$ strings auth-for-saml-PSW952/database
grinchy
MIT-MAGIC-COOKIE-1
-G9 
[root@grinchy gdm]# strings auth-for-gdm-8DkDnQ/database
grinchy
MIT-MAGIC-COOKIE-1
-G9 

查看数据库文件内部有有关MIT-MAGIC-COOKIES.

答案3

中的代码gdm daemon负责与X的通信。
gdm-server.c:

#define X_SERVER_ARG_FORMAT " -background none -noreset -verbose %s%s"
...........
gdm_server_init_command (server);
...........
g_shell_parse_argv (server->priv->command, &argc, &argv, NULL);
...........
 /* server number is the FIRST argument, before any others */
argv[1] = g_strdup (server->priv->display_name);
len++;
if (server->priv->auth_file != NULL) {
    argv[len++] = g_strdup ("-auth");
    argv[len++] = g_strdup (server->priv->auth_file);
}

gdm-display-access-file.c处理 cookie/Xauth 文件创建:

static FILE *
_create_xauth_file_for_user (const char *username,
.........
    gdm_display_get_x11_display_number (display, &display_number, NULL);
    *number = g_strdup_printf ("%d", display_number);
    *number_length = strlen (*number);
    *name = g_strdup ("MIT-MAGIC-COOKIE-1");
    *name_length = strlen (*name);
.........
    *cookie = gdm_generate_random_bytes (GDM_DISPLAY_ACCESS_COOKIE_SIZE,

这些文件存储在新创建的子目录中GDM_XAUTH_DIR(默认为<var>/run/gdm)在启动时。正如 Hauke 上面指出的,gdm使用 auth 文件作为参数启动 Xserver:

systemctl status gdm.service
...............
Main PID: 263 (gdm)
CGroup: /system.slice/gdm.service
       ├─263 /usr/bin/gdm
       └─287 /usr/bin/Xorg.bin :0 -background none -noreset -verbose 3 -logfile /dev/null -auth /var/run/gdm/auth-for-gdm-4X6qTS/database -seat seat0 -nolisten tcp vt1

相关内容