sudo
- setuid bit로 root 권한 획득
- 실행자, 호스트, 목표 사용자, 명령어 파악
- sudoers 규칙들과 순차적으로 매칭
- 인증 (비밀번호 or 타임스탬프)
- fork → setuid/setgid → execve로 명령 실행
Info
-u 옵션이 없는 경우 root 가 기본값
- setgid 의 경우 목표 사용자의 primary group으로 설정
동작
1// sudo 내부 코드 (의사 코드)
2
3struct context {
4 char *real_user; // "john" (RUID로부터)
5 char *hostname; // "macbook-pro.local"
6 char *target_user; // "postgres" (-u 옵션)
7 char *target_group; // "postgres" (-g 옵션 또는 기본)
8 jchar *command; // "/usr/bin/psql"
9 char **args; // 명령어 인자들
10};
11
12context ctx = {
13 .real_user = getpwuid(getuid()), // john
14 .hostname = gethostname(), // macbook-pro.local
15 .target_user = parse_u_option() ?: "root", // postgres
16 .command = find_command_path("psql"), // /usr/bin/psql
17};
18
19// sudoers 파일 읽기 (root 권한이 있어야 읽을 수 있음)
20FILE *sudoers = fopen("/etc/sudoers", "r");
21
22// 파싱 결과 (예시)
23rules[] = {
24 { user: "root", host: "ALL", runas_user: "ALL", runas_group: "ALL", command: "ALL" },
25 {
26 user: "%admin", // % = 그룹
27 host: "ALL",
28 runas_user: "ALL",
29 runas_group: "ALL",
30 command: "ALL"
31 },
32 // ... 다른 규칙들
33};
34
35// 규칙 매칭
36// 인증 (+타임스탬프 확인)
37// 명령어 실행
sudoers
/etc/sudoers
문법
1# 사용자 호스트 = (실행될 사용자) 명령어
2%admin ALL = (ALL) ALL