sudoは私のルートの.Xauthorityデータをどこに隠しますか?

sudoは私のルートの.Xauthorityデータをどこに隠しますか?

sudoちょうどファイルが処理される方法で奇妙な点を見つけました.Xauthority

sudo xauth add $(xauth list | tail -1)

user@server: sudo xauth info
Authority file:       /root/.xauthYZ21Nt
File new:             no
File locked:          no
Number of entries:    1
Changes honored:      yes
Changes made:         no
Current input:        (argv):1

user@server:  sudo xauth info
Authority file:       /root/.xauth3BFy5d
File new:             no
File locked:          no
Number of entries:    1
Changes honored:      yes
Changes made:         no
Current input:        (argv):1

user@server:  sudo xauth list
server/unix:10  MIT-MAGIC-COOKIE-1  c922ab48defdf43b1092dffb86c06eed

user@server: sudo ls -la /root | grep auth
-rw-r--r--  1 root root    0 Nov  9 14:40 .Xauthority
-rw-------  1 root root   57 Nov  9 15:23 .xauthsrxzxl

user@server:  pkexec xauth info
Authority file:       /root/.Xauthority
File new:             no
File locked:          no
Number of entries:    0
Changes honored:      yes
Changes made:         no
Current input:        (argv):1

したがって、$XAUTHORITYそれぞれの新しい値は異なり、終了時に消える一時sudoファイルを指します。sudoしたがって、最後のコマンド(pkexec代わりに使用sudoしてそこにあると予想/root/.Xauthority)では、クッキーを見ることはできません。たとえば、うまくsudo gedit動作しますがpkexec env DISPLAY=$DISPLAY gedit失敗します。

.Xauthorityデータがどこに保存されているのか、そしてもっと重要なのは、どのようにデータにアクセスできるのか、そしてこのような複雑な方法で行われるのですかpkexec

答え1

オプションを使用してXサーバーを-auth起動すると(パスワード)を含むファイルが作成されMIT-MAGIC-COOKIE-1、パスワードを知っているユーザーだけがXウィンドウシステムに自分のウィンドウを表示できます。

MIT-MAGIC-COOKIE-1複数(ネットワークログインなど)があるかもしれませんが、ssh -Xあなたの場合、このファイルをチェックすると、まったく同じ内容(cmp /root/.xauth1 /root/.xauth2)を持つことになります。

ただし、別のXサーバーを起動してsudo(またはsu)を使用している場合は、新しいパスワードは異なる必要があります。

したがって、ファイルが異なる理由は、他のsudoインスタンスがどのモニターを使用しているのかわからず、必要な固有のパスワードを取得して保存するための新しいファイルを作成するためです。

答え2

xauth cookie はこの一時ファイル ( ) に保存され、~/.xauthXXXX返されると (コマンドが完了したときなど) 削除されます。sudosudo xauth info

ソースコードを見ることをお勧めしますpam_xauth基準寸法:

#define XAUTHTMP ".xauthXXXXXX"
...
int
pam_sm_open_session (pam_handle_t *pamh, int flags UNUSED,
                     int argc, const char **argv)
{
...

                /* Generate the environment variable
                 * "XAUTHORITY=<homedir>/filename". */
                if (asprintf(&xauthority, "%s=%s/%s",
                             XAUTHENV, tpwd->pw_dir, XAUTHTMP) < 0) {
...
                fd = mkstemp(xauthority + sizeof(XAUTHENV));
...
                cookiefile = strdup(xauthority + sizeof(XAUTHENV));

                /* Save the filename. */
                if (pam_set_data(pamh, DATANAME, cookiefile, cleanup) != PAM_SUCCESS) {
...
int
pam_sm_close_session (pam_handle_t *pamh, int flags UNUSED,
                      int argc, const char **argv)
{
...
        if (pam_get_data(pamh, DATANAME, &data) != PAM_SUCCESS)
                return PAM_SUCCESS;
        cookiefile = data;
...
        if (unlink(cookiefile) == -1 && errno != ENOENT)
          pam_syslog(pamh, LOG_WARNING, "Couldn't remove `%s': %m", cookiefile);

に関してはpkexecを使用してはいけないと思いますpkexec。ただ実行できるほど悪いですsudo;-)

答え3

@user499944 ありがとうございます。今、すべてが明確に見えます。簡単に言うと:

  • 一時.xauthXXXXXXファイルはpam_xauth

  • setの場合にのみ生成されますが$DISPLAY、これは本当ですが、そうではsudoありませんpkexec。走るのは設定だけだpkexed env DISPLAY=$DISPLAY commandから何の成果も得られない$DISPLAY後ろに認証が完了しました。システムログには以下が表示されます。

# after pkexec env DISPLAY=$DISPLAY xauth info
Nov 11 18:01:41 server pkexec[11650]: pam_xauth(polkit-1:session): user has no DISPLAY, doing nothing
Nov 11 18:01:41 server pkexec[11650]: user: Executing command [USER=root] [TTY=/dev/pts/3] [CWD=/home/user] [COMMAND=/usr/bin/env DISPLAY=localhost:10.0 xauth info]

# after sudo xauth info
Nov 11 18:04:12 server sudo[11666]: user : TTY=pts/3 ; PWD=/home/user ; USER=root ; COMMAND=/usr/bin/xauth info
# no message from pam_xauth about missing DISPLAY

答え4

その部分に答えるなぜ pam_xauth次の2つの理由で、各Cookieを別々のファイルに保存します。

  • ユーザーの現在のモニター全体ではなく、1つのモニターにのみアクセスを許可します。
  • セッションの終わりにsudoファイルを削除してこのアクセス権を削除できます。

簡単に言えば、範囲とライフサイクルです。

関連情報