Ubuntu unattended-upgrades로 보안 패치 자동 적용하기

보안 패치는 CVE가 뜬 순간이 아니라 담당자가 apt를 돌리는 순간에야 적용된다. 서버가 몇 대만 넘어가도 관리가 안 되고, 휴가나 주말 사이에 터진 취약점은 며칠씩 방치되기 쉽다. Ubuntu는 매일 자동으로 보안 저장소만 골라 패치를 적용하는 unattended-upgrades 데몬으로 이 문제를 해결한다. 이 글에서는 Ubuntu 24.04에서 실제로 설치·설정하고 --dry-run --debug로 동작을 검증한 결과를 정리한다.

핵심 개념

설정 파일은 두 개로 나뉜다.

파일역할
/etc/apt/apt.conf.d/20auto-upgrades자동 실행 스위치 — apt 목록 갱신 주기, unattended-upgrade 실행 여부(on/off)만 결정
/etc/apt/apt.conf.d/50unattended-upgrades실제 동작 세부 설정 — 어떤 저장소를 대상으로 할지, 재부팅/제거/메일 정책 등

Ubuntu 24.04는 기본 이미지에 이미 unattended-upgrades가 설치되어 있고 20auto-upgrades도 기본 활성 상태다.

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

50unattended-upgrades의 주요 옵션이다.

주요 옵션기본값의미
Allowed-Originsrelease + -security + ESM자동 적용 대상 저장소. -updates/-backports는 기본 제외
Remove-Unused-Kernel-Packages주석(비활성)사용하지 않는 구버전 커널 패키지 자동 삭제
Remove-Unused-Dependencies주석(비활성)더 이상 필요 없는 의존성 자동 삭제(apt autoremove와 동일 효과)
Automatic-Rebootfalse재부팅이 필요한 패치 적용 후 확인 없이 즉시 재부팅
Automatic-Reboot-Time02:00 (예시, 비활성)Automatic-Reboot가 true일 때 재부팅 시각 지정
Mail비어있음결과 메일 수신 주소. MTA(mailx 등) 별도 설치 필요

실전 코드

디스포저블 테스트 서버(Ubuntu 24.04.4 LTS)에 apt-listchanges를 추가 설치하고 기존 설정을 백업한 뒤 아래 옵션을 주석 해제했다.

sudo cp -a /etc/apt/apt.conf.d/50unattended-upgrades /tmp/50unattended-upgrades.orig
sudo apt-get install -y apt-listchanges
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Remove-New-Unused-Dependencies "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "03:30";
Unattended-Upgrade::Verbose "true";

실제 패치 대신 시뮬레이션만 하는 --dry-run --debug로 동작을 확인했다.

sudo unattended-upgrade --dry-run --debug

Allowed-Origins에 없는 -updates/-backports 저장소는 우선순위 -32768로 pin되어 원천 차단됐다.

Marking not allowed <apt_pkg.PackageFile object: filename:'.../noble-updates_main_binary-amd64_Packages' ...> with -32768 pin
Applying pinning: PkgFilePin(id=8, priority=-32768)

apport·fwupd·mutter·sssd 등 -updates(비보안) 후보는 candidate 버전이 강제로 낮춰져 업그레이드 대상에서 빠졌다.

Checking: fwupd ([<Origin ... archive:'noble-updates' ...>])
adjusting candidate version: fwupd=1.9.16-1
...
pkgs that look like they should be upgraded:
Packages that will be upgraded:
InstCount=0 DelCount=0 BrokenCount=0

보안 저장소에 적용할 패치는 없었지만(테스트 서버가 이미 패치된 상태), Remove-Unused-Dependencies를 켠 효과는 그대로 드러났다.

marking python3-netifaces for removal
marking libcapnp-1.0.1 for removal
Packages that were successfully auto-removed:
Packages that are kept back:

dry-run이라 실제 삭제는 없었지만, 옵션 하나로 예상치 못한 패키지가 조용히 지워질 수 있다는 걸 확인했다.

자동 실행 스케줄은 systemd 타이머가 담당한다.

apt-daily.timer                Tue 2026-07-21 07:19:07 KST  → apt-daily.service
apt-daily-upgrade.timer        Tue 2026-07-21 06:25:48 KST  → apt-daily-upgrade.service

주의사항

  • 설정을 실서버에 바로 적용하지 말고 반드시 --dry-run --debug로 먼저 대상 패키지를 확인한다. Remove-Unused-Dependencies는 위 사례처럼 의도치 않은 패키지를 지목할 수 있다.
  • Automatic-Reboot "true"는 확인 절차 없이 재부팅한다. 운영 중인 서비스가 있다면 Automatic-Reboot-Time을 트래픽이 적은 새벽 시간대로 지정할 것.
  • 커널 CVE 대응 이상의 일반 업데이트까지 자동화하려면 Allowed-Origins-updates 줄을 별도로 주석 해제해야 한다.
  • 메일 알림(Mail 옵션)을 쓰려면 mailx 등 MTA가 먼저 설치되어 있어야 하며, 없으면 조용히 무시된다.
  • 재부팅이 필요한 패치는 /var/run/reboot-required 파일 생성으로 표시된다. Automatic-Reboot를 꺼두더라도 이 파일 유무는 모니터링 대상에 넣는 게 좋다.

마무리

unattended-upgrades는 “보안 저장소만, 재부팅은 수동”이라는 보수적인 기본값만으로도 CVE 대응 지연을 안전하게 줄인다. 운영에 영향을 주는 옵션을 추가로 켤 때는 이번처럼 dry-run으로 실제 대상부터 확인할 것.

참고

답글 남기기