sudo -i가 대상 사용자에 대해 XDG_RUNTIME_DIR을 설정하지 않은 이유는 무엇입니까? 방지, 설정

XDG_RUNTIME_DIRsystemctl --user일하는 데 필요 합니다.

시스템 사용자 세션을 실행하도록 우분투 서버 16.04를 설정했습니다. 를 관리 할 때 지금, 나는 통해 사용자를 바꾸는 경우에 것을 발견 sudo -u $user -i하거나 su - $user, 환경이하지 않는 XDG_RUNTIME_DIR것을 방지, 설정 systemctl --user작업에서. 그러나 ssh해당 사용자 에게 직접 연결하면 올바르게 설정됩니다.

설명서를 올바르게 이해 libpam-systemd하면 사용자 세션을 만들 때 설정해야합니다 . XDG_RUNTIME_DIRpoint ( /run/users/$uid) 디렉토리 가 존재 하므로 사용자 슬라이스가 올바르게 시작됩니다 . .bash_profilepam이 처리해야 할 때 해킹 된 것처럼 보이기 때문에 하드 코딩하는 것이 주저 합니다.

물론에 추가 XDG_RUNTIME_DIR할 수 env_keepsudoers있지만 sudoing 사용자 환경을 보존하기 때문에 원하는 것이 아닙니다. 대상 사용자 환경을 원합니다 .

그래도 내가 정말로 궁금한 것은 세션이와 함께 올바르게 설정 ssh되었지만 su또는로 설정 되지 않은 방법입니다 sudo -i.



답변

Fedora 25 시스템에서이 문제를 복제했습니다.

소스 코드에서 매우 의심스러운 상태를 발견했습니다. https://github.com/systemd/systemd/blob/f97b34a/src/login/pam_systemd.c#L439 평범하게 작성된 것처럼 보이지만 sudo그렇지 않은 것 같습니다 sudo -u non-root-user.

machinectl shell --uid=non-root-user 당신이 요청 한대로 일했습니다.

systemd-run machinectl 문서에서 참조에도 불구하고 원하는대로 작동하지 않는 것 같습니다.

현재 SELinux를 활성화 한 경우 일부 machinectl 명령이 작동하지 않으며 이러한 특정 명령은 내가 할 때까지 작동하지 않았습니다 setenforce 0. 그러나 나는 SELinux를 사용하기를 원할 때 machinectl이 작동하도록 해결 방법을 시도하고 있습니다 machinectl shell.

편집 :이 코드는 이 토론 후에 소개 된 것 같습니다 . 그리고 분명히 su -/ sudo -i작동하도록 만들 수는 있지만 아무도 그것을 구현하지 못했습니다 (아직).


답변

그러나 내가 정말로 궁금한 것은 세션이 ssh로 올바르게 설정되었지만 su 또는 sudo -i로는 어떻게 설정되지 않는 것입니까?

https://github.com/systemd/systemd/issues/7451#issuecomment-346787237

죄송하지만 “su”는 사용자 ID를 변경하고 다른 프로세스 자격 증명을 일시적으로 변경하기위한 도구입니다. 완전히 새로운 로그인 세션을 여는 도구는 아닙니다. 새로운 로그인 세션은 다른 세션에서 아무것도 상속받지 않고 잘 정의 된 원시 설정을 갖지만 실제로는 “su”uid 변경의 경우에는 해당되지 않습니다. 대부분의 실행 환경은 수많은 그리고 명백하지 않고 상속됩니다. MAC 컨텍스트, 감사 컨텍스트, cgroup 컨텍스트, 네임 스페이스 컨텍스트, 스케줄링, 타이머 세분성 등의 방법

완전히 새로운 세션을 원한다면 “machinectl login”또는 “machinectl shell”과 같은 것을 사용하십시오. 실제로는 완전히 깨끗하고 독립적이며 분리 된 환경을 얻을 수 있으며, 호출 된 곳에서 숨겨진 프로세스 속성이 누출되지 않습니다.

로그인 된 세션은 대부분 감사 세션 개념에 구속되며 감사 세션은 “su”의 영향을받지 않습니다. 실제로 “봉인 된”것으로 정의됩니다. 즉, 프로세스가 세션에 한 번 입력되면 항상 유지됩니다. 그것으로, 자식도 마찬가지입니다. 즉, 새로운 세션을 얻는 유일한 방법은 세션에 포함되지 않은 PID 1 (또는 유사한 것)을 끄는 것입니다.

또는 다르게 말하면 : “su”를 통해 호출 한 항목은 “loginctl”에 잘 표시되지만 원래 로그인 한 상태이므로 원래 로그인 한 상태입니다. 원래 세션의 ID에서 “loginctl status”를 호출하여 확인할 수 있습니다 (echo $ XDG_SESSION_ID를 통해 볼 수 있음).