시스템 보안 · 취약점 › A. Linux 서버 보안 설정 · 6/50편 (전체 006/450)
학습 단계: 1단계 · 기본 개념
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.
sudo는 "누가(사용자) 어디서(호스트) 누구로(runas) 무엇을(명령)" 실행할 수 있는지를 정의합니다. 점검의 핵심은 규칙이 의도보다 넓은 권한을 주고 있지 않은지 확인하는 것입니다.
admin1 ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart httpd
사용자 호스트=(runas) 태그 허용 명령
규칙은 /etc/sudoers와 /etc/sudoers.d/ 아래 파일에 흩어져 있을 수 있으므로 실효 권한을 sudo -l -U로 확인해야 합니다.
NOPASSWD는 계정 탈취 시 추가 인증 없이 root 명령이 가능하게 만듭니다./etc/sudoers.d/에 새 파일을 추가하는 방식을 선호합니다. 눈에 덜 띄기 때문입니다.| 위험 패턴 | 예시 | 이유 |
|---|---|---|
| 전체 권한 + 무암호 | user ALL=(ALL) NOPASSWD: ALL | 계정 탈취 = 즉시 root |
| 와일드카드 인자 | /usr/bin/cat /var/log/* | *가 ../ 경로까지 확장되어 다른 파일 접근 가능 |
| 셸 탈출 가능한 프로그램 | vi, less, find, awk, python3 | 프로그램 내부에서 셸 실행 가능 |
| 쓰기 가능한 스크립트 허용 | 사용자 소유 /home/u/backup.sh | 스크립트 내용 교체로 임의 명령 |
!authenticate, Defaults !requiretty 남용 | 정책 완화 | 인증·감사 약화 |
# 문법 검사 + 포함 파일 확인
sudo visudo -c
sudo ls -l /etc/sudoers.d/
# 주석 제외 실효 규칙 모아 보기
sudo grep -hEv '^\s*(#|$)' /etc/sudoers /etc/sudoers.d/* 2>/dev/null
# 위험 키워드 탐색
sudo grep -nE 'NOPASSWD|ALL\s*$|\*|!authenticate' /etc/sudoers /etc/sudoers.d/*
# 사용자별 실효 권한
for u in $(getent group wheel sudo | cut -d: -f4 | tr ',' ' '); do echo "== $u"; sudo -l -U "$u"; done
Rocky는 wheel, Ubuntu는 sudo 그룹이 관리자 그룹입니다.
$ sudo visudo -c
/etc/sudoers: parsed OK
/etc/sudoers.d/ops: parsed OK
$ sudo grep -hEv '^\s*(#|$)' /etc/sudoers.d/*
%ops ALL=(root) /usr/bin/systemctl restart httpd, /usr/bin/systemctl status httpd
$ sudo ls -l /etc/sudoers.d/
-r--r-----. 1 root root 44 Oct 1 02:16 99-sysupdate
$ sudo cat /etc/sudoers.d/99-sysupdate
apache ALL=(ALL) NOPASSWD: ALL
apache에 무암호 전체 권한 → 웹 취약점(D·E 웹 영역에서 다룬 명령 실행 계열)과 결합하면 즉시 root 획득99-sysupdate는 업데이트 관련 정상 파일처럼 보이도록 위장했을 가능성apache 셸 변경 시각과 근접 → 동일 공격 흐름으로 묶어 분석sudoers 파일 생성과 이후 사용 흔적을 연결합니다(가상의 예시 로그).
type=PATH msg=audit(1759713360.201:955): item=1 name="/etc/sudoers.d/99-sysupdate" nametype=CREATE ouid=0
Oct 1 02:17:05 rocky9-web01 sudo[3190]: apache : TTY=unknown ; PWD=/var/www/html ; USER=root ; COMMAND=/usr/bin/id
| 관찰 | 해석 |
|---|---|
apache가 sudo 실행 | 서비스 계정의 대화형 권한 사용은 비정상 |
TTY=unknown | 터미널 없이 실행(웹셸·스크립트 경유 가능성) |
PWD=/var/www/html | 웹 루트에서 실행 → 웹 침해 연계 |
첫 명령이 id | 권한 확인용 정찰 명령의 전형 |
/etc/sudoers, /etc/sudoers.d/ 변경은 최상위 중요도로 감시합니다.apache, nginx, www-data, mysql)의 sudo 실행은 그 자체로 Alert 대상입니다.<group name="local,sudo,">
<rule id="100130" level="12">
<if_sid>5402</if_sid>
<user>^apache$|^nginx$|^www-data$|^mysql$</user>
<description>서비스 계정의 sudo root 실행</description>
</rule>
</group>
5402는 Wazuh의 "Successful sudo to ROOT executed" 기본 룰입니다. sudoers 파일 자체는 FIM(550/554)과 auditd -w /etc/sudoers.d/ -p wa -k sudoers로 감시합니다.
secure/auth.log에서 전수 확인합니다.| 구분 | 핵심 내용 |
|---|---|
| 규칙 구조 | 사용자 호스트=(runas) 태그 명령 |
| 위험 패턴 | NOPASSWD:ALL, 와일드카드, 셸 탈출 가능 프로그램 |
| 점검 도구 | visudo -c, sudo -l -U |
| 관련 룰 | Wazuh 5402 + 서비스 계정 조건 |
| 면접 포인트 | "sudoers.d 신규 파일은 은폐된 권한 상승 통로" |
다음 편 007. Linux 서버 보안 — sudo 로깅 강화 — logfile과 I/O 기록 에서는 sudo가 무엇을 실행했는지 더 자세히 남기는 로깅 설정(logfile, I/O 기록)을 다룹니다.
이전 편: 005. Linux 서버 보안 — umask와 기본 권한 설정 점검
📚 시리즈 전체 보기: 시스템 보안 · 취약점