2026年9月22日
2026年9月22日
OSのセキュリティアップデートを自動適用する方法(unattended-upgrades・dnf-automatic)
Linux サーバーのセキュリティ更新は、公開されてから適用するまでの間が攻撃を受けやすい期間です。手動で適用していると、忙しい時期や休暇中に放置されがちです。この記事では、セキュリティ更新だけを自動で適用する設定を、Debian/Ubuntu(unattended-upgrades)と RHEL 系(AlmaLinux、Rocky Linux など。dnf-automatic)に分けて説明します。内容は 2026年10月時点のものです。
なお、CentOS 7 で使われていた yum-cron や、さらに古い yum-updatesd は、現在サポートされている OS では使いません。CentOS 7 自体がすでにサポートを終えているため、まだ使っている場合は自動更新より先に OS の移行を検討してください。
自動更新の前に決めておくこと
- 対象を絞る:自動で入れるのはセキュリティ更新だけにし、機能追加を含む通常の更新は手動で確認してから入れる構成が無難です。
- サービスの再起動:PHP や Web サーバー、データベースが更新されるとサービスが再起動され、数秒程度つながらない瞬間が出ることがあります。
- OS の再起動:カーネルや主要ライブラリの更新は、再起動するまで反映されません。自動で再起動するか、通知を受けて手動で再起動するかを決めます。
- バックアップ:更新で問題が起きたときに戻せるよう、スナップショットやバックアップを用意しておきます。
Debian / Ubuntu:unattended-upgrades
ステップ1:インストールと有効化
Ubuntu Server では最初から入っていることが多いですが、念のためインストールし、有効にします。
sudo apt update
sudo apt install unattended-upgrades
sudo dpkg-reconfigure -plow unattended-upgrades # 「Yes」を選ぶと有効になる
有効化すると、/etc/apt/apt.conf.d/20auto-upgrades に次の内容が書かれます。"1" は「1日ごとに実行する」という意味です。
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
有効になっているかは次のコマンドで確認できます。
apt-config dump APT::Periodic::Unattended-Upgrade
ステップ2:対象の確認(既定はセキュリティ更新)
何を自動更新するかは /etc/apt/apt.conf.d/50unattended-upgrades で決まります。Ubuntu の既定では、次のようにセキュリティ用のリポジトリ(-security)からの更新が対象で、通常の更新(-updates)はコメントアウトされています。
Unattended-Upgrade::Allowed-Origins {
"${distro_id}:${distro_codename}";
"${distro_id}:${distro_codename}-security";
// (ESM 関連の行は省略)
// "${distro_id}:${distro_codename}-updates";
// "${distro_id}:${distro_codename}-proposed";
// "${distro_id}:${distro_codename}-backports";
};
Debian でも、既定の設定はセキュリティ更新だけを自動で入れる内容になっています(Debian では Origins-Pattern という書式で指定されています)。外部のリポジトリ(PHP や MariaDB の公式リポジトリなど)から入れたパッケージは、ここに追加しない限り自動更新されません。
ステップ3:除外・メール通知・再起動の設定
50unattended-upgrades はパッケージの設定ファイルなので、直接編集するとパッケージ更新のたびに差分の確認を求められます。Debian の Wiki では、別ファイル(例: 52unattended-upgrades-local)に変更点だけを書く方法が紹介されています。
sudoedit /etc/apt/apt.conf.d/52unattended-upgrades-local
// 自動更新から外すパッケージ(正規表現で指定できる)
Unattended-Upgrade::Package-Blacklist {
"mariadb-";
};
// 結果をメールで受け取る(mailx などメール送信の仕組みが必要)
Unattended-Upgrade::Mail "admin@example.com";
Unattended-Upgrade::MailReport "on-change";
// 再起動が必要な更新があったら、深夜2時に自動で再起動する
Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "02:00";
各項目の意味は次のとおりです。
| 項目 | 内容 |
|---|---|
| Package-Blacklist | 自動更新しないパッケージ。上の例はデータベースを手動で更新したい場合 |
| Mail / MailReport | 結果の送信先と送る条件(always・only-on-error・on-change) |
| Automatic-Reboot | 再起動が必要なときに自動で再起動するか(既定は false) |
| Automatic-Reboot-Time | 自動再起動する時刻(既定は now=更新直後) |
Automatic-Reboot を false のままにする場合は、/var/run/reboot-required というファイルが作られていないかを定期的に確認し、あれば都合のよい時間に再起動します。
# 再起動が必要か、どのパッケージが原因かを確認
ls /var/run/reboot-required 2>/dev/null && cat /var/run/reboot-required.pkgs
ステップ4:動作確認
実際には更新せずに、何が対象になるかを確認できます。
sudo unattended-upgrade --dry-run --debug
自動実行は systemd のタイマーで行われます。apt-daily.timer がパッケージ一覧の取得とダウンロード、apt-daily-upgrade.timer が更新の適用を担当します。
systemctl list-timers 'apt-daily*'
実行時刻を変えたい場合は sudo systemctl edit apt-daily-upgrade.timer でタイマーを上書きします。
ステップ5:ログを確認する
sudo tail -n 50 /var/log/unattended-upgrades/unattended-upgrades.log
sudo tail -n 50 /var/log/unattended-upgrades/unattended-upgrades-dpkg.log
更新されたパッケージや、除外されたパッケージ、エラーの内容が記録されます。
RHEL 系(AlmaLinux・Rocky Linux など):dnf-automatic
ステップ1:インストール
sudo dnf install dnf-automatic
ステップ2:設定ファイルを編集する
設定は /etc/dnf/automatic.conf で行います。セキュリティ更新だけを適用するには、[commands] セクションを次のようにします。
[commands]
upgrade_type = security
download_updates = yes
apply_updates = yes
| 項目 | 内容 |
|---|---|
| upgrade_type | default(すべての更新)か security(セキュリティ更新のみ) |
| download_updates | 更新をダウンロードするか |
| apply_updates | 更新を適用するか(既定は no で、通知だけになる) |
| reboot | 更新後の再起動。never(既定)・when-changed・when-needed |
reboot の項目は比較的新しい版で追加されたものです。お使いの版の automatic.conf に項目がない場合は使えないので、後述の dnf needs-restarting で確認する運用にします。
結果の通知方法は [emitters] セクションの emit_via で指定します(stdio・email・motd など)。メールで受け取る場合は [email] セクションに送信元・宛先・SMTP サーバーを設定します。
特定のパッケージを自動更新から外したい場合は、[base] セクションで dnf の設定を上書きできます。
[base]
exclude = mariadb*
ステップ3:セキュリティ情報が取れるか確認する
upgrade_type = security は、リポジトリが提供するセキュリティ情報(updateinfo)をもとに対象を選びます。リポジトリがこの情報を提供していないと、何も適用されません。設定前に次のコマンドで一覧が出るか確認してください。
sudo dnf updateinfo list --security
ステップ4:タイマーを有効にする
sudo systemctl enable --now dnf-automatic.timer
systemctl list-timers 'dnf-*'
dnf-automatic.timer は automatic.conf の設定どおりに動きます。ほかに、設定ファイルの apply_updates などを上書きするタイマーも用意されています。
| タイマー | 動作 |
|---|---|
| dnf-automatic.timer | automatic.conf の設定に従う |
| dnf-automatic-notifyonly.timer | 通知だけ行う |
| dnf-automatic-download.timer | ダウンロードだけ行い、適用しない |
| dnf-automatic-install.timer | ダウンロードして適用する |
複数のタイマーを同時に有効にすると動作がわかりにくくなるので、どれか1つにします。
ステップ5:動作確認とログ
# 手動で1回実行する(設定ファイルどおりに動く)
sudo dnf-automatic
# 実行履歴とログ
sudo journalctl -u dnf-automatic --since "7 days ago"
sudo dnf history
再起動が必要かどうかは dnf needs-restarting で確認できます(dnf-plugins-core に含まれます)。-r を付けると、再起動が必要な場合は終了コード 1 を返します。
sudo dnf needs-restarting -r
自動更新を入れたあとに続けること
- 通知を読む:メールや motd の通知を見て、失敗や除外したパッケージの更新を見逃さないようにします。
- 除外したパッケージは手動で更新する:除外したまま放置すると、そのパッケージだけ古いままになります。
- 再起動の予定を決める:カーネル更新は再起動しないと反映されません。自動再起動しない場合は、月1回などの定期作業にします。
- アプリケーションは別に更新する:OS のパッケージ管理の外にあるもの(WordPress 本体・プラグイン・テーマ、Composer や npm で入れたライブラリなど)は、この仕組みでは更新されません。
まとめ
- Debian/Ubuntu は unattended-upgrades、RHEL 系は dnf-automatic でセキュリティ更新を自動適用する
- unattended-upgrades は既定でセキュリティ更新が対象。変更点は別ファイル(52unattended-upgrades-local など)に書く
- dnf-automatic は
upgrade_type = securityとapply_updates = yesを設定し、dnf-automatic.timer を有効にする unattended-upgrade --dry-run --debugやdnf updateinfo list --securityで事前に確認する- 再起動の要否は /var/run/reboot-required や
dnf needs-restarting -rで確認する