Sudo 권한 위임 시스템의 아키텍처
Sudo는 사용자가 다른 사용자(일반적으로 root)로 명령을 실행할 수 있도록 하는 정책 기반 권한 위임 메커니즘입니다. sudoers 정책 플러그인이 사용자의 sudo 권한을 결정하며, 이는 /etc/sudoers 파일 또는 LDAP에서 정책을 읽어 적용합니다. Sudo 프론트엔드는 먼저 /etc/sudo.conf 파일을 참조하여 로드할 정책 및 입출력 로깅 플러그인을 결정합니다. 기본적으로 sudoers 플러그인이 정책 결정과 입출력 로깅을 담당합니다.
Sudoers 파일 형식의 작동 원리
Sudoers 파일은 사용자 사양(User Specification)과 별칭(Aliases) 두 가지 항목으로 구성됩니다. 사용자 사양은 "누가(사용자) 어디서(호스트) 무엇을(명령) 실행할 수 있고, 어느 사용자/그룹으로(Runas_Spec) 실행하는가"를 정의합니다. Runas_Spec은 두 개의 Runas_List(콜론으로 분리)로 구성되며, 첫 번째는 -u 옵션으로 지정 가능한 사용자 목록, 두 번째는 -g 옵션으로 지정 가능한 그룹 목록입니다. 여러 항목이 매칭되면 마지막 매칭이 적용되므로, 순서가 중요합니다.
인증 메커니즘과 시간 기반 캐싱
기본적으로 sudoers는 사용자가 sudo를 실행하기 전에 인증을 요구합니다(rootpw, targetpw, runaspw 플래그로 변경 가능). Sudoers는 사용자 별 시간 기반 타임스탐프 파일을 사용하여 credential을 캐시합니다. 인증 후 5분(기본값) 동안 비밀번호 입력 없이 sudo를 사용할 수 있습니다. timestamp_type 옵션으로 캐시 기간의 세분성(global, ppid, tty, kernel)을 제어할 수 있으며, tty는 터미널별로 별도의 기록을 사용합니다. 시스템 시간 조정 공격을 방지하기 위해 단조 증가 시계(monotonic clock)를 사용합니다.
환경 격리와 보안 정책
기본적으로 env_reset 플래그가 활성화되어 최소 환경(TERM, PATH, HOME, MAIL, SHELL, LOGNAME, USER, SUDO_*)으로 명령을 실행합니다. env_keep 및 env_check 리스트와 매칭되는 변수만 호출자 환경에서 추가됩니다. HOME을 env_keep에 추가하면 설정 파일 검색을 통한 권한 상승이 가능하므로 권장되지 않습니다. BASH 쉘 함수는 "()" 문법으로 시작하는 환경 변수로 표현되며, 기본적으로 제거됩니다. 명령 타임아웃(TIMEOUT 지시어)은 명령 실행 시간을 제한하며, 7d8h30m10s 형식으로 지정됩니다.
로깅과 감시 전략
Sudoers는 성공/실패한 모든 sudo 시도를 기본적으로 로깅합니다. log_allowed 및 log_denied 플래그로 로깅 동작을 제어하며, syslog(기본값), 파일, 또는 둘 다에 기록합니다. 입출력 로깅(log_input, log_output)을 활성화하면 사용자 입력 및 명령 출력을 별도 디렉토리(/var/log/sudo-io 기본값)에 저장합니다. 로그 메시지는 IETF RFC 5424 호환성을 위해 기본 980바이트 제한을 두며, syslog_maxlen으로 조정 가능합니다. 감시 메커니즘 실패(감시 불가)는 ignore_iolog_errors 플래그로 제어합니다.