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
返されると (コマンドが完了したときなど) 削除されます。sudo
sudo 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
ファイルを削除してこのアクセス権を削除できます。
簡単に言えば、範囲とライフサイクルです。