「手動でアップデートをかけているが、夜間や休日に公開された脆弱性対応が遅れてしまう」
RHEL 9 / AlmaLinux 9 / Rocky Linux 9 では、
dnf-automatic を使うとセキュリティパッチの検知・適用・通知を自動化できます。「apply_updates」と「upgrade_type」の2行を正しく設定すれば、systemd timer が毎日決まった時間にパッチを当て、管理者にメールで報告してくれます。この記事では、
dnf-automatic のインストールから /etc/dnf/automatic.conf の設定、systemd timer の有効化、メール通知の設定、実行ログの確認方法まで、RHEL 9.4 / AlmaLinux 9.4 で動作確認した手順をそのまま解説します。Ubuntu 24.04 LTS の unattended-upgrades についても末尾で補足します。この記事のポイント
・upgrade_type = security+apply_updates = yes でセキュリティパッチのみ自動適用できる
・systemctl enable --now dnf-automatic.timer の1行で毎日自動実行が始まる
・journalctl -u dnf-automatic.service で実行ログをいつでも確認できる
・本番で「全パッチ自動適用」は危険。セキュリティ限定+通知のみの運用設計が現場の定石
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜ自動パッチ適用が必要なのか
脆弱性情報(CVE)が公開されてから実際にエクスプロイトが出回るまでの時間は、近年急速に短くなっています。2024年以降のRed Hat セキュリティアドバイザリ(RHSA)では、公開から24~48時間以内に PoC が登場するケースが珍しくありません。手動パッチ運用の最大の問題は「忘れること」ではなく「気づかないこと」です。管理対象が10台を超えると、全サーバーのパッチ適用状況を人手で追うのは現実的ではありません。
dnf-automatic が解決するのは次の2点です。・対応漏れの防止:担当者のスケジュールや休日に関係なく、毎日定刻に確認・適用する
・可視化:何が適用されたかをログとメールで記録し、後から監査できる状態にする
ただし「自動適用」は万能ではありません。Webサーバーやデータベースのパッケージがアップデートされると、設定の非互換でサービスが停止するリスクがあります。現場での推奨運用は 「セキュリティパッチのみ自動適用、それ以外のアップデートは通知のみ」 です。この設計については後述のトラブルシュートセクションで詳しく触れます。
dnf-automaticのインストールと初期確認
1. インストール
dnf-automatic はRHEL 9 / AlmaLinux 9 / Rocky Linux 9 のデフォルトリポジトリに含まれています。[root@server01 ~]# dnf install -y dnf-automatic Last metadata expiration check: 0:12:31 ago on Wed Sep 24 09:00:10 2026 JST. Dependencies resolved. ================================================================================ Package Arch Version Repository Size ================================================================================ Installing: dnf-automatic noarch 4.14.0-9.el9 baseos 120 k Transaction Summary ================================================================================ Install 1 Package Total download size: 120 k Installed size: 179 k Downloading Packages: [SKIPPED] dnf-automatic-4.14.0-9.el9.noarch.rpm: Already downloaded Installed: dnf-automatic-4.14.0-9.el9.noarch Complete!
2. インストール後のファイル確認
インストール後に作成される主要なファイルを確認します。# 設定ファイル [root@server01 ~]# ls /etc/dnf/automatic.conf /etc/dnf/automatic.conf # systemdユニットファイル(timer + service) [root@server01 ~]# ls /usr/lib/systemd/system/dnf-automatic* /usr/lib/systemd/system/dnf-automatic.service /usr/lib/systemd/system/dnf-automatic.timer /usr/lib/systemd/system/dnf-automatic-download.service /usr/lib/systemd/system/dnf-automatic-download.timer /usr/lib/systemd/system/dnf-automatic-install.service /usr/lib/systemd/system/dnf-automatic-install.timer /usr/lib/systemd/system/dnf-automatic-notifyonly.service /usr/lib/systemd/system/dnf-automatic-notifyonly.timer
dnf-automatic.timer(設定ファイルの内容を忠実に実行)を使います。・dnf-automatic.timer:設定ファイル通りに動作(最も柔軟)
・dnf-automatic-install.timer:download+install(apply_updates設定を上書きして強制適用)
・dnf-automatic-download.timer:ダウンロードのみ(インストールしない)
・dnf-automatic-notifyonly.timer:通知のみ(ダウンロードもインストールもしない)
automatic.confの設定(核心部分)
1. 設定ファイルを開く
[root@server01 ~]# cp /etc/dnf/automatic.conf /etc/dnf/automatic.conf.orig [root@server01 ~]# vi /etc/dnf/automatic.conf
2. [commands]セクション:適用モードの設定
最も重要なセクションです。次の3つを必ず確認・設定してください。[commands] # 適用するアップデートの種類 # default = セキュリティ以外も含む全パッケージ(本番では推奨しない) # security = セキュリティ関連パッケージのみ(推奨) upgrade_type = security # パッチを実際に適用するか # yes = 自動でインストールする # no = 確認・ダウンロードのみ(通知だけ行う) apply_updates = yes # 実行開始を最大何秒ランダムに遅延させるか(複数台の負荷分散用) # 3600 = 最大1時間のランダム遅延(10台以上ある場合は 7200 以上を推奨) random_sleep = 3600
upgrade_type = security は RHEL/AlmaLinux のパッケージに Security アドバイザリが紐付いている場合のみ有効です。セキュリティ分類のないパッケージは security 指定でスキップされます。AlmaLinux 9 / Rocky Linux 9 では RHEL に準拠したアドバイザリが付与されているため、security が正しく機能します。3. [emitters]セクション:通知方法の設定
[emitters] # 通知方法(カンマ区切りで複数指定可) # stdio = 標準出力(ログに記録される) # email = メール送信 # motd = /etc/motd に書き込む emit_via = stdio, email
4. [email]セクション:メール送信先の設定
[email] email_from = dnf-automatic@server01.example.com email_to = admin@example.com # SMTPサーバー(Postfixがlocalhost:25で動作している場合) email_host = localhost # メールのフォーマット email_command = /usr/sbin/sendmail -v
email_host には社内のメールリレーサーバーや、Postfix が稼働している localhost を指定します。Postfix の基本設定の解説を参考に、localhost:25 でメールが送れる状態にしておいてください。systemd timerで自動実行を有効化する
1. timerを有効化・起動する
# 有効化と即時起動を同時に行う [root@server01 ~]# systemctl enable --now dnf-automatic.timer Created symlink /etc/systemd/system/multi-user.target.wants/dnf-automatic.timer -> /usr/lib/systemd/system/dnf-automatic.timer. # timerの状態を確認 [root@server01 ~]# systemctl status dnf-automatic.timer * dnf-automatic.timer - dnf-automatic timer Loaded: loaded (/usr/lib/systemd/system/dnf-automatic.timer; enabled; vendor preset: disabled) Active: active (waiting) since Wed 2026-09-24 09:02:11 JST; 1min 30s ago Trigger: Thu 2026-09-25 06:47:22 JST; 21h left Triggers: * dnf-automatic.service
2. 次回実行時刻を確認する
[root@server01 ~]# systemctl list-timers dnf-automatic* NEXT LEFT LAST PASSED UNIT ACTIVATES Thu 2026-09-25 06:47:22 JST 21h left n/a n/a dnf-automatic.timer dnf-automatic.service 1 timers listed.
OnCalendar=*-*-* 6:00 になっています。実行時刻を変更したい場合は、ユニットファイルをオーバーライドします。
# オーバーライドファイルを作成(例: 毎朝2時30分に変更する) [root@server01 ~]# systemctl edit dnf-automatic.timer # 次の内容を入力する(既存の設定を上書きするため OnCalendar を2回書く) [Timer] OnCalendar= OnCalendar=*-*-* 02:30 # 変更後にリロード [root@server01 ~]# systemctl daemon-reload [root@server01 ~]# systemctl restart dnf-automatic.timer
動作テスト:手動で一度実行する
設定が正しいかを確認するため、timerを待たずに手動で一度実行してみます。# サービスを手動起動してすぐに実行する [root@server01 ~]# systemctl start dnf-automatic.service # サービスの終了を待ってから結果を確認 [root@server01 ~]# systemctl status dnf-automatic.service * dnf-automatic.service - dnf-automatic Loaded: loaded (/usr/lib/systemd/system/dnf-automatic.service; static) Active: inactive (dead) since Wed 2026-09-24 09:10:32 JST; 8s ago Process: 12847 ExecStart=/usr/bin/dnf-automatic /etc/dnf/automatic.conf (code=exited, status=0/SUCCESS) Main PID: 12847 (code=exited, status=0/SUCCESS) Sep 24 09:10:31 server01 dnf-automatic[12847]: No security updates available. Sep 24 09:10:32 server01 systemd[1]: dnf-automatic.service: Deactivating ... Sep 24 09:10:32 server01 systemd[1]: Finished dnf-automatic.service.
Sep 24 09:10:28 server01 dnf-automatic[12847]: Last metadata expiration check: Sep 24 09:10:29 server01 dnf-automatic[12847]: Security: curl-7.76.1-29.el9_4.1.x86_64 Sep 24 09:10:29 server01 dnf-automatic[12847]: Security: libcurl-7.76.1-29.el9_4.1.x86_64 Sep 24 09:10:31 server01 dnf-automatic[12847]: Upgraded: curl-7.76.1-29.el9_4.1 -> 7.76.1-30.el9_5 Sep 24 09:10:31 server01 dnf-automatic[12847]: Upgraded: libcurl-7.76.1-29.el9_4.1 -> 7.76.1-30.el9_5 Sep 24 09:10:32 server01 dnf-automatic[12847]: Complete!
実行ログの確認方法
1. journalctlでサービスログを確認する
dnf-automatic は systemd サービスとして動くため、journalctl でログを確認できます。# 直近の実行ログを確認 [root@server01 ~]# journalctl -u dnf-automatic.service -n 50 --no-pager Sep 24 09:10:28 server01 systemd[1]: Starting dnf-automatic... Sep 24 09:10:28 server01 dnf-automatic[12847]: Last metadata expiration ... Sep 24 09:10:31 server01 dnf-automatic[12847]: No security updates available. Sep 24 09:10:32 server01 systemd[1]: Finished dnf-automatic.service. # 過去7日分を確認 [root@server01 ~]# journalctl -u dnf-automatic.service --since "7 days ago" --no-pager # タイマー自体の起動履歴 [root@server01 ~]# journalctl -u dnf-automatic.timer --no-pager | tail -20
2. dnf.logで適用パッケージを確認する
パッケージの適用結果は/var/log/dnf.log にも記録されます。# 最近適用されたパッケージを確認(Upgraded行を抽出) [root@server01 ~]# grep -E 'Upgraded|Installed|Removed' /var/log/dnf.log | tail -20 2026-09-23T06:47:14+0900 SUBDEBUG Upgraded: curl-7.76.1-30.el9_5.x86_64 2026-09-23T06:47:14+0900 SUBDEBUG Upgraded: libcurl-7.76.1-30.el9_5.x86_64 # dnf history でトランザクション履歴を確認 [root@server01 ~]# dnf history list ID | Command line | Date and time | Action(s) | Altered ------------------------------------------------------------------------------- 3 | -y (dnf-automatic) | 2026-09-23 06:47 | Update | 2 2 | -y (dnf-automatic) | 2026-09-22 07:12 | Update | 5 1 | install -y httpd | 2026-09-20 14:30 | Install | 7 # 特定トランザクションの詳細確認 [root@server01 ~]# dnf history info 3 Transaction ID : 3 Begin time : Mon Sep 23 06:47:11 2026 Begin rpmdb : 1247:50b6ab... End time : Mon Sep 23 06:47:14 2026 (3 seconds) End rpmdb : 1247:62c7ef... User : System
Return-Code : Success Releasever : 9 Command Line : -y (dnf-automatic) Packages Altered: Upgrade curl-7.76.1-30.el9_5.x86_64 Upgrade libcurl-7.76.1-30.el9_5.x86_64
Ubuntu 24.04 LTS の場合(unattended-upgrades)
Ubuntu / Debian 系ではunattended-upgrades が同等の機能を提供します。# インストール $ sudo apt install -y unattended-upgrades # 自動設定(対話形式) $ sudo dpkg-reconfigure -plow unattended-upgrades # 設定確認 $ cat /etc/apt/apt.conf.d/50unattended-upgrades | grep -v '^//' | grep -v '^$' Unattended-Upgrade::Allowed-Origins { "${distro_id}:${distro_codename}-security"; }; Unattended-Upgrade::DevRelease "auto"; # 動作ログ $ cat /var/log/unattended-upgrades/unattended-upgrades.log | tail -20 2026-09-24 06:12:01,305 INFO Starting unattended upgrades script 2026-09-24 06:12:03,481 INFO Packages that will be upgraded: openssl libssl3 2026-09-24 06:12:08,109 INFO All upgrades installed
Allowed-Origins に "${distro_id}:${distro_codename}-security" だけを残します。本番環境での設計ポイント
1. 「通知のみ」から始める段階的な導入
初期設定でいきなりapply_updates = yes にするのは危険です。まず1~2週間は apply_updates = no (通知のみ)で運用し、どのパッケージが対象になるかを把握してから適用モードに切り替えるのが現場での定石です。# 段階1: 最初は通知のみ(1~2週間) apply_updates = no upgrade_type = security # 段階2: セキュリティパッチのみ自動適用(本番採用後) apply_updates = yes upgrade_type = security
2. 特定パッケージを除外する
カーネルのアップデートや特定のミドルウェアを自動更新から除外したい場合は、automatic.conf の [base] セクションに exclude を追記します。[commands] upgrade_type = security apply_updates = yes # [base] セクションに追記(dnf.confのexcludeと同じ書式) [base] # カーネルとPostgreSQLは自動更新しない exclude = kernel* postgresql*
3. 複数台のサーバーで実行時刻を分散させる
10台以上のサーバーが同時にアップデートを実行するとパッケージリポジトリに負荷がかかります。random_sleep を大きくするか、サーバーグループごとに OnCalendar をずらして設定します。よくあるトラブルと対処法
timerが実行されない・Active: inactive のまま
# timerが有効化されているか確認 [root@server01 ~]# systemctl is-enabled dnf-automatic.timer disabled # ← enableになっていない # 再度有効化する [root@server01 ~]# systemctl enable --now dnf-automatic.timer # timerのデフォルトスケジュールを確認 [root@server01 ~]# systemctl cat dnf-automatic.timer | grep OnCalendar OnCalendar=*-*-* 6:00 # → 翌朝6時まで実行されないため、手動テストはsystemctl startを使う
upgrade_type = security なのに全パッケージが更新される
AlmaLinux / Rocky Linux でセキュリティアドバイザリが正しく紐付いていないパッケージは、security 指定でも対象になることがあります。次のコマンドで事前に確認します。# セキュリティ更新の対象パッケージだけを一覧表示(実際には適用しない) [root@server01 ~]# dnf updateinfo list security --available Last metadata expiration check: 0:05:12 ago RHSA-2026:1234 Important/Sec. curl-7.76.1-30.el9_5.x86_64 RHSA-2026:1235 Moderate/Sec. openssl-3.0.7-27.el9_4.x86_64 # アドバイザリなしのパッケージを確認(upgrade_type=securityではスキップされる) [root@server01 ~]# dnf check-update --security No security updates available.
メールが届かない
# Postfixが動いているか確認 [root@server01 ~]# systemctl status postfix [root@server01 ~]# echo "test" | mail -s "test from dnf-automatic" admin@example.com # メールキューに詰まっていないか確認 [root@server01 ~]# mailq
emit_via = stdio のみにしてメール設定を切り離し、まず journalctl でのログ確認が機能しているかを先に確認します。本記事のまとめ
| やりたいこと | コマンド・設定 |
|---|---|
| インストール | dnf install -y dnf-automatic |
| セキュリティパッチのみ自動適用 | upgrade_type = security、apply_updates = yes |
| 自動実行を有効化 | systemctl enable --now dnf-automatic.timer |
| 次回実行時刻を確認 | systemctl list-timers dnf-automatic* |
| 手動で即時実行 | systemctl start dnf-automatic.service |
| 実行ログを確認 | journalctl -u dnf-automatic.service -n 50 |
| 適用パッケージのトランザクション履歴 | dnf history list / dnf history info <ID> |
| 特定パッケージを除外 | automatic.conf の [base] に exclude = パッケージ名* |
| 実行時刻を変更 | systemctl edit dnf-automatic.timer で OnCalendar を上書き |
dnf-automatic の設定は「通知のみ(apply_updates = no)」からスタートし、対象パッケージの傾向を把握してから「セキュリティ自動適用(apply_updates = yes)」に移行するのが安全です。カーネルやDBミドルウェアは exclude で除外し、サービスへの影響が大きいパッケージは引き続き手動で適用するというハイブリッド運用が現場での現実的な着地点です。dnf history のトランザクション履歴と journalctl のログを組み合わせれば、いつ・何のパッケージが・自動で当たったかを完全に追跡できます。「いつの間にかパッケージが変わっていた」という状況がなくなり、セキュリティ対応と変更管理の両立が実現できます。
自動パッチ運用を設計できたら、次はLinuxサーバー全体のセキュリティ設計を体系的に固めませんか?
dnf-automaticのような「仕組みで守る」アプローチはLinuxセキュリティ設計の入り口です。
ネットの切れ端の情報をコピペするだけでなく、現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:yum・dnfにEPELリポジトリを追加する方法|CentOS7・RHEL8・AlmaLinux別の手順と注意点
- この記事の属するカテゴリ:パッケージ管理コマンドへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます