Ubuntu 16.04 サーバで unattended-upgrades による自動セキュリティ更新を設定する

重要: 本ガイドは Ubuntu 16.04 を対象としています。ほかのリリースではファイル名やリポジトリ名が異なる場合があります。
目的と関連語句
このガイドの主な目的は「Ubuntu 16.04 サーバでセキュリティ更新のみを自動適用する」ことです。関連するバリアント検索語句は次の通りです。
- Ubuntu 16.04 自動セキュリティ更新
- unattended-upgrades 設定
- APT Periodic
- 自動再起動の設定
- セキュリティパッケージの自動適用
用語1行定義:
- unattended-upgrades: Ubuntu/Debian 系でパッケージの自動適用を行う公式パッケージ。主にセキュリティ更新の自動導入で使う。
何を行うか
- Ubuntu 16.04 に unattended-upgrades をインストール
- 50unattended-upgrades を編集してポリシーを定義
- 20auto-upgrades を編集して自動化を有効化
- ログやメールで更新状況を確認
前提条件
- Ubuntu 16.04 Server が稼働していること
- root 権限または sudo 権限を持つユーザー
- メール通知を受けたい場合は sendmail / mailx 相当がインストールされていること
ステップ 1 インストール
最初に unattended-upgrades パッケージをインストールします。Ubuntu のリポジトリから入手可能です。SSH でサーバに接続してください。
ssh root@hakase-labs
パッケージ情報を更新してからインストールします。
sudo apt update
sudo apt install unattended-upgrades
インストール後、/etc/apt/apt.conf.d ディレクトリ内の設定ファイルを編集します。
ステップ 2 設定
unattended-upgrades の設定は /etc/apt/apt.conf.d にあります。更新範囲の定義、ブラックリスト、追加オプション(メール通知、自動削除、自動再起動)を設定します。
設定ファイルを編集します。
cd /etc/apt/apt.conf.d/
vim 50unattended-upgrades
更新対象の指定
Allowed-Origins ブロックで自動適用するリポジトリを指定します。本例ではセキュリティ更新のみを許可します。
Unattended-Upgrade::Allowed-Origins {
// "${distro_id}:${distro_codename}";
"${distro_id}:${distro_codename}-security";
// Extended Security Maintenance; doesn't necessarily exist for
// every release and this system may not have it installed, but if
// available, the policy for updates is such that unattended-upgrades
// should also install from here by default.
// "${distro_id}ESM:${distro_codename}";
// "${distro_id}:${distro_codename}-updates";
// "${distro_id}:${distro_codename}-proposed";
// "${distro_id}:${distro_codename}-backports";
};
注: 上記では -security のみ残しています。必要に応じて -updates や backports を許可できますが、運用リスクが増えます。
ブラックリスト
更新したくないパッケージがある場合は Package-Blacklist に追加します。クリティカルなバイナリやカスタムビルド済みパッケージなどを保護できます。
Unattended-Upgrade::Package-Blacklist {
"vim";
"mysql-server";
"mysql-client";
// "libc6";
// "libc6-dev";
// "libc6-i686";
};
注: ブラックリストは慎重に扱ってください。重要な依存関係が更新されないことで、他のパッケージ更新が失敗することがあります。
追加設定
以下のようなオプションを有効にしておくと運用が楽になります。
- メールで通知
- 不要依存関係の自動削除
- 再起動が必要な場合の自動再起動
メール通知を有効にするには次の行のコメントを外します。
Unattended-Upgrade::Mail "root";
注意: メール送信には sendmail や mailx 相当の実装が必要です。例: sendmail をインストールするには次のコマンドを実行します。
sudo apt install -y sendmail
不要依存関係の自動削除:
Unattended-Upgrade::Remove-Unused-Dependencies "true";
自動再起動(必要時):
Unattended-Upgrade::Automatic-Reboot "true";
自動再起動の時刻を指定することも可能です(24時間表記)。例:
Unattended-Upgrade::Automatic-Reboot-Time "00:00";
設定を保存して終了します。
ステップ 3 自動化の有効化
次に APT の定期実行設定を行います。/etc/apt/apt.conf.d/20auto-upgrades を編集します。
cd /etc/apt/apt.conf.d/
vim 20auto-upgrades
以下の内容にします。
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "3";
APT::Periodic::Unattended-Upgrade "1";
各設定の意味:
- Update-Package-Lists: 1 でパッケージリストを毎日更新
- Download-Upgradeable-Packages: 1 でアップグレード可能なパッケージを自動ダウンロード
- AutocleanInterval: 3 日ごとに不要な .deb を自動削除
- Unattended-Upgrade: 1 で unattended-upgrades を毎日実行
保存して終了します。
注: 更新やダウンロードのタイミングは cron ではなく /etc/cron.daily/apt-compat 経由で実行されます。
ステップ 4 更新内容の確認
ログの確認
unattended-upgrades のログは /var/log/unattended-upgrades にあります。
cd /var/log/unattended-upgrades
ls -lah
主なログファイル:
- unattended-upgrades-dpkg.log - dpkg 操作(インストール、削除、アップグレード)の詳細
- unattended-upgrades.log - 実行結果、ブラックリストやエラーの一覧
- unattended-upgrades-shutdown.log - シャットダウン/再起動に関するログ
SSH ログイン時の通知
SSH ログイン時に更新の有無が MOTD に表示されます。更新適用前後のメッセージを確認できます。
メール受信の確認
root 宛に送られた通知メールは /var/mail/root に保存されます。
cd /var/mail/
cat root
送信されるメールにはブラックリスト、更新されたパッケージ、削除されたパッケージの要約が含まれます。
再起動履歴の確認
自動再起動が有効な場合、直近の再起動を確認するには次のコマンドを使います。
last reboot
例: 再起動前と後の差分をログで確認して、自動再起動が正しく行われたかを検証してください。
運用チェックリスト(ロール別)
管理者向けチェックリスト:
- unattended-upgrades がインストールされている
- 50unattended-upgrades で -security のみ許可しているか確認
- 不要なブラックリストが含まれていないか確認
- 自動再起動の許可時間帯が業務に支障ないか確認
- メール通知先が適切か確認
SRE/運用担当向け:
- /var/log/unattended-upgrades を定期チェック
- last reboot を使い自動再起動が想定通りか確認
- アラートや監視(例: Nagios/Prometheus)と連携して異常を検知
開発チーム向け:
- ブラックリストにアプリ依存パッケージが含まれていないか確認
- バックアップ手順があり、ロールバック手順を文書化しているか確認
受け入れ基準
- セキュリティ更新のみが自動でインストールされること
- 自動実行後に unattended-upgrades.log に成功ログが残ること
- 必要に応じて自動再起動が行われ、last reboot で記録されること
- root 宛のメールに更新サマリが届くこと
トラブルシューティング
- updates が適用されない場合
- /var/log/unattended-upgrades/unattended-upgrades.log を確認してエラー内容を把握
- apt のロックが残っていないか確認: sudo fuser -v /var/lib/dpkg/lock
- メールが届かない場合
- sendmail が正しくインストールされ、ローカルメール送信が機能しているか確認
- /var/log/mail.log をチェック
- 自動再起動が行われない場合
- Automatic-Reboot が true に設定されているか確認
- 再起動時刻が別の設定で上書きされていないか確認
- 特定のパッケージだけ更新されない場合
- Package-Blacklist に含まれていないか確認
- 依存関係エラーがないか apt-get install -f を実行してみる
代替手段とその比較
- apticron: 軽量でメール通知特化。自動インストールは行わないため手動承認運用に向く。
- Landscape(Canonical 有料サービス): 大規模環境向けに中央管理、ロールアウト制御、レポート機能あり。
- 手動 apt update / apt upgrade: 完全な管理制御を保持できるが、人的コストが高い。
選び方の目安:
- 小〜中規模で自動化したい: unattended-upgrades
- 中〜大規模で中央管理や詳細なロールアウトが必要: Landscape
- 人的レビューが必須: apticron または手動運用
セキュリティとプライバシー考慮
- 自動更新はセキュリティリスクを低減するが、更新によりサービス停止や互換性問題が起きるリスクもある。
- ブラックリストで特定のパッケージを除外すると、除外したパッケージ由来の脆弱性が長期間残る可能性がある。
- メール通知に機密情報を含めない。サマリ情報のみで十分です。
- 個人データやユーザーデータの取り扱いに関しては更新前に必ずバックアップを取り、法的要件(例: 個人情報保護法)に従うこと。
運用手順(簡易 SOP)
- 変更前: 本番での更新は深夜のメンテ時間に自動化する。重要サービスはメンテ期間中に停止計画を作成。
- バックアップ: 重要な構成ファイルとデータをバックアップ。
- 設定確認: 50unattended-upgrades と 20auto-upgrades を確認。
- テスト: ステージングで自動更新を適用し、アプリケーション動作を検証。
- 本番適用: 本番環境で自動化を有効化。
- 監視: ログ、メール、監視ツールで異常を検知し、問題発生時はロールバック手順を実行。
例外や失敗する場合のケース
- カスタムカーネルや独自ビルドのバイナリがある環境では自動更新で互換性破壊が発生することがある。
- 依存関係の複雑なパッケージをブラックリスト化していると、期待した更新が適用されない。
- ネットワーク断やミラーサーバの不具合によりダウンロードが失敗する場合がある。
対応策: ステージング環境で更新を検証し、必要ならブラックリストの代わりにパッケージ別の運用ルールを設ける。
関連コマンドまとめ(チートシート)
- インストール: sudo apt install unattended-upgrades
- 設定編集: vim /etc/apt/apt.conf.d/50unattended-upgrades
- 自動化設定: vim /etc/apt/apt.conf.d/20auto-upgrades
- ログ確認: tail -n 100 /var/log/unattended-upgrades/unattended-upgrades.log
- 再起動履歴: last reboot
- メール確認: cat /var/mail/root
まとめ
unattended-upgrades を適切に設定すると、Ubuntu 16.04 環境でセキュリティ更新を迅速に適用でき、脆弱性の露出時間を短くできます。ただし自動更新はリスクも伴うため、ブラックリストや自動再起動の設定、メール通知、監視連携、ステージングでの検証を組み合わせた運用が重要です。
参考: