GDM은 X 서버에 어떻게 인증합니까?

GDM은 X 서버에 어떻게 인증합니까?

.xauthority일반적 으로 사용자의 홈 디렉토리에 있는 파일에 저장된 "마법 쿠키"를 통해 X 서버에 인증 해야 한다고 가정할 때 : GDM(대부분의 로그인 프로세스와 마찬가지로 루트로 실행한다고 가정)은 어떻게 X 서버에 연결합니까? draw 로그인 화면? 루트 사용자의 홈 디렉터리에 저장된 .xauthority 파일을 사용합니까, 아니면 인증을 완전히 우회합니까?

답변1

내 시스템에서 ps이것을 찾았습니다 .

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

디스플레이 관리자는 인증 파일을 인수로 사용하여 X를 시작합니다. 파일을 직접 사용할 수 있습니다.

편집 1:

제 경우에는 GDM이 아니라 KDM입니다.

답변2

당신의 이론을 테스트해보세요. /root이 파일을 루트 디렉터리에서 임시로 이동하고 다음 사항이 있는지 확인하세요.

  1. 문제를 일으키고 더 이상 로그인을 방해합니다.
  2. 파일이 재생성됩니다./root

GDM 참조 매뉴얼

한번 살펴보고 싶어요그놈 디스플레이 관리자 참조 매뉴얼. 문서를 보면 루트는 어떤 방식으로든 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 daemonX와의 통신을 담당합니다.
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쿠키/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인증 파일을 인수로 사용하여 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

관련 정보