Ubuntu18.04 アップデートを自動で適用

サーバーがある程度安定稼働してきていて、SSHでアクセスしない日が増えてきている。そうなってくるとセキュリティアップデートを自動で適用させたくなってくる。何なら、セキュリティじゃなくても自動適用させたいし、必要ならさっさと再起動してもらって構わない。






あぁ、再起動タイミングは少し考えるか…OS2種類(タイトルは18.04だけど)、再起動タイミング2種類かな。

■ルーター君は即時再起動

ルーター君はUbuntu18.04、外部に向けてサービスを提供するためにPPP接続を張ってDynamicDNSに割り当てられたIPアドレスを通知している。既に設定は完了しており、今後機能を追加する予定はない。家族や親戚だけで利用しているサービスだし、仮に真っ昼間に1~2分程度止まっても何の問題もない。

■AD DC君は4時頃再起動

AD DC君はUbuntu18.04、DHCPやDNSが機能していて日頃普通に使っている。機能を変えるためにメンテナンスすることもあるから、意図しない再起動はちょっと困る。

■サーバー君も4時頃再起動

サーバー君はUbuntu16.04、Webサーバーの元で各種機能を展開している。こちらもメンテナンスすることがあるから、意図しない再起動はちょっと困る。


■unattended-upgrades

ここで超詳しく説明してくれている。
Qiita / Debian 系で unattended-upgrades を有効にする場合の追加設定 (メール通知, autoremove, autoclean, 再起動)

Ubuntu18.04でもUbuntu16.04でもインストールは一緒…だが、最初からインストールされてる。

$ sudo apt install unattended-upgrades ← 最初から入ってる

設定ファイルは3つある模様。
Narrow Escape / Ubuntu 16.04: 自動アップデート / アップグレードの設定をする

/etc/apt/apt.conf.d/10periodic ← unattended-upgradeでは利用されない。20が優先される
/etc/apt/apt.conf.d/20auto-upgrades ← 自動アップデートとアップグレードを設定。
/etc/apt/apt.conf.d/50unattended-upgrades ← 自動アップグレードの詳細を設定。

■ファイル 20auto-upgrades

ここに説明があるかな…と思いきや、ない。いや、枠組みの説明や、なくなったときの説明はあるんだけど、中身の説明がない。
debian wiki / UnattendedUpgrades

なので、画面の設定値を変えたらどうなるのか見てみた。

APT::Periodic::Update-Package-Lists "1"; 
→ Automatically check for updates(アップデートを自動的に確認する)
   Daily=1 / Every two days = 2 / Weekly = 7 / Every two weeks = 14 / Never = 0

APT::Periodic::Download-Upgradeable-Packages "0";
→ When there are security updates(セキュリティアップデートがある場合 その1)
   Download and install automatically = 1 / Download automatically = 1 / Display immediately = 0
   アップグレードするためにはダウンロードはしておく(=1)必要がある。

APT::Periodic::AutocleanInterval "0";
→ GUIをインストールして[Software & Updates]を起動したらできた項目だけど、対応項目が見つからない。
   何か設定を変えると必ず0になるけど、どうやらこれは日にちを入れる模様。恐らく以下。
   Daily=1 / Every two days = 2 / Weekly = 7 / Every two weeks = 14 / Never = 0

APT::Periodic::Unattended-Upgrade "1";
→ When there are security updates(セキュリティアップデートがある場合 その2)
   Download and install automatically = 1 / Download automatically = 0  / Display immediately = 0
   アップグレードするには1を設定しておく必要がある。

以上のことから、ウチの場合は以下の設定にしておけば良さそう。
再起動のタイミングは 50unattended-upgrades で設定する。

APT::Periodic::Update-Package-Lists "1";           ← 毎日アップデートをチェック
APT::Periodic::Download-Upgradeable-Packages "1";  ← アップデートをダウンロードする
APT::Periodic::AutocleanInterval "14";             ← 2週間に1回くらいクリーンアップ
APT::Periodic::Unattended-Upgrade "1";             ← アップデートをインストールする

なお、Ubuntu16.04ではファイルがなくなっていた。これは再構築できる。

