linux) sudo

sudo

  1. setuid bit로 root 권한 획득
  2. 실행자, 호스트, 목표 사용자, 명령어 파악
  3. sudoers 규칙들과 순차적으로 매칭
  4. 인증 (비밀번호 or 타임스탬프)
  5. 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

  • sudo 의 정책 엔진

문법

1# 사용자 호스트 = (실행될 사용자) 명령어
2%admin ALL = (ALL) ALL

포스트
카테고리
시리즈