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각각의 new 값은 다르며  종료 시 사라지는 sudo임시 파일을 가리킵니다 . sudo따라서 마지막 명령( pkexec대신 사용 sudo하고 거기에 있을 것으로 예상 /root/.Xauthority)에서는 쿠키를 볼 수 없습니다. 예를 들어, sudo gedit잘 작동하지만 pkexec env DISPLAY=$DISPLAY gedit실패합니다.

.Xauthority데이터가 어디에 저장되어 있는지, 그리고 더 중요한 것은 어떻게 데이터에 액세스할 수 있는지, 이렇게 복잡한 방식으로 수행되는 이유는 무엇입니까 pkexec?

답변1

옵션을 사용하여 X 서버를 -auth시작하면 (password)가 포함된 파일이 생성되고 MIT-MAGIC-COOKIE-1, 암호를 아는 사용자만 X Window System에 자신의 창을 표시할 수 있습니다.

MIT-MAGIC-COOKIE-1여러 개 (네트워크 로그인 등 ) 가 있을 수 있지만 ssh -X귀하의 경우 이 파일을 확인하면 정확히 동일한 내용( cmp /root/.xauth1 /root/.xauth2)을 갖게 될 것입니다.

그러나 다른 X 서버를 시작하고 sudo(또는 su)을 사용하는 경우 새 비밀번호는 달라야 합니다.

따라서 파일이 다른 이유는 sudo다른 인스턴스가 어떤 모니터를 사용하고 있는지 모르고 필요한 고유 비밀번호를 얻고 이를 저장할 새 파일을 생성하기 때문입니다.

답변2

xauth 쿠키는 이 임시 파일( )에 저장되며 ~/.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다음 두 가지 이유로 각 쿠키를 별도의 파일에 저장합니다.

  • 사용자의 현재 모니터 전체가 아닌 하나의 모니터에만 액세스를 허용합니다.
  • 세션이 끝날 때 sudo파일을 삭제하여 이 액세스 권한을 제거 할 수 있습니다.

간단히 말해서 범위와 수명주기입니다.

관련 정보