Automatyczne aktualizacje Linuksa: konfiguracja unattended-upgrades i dnf-automatic do aktualizacji serwerów Linux
Poziom: Ekspert
Szacowany czas: ok. 30 minut
Cel: Skonfigurować skalowalne, bezprzestojowe automatyczne aktualizacje Linuksa przy użyciu unattended-upgrades i dnf-automatic, zgodnie z zasadami Infrastructure as Code.
Wprowadzenie
Ręczne instalowanie poprawek na serwerach to krytyczne wąskie gardło w zarządzaniu każdym środowiskiem produkcyjnym: bez automatyzacji niezawodne utrzymywanie setek węzłów w stanie zabezpieczonym i aktualnym byłoby bardzo trudne. Podatna aplikacja może zostać przejęta w ciągu kilku minut, a większość exploitów wykorzystuje dobrze znane, niezałatane luki. Aby uniknąć naruszeń bezpieczeństwa, trzeba na bieżąco instalować aktualizacje bezpieczeństwa (krytyczne poprawki wydawane w celu usunięcia znanych luk w oprogramowaniu). W tym poradniku skonfigurujemy automatyczne aktualizacje Linuksa na serwerze Linux za pomocą unattended-upgrades i dnf-automatic. To podejście ujednolica aktualizacje serwerów Linux.
Czym są unattended-upgrades i dnf-automatic?
unattended-upgrades to narzędzie dla Debiana/Ubuntu, które automatyzuje instalację aktualizacji bezpieczeństwa i innych aktualizacji pakietów.
dnf-automatic to komponent zapewniający automatyczne aktualizacje w systemach RHEL/CentOS/Fedora.
Narzędzia te pozwalają płynnie uruchamiać w tle automatyczne aktualizacje (proces pobierania i instalowania aktualizacji bez udziału człowieka). Zwykle są uruchamiane codziennie przez timer systemd (jednostkę systemd sterującą harmonogramem zadań, zastępującą tradycyjne zadania cron).
Wymagania wstępne
Przed rozpoczęciem upewnij się, że spełnione są następujące warunki:
- System operacyjny: Ubuntu 20.04/22.04/24.04 LTS, Debian 12/13 lub RHEL/AlmaLinux 9/10
- Dostęp: dostęp sudo lub root do serwera
- Wymagania sieciowe: wychodzący dostęp HTTPS do repozytoriów pakietów (archive.ubuntu.com, security.debian.org, repo.almalinux.org)
- Wymagana wiedza: zaawansowana znajomość administracji systemami, systemd oraz podstaw zarządzania poprawkami (proces dystrybucji i instalowania aktualizacji oprogramowania), a także zarządzania poprawkami w Linuksie.
Krok 1: Konfiguracja automatycznych aktualizacji Linuksa z unattended-upgrades
W systemach korzystających z APT (Advanced Package Tool) (podstawowego systemu zarządzania pakietami w dystrybucjach opartych na Debianie) używamy unattended-upgrades. To narzędzie płynnie wpisuje się w Twoją strategię zarządzania poprawkami w Linuksie.
1.1 Instalacja pakietu
Najpierw sprawdź i zainstaluj wymagany pakiet z repozytorium pakietów (scentralizowanej lokalizacji, z której pobierane i instalowane są pakiety oprogramowania).
Uruchom następujące polecenie:
sudo apt update && sudo apt install unattended-upgrades -y
Powinieneś zobaczyć komunikat potwierdzający instalację. Dzięki temu system jest gotowy do automatycznych aktualizacji APT.
1.2 Konfiguracja dozwolonych źródeł
Główny plik konfiguracyjny znajduje się w /etc/apt/apt.conf.d/50unattended-upgrades. Zmodyfikujemy konfigurację tak, aby instalowane były wyłącznie aktualizacje bezpieczeństwa. Minimalizuje to ryzyko zmian łamiących zgodność podczas automatycznych aktualizacji pakietów.
Przed wprowadzeniem zmian dobrą praktyką jest utworzenie kopii zapasowej oryginalnego pliku konfiguracyjnego:
sudo cp /etc/apt/apt.conf.d/50unattended-upgrades /etc/apt/apt.conf.d/50unattended-upgrades.bak
Otwórz plik konfiguracyjny:
sudo nano /etc/apt/apt.conf.d/50unattended-upgrades
Całkowicie zastąp zawartość bloku Allowed-Origins i dopisz podane nazwy do bloku Package-Blacklist:
Dla Ubuntu:
Unattended-Upgrade::Allowed-Origins { "${distro_id}:${distro_codename}-security"; };
Dla Debiana:
Unattended-Upgrade::Origins-Pattern { "origin=Debian,codename=${distro_codename},label=Debian-Security"; "origin=Debian,codename=${distro_codename}-security,label=Debian-Security"; };
Następnie skonfiguruj czarną listę pakietów i zachowanie dotyczące restartu:
Unattended-Upgrade::Package-Blacklist { "^nginx$"; "^mysql-server$"; "^mariadb-server$"; "postgresql*"; "docker*"; }; Unattended-Upgrade::Automatic-Reboot "false";
Package-Blacklist korzysta z wyrażeń regularnych. Wpis taki jak "nginx" pasuje także do nginx-common, nginx-extras itd. Aby wskazać wyłącznie konkretny pakiet, użyj kotwic regex, np. "^nginx$".
Ogranicza to automatyczne aktualizacje APT wyłącznie do poprawek bezpieczeństwa i wyklucza krytyczne pakiety z automatycznej aktualizacji, zmniejszając ryzyko przerw w działaniu usług przy zachowaniu automatyzacji poprawek bezpieczeństwa.
Aktualizacje jądra, libc i innych pakietów niskiego poziomu nadal mogą wymagać restartu. W środowiskach produkcyjnych pozostaw automatyczne restarty wyłączone, chyba że okna serwisowe są wymuszane przez orkiestrację.
1.3 Włączenie automatycznych aktualizacji
Utwórz plik auto-upgrades, aby aktywować timer systemd dla APT.
Otwórz plik:
sudo nano /etc/apt/apt.conf.d/20auto-upgrades
Wklej do niego poniższą zawartość:
APT::Periodic::Update-Package-Lists "1"; APT::Periodic::Unattended-Upgrade "1"; APT::Periodic::AutocleanInterval "7";
Ta konfiguracja nakazuje systemowi:
Update-Package-Lists "1"- codziennie aktualizować listy pakietów.Unattended-Upgrade "1"- automatycznie wykonywać automatyczne aktualizacje APT.AutocleanInterval "7"- czyścić pamięć podręczną pakietów co 7 dni.
Krok 2: Konfiguracja dnf-automatic dla aktualizacji serwerów Linux
W systemach korzystających z DNF (Dandified YUM) (menedżera pakietów nowej generacji w dystrybucjach opartych na RHEL) dnf-automatic zapewnia niezawodną automatyzację aktualizacji DNF.
2.1 Instalacja pakietu
Zainstaluj narzędzie do automatyzacji z repozytorium pakietów.
Uruchom następujące polecenie:
sudo dnf install dnf-automatic -y
Powinieneś zobaczyć komunikat potwierdzający pomyślną instalację pakietu do automatyzacji aktualizacji DNF.
2.2 Konfiguracja zasad aktualizacji
Główny plik konfiguracyjny znajduje się w /etc/dnf/automatic.conf. Skonfiguruj narzędzie tak, aby pobierało i instalowało wyłącznie aktualizacje bezpieczeństwa.
Przed wprowadzeniem zmian wykonaj kopię zapasową pliku konfiguracyjnego i sprawdź, czy dla Twojej dystrybucji dostępne są biuletyny bezpieczeństwa (security advisories):
sudo cp /etc/dnf/automatic.conf /etc/dnf/automatic.conf.bak sudo dnf updateinfo summary sudo dnf updateinfo list security
Otwórz plik konfiguracyjny:
sudo nano /etc/dnf/automatic.conf
Dostosuj następujące parametry:
[commands] upgrade_type = security random_sleep = 3600 download_updates = yes apply_updates = yes [emitters] emit_via = stdio
Ta konfiguracja nakazuje systemowi:
upgrade_type = security- uwzględniać wyłącznie poprawki bezpieczeństwa.random_sleep = 3600- losowo opóźniać uruchomienie nawet o 1 godzinę, rozkładając obciążenie w wielkoskalowych wdrożeniach Infrastructure as Code, aby uniknąć skoków obciążenia repozytoriów i jednoczesnych awarii kaskadowych.download_updatesiapply_updates- automatycznie pobierać i instalować aktualizacje bezpieczeństwa.
upgrade_type = security zależy od metadanych bezpieczeństwa repozytorium. Jeśli biuletyny bezpieczeństwa są niedostępne (co jest typowe dla świeżej instalacji AlmaLinux 10), dnf-automatic z tym ustawieniem może nie zastosować żadnych aktualizacji. Zanim w środowisku produkcyjnym zaczniesz polegać na aktualizacjach wyłącznie bezpieczeństwa, sprawdź obsługę po stronie repozytorium. Alternatywnie w systemach produkcyjnych rozważ użycie upgrade_type = security-severity:Critical lub default-security.
2.3 Włączenie timera systemd
Aktywuj timer, aby zaplanować automatyzację aktualizacji DNF.
Uruchom następujące polecenie:
sudo systemctl enable --now dnf-automatic.timer
Powinieneś zobaczyć komunikat informujący, że timer został włączony i uruchomiony. Aktywuje to zaplanowane automatyczne aktualizacje pakietów w systemie.
Krok 3: Weryfikacja konfiguracji
Po zapisaniu konfiguracji należy ją zweryfikować.
3.1 Weryfikacja w Debianie/Ubuntu
Wykonaj uruchomienie próbne (dry run), aby zweryfikować konfigurację. Flaga -d (lub --dry-run) uruchamia unattended-upgrades w trybie debugowania - nic nie jest faktycznie zmieniane:
sudo unattended-upgrades --dry-run --debug
Flaga --dry-run wypisuje informacje diagnostyczne, ale nie modyfikuje żadnych plików. Upewnij się, że w kolejce nie ma pakietów z czarnej listy.
W środowisku produkcyjnym logi są ważniejsze niż uruchomienia próbne. Sprawdź, czy timer i usługa są aktywne:
systemctl list-timers | grep apt systemctl status apt-daily-upgrade.service --no-pager
Następnie sprawdź ostatnie wpisy w logu, aby potwierdzić aktywność aktualizacji. W świeżo skonfigurowanym systemie log może być pusty. Aby sprawdzić od razu, uruchom: sudo unattended-upgrade -v.
sudo tail -n 50 /var/log/unattended-upgrades/unattended-upgrades.log
3.2 Weryfikacja timera w RHEL/AlmaLinux
Sprawdź status timera:
systemctl list-timers | grep dnf-automatic
Oczekiwany wynik:
Wed 2026-05-27 06:23:13 EEST 16h left - - dnf-automatic.timer dnf-automatic.service
Jeśli timer jest widoczny na liście, aktualizacje zostały zaplanowane poprawnie.
3.3 Sprawdzanie, czy potrzebny jest restart
Aktualizacje jądra i libc trafiają do kolejki aktualizacji bezpieczeństwa (na przykład w Debianie linux-image-amd64 jest częścią aktualizacji bezpieczeństwa). Ponieważ ustawiono Automatic-Reboot=false, musisz samodzielnie sprawdzić, czy wymagany jest ręczny restart.
Dla Debiana/Ubuntu:
test -f /var/run/reboot-required && cat /var/run/reboot-required.pkgs
Dla AlmaLinux/RHEL:
sudo dnf needs-restarting -r
3.4 Wymuszone uruchomienie w celu weryfikacji
Wynik może być niewidoczny, dopóki nie zadziała timer. Aby ręcznie uruchomić proces aktualizacji w celu weryfikacji:
Dla Debiana/Ubuntu:
sudo unattended-upgrade -v
Dla AlmaLinux/RHEL:
sudo dnf-automatic
Krok 4: Konfiguracja zaawansowana (poziom ekspercki)
Aby sprostać wymaganiom na poziomie eksperckim, możesz rozszerzyć konfigurację o powiadomienia i szczegółowe planowanie.
4.1 Powiadomienia e-mail
Aby otrzymywać raporty o aktualizacjach:
Dla Debiana/Ubuntu:
W pliku /etc/apt/apt.conf.d/50unattended-upgrades odkomentuj i dostosuj:
Unattended-Upgrade::Mail "<YOUR_EMAIL>"; Unattended-Upgrade::MailReport "on-change";
Dla AlmaLinux/RHEL:
W pliku /etc/dnf/automatic.conf skonfiguruj sekcję [email] i zmień emiter (emitter):
[emitters] emit_via = email [email] email_from = [email protected] email_to = <YOUR_EMAIL> email_host = localhost
4.2 Zaawansowane timery dnf-automatic
dnf-automatic udostępnia kilka timerów, które pozwalają rozdzielić fazy pobierania i instalacji, co zapewnia większą kontrolę w środowisku produkcyjnym:
- dnf-automatic.timer: domyślny timer (pobiera i opcjonalnie instaluje, jeśli tak skonfigurowano).
- dnf-automatic-notifyonly.timer: tylko sprawdza dostępność aktualizacji i wysyła powiadomienie.
- dnf-automatic-download.timer: pobiera aktualizacje, ale ich nie instaluje.
- dnf-automatic-install.timer: pobiera i automatycznie instaluje aktualizacje (nadpisuje ustawienie
apply_updatesw konfiguracji).
Użyj timera odpowiadającego polityce serwisowej Twojego klastra.
Wycofanie zmian (rollback)
Aby cofnąć wszystkie wykonane czynności, wystarczy usunąć narzędzia i konfiguracje.
Debian/Ubuntu:
sudo apt purge unattended-upgrades -y sudo rm -rf /etc/apt/apt.conf.d/20auto-upgrades /var/log/unattended-upgrades/ /var/run/reboot-required* sudo mv /etc/apt/apt.conf.d/50unattended-upgrades.bak /etc/apt/apt.conf.d/50unattended-upgrades
RHEL/AlmaLinux:
sudo systemctl disable --now dnf-automatic.timer sudo mv /etc/dnf/automatic.conf.bak /etc/dnf/automatic.conf sudo dnf remove dnf-automatic -y
Usunięcie tych narzędzi wyłączy automatyczne aktualizacje w całym systemie, pozostawiając serwery podatne na ataki, o ile nie będą łatane ręcznie.
Podsumowanie
To wszystko. Jeden prawidłowo skonfigurowany system z unattended-upgrades lub dnf-automatic, sprawdzony uruchomieniem próbnym - i gotowe. Dzięki tej automatyzacji poprawek bezpieczeństwa automatyczne aktualizacje Linuksa są stosowane bezproblemowo, nakład pracy utrzymaniowej pozostaje niski, a aktualizacje serwerów Linux stają się przewidywalne, zamiast być reaktywne. W większych środowiskach połącz tę konfigurację z Infrastructure as Code i etapowymi wdrożeniami, aby nie aktualizować wszystkich węzłów jednocześnie.
Wersja dokumentu: 1.0
Ostatnia aktualizacja: maj 2026
Właściciel: Zespół dokumentacji technicznej