패치되지 않은 취약점은 공격자에게 서버 침입의 문을 열어줍니다. 하지만 매일 직접 업데이트하기는 현실적으로 어렵습니다. 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 등)는 업데이트 시 설정 변경이 발생할 수 있으므로, 자동 업데이트에서 제외하고 수동으로 관리하는 것도 고려하세요.