대상 OS: Ubuntu Server 24.04 LTS
systemd 고급 서비스 관리 및 journald 로깅 활용
리눅스 시스템 관리에 있어 `systemd`는 필수적인 구성 요소입니다. 이번 글에서는 `systemd`의 고급 서비스 관리 기법과 `journald` 로깅 시스템을 효과적으로 활용하는 방법을 중급 관리자 관점에서 다루겠습니다.
# 1. systemd 서비스 유닛 심층 분석 및 최적화
`systemd` 서비스 유닛 파일(.service)은 단순한 시작/중지 명령을 넘어, 시스템 안정성과 보안을 강화하는 다양한 옵션를 제공합니다.
* **리 attivtiyState 및 리ativtiyName 활용**: 특정 서비스의 상태를 사용자 인터페이스에 표시하여 현재 시스템의 활동을 직관적으로 파악할 수 있게 합니다. 예를 들어, `sshd` 서비스가 연결을 받고 있다면 '접속 대기'와 같이 표시할 수 있습니다.
[Unit]
Description=SSH Server
After=network.target
[Service]
ExecStart=/usr/sbin/sshd -D
Restart=on-failure
User=root
# Activity state and name for systemd-monitor
ActivityState=running
ActivityName=Secure Shell Daemon
[Install]
WantedBy=multi-user.target
* **리소스 제한 (systemd-run)**: 서비스별 CPU, 메모리 사용량을 제한하여 DOS 공격이나 리소스 고갈을 방지합니다. `systemd-run` 명령어를 사용하여 임시 서비스로 실행하거나, 기존 서비스 유닛 파일에 직접 설정을 추가할 수 있습니다.
# 예시: CPU 사용량 50%, 메모리 100MB 제한
[Service]
CPUQuota=50%
MemoryMax=100M
# Add other resource limits as needed: TasksMax, IOWeight, etc.
이러한 설정을 특정 서비스 유닛 파일에 적용할 때는 `systemd-run --scope -p CPUQuota=50% -p MemoryMax=100M your-service.service` 와 같이 사용하거나, 해당 서비스의 `.service` 파일 내 `[Service]` 섹션에 직접 등록합니다.
# 2. journald를 통한 효율적인 로그 관리
`journald`는 `syslog`의 경량화된 대안으로, 구조화된 로그를 수집하고 관리하는 강력한 시스템입니다.
* **필터링과 검색**: `journalctl` 명령어를 사용하여 로그를 효과적으로 검색하고 필터링할 수 있습니다. 특정 서비스, 시간 범위, 우선순위, 시스템 컴포넌트별로 로그를 추출할 수 있습니다.
* **특정 서비스 로그 보기**: `journalctl -u <service-name>.service`
journalctl -u sshd.service
* **시간 범위 지정**: `journalctl --since "2026-03-01 09:00:00" --until "2026-03-01 10:00:00"`
* **우선순위별 필터링**: `journalctl -p err` (에러 및 심각한 로그만 출력)
* **로그 보존 정책**: `/etc/systemd/journald.conf` 파일을 통해 로그 저장 공간 및 보존 기간을 설정할 수 있습니다.
ini
[Journal]
# 로그 크기 제한 (예: 1GB)
SystemMaxUse=1G
# 로그 회전 정책 (만료된 로그 삭제)
MaxRetentionSec=7d
* **원격 로깅**: `journald`는 `systemd-journal-remote` 서비스를 통해 원격 서버로 로그를 전송할 수 있습니다. 이는 중앙 집중식 로그 관리 환경 구축에 필수적입니다.
# 원격 서버 설정 (journald.conf):
[Remote]
ListenStream=19532
# 클라이언트 설정 (journald.conf):
URL=remote://remote-server-ip:19532
# 3. systemd 샌드박싱으로 서비스 강화
`systemd`는 각 서비스를 격리하여 보안성을 높이는 다양한 샌드박싱 기능을 제공합니다.
* **`ProtectSystem=strict`, `PrivateTmp=yes`**: 시스템 파일 시스템을 읽기 전용으로 마운트하고, `/tmp` 디렉토리를 서비스별로 분리하여 파일 시스템 공격 표면을 줄입니다.
* **`NoNewPrivileges=yes`**: 서비스가 `setuid` 또는 `setgid`를 통해 권한 상승을 시도하는 것을 방지합니다.
* **`CapabilityBoundingSet`**: 서비스가 사용할 수 있는 리눅스 Capabilities를 최소화하여 권한을 제한합니다.
[Service]
ProtectSystem=strict
PrivateTmp=yes
NoNewPrivileges=yes
CapabilityBoundingSet=CAP_NET_BIND_SERVICE CAP_SETUID
이러한 고급 시스템 관리 기법들은 시스템의 안정성, 보안성, 그리고 운영 효율성을 크게 향상시킬 수 있습니다.