대상 OS: Debian 12 (bookworm)

사고가 터지고 나서 가장 곤란한 질문은 이것이다.
“누가 root로 들어가서 정확히 어떤 명령을 실행했지?”
bash 히스토리는 삭제될 수 있고, sudo 로그는 보통 ‘명령 문자열 한 줄’만 남겨 맥락이 부족하다.
Debian 12에서 sudo의 I/O 로깅(log_input/log_output)을 켜면, sudo로 실행된 세션의 입력/출력을 파일로 남길 수 있다.
오늘은 이 기능을 ‘운영 가능한 형태’로 구축하는 방법(분리 저장, 권한, 보관 정책, 검증)을 정리한다.

---

이 글의 목표와 주의점

- 목표: sudo 사용 시 **세션 단위 증거**(입력/출력)를 남겨 사후 분석을 가능하게 한다.
- 주의: I/O 로깅은 민감정보(토큰/패스워드/키)가 기록될 수 있다.
- 접근 권한을 강하게 제한하고
- 보관 기간을 명확히 하고
- 필요하면 특정 명령은 예외 처리해야 한다.

---

준비: 현재 sudo 버전/설정 경로 확인

1.

sudo 버전과 컴파일 옵션을 확인한다.

sudo -V | sed -n '1,120p'

2.

sudoers 편집은 항상 visudo로 한다(문법 오류로 잠금 방지).

sudo visudo -c

---

설계: 로그를 어디에, 어떤 권한으로 저장할 것인가

권장 설계는 “iolog 전용 디렉터리 + root만 접근”이다.

1.

전용 디렉터리 생성.

sudo install -d -m 0700 -o root -g root /var/log/sudo-io

2.

로그가 커질 수 있으니 별도 파티션/용량 계획이 있으면 더 좋다.
(최소한 `df -h`로 여유 용량을 확인하자.)

df -h /var/log

---

구현 1: sudoers에 I/O 로깅 정책 추가(기본 정책)

Debian 12에서 sudoers에 아래 옵션을 추가한다.

- `log_input`, `log_output`: sudo 세션의 입력/출력 로깅
- `iolog_dir`: 로깅 파일 저장 위치
- `iolog_file`: 파일명 템플릿(세션/유저/시간 등을 포함)
- `loglinelen`: 한 줄 길이(너무 짧으면 분석 불편)

1.

sudoers 편집.

sudo visudo

2.

파일 맨 아래(또는 정책 섹션)에 Defaults를 추가한다.

# --- root.so: sudo I/O logging (Debian 12) ---
Defaults log_input,log_output
Defaults iolog_dir="/var/log/sudo-io"
Defaults iolog_file="%{seq}-%{user}-%{command}"
Defaults loglinelen=0

- `loglinelen=0`은 줄바꿈/길이 제한을 완화해 출력이 잘리지 않게 한다.
- `iolog_file`에 `%{command}`가 들어가면 파일명이 길어질 수 있다. 운영 환경에 따라 `%{seq}-%{user}` 정도로 단순화해도 된다.

3.

문법 검증.

sudo visudo -c

---

구현 2: 민감 명령/민감 경로는 예외 처리(현실적인 안전장치)

무조건 전체 로깅을 켜면 비밀이 남는다.
특히 아래 유형은 조직 정책에 따라 예외가 필요할 수 있다.

- 비밀/키를 다루는 명령(예: 패스워드 입력을 유도하는 도구)
- 인프라 토큰/클라우드 자격증명 출력
- 긴 바이너리 출력(로그 폭증)

sudo는 “특정 명령에 대해 I/O 로깅을 끄는” 방식으로 조정할 수 있다.
예시는 `apt` 같은 일반 운영 명령은 로깅하고, 특정 민감 명령은 `!log_input,!log_output`로 제외하는 패턴이다.

1.

Cmnd_Alias를 정의한다(예: 민감 명령 목록).

sudo visudo
# 예시: 조직 상황에 맞게 엄선해서 추가
Cmnd_Alias NOIOLOG = /usr/bin/passwd, /usr/bin/chpasswd

# 해당 명령은 I/O 로깅 제외(감사 필요성 vs 민감정보 노출을 비교해서 결정)
Defaults!NOIOLOG !log_input, !log_output

2.

검증.

sudo visudo -c

주의: “무엇을 예외로 둘지”는 보안팀/운영팀 합의가 필요하다. 예외가 늘수록 감사 효율이 떨어진다.

---

검증: 실제로 어떤 파일이 생성되고, 권한은 안전한가

1.

테스트로 간단한 sudo 명령을 실행한다.

sudo id
sudo ls -al /root 2>/dev/null || true

2.

iolog 디렉터리에 파일이 생성되는지 확인한다.

sudo find /var/log/sudo-io -maxdepth 2 -type f | head
sudo find /var/log/sudo-io -maxdepth 2 -type d | head

3.

권한이 root-only인지 확인한다.

sudo ls -ld /var/log/sudo-io
sudo namei -l /var/log/sudo-io | sed -n '1,120p'

---

운영 1: 로그 보관/정리(용량 폭증 방지)

I/O 로그는 생각보다 빠르게 커진다. 최소한 보관 정책을 잡자.
가장 단순한 방법은 systemd-tmpfiles로 오래된 세션 디렉터리를 정리하는 것이다.

1.

tmpfiles 규칙 파일 생성(예: 30일 보관).

sudo tee /etc/tmpfiles.d/sudo-io.conf >/dev/null