대상 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
    

이러한 고급 시스템 관리 기법들은 시스템의 안정성, 보안성, 그리고 운영 효율성을 크게 향상시킬 수 있습니다.