$ dpkg-reconfigure -plow unattended-upgrades
…
[unattended-upgrades を設定しています]
自動的に安定版の更新をダウンロードしてインストールしますか?
→ はい
…
Creating config file /etc/apt/apt.conf.d/20auto-upgrades with new version

■ファイル 50unattended-upgrades

とにかく説明を探さないと…
Github / mvo5/unattended-upgrades
Ubuntu Manuals / unattended-upgrade
libre-software.net / How to set up automatic updates on Ubuntu Server 18.04

だけど、Githubの情報にたどり着いたのは調査の最後の方で、とにかく情報に行き当たらなかった。仕方なくファイルの中身をGoogle先生に翻訳してもらって若干の意訳を付けてみたりした…

// Automatically upgrade packages from these (origin:archive) pairs
// これらの(origin:archive)ペアから自動的にパッケージをアップグレードする
//
// Note that in Ubuntu security updates may pull in new dependencies
// from non-security sources (e.g. chromium). By allowing the release
// pocket these get automatically pulled in.
// Ubuntuでは、セキュリティアップデートにより、セキュリティ以外の
// ソース(例 chromium)から新しい依存関係が引き込まれる可能性があります。
// リリースポケットを許可することで、これらは自動的に引き込まれます。
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.
    // 拡張セキュリティメンテナンス; 必ずしもすべてのリリースに存在するわけではなく、
    // このシステムにインストールされていない場合もありますが、
    // 利用可能であれば、デフォルトでunattended-upgradesも
    // ここからインストールするように更新のポリシーが定められています。
    "${distro_id}ESM:${distro_codename}";
//  "${distro_id}:${distro_codename}-updates";
//  "${distro_id}:${distro_codename}-proposed";
//  "${distro_id}:${distro_codename}-backports";
};

// List of packages to not update (regexp are supported)
// 更新しないパッケージのリスト(regexpがサポートされています)
Unattended-Upgrade::Package-Blacklist {
//  "vim";
//  "libc6";
//  "libc6-dev";
//  "libc6-i686";
};

// This option will controls whether the development release of Ubuntu will be
// upgraded automatically.
// このオプションはUbuntuの開発版を自動的にアップグレードするかどうかを制御します。
// ※Ubuntu16.04にない
Unattended-Upgrade::DevRelease "false";

// This option allows you to control if on a unclean dpkg exit
// unattended-upgrades will automatically run
//   dpkg --force-confold --configure -a
// The default is true, to ensure updates keep getting installed
// このオプションを使用すると、dpkgがきれいに終了しなかった時に
// unattended-upgradesが自動的に実行されるかどうかを制御できます。
//   dpkg --force-confold --configure -a
// 更新が確実にインストールされるようにするため、デフォルトはtrueです。
// デフォルト値: true
//Unattended-Upgrade::AutoFixInterruptedDpkg "false";

// Split the upgrade into the smallest possible chunks so that
// they can be interrupted with SIGTERM. This makes the upgrade
// a bit slower but it has the benefit that shutdown while a upgrade
// is running is possible (with a small delay)
// それらがSIGTERMで割り込まれることができるように可能な限り小さい塊にアップグレードを
// 分割してください。これによりアップグレードが少し遅くなりますが、アップグレードの
// 実行中にシャットダウンが可能になるという利点があります(わずかな遅延があります)。
// デフォルト値: true
//Unattended-Upgrade::MinimalSteps "false";

// Install all unattended-upgrades when the machine is shutting down
// instead of doing it in the background while the machine is running
// This will (obviously) make shutdown slower
// マシンの実行中にバックグラウンドで実行するのではなく、
// マシンのシャットダウン時にすべての無人アップグレードをインストールします。
// これは(明らかに)シャットダウンを遅くします。
// デフォルト値: false 
//Unattended-Upgrade::InstallOnShutdown "true";

// Send email to this address for problems or packages upgrades
// If empty or unset then no email is sent, make sure that you
// have a working mail setup on your system. A package that provides
// 'mailx' must be installed. E.g. "user@example.com"
// 問題やパッケージのアップグレードがあれば、ここに電子メールを送ります。
// 有効なメールアドレスであることを確認してください、空または未設定の場合は送信されません。
// 'mailx'を提供するパッケージをインストールしておいてください。
// 例 "user@example.com"
// デフォルト値: 未設定
//Unattended-Upgrade::Mail "root";

// Set this value to "true" to get emails only on errors. Default
// is to always send a mail if Unattended-Upgrade::Mail is set
// エラー時にのみEメールを受信するには、この値を "true"に設定します。
// Unattended-Upgrade::Mailが設定されている場合、デフォルトでは常にメールを送信します。
// デフォルト値: false
//Unattended-Upgrade::MailOnlyOnError "true";

// Remove unused automatically installed kernel-related packages
// (kernel images, kernel headers and kernel version locked tools).
// 自動インストールされたカーネル関連パッケージが未使用になったら削除します。
// (カーネルイメージ、カーネルヘッダ、カーネルバージョンロックツール)
// デフォルト値: 情報なし
//Unattended-Upgrade::Remove-Unused-Kernel-Packages "false";

// Do automatic removal of new unused dependencies after the upgrade
// (equivalent to apt-get autoremove)
// アップグレード後に新しい未使用の依存関係を自動的に削除します。
// (apt-get autoremoveと同等)
// デフォルト値: false
//Unattended-Upgrade::Remove-Unused-Dependencies "false";

// Automatically reboot *WITHOUT CONFIRMATION*
//  if the file /var/run/reboot-required is found after the upgrade
// アップグレード後に /var/run/reboot-required ファイルが見つかった場合は、
// *確認なし*に自動的に再起動します。
// デフォルト値: false
//Unattended-Upgrade::Automatic-Reboot "false";

// If automatic reboot is enabled and needed, reboot at the specific
// time instead of immediately
//  Default: "now"
// 自動再起動が有効で必要な場合は、すぐにではなく特定の時間に再起動します。
//  デフォルト値: "now"
//Unattended-Upgrade::Automatic-Reboot-Time "02:00";

// Use apt bandwidth limit feature, this example limits the download
// speed to 70kb/sec
// この例では、ダウンロード速度を70kb/秒に制限しています。
//Acquire::http::Dl-Limit "70";

// Enable logging to syslog. Default is False
// syslogへのロギングを有効にします。
// デフォルト値: false
// ※Ubuntu16.04にない
// Unattended-Upgrade::SyslogEnable "false";

// Specify syslog facility. Default is daemon
// syslog機能を指定してください。
// デフォルト値: daemon
// ※Ubuntu16.04にない
// Unattended-Upgrade::SyslogFacility "daemon";

// Download and install upgrades only on AC power
// (i.e. skip or gracefully stop updates on battery)
// AC電源でのみアップグレードをダウンロードしてインストールします。
// (つまり、バッテリーのアップデートをスキップまたは正常に停止します)
// デフォルト値: 情報なし
// ※Ubuntu16.04にない
// Unattended-Upgrade::OnlyOnACPower "true";

// Download and install upgrades only on non-metered connection
// (i.e. skip or gracefully stop updates on a metered connection)
// 従量課金ではない接続でのみアップグレードをダウンロードしてインストールします。
// (つまり、従量課金接続では更新をスキップまたは適切に停止します)
// デフォルト値: 情報なし
// ※Ubuntu16.04にない
// Unattended-Upgrade::Skip-Updates-On-Metered-Connections "true";

それぞれの設定を見ていこうと思うけど…大変。Unattended-Upgrade::Allowed-Origins については、以下の内容が参考になりそう。
コはコンピューターのコ / unattended-upgradeでサードパーティリポジトリも自動アップデートする
セキュリティ以外のアップデートも一緒にやっておいて欲しいから、
“${distro_id}:${distro_codename}-updates”
を有効にしてみるか。

これ以外の項目はコメントを見ながらやってみよう!ということで、ファイルは以下の通りに変更。コメントは日本語にしちゃえ。

// これらの(origin:archive)ペアから自動的にパッケージをアップグレードする
//
// Ubuntuでは、セキュリティアップデートにより、セキュリティ以外の
// ソース(例 chromium)から新しい依存関係が引き込まれる可能性があります。
// リリースポケットを許可することで、これらは自動的に引き込まれます。
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.
    // 拡張セキュリティメンテナンス; 必ずしもすべてのリリースに存在するわけではなく、
    // このシステムにインストールされていない場合もありますが、
    // 利用可能であれば、デフォルトでunattended-upgradesも
    // ここからインストールするように更新のポリシーが定められています。
    "${distro_id}ESM:${distro_codename}";
    "${distro_id}:${distro_codename}-updates"; ← 有効化
//  "${distro_id}:${distro_codename}-proposed";
//  "${distro_id}:${distro_codename}-backports";
};

// 更新しないパッケージのリスト(regexpがサポートされています)
Unattended-Upgrade::Package-Blacklist {
//  "vim";
//  "libc6";
//  "libc6-dev";
//  "libc6-i686";
};

// このオプションはUbuntuの開発版を自動的にアップグレードするかどうかを制御します。
Unattended-Upgrade::DevRelease "false";

// このオプションを使用すると、dpkgがきれいに終了しなかった時に
// unattended-upgradesが自動的に実行されるかどうかを制御できます。
//   dpkg --force-confold --configure -a
// 更新が確実にインストールされるようにするため、デフォルトはtrueです。
// デフォルト値: true
//Unattended-Upgrade::AutoFixInterruptedDpkg "false";

// それらがSIGTERMで割り込まれることができるように可能な限り小さい塊にアップグレードを
// 分割してください。これによりアップグレードが少し遅くなりますが、アップグレードの
// 実行中にシャットダウンが可能になるという利点があります(わずかな遅延があります)。
// デフォルト値: true
//Unattended-Upgrade::MinimalSteps "false";

// マシンの実行中にバックグラウンドで実行するのではなく、
// マシンのシャットダウン時にすべての無人アップグレードをインストールします。
// これは(明らかに)シャットダウンを遅くします。
// デフォルト値: false 
//Unattended-Upgrade::InstallOnShutdown "true";

// 問題やパッケージのアップグレードがあれば、ここに電子メールを送ります。
// 有効なメールアドレスであることを確認してください、空または未設定の場合は送信されません。
// 'mailx'を提供するパッケージをインストールしておいてください。
// 例 "user@example.com"
// デフォルト値: 未設定
//Unattended-Upgrade::Mail "root";
Unattended-Upgrade::Mail "hogeuser@hogeserver.hogeddns.jp";
// ただし、メール送信のためにはpostfixとかも必要になることから、ちょっとハードルが高いかも。

// エラー時にのみEメールを受信するには、この値を "true"に設定します。
// Unattended-Upgrade::Mailが設定されている場合、デフォルトでは常にメールを送信します。
// デフォルト値: false
Unattended-Upgrade::MailOnlyOnError "true"; ← 有効化

// 自動インストールされたカーネル関連パッケージが未使用になったら削除します。
// (カーネルイメージ、カーネルヘッダ、カーネルバージョンロックツール)
// デフォルト値: 情報なし
//Unattended-Upgrade::Remove-Unused-Kernel-Packages "false";
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
// アップグレード後に新しい未使用の依存関係を自動的に削除します。
// (apt-get autoremoveと同等)
// デフォルト値: false
//Unattended-Upgrade::Remove-Unused-Dependencies "false";
Unattended-Upgrade::Remove-Unused-Dependencies "true";

// アップグレード後に /var/run/reboot-required ファイルが見つかった場合は、
// *確認なし*に自動的に再起動します。
// デフォルト値: false
//Unattended-Upgrade::Automatic-Reboot "false";
Unattended-Upgrade::Automatic-Reboot "true";

// 自動再起動が有効で必要な場合は、すぐにではなく特定の時間に再起動します。
//  デフォルト値: "now"
//Unattended-Upgrade::Automatic-Reboot-Time "02:00";
Unattended-Upgrade::Automatic-Reboot-Time "now";   ← 即時再起動チーム
Unattended-Upgrade::Automatic-Reboot-Time "04:00"; ← 4時再起動チーム

// この例では、ダウンロード速度を70kb/秒に制限しています。
//Acquire::http::Dl-Limit "70";

// syslogへのロギングを有効にします。
// デフォルト値: false
// Unattended-Upgrade::SyslogEnable "false";

// syslog機能を指定してください。
// デフォルト値: daemon
// Unattended-Upgrade::SyslogFacility "daemon";

// AC電源でのみアップグレードをダウンロードしてインストールします。
// (つまり、バッテリーのアップデートをスキップまたは正常に停止します)
// デフォルト値: 情報なし
// Unattended-Upgrade::OnlyOnACPower "true";

// 従量課金ではない接続でのみアップグレードをダウンロードしてインストールします。
// (つまり、従量課金接続では更新をスキップまたは適切に停止します)
// デフォルト値: 情報なし
// Unattended-Upgrade::Skip-Updates-On-Metered-Connections "true";


■メール送信について

mailutil にしても bsd-mailx にしても、Postfixを必要とする。
ルーター君は外からのメールをサーバー君に単純転送するなどの動きをしていることから、そんなものを設定することはできないなぁと。よって、ここでは説明をしない。

ウチの場合だと、ルーター君とAD DC君はメール送信ができなくて、サーバー君だけがメール送信できる状態になるが、まぁ、いいでしょう。

$ sudo apt install bsd-mailx
$ echo test | mail hogeuser@hogeserver.hogeddns.jp
→ これで宛先にテストメールが届く。


■動作確認

まずは、サービスが有効になっているか確認。

$ sudo systemctl status unattended-upgrades.service
● unattended-upgrades.service - Unattended Upgrades Shutdown
   Loaded: loaded (/lib/systemd/system/unattended-upgrades.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2019-04-29 16:39:25 JST; 1 day 22h ago
…

どうやら、サービスが有効化されて起動している模様。

動作テスト。

$ sudo unattended-upgrade --dry-run --debug
Initial blacklisted packages:
Initial whitelisted packages:
Starting unattended upgrades script
Allowed origins are: o=Ubuntu,a=bionic, o=Ubuntu,a=bionic-security, o=UbuntuESM,a=bionic, o=Ubuntu,a=bionic-updates
Using (^linux-image-[0-9]+\.[0-9\.]+-.*|^linux-headers-[0-9]+\.[0-9\.]+-.*|^linux-image-extra-[0-9]+\.[0-9\.]+-.*|^linux-modules-[0-9]+\.[0-9\.]+-.*|^linux-modules-extra-[0-9]+\.[0-9\.]+-.*|^linux-signed-image-[0-9]+\.[0-9\.]+-.*|^kfreebsd-image-[0-9]+\.[0-9\.]+-.*|^kfreebsd-headers-[0-9]+\.[0-9\.]+-.*|^gnumach-image-[0-9]+\.[0-9\.]+-.*|^.*-modules-[0-9]+\.[0-9\.]+-.*|^.*-kernel-[0-9]+\.[0-9\.]+-.*|^linux-backports-modules-.*-[0-9]+\.[0-9\.]+-.*|^linux-modules-.*-[0-9]+\.[0-9\.]+-.*|^linux-tools-[0-9]+\.[0-9\.]+-.*|^linux-cloud-tools-[0-9]+\.[0-9\.]+-.*) regexp to find kernel packages
Using (^linux-image-4\.15\.0\-48\-generic$|^linux-headers-4\.15\.0\-48\-generic$|^linux-image-extra-4\.15\.0\-48\-generic$|^linux-modules-4\.15\.0\-48\-generic$|^linux-modules-extra-4\.15\.0\-48\-generic$|^linux-signed-image-4\.15\.0\-48\-generic$|^kfreebsd-image-4\.15\.0\-48\-generic$|^kfreebsd-headers-4\.15\.0\-48\-generic$|^gnumach-image-4\.15\.0\-48\-generic$|^.*-modules-4\.15\.0\-48\-generic$|^.*-kernel-4\.15\.0\-48\-generic$|^linux-backports-modules-.*-4\.15\.0\-48\-generic$|^linux-modules-.*-4\.15\.0\-48\-generic$|^linux-tools-4\.15\.0\-48\-generic$|^linux-cloud-tools-4\.15\.0\-48\-generic$) regexp to find running kernel packages
pkgs that look like they should be upgraded:
Fetched 0 B in 0s (0 B/s)
fetch.run() result: 0
blacklist: []
whitelist: []
No packages found that can be upgraded unattended and no pending auto-removals

さぁ、後はアップデートがされるのをじっと待つ感じかな。

お気軽にどうぞ ~ 投稿に関するご意見・感想・他

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です