패치되지 않은 취약점은 공격자에게 서버 침입의 문을 열어줍니다. 하지만 매일 직접 업데이트하기는 현실적으로 어렵습니다. unattended-upgrades로 보안 패치를 자동 적용하면 이 문제를 해결할 수 있습니다.

패키지 설치

sudo apt install -y unattended-upgrades apt-listchanges

자동 업데이트 설정 마법사

# 대화형 설정
sudo dpkg-reconfigure -plow unattended-upgrades
# "자동 업데이트를 활성화할까요?" → 예 선택

상세 설정

/etc/apt/apt.conf.d/50unattended-upgrades:

Unattended-Upgrade::Allowed-Origins {
    // Ubuntu 보안 업데이트
    "${distro_id}:${distro_codename}";
    "${distro_id}:${distro_codename}-security";
    // Debian 보안 업데이트
    "origin=Debian,codename=${distro_codename},label=Debian-Security";
};

// 자동 제거 (사용하지 않는 패키지)
Unattended-Upgrade::Remove-Unused-Dependencies "true";

// 자동 재부팅 (커널 업데이트 등)
Unattended-Upgrade::Automatic-Reboot "false";

// 재부팅이 필요한 경우 자동 재부팅 시간 (false이면 비활성화)
Unattended-Upgrade::Automatic-Reboot-Time "03:00";

// 이메일 알림 (설정 시)
// Unattended-Upgrade::Mail "admin@example.com";
// Unattended-Upgrade::MailReport "on-change";  // 변경사항 있을 때만

// 업데이트 로그 위치
Unattended-Upgrade::SyslogEnable "true";

업데이트 주기 설정

/etc/apt/apt.conf.d/20auto-upgrades:

// 패키지 목록 업데이트 주기 (일)
APT::Periodic::Update-Package-Lists "1";

// 다운로드 주기
APT::Periodic::Download-Upgradeable-Packages "1";

// 자동 업데이트 주기 (0: 비활성화, 1: 매일)
APT::Periodic::Unattended-Upgrade "1";

// 다운로드 캐시 보존 기간 (일)
APT::Periodic::AutocleanInterval "7";

테스트 및 확인

# 실제 적용 없이 시뮬레이션
sudo unattended-upgrade --dry-run --debug

# 즉시 실행 (테스트)
sudo unattended-upgrade -v

# 타이머 상태 확인
sudo systemctl status apt-daily-upgrade.timer
sudo systemctl status apt-daily.timer

# 예약 실행 시간 확인
sudo systemctl list-timers | grep apt

업데이트 로그 확인

# unattended-upgrades 로그
sudo tail -f /var/log/unattended-upgrades/unattended-upgrades.log

# 적용된 업데이트 기록
cat /var/log/unattended-upgrades/unattended-upgrades.log | grep "Packages that"

# dpkg 로그 (모든 패키지 변경 기록)
sudo tail -100 /var/log/dpkg.log

# 재부팅이 필요한지 확인
cat /var/run/reboot-required 2>/dev/null && echo "재부팅 필요" || echo "재부팅 불필요"
ls /var/run/reboot-required.pkgs 2>/dev/null

자동 재부팅 정책

# 재부팅이 필요할 때 서비스 중단 시간을 정해 자동 재부팅
# /etc/apt/apt.conf.d/50unattended-upgrades 에서:

# 자동 재부팅 활성화 (주의: 서비스 중단 발생)
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "04:00";  # 새벽 4시

# 사용자 로그인 중에도 재부팅
Unattended-Upgrade::Automatic-Reboot-WithUsers "false";

권장: 프로덕션 서버는 Automatic-Reboot "false"로 설정하고, 수동으로 재부팅 일정을 잡는 것이 안전합니다.

특정 패키지 제외

# 업데이트에서 제외할 패키지 (예: nginx, mysql)
Unattended-Upgrade::Package-Blacklist {
    "nginx";
    "mysql-server";
    "php*";
};

업데이트 상태 모니터링 스크립트

#!/bin/bash
# /opt/check-updates.sh

echo "=== $(date '+%Y-%m-%d') 업데이트 현황 ==="

# 보안 업데이트 가능 패키지 수
SECURITY=$(apt list --upgradeable 2>/dev/null | grep -i security | wc -l)
ALL=$(apt list --upgradeable 2>/dev/null | grep -c upgradeable)

echo "전체 업데이트 가능: $ALL 개"
echo "보안 업데이트: $SECURITY 개"

if [ -f /var/run/reboot-required ]; then
    echo "⚠️  재부팅 필요"
fi

CentOS/RHEL 자동 업데이트

# dnf-automatic 설치
sudo dnf install -y dnf-automatic

# 설정 파일
sudo vi /etc/dnf/automatic.conf

# 보안 업데이트만 자동 적용
upgrade_type = security
apply_updates = yes

# 타이머 활성화
sudo systemctl enable --now dnf-automatic.timer

자동 보안 업데이트는 알려진 취약점으로 인한 피해를 크게 줄여줍니다. 단, 일부 패키지(Nginx, PHP 등)는 업데이트 시 설정 변경이 발생할 수 있으므로, 자동 업데이트에서 제외하고 수동으로 관리하는 것도 고려하세요.