sudoers 권한 설정
사용자 및 그룹 기반 sudo 권한, 명령어 별칭, 보안 기본값 설정을 포함하는 /etc/sudoers.d/ 구성 템플릿입니다.
# /etc/sudoers.d/99-custom-sudoers
# sudo 권한 설정 파일
#
# ⚠️ 반드시 visudo로 편집할 것:
# sudo visudo -f /etc/sudoers.d/99-custom-sudoers
#
# visudo는 저장 전 문법 검사를 수행 — 직접 편집 시
# 오류로 인해 sudo가 완전히 작동 불능이 될 수 있음
#
# 문법 검사: sudo visudo -c -f /etc/sudoers.d/99-custom-sudoers
# ============================================================
# Defaults: 전역 보안 기본값 설정
# ============================================================
# 허용된 실행 경로만 사용 (PATH 하이재킹 공격 방지)
Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
# sudo 실행 시 유지할 환경 변수 (나머지는 초기화)
Defaults env_keep += "LANG LANGUAGE LC_ALL LC_MESSAGES"
Defaults env_keep += "EDITOR VISUAL"
Defaults env_keep += "http_proxy https_proxy no_proxy"
# 비밀번호 캐시 유효 시간 (분) — 0으로 설정 시 매번 인증
# 민감한 서버에서는 0 권장
Defaults timestamp_timeout=5
# sudo 명령 실행 로그 기록 (감사 추적)
Defaults log_file=/var/log/sudo.log
Defaults loglinelen=0 # 로그 줄 바꿈 없이 전체 기록
Defaults log_input # 입력 내용 기록
Defaults log_output # 출력 내용 기록
# 비밀번호 입력 시 별표(*) 표시 (기본값: 아무것도 표시 안 함)
Defaults pwfeedback
# 잘못된 비밀번호 입력 시 조롱 메시지 비활성화
Defaults !lecture
# sudo 인증 실패 시 지연 (브루트포스 방지)
Defaults passwd_tries=3
# ============================================================
# 명령어 별칭 (Command Aliases) 정의
# 관련 명령어를 그룹화하여 관리 편의성 향상
# ============================================================
# 서비스 관리 명령어
Cmnd_Alias SERVICE_CMDS = \
/usr/bin/systemctl start *, \
/usr/bin/systemctl stop *, \
/usr/bin/systemctl restart *, \
/usr/bin/systemctl reload *, \
/usr/bin/systemctl status *, \
/usr/bin/systemctl enable *, \
/usr/bin/systemctl disable *
# 네트워크 진단 명령어 (읽기 전용, 위험도 낮음)
Cmnd_Alias NETWORK_DIAG = \
/usr/sbin/iptables -L, \
/usr/sbin/nft list ruleset, \
/usr/bin/ss -tulnp, \
/usr/sbin/ip addr, \
/usr/sbin/ip route
# 패키지 관리 명령어
Cmnd_Alias PKG_CMDS = \
/usr/bin/apt update, \
/usr/bin/apt upgrade -y, \
/usr/bin/apt install *, \
/usr/bin/apt remove *
# Nginx 관련 명령어
Cmnd_Alias NGINX_CMDS = \
/usr/sbin/nginx -t, \
/usr/bin/systemctl reload nginx, \
/usr/bin/systemctl restart nginx
# Docker 관련 명령어
Cmnd_Alias DOCKER_CMDS = \
/usr/bin/docker ps *, \
/usr/bin/docker logs *, \
/usr/bin/docker restart *, \
/usr/bin/docker-compose up *, \
/usr/bin/docker-compose down *
# 절대 허용하면 안 되는 위험 명령어
Cmnd_Alias DANGER_CMDS = \
/usr/bin/su, \
/usr/bin/passwd root, \
/usr/sbin/visudo, \
/bin/chmod 777 *, \
/bin/chown root *
# ============================================================
# 사용자별 권한 설정
# 형식: 사용자 호스트=(실행계정:실행그룹) [NOPASSWD:] 명령어
# ============================================================
# deploy 계정: 특정 서버에서 서비스 재시작만 허용 (비밀번호 불필요)
# CI/CD 파이프라인 자동 배포에 적합
deploy prod-server=(root:root) NOPASSWD: SERVICE_CMDS, NGINX_CMDS
# developer 그룹: 서비스 상태 확인 및 로그 조회만 허용
%developer ALL=(root) NOPASSWD: \
/usr/bin/systemctl status *, \
/usr/bin/journalctl -u *, \
/usr/bin/journalctl --since *, \
NETWORK_DIAG
# ops 그룹: 패키지 관리 및 서비스 관리 허용 (비밀번호 필요)
# 보안상 중요한 작업이므로 비밀번호 인증 유지
%ops ALL=(root) SERVICE_CMDS, PKG_CMDS
# docker 그룹: Docker 작업 허용 (비밀번호 불필요)
%docker-ops ALL=(root) NOPASSWD: DOCKER_CMDS
# admin 사용자: 전체 sudo 허용 (단, 위험 명령어 제외)
# !DANGER_CMDS: 해당 명령어 명시적 차단
admin ALL=(ALL:ALL) ALL, !DANGER_CMDS
# ============================================================
# 호스트 별칭 (Host Aliases) — 다중 서버 환경
# 동일 sudoers 파일을 여러 서버에 배포할 때 유용
# ============================================================
# 서버 그룹 정의
Host_Alias WEB_SERVERS = web01, web02, web03
Host_Alias DB_SERVERS = db01, db02
Host_Alias ALL_SERVERS = WEB_SERVERS, DB_SERVERS
# 웹 서버에서만 Nginx 관리 권한 부여
%webadmin WEB_SERVERS=(root) NOPASSWD: NGINX_CMDS
# ============================================================
# 루트 계정 직접 전환 방지
# wheel 그룹 구성원도 루트로 직접 전환 불가
# ============================================================
# 특정 사용자의 루트 쉘 획득 차단
%sudo ALL=(root) !/bin/bash, !/bin/sh, !/bin/dash
%sudo ALL=(root) !/usr/bin/passwd root