정보보안기사 | systemd의 .service와 .socket — xinetd 구성 (4/4)

정보보안기사 | systemd의 .service와 .socket — xinetd 구성 (4/4)

⚙️ 정보보안기사 | systemd의 .service와 .socket — xinetd 구성 (4/4)

.service 상주형 vs .socket 온디맨드형 · xinetd → systemd 1:1 대응 관계 · 접근 제어의 firewalld 분리 · 변환 예제까지 시리즈 최종편

#systemd #.service #.socket #socket_activation #xinetd대체 #정보보안기사

📋 목차

  • 1. 서비스 기동 방식의 3가지 모델
  • 2. .service 파일 구조와 핵심 명령어
  • 3. .socket 파일 구조 — xinetd의 현대판
  • 4. xinetd → systemd 1:1 대응 관계표
  • 5. 변환 예제 — xinetd 설정을 systemd로
  • 6. systemd의 추가 보안 기능
  • 7. 시험 출제 맥락 5가지
  • 8. 시리즈 총정리

1. 서비스 기동 방식의 3가지 모델

모델 A · 레거시
xinetd 방식
평소에 데몬 꺼짐 → xinetd가 포트를 대신 듣다가 → 요청 시 fork로 데몬 실행
모델 B · 상주형
.service 방식
부팅 시 데몬이 올라와서 항상 실행중. 요청 즉시 응답. SSH, 웹서버 등에 적합.
모델 C · 온디맨드 (xinetd 대체)
.socket 방식
systemd가 소켓만 열어둠 → 요청 시 .service 시작. xinetd와 동작 원리 동일.
🔄 .socket 방식 동작 흐름
Client → :873 → rsync.socket (대기중) → start → rsync.service (이때 시작)

2. .service 파일 구조와 핵심 명령어

파일 위치 (우선순위 순서)

📁 유닛 파일 우선순위
/etc/systemd/system/ ← 관리자 생성 (최우선)
/usr/lib/systemd/system/ ← 패키지 기본값
/lib/systemd/system/ ← Debian 계열

구조 예시: sshd.service

[Unit]
Description=OpenSSH server daemon
After=network.target

[Service]
Type=notify
ExecStart=/usr/sbin/sshd -D
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target
섹션항목의미
[Unit]Description서비스 설명
After이 서비스보다 먼저 시작되어야 할 유닛
[Service]ExecStart서비스 시작 명령 (절대경로 필수)
Restart재시작 정책 (on-failure, always 등)
Type서비스 타입 (simple, forking, notify)
[Install]WantedBysystemctl enable 시 연결할 타겟

핵심 관리 명령어

명령어의미
systemctl start sshd서비스 시작
systemctl stop sshd서비스 중지
systemctl restart sshd재시작
systemctl reload sshd설정만 리로드 (중단 없음)
systemctl enable sshd부팅 시 자동 시작 등록
systemctl disable sshd자동 시작 해제
systemctl status sshd상태 확인
systemctl is-enabled sshd자동 시작 등록 여부 확인

3. .socket 파일 구조 — xinetd의 현대판

예시: rsync.socket

[Unit]
Description=Rsync Server Socket

[Socket]
ListenStream=873
Accept=false

[Install]
WantedBy=sockets.target
.socket 항목의미xinetd 대응
ListenStreamTCP 포트 번호xinetd의 포트 지정
ListenDatagramUDP 포트 번호socket_type=dgram
Accept=true접속마다 새 인스턴스wait=no와 유사
Accept=false하나의 서비스가 전체 처리wait=yes와 유사
💡 핵심 규칙: 파일명 매칭

.socket.service파일 이름이 같아야 자동 연결됩니다.
rsync.socket → 요청 시 → rsync.service 자동 시작
파일명이 다를 경우 .socket 안에서 Service=다른이름.service로 명시 지정도 가능.


4. xinetd → systemd 1:1 대응 관계표

xinetd 구성요소systemd 대응
xinetd 데몬 자체systemd 소켓 활성화 (.socket)
/etc/xinetd.d/rsyncrsync.socket + rsync.service
server = /usr/bin/rsyncExecStart=/usr/bin/rsync --daemon
socket_type = streamListenStream=포트
socket_type = dgramListenDatagram=포트
disable = yes/nosystemctl enable/disable .socket
cps / per_sourceMaxConnections / MaxConnectionsPerSource
⚠️ 가장 중요한 차이점

xinetd의 IP 접근 제어(only_from, no_access)가 systemd .socket에는 없습니다.

firewalld 또는 iptables/nftables로 분리해서 처리해야 합니다.


5. 변환 예제 — xinetd 설정을 systemd로

xinetd 원본: /etc/xinetd.d/rsync

service rsync
{
    disable         = no
    socket_type     = stream
    wait            = no
    user            = root
    server          = /usr/bin/rsync
    server_args     = --daemon
    only_from       = 192.168.1.0/24
    per_source      = 5
}

systemd 변환 결과

소켓 유닛
rsync.socket
[Unit]
Description=Rsync Server Socket

[Socket]
ListenStream=873
Accept=false
MaxConnectionsPerSource=5

[Install]
WantedBy=sockets.target
서비스 유닛
rsync.service
[Unit]
Description=Rsync Server

[Service]
ExecStart=/usr/bin/rsync --daemon
User=root
Type=forking

접근 제어: firewalld로 분리

# only_from = 192.168.1.0/24 에 해당하는 방화벽 정책
firewall-cmd --add-rich-rule='rule family="ipv4" \
  source address="192.168.1.0/24" \
  port port="873" protocol="tcp" accept' --permanent
firewall-cmd --reload

# 또는 iptables로:
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 873 -j ACCEPT
iptables -A INPUT -p tcp --dport 873 -j DROP

6. systemd의 추가 보안 기능

💡 xinetd에 없던 프로세스 격리

시험 직접 출제 가능성은 낮지만, 실무와 면접 대비로 알아두면 좋습니다.

설정 항목의미
ProtectSystem=strict파일시스템을 읽기 전용으로 마운트
ProtectHome=yes/home, /root 접근 차단
PrivateTmp=yes서비스 전용 /tmp (다른 서비스와 격리)
NoNewPrivileges=yes실행 중 권한 상승 차단

7. 시험에서 systemd가 나오는 맥락 5가지

Q1 “xinetd를 대체하는 systemd 기능은?”
→ 소켓 활성화(socket activation) 또는 .socket 유닛
Q2 “서비스를 부팅 시 자동 시작하려면?”
→ systemctl enable 서비스명
Q3 “서비스 상태를 확인하는 명령은?”
→ systemctl status 서비스명
Q4 “systemd 유닛 파일 경로는?”
→ /etc/systemd/system/ 또는 /usr/lib/systemd/system/
Q5 “xinetd의 only_from에 해당하는 systemd 설정은?”
→ systemd .socket에는 해당 기능 없음. firewalld 또는 iptables/nftables로 대체.

8. 시리즈 총정리

비교 항목xinetdsystemd .socket
동작 원리포트 대기 → 요청 시 데몬 기동소켓 대기 → 요청 시 서비스 기동
설정 파일/etc/xinetd.d/서비스명서비스명.socket + .service
IP 접근 제어only_from / no_access 자체 내장없음 → firewalld로 분리
DoS 방어cps / per_source / instancesMaxConnections / MaxConnectionsPerSource
프로세스 격리없음ProtectSystem, PrivateTmp 등
로깅자체 로그 설정journalctl 통합 로그
현재 상태레거시 (기본 미설치 추세)현대 배포판 표준
주제핵심 한 줄
1편전체 지도6단계 구조 — “왜 파일이 많은가”
2편xinetd + TCP Wrapper슈퍼서버 항목 + allow→deny→기본허용
3편데몬별 보안 설정설정값 → 위험 → 조치 즉답 훈련
4편systemd .service/.socketxinetd → .socket 전환 + 접근 제어 분리
🎯 4편 암기 포인트
  • .service = 상주형 / .socket = 온디맨드형 (xinetd 대체)
  • .socket + .service는 파일명이 같아야 자동 연결
  • xinetd의 only_from/no_access → systemd에 없음 → firewalld/iptables로 분리
  • 유닛 파일 위치: /etc/systemd/system/ (관리자) · /usr/lib/systemd/system/ (패키지)
  • 핵심 명령: systemctl enable/start/status/is-enabled
  • systemd 추가 보안: ProtectSystem, PrivateTmp, NoNewPrivileges
  • 발전 흐름: inetd → xinetd → systemd socket activation