GDMはXサーバーにどのように認証しますか?

GDMはXサーバーにどのように認証しますか?

.xauthority一般的に、ユーザーのホームディレクトリにあるファイルに保存されている「魔法のCookie」を介してXサーバーに認証する必要があるとします。 drawログイン画面? rootユーザーのホームディレクトリに保存されている.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リファレンスマニュアル

一度見たいです。GNOMEディスプレイマネージャリファレンスマニュアル。ドキュメントを見ると、ルートは何らかの方法で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つの認証ディレクトリを持っています。 1つはuser用gdm、もう1つは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.cCookie/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

関連情報