006. Linux 서버 보안 — sudoers 설정 점검 — NOPASSWD와 와일드카드

changseop lee·5일 전

시스템 보안 · 취약점 › A. Linux 서버 보안 설정 · 6/50편 (전체 006/450)
학습 단계: 1단계 · 기본 개념
실습 표기: 이 글의 명령어·출력·로그는 로컬 VMware 테스트 VM(Rocky Linux 9 / Ubuntu 22.04) 기준의 「실습 예시」이며, IP·계정·호스트명은 가상의 값입니다.

선행 학습

1. 개념

sudo는 "누가(사용자) 어디서(호스트) 누구로(runas) 무엇을(명령)" 실행할 수 있는지를 정의합니다. 점검의 핵심은 규칙이 의도보다 넓은 권한을 주고 있지 않은지 확인하는 것입니다.

admin1   ALL=(ALL)       NOPASSWD: /usr/bin/systemctl restart httpd
 사용자   호스트=(runas)   태그       허용 명령

규칙은 /etc/sudoers와 /etc/sudoers.d/ 아래 파일에 흩어져 있을 수 있으므로 실효 권한을 sudo -l -U로 확인해야 합니다.

2. 왜 중요한가

  • sudo 규칙 하나가 사실상 root 권한을 줄 수 있습니다. 예를 들어 편집기·셸·스크립트 인터프리터를 허용하면 그 안에서 셸을 띄울 수 있습니다.
  • NOPASSWD는 계정 탈취 시 추가 인증 없이 root 명령이 가능하게 만듭니다.
  • 공격자는 기존 파일 수정보다 /etc/sudoers.d/에 새 파일을 추가하는 방식을 선호합니다. 눈에 덜 띄기 때문입니다.

3. 핵심 명령어 / 설정

위험 패턴예시이유
전체 권한 + 무암호user ALL=(ALL) NOPASSWD: ALL계정 탈취 = 즉시 root
와일드카드 인자/usr/bin/cat /var/log/**가 ../ 경로까지 확장되어 다른 파일 접근 가능
셸 탈출 가능한 프로그램vi, less, find, awk, python3프로그램 내부에서 셸 실행 가능
쓰기 가능한 스크립트 허용사용자 소유 /home/u/backup.sh스크립트 내용 교체로 임의 명령
!authenticate, Defaults !requiretty 남용정책 완화인증·감사 약화

4. 실습 (실습 예시)

# 문법 검사 + 포함 파일 확인
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 그룹이 관리자 그룹입니다.

5. 정상 상태

$ 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
  • 그룹 단위 규칙, 명령은 절대 경로 + 인자 고정, NOPASSWD 없음 → 최소 권한 원칙에 부합

6. 이상 상태

$ 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는 업데이트 관련 정상 파일처럼 보이도록 위장했을 가능성
  • 생성 시각 02:16은 003편 예시의 apache 셸 변경 시각과 근접 → 동일 공격 흐름으로 묶어 분석

7. 로그 분석 (분석 방법)

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권한 확인용 정찰 명령의 전형

8. SOC 관제 포인트

  • /etc/sudoers, /etc/sudoers.d/ 변경은 최상위 중요도로 감시합니다.
  • 서비스 계정(apache, nginx, www-data, mysql)의 sudo 실행은 그 자체로 Alert 대상입니다.
  • sudo 규칙 변경 직후의 첫 sudo 사용을 함께 보면 의도를 빠르게 파악할 수 있습니다.

9. 탐지 규칙

<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로 감시합니다.

10. 대응 방법

  1. 초기 확인 — 위험 규칙의 대상 계정·명령 범위와 파일 생성 시각을 확인합니다.
  2. 범위 확인 — 해당 규칙으로 실제 실행된 sudo 명령을 secure/auth.log에서 전수 확인합니다.
  3. 증거 확보 — sudoers 파일 사본, sudo 로그, audit 로그를 보존합니다.
  4. 차단/조치 — 비인가 규칙 파일을 격리(이동)하고 계정 권한을 회수합니다.
  5. 재발 방지 — sudoers.d 변경 감시와 서비스 계정 sudo 룰을 상시 운영합니다.

11. 핵심 정리

구분핵심 내용
규칙 구조사용자 호스트=(runas) 태그 명령
위험 패턴NOPASSWD:ALL, 와일드카드, 셸 탈출 가능 프로그램
점검 도구visudo -c, sudo -l -U
관련 룰Wazuh 5402 + 서비스 계정 조건
면접 포인트"sudoers.d 신규 파일은 은폐된 권한 상승 통로"

12. 다음 편 예고

다음 편 007. Linux 서버 보안 — sudo 로깅 강화 — logfile과 I/O 기록 에서는 sudo가 무엇을 실행했는지 더 자세히 남기는 로깅 설정(logfile, I/O 기록)을 다룹니다.


이전 편: 005. Linux 서버 보안 — umask와 기본 권한 설정 점검
📚 시리즈 전체 보기: 시스템 보안 · 취약점

profile
코드에 숨겨진 위협을 읽고 AI로 보안의 미래를 설계합니다. 프론트엔드 개발 경험을 자산 삼아 더 견고하고 지능적인 보안 운영 시스템을 구축해 나가는 과정을 기록합니다

0개의 댓글