16P by neo 3달전 | favorite | 댓글 1개

run0: systemd의 sudo 대체 도구

  • v256에 포함된 새로운 도구 (실제로는 기존 systemd-run 을 symlink 한것)
  • sudo와 유사하게 동작하지만, SUID가 아님
  • 서비스 매니저에 타겟 사용자의 UID로 명령이나 셸을 호출하도록 요청함
    • 클라이언트에서 컨텍스트를 상속하지 않고 PID 1에서 새로 포크된 격리된 실행 컨텍스트에서 타겟 명령을 호출
  • run0는 자체 설정 언어를 구현하지 않고, 권한 부여에 polkit을 사용함.
  • 권한 상승 중에는 터미널 배경을 붉은 색조로 바꾸어 특권으로 동작중임을 알려줌. 윈도우 타이틀에도 권한 상승 여부를 나타내는 붉은 점을 표시함.
  • systemd-run의 --property= 스위치를 지원해서 호출된 특권 명령/세션에 대해 원하는 서비스 설정을 지정할 수 있음.

sudo의 문제점

  • sudo는 상대적으로 큰 SUID 바이너리로, 비특권 사용자가 자신의 컨텍스트에서 호출할 수 있는 특권 코드임.
  • 복잡한 설정 언어, 로드 가능한 플러그인(LDAP 등), 호스트 이름 매칭 등 공격 표면이 큼.
  • SUID 바이너리라는 점이 가장 큰 문제. 비특권 코드에 의해 호출되고, 비특권 코드가 제어하는 실행 컨텍스트(환경변수, 프로세스 스케줄링 속성, cgroup 할당, 보안 컨텍스트, 전달된 파일 디스크립터 등)를 상속함. SUID 바이너리는 이를 매우 주의깊게 정리해야 하지만 잘 하지 못하는 경우가 많음.

그외

  • run0로 셸 뿐 아니라 루트 권한으로 다른 명령도 실행할 수 있음. 프로그램 종료시 터미널 색상이 원래대로 돌아옴.
  • 배경색 자동 변경이 불편할 수 있지만 --background= 스위치로 변경하거나 비활성화 할 수 있음.
  • sudo를 run0로 완전히 교체하는 것도 가능해 보이지만, 배포판마다 선호하는 바가 다를 수 있음.
  • LDAP 지원 등 sudo의 플러그인 방식은 문제가 많음. polkit은 systemd에서 안전하게 관리되는 방식으로 확장 가능함.
  • run0의 bash 스크립트 실행 여부는 sudo와 호환되는 SUDO_xxx 환경변수로 확인 가능함.

GN⁺의 의견

  • 자주 사용되는 sudo의 대안으로 run0를 제시한 점이 인상적임. SUID의 위험성을 피하면서도 sudo의 장점은 계승한 것으로 보임.
  • 특권 상승 여부를 시각적으로 명확히 알려주는 것은 실수로 인한 피해를 줄이는데 도움이 될 것 같음. 터미널 배경색을 바꾸는 것이 거슬릴 수도 있겠지만 옵션으로 조정할 수 있어 큰 문제는 아닐 듯함.
  • polkit을 통한 권한 설정이 sudo보다는 덜 유연할 수 있지만, 오히려 단순해지고 공격 표면을 줄일 수 있을 것임. polkit의 설정 예시를 잘 문서화 해주는 것이 중요해 보임.
  • sudo에 의존하는 기존 스크립트 등의 마이그레이션을 위해서는 당분간 sudo도 함께 제공되어야 할 것 같음. 하지만 신규 환경이라면 처음부터 run0를 사용하는 것이 좋겠음.
  • 장기적으로는 run0 도입을 계기로 SUID를 과감히 제거하고, 시스템 권한을 시스템 서비스에서 집중 관리하는 아키텍처로의 전환을 기대해 봄. 보안과 견고성 측면에서 바람직한 방향이라 생각함.
Hacker News 의견
  • run0은 sudo와 달리 클라이언트로부터 어떤 컨텍스트도 상속받지 않고 PID 1에서 새로 포크된 격리된 exec 컨텍스트에서 대상 명령을 호출함. 이는 shell 명령의 일반적인 사용 사례와 맞지 않아 실제로는 문제의 원인이 될 것이며 널리 채택되기 어려울 것임.
  • run0이 광범위하게 사용된다면 sudo처럼 동작하는 플래그가 추가되고, 사람들은 항상 그 플래그를 사용하게 될 것임. 이것이 문제를 일으킬 때 systemd 프로젝트는 sudo를 제거하려 할 수 있음.
  • run0은 권한 레벨 간에 엄격한 IPC 경계를 가짐으로써 sudo와 다른 접근 방식을 취하고 있음. systemd를 사용하고 싶은 사람들에게는 좋은 방법이 될 수 있음.
  • sudo는 대부분 한 명에 의해 관리되고 있음.
  • run0의 동작은 여러모로 sudo보다는 ssh에 가까움. localhost에 SSH로 연결하는 것으로 유사한 도구를 구현할 수 있음.
  • 1980년대 중반 Berkeley의 실험적 BSD 클론에서 비슷한 아이디어가 테스트되었으나, 모든 것을 파이프로 전달하는 복잡성 때문에 거부되었음. 대신 상속된 환경 검사가 강화됨.
  • run0에는 로깅, 전달되는 환경변수, 시그널 처리, sudoedit 대체 방안 등에 대한 의문점들이 있음.
  • run0 외에도 Rust로 작성된 메모리 안전하고 버그가 적은 sudo 구현체가 있음.
  • 최근에는 한 물리 머신에 한 사용자만 있는 경우가 많아 유닉스 권한 시스템을 간소화할 필요가 있음.
  • 권한 상승 시 터미널 배경색을 붉게 변경하는 것은 중요한 부분이 아님.