Linux 시스템 보안 기초 · 29/50편
이 글은
리눅스 시스템 기초·파일 · 권한 · 사용자 관리·서비스 · 프로세스 관리시리즈를 선행 학습으로 두고, 동일한 개념을 보안관제(SOC) 관점에서 한 단계 확장합니다.
서비스는 '재부팅해도 다시 뜨는 프로세스'입니다. 그래서 공격자에게 서비스는 지속성의 이상적 수단입니다. 이번 편은 systemd 서비스의 구조와, 그것이 어떻게 보안 위험이 되는지 봅니다.
systemd 서비스의 핵심 요소:
.service): 서비스 정의. /etc/systemd/system/, /lib(usr/lib)/systemd/system/, 그리고 사용자 단위 ~/.config/systemd/user/보안 관점에서 위험한 조합은 'root 실행 + 낯선 ExecStart + enabled'입니다.
Unit 파일(.service)
├── ExecStart= ← 무엇을 실행? (핵심)
├── User= ← 어떤 권한? (미지정=root)
└── WantedBy= ← 부팅 자동시작?
│ systemctl enable
▼
재부팅해도 자동 실행 → 지속성
systemd는 Unit 파일을 읽어 서비스를 관리합니다. enable하면 지정 target(예: multi-user)에 심볼릭 링크가 생겨 부팅 시 자동 시작됩니다. 공격자는 악성 Unit을 만들어 enable하면, 재부팅·프로세스 종료 후에도 자동으로 되살아나는 지속성을 얻습니다(30편).
사용자 단위 서비스(systemctl --user)나 drop-in 오버라이드(.d/*.conf)는 특히 눈에 덜 띄어, 점검 시 시스템 단위만 보면 놓칠 수 있습니다.
# enabled 서비스 목록
systemctl list-unit-files --type=service --state=enabled
# 특정 서비스의 실제 정의(ExecStart/User 확인)
systemctl cat <name>.service
# 사용자 단위 서비스(놓치기 쉬움)
systemctl --user list-unit-files --type=service 2>/dev/null
일반 서버에서 서비스 정의 확인 형식입니다. (예시 출력 — systemd가 PID 1인 표준 서버 기준; 본 실습 컨테이너는 systemd가 PID 1이 아니어서 형식 예시)
$ systemctl cat sshd.service
# /lib/systemd/system/ssh.service
[Service]
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
...
정상 서비스는 ExecStart가 표준 바이너리를 가리킵니다. 여기에 /tmp/x나 bash -c 'curl ... | sh' 같은 ExecStart가 보이면 악성 서비스입니다(30편).
서비스 점검은 '실행 정의(ExecStart)'와 '자동시작(enabled)'을 함께 봐야 지속성을 잡습니다.
악성 서비스는 MITRE T1543.002(Systemd Service) 지속성 기법입니다. Wazuh FIM으로 Unit 디렉터리를 감시하고, 신규/변경 Unit을 알람합니다. SIEM에서는 서비스 생성·enable 이벤트를 SSH 로그인·권한 상승과 상관분석해 '침입→지속성' 흐름을 탐지합니다.
[ ] enabled 서비스 목록 확보
[ ] 각 서비스 ExecStart/User 확인
[ ] 사용자 단위/drop-in 점검
[ ] Unit 디렉터리 변경 감사
다음 편에서는 30. 악성 systemd 서비스 탐지 를 다룹니다. 실제 악성 systemd 서비스를 어떻게 식별하는지, Unit 파일 분석 관점에서 봅니다.
본 실습은 격리된 테스트 VM(Rocky Linux / Ubuntu, VMware) 및 테스트 계정 환경을 기준으로 하며, 운영 서버를 대상으로 하지 않습니다. 실행 결과는 실제 캡처와 예시 출력을 명확히 구분해 표기합니다.