보안 패치는 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-Origins | release + -security + ESM | 자동 적용 대상 저장소. -updates/-backports는 기본 제외 |
| Remove-Unused-Kernel-Packages | 주석(비활성) | 사용하지 않는 구버전 커널 패키지 자동 삭제 |
| Remove-Unused-Dependencies | 주석(비활성) | 더 이상 필요 없는 의존성 자동 삭제(apt autoremove와 동일 효과) |
| Automatic-Reboot | false | 재부팅이 필요한 패치 적용 후 확인 없이 즉시 재부팅 |
| Automatic-Reboot-Time | 02:00 (예시, 비활성) | Automatic-Reboot가 true일 때 재부팅 시각 지정 |
| 비어있음 | 결과 메일 수신 주소. 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-listchangesUnattended-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 --debugAllowed-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으로 실제 대상부터 확인할 것.