프로세스·데몬·서비스 관리
프로세스 상태와 좀비·고아를 구분하고 서비스의 자동 시작·현재 실행·포트 노출을 따로 판단합니다.
1. 프로그램과 프로세스는 다르다
| 구분 | 프로그램 | 프로세스 |
|---|---|---|
| 의미 | 저장장치에 있는 실행 코드 | 실행 중인 작업 단위 |
| 주요 정보 | 파일, 코드, 라이브러리 | PID, 메모리, 열린 파일, 계정, 상태 |
| 보안 질문 | 누가 변경할 수 있는가? | 누구의 권한으로 무엇을 하는가? |
하나의 프로그램에서 여러 프로세스가 실행될 수 있으며, 각 프로세스는 서로 다른 사용자·환경·파일·네트워크 연결을 가질 수 있다.
2. PID·PPID와 실행 신원
- PID: 프로세스를 식별하는 번호
- PPID: 부모 프로세스의 PID
- UID/GID 또는 Windows 토큰: 프로세스가 실제로 사용할 권한
보안 점검에서는 프로세스 이름만 보지 않는다. 같은 프로그램도 관리자·root 권한으로 실행되는지, 전용 서비스 계정으로 실행되는지에 따라 침해 시 영향이 달라진다.
부모 프로세스
↓ 새 프로세스 생성
자식 프로세스
↓ 다른 프로그램 실행 가능
서비스·사용자 프로그램
3. 대표적인 프로세스 상태
운영체제와 도구마다 표시 방식은 다르지만 일반적으로 다음 상태를 구분한다.
| 상태 | 의미 |
|---|---|
| 실행/실행 가능 | CPU를 사용 중이거나 사용할 준비가 됨 |
| 대기/수면 | 이벤트·입출력·타이머 등을 기다림 |
| 중지 | 신호나 디버깅 등으로 실행이 멈춤 |
| 좀비 | 실행은 끝났지만 부모가 종료 정보를 회수하지 않음 |
CPU 사용률이 낮다고 안전한 프로세스는 아니며, CPU 사용률이 높다고 곧 악성 프로세스도 아니다. 실행 경로, 계정, 부모 프로세스, 네트워크 연결, 파일 변경과 함께 판단한다.
4. 좀비와 고아 프로세스
좀비 프로세스는 자식 프로세스가 종료됐지만 부모가 종료 상태를 회수하지 않아 프로세스 표에 최소 정보가 남아 있는 상태다. 일반적으로 실행 코드는 끝났으므로 CPU를 계속 사용하는 살아 있는 프로세스와 다르다.
고아 프로세스는 부모가 먼저 종료되어 다른 시스템 프로세스가 부모 역할을 넘겨받은 프로세스다. 자식은 계속 실행 중일 수 있다.
| 구분 | 실행 여부 | 핵심 원인 |
|---|---|---|
| 좀비 | 종료됨 | 부모가 종료 상태를 회수하지 않음 |
| 고아 | 실행 중일 수 있음 | 부모가 먼저 종료됨 |
좀비가 반복적으로 많이 생긴다면 응용프로그램의 프로세스 관리 오류를 의심할 수 있다.
5. 신호와 프로세스 종료
Unix/Linux의 신호는 프로세스에 사건을 알리는 수단이다.
- 정상 종료 요청(SIGTERM, 15): 프로그램이 처리할 수 있어 정리 기회를 제공
- 강제 종료(SIGKILL, 9): 잡거나 무시할 수 없는 종료 신호
- 일시 중지·재개·설정 재읽기: 프로그램이 지원하는 경우 사용
강제 종료는 열린 파일, 트랜잭션, 임시 데이터가 정상적으로 정리되지 못하게 할 수 있다. 따라서 보안 사고가 아닌 일반 운영에서는 먼저 정상 종료를 시도한다. 사고 상황에서는 증거 보존과 확산 위험을 함께 판단한다.
6. 데몬과 서비스
데몬(daemon)은 Unix/Linux에서 백그라운드로 지속 실행되는 프로그램을 가리키는 전통적 표현이다. 서비스(service)는 운영체제의 서비스 관리자가 시작·중지·재시작·상태 확인 등을 관리하는 기능 단위다.
둘은 자주 겹치지만 완전히 같은 말은 아니다. 소켓 활성화처럼 요청이 들어올 때만 프로세스가 시작될 수도 있고, 여러 프로세스가 하나의 서비스를 구성할 수도 있다.
7. 현재 실행과 자동 시작은 다르다
현대 Linux에서 systemd를 사용하는 경우 다음 상태를 구분한다.
| 상태 | 질문 |
|---|---|
| active/running | 지금 실행 중인가? |
| enabled | 부팅 또는 특정 조건에서 자동 활성화되도록 연결돼 있는가? |
| failed | 시작·실행 과정에서 실패 상태인가? |
서비스가 지금 실행 중이더라도 자동 시작이 아닐 수 있고, 자동 시작으로 설정돼 있어도 현재는 중지돼 있을 수 있다. 시험에서는 start/stop과 enable/disable의 목적을 구분한다.
전통적인 SysV runlevel과 inetd/xinetd는 과거·일부 환경에서 사용된 구조로 이해한다. 현재 시스템에서 실제 서비스 관리자가 무엇인지 먼저 확인해야 한다.
8. 서비스 실행과 포트 수신은 별도 상태다
서비스 보안 점검은 다음을 단계별로 본다.
패키지·프로그램 존재
↓
서비스 설정 존재
↓
프로세스 실행
↓
소켓·포트 수신
↓
방화벽·라우팅을 거쳐 도달 가능
↓
업무상 허가된 노출인가?
프로세스가 실행 중이어도 네트워크 포트를 열지 않을 수 있다. 반대로 소켓 활성화 구조에서는 서비스 프로세스가 아직 없는데 포트가 수신 중일 수 있다.
9. 서비스 보안에서 확인할 항목
- 업무에 필요한 서비스인가?
- 누구의 권한으로 실행되는가?
- 실행 파일과 설정을 누가 변경할 수 있는가?
- 외부에서 어느 주소·포트로 접근 가능한가?
- 기본·시험·불필요 기능이 활성화돼 있는가?
- 실패·재시작·설정 변경이 기록되는가?
- 패치와 안전한 설정이 적용돼 있는가?
불필요한 서비스는 공격 표면을 늘린다. 필요한 서비스도 관리자 권한이 아니라 가능한 한 전용 계정과 최소 권한으로 실행해야 한다.
개념 확인 문제
문제를 누르면 바로 아래에서 정답과 해설을 확인할 수 있습니다.
01좀비 프로세스와 고아 프로세스의 차이는?
좀비는 이미 종료됐지만 부모가 종료 상태를 회수하지 않은 상태다. 고아는 부모가 먼저 종료된 프로세스로, 실행 중일 수 있고 다른 프로세스가 부모 역할을 맡는다.
02서비스가 enabled이면 현재 외부에서 접속할 수 있는가?
그 사실만으로는 알 수 없다. 자동 활성화 설정, 현재 실행, 수신 주소·포트, 방화벽·라우팅은 서로 다른 조건이다.