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
반환 시(예: 명령이 완료될 때) 삭제됩니다.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
다음 두 가지 이유로 각 쿠키를 별도의 파일에 저장합니다.
- 사용자의 현재 모니터 전체가 아닌 하나의 모니터에만 액세스를 허용합니다.
- 세션이 끝날 때
sudo
파일을 삭제하여 이 액세스 권한을 제거 할 수 있습니다.
간단히 말해서 범위와 수명주기입니다.