dnf-automaticでLinuxのセキュリティパッチを自動適用する方法|設定ファイルと通知・実行ログの確認

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > Linuxコマンド > パッケージ管理コマンド > dnf-automaticでLinuxのセキュリティパッチを自動適用する方法|設定ファイルと通知・実行ログの確認
「サーバーへのログインが面倒で、ついパッチ適用を後回しにしてしまう」
「手動でアップデートをかけているが、夜間や休日に公開された脆弱性対応が遅れてしまう」

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 で実行ログをいつでも確認できる
・本番で「全パッチ自動適用」は危険。セキュリティ限定+通知のみの運用設計が現場の定石


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

なぜ自動パッチ適用が必要なのか

脆弱性情報(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

timerは用途別に4種類あります。ほとんどの場合は 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.

デフォルトのスケジュールは翌朝6時 + random_sleep(最大1時間)です。ユニットファイルを確認すると 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.

「No security updates available.」が表示されたら正常動作です。セキュリティパッチが存在した場合は以下のように適用結果が表示されます。

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

Ubuntu の場合、セキュリティパッチのみを適用したい場合は 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日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。