Ubuntuのパッケージ自動更新設定

2021年6月14日

前回はVALUE SERVERからConoHa VPSへのこのサイトのWordPress移行方法を記事にしました。

このサイトのWordPressやMySQL、nginxなどが動いてるDockerコンテナが乗っているのは母艦であるUbuntuです。
今回はUbuntuのパッケージ自動更新について話します。

序章

このサイトではUbuntuのパッケージでMySQLやnginxやphpなどをインストールしていません。これらはUbuntu上のdockerコンテナでそれぞれ動いています。それは攻撃者がWordPressの脆弱性を突いてきても、それが動いているコンテナ内に封じ込めるため、という説明をしてきました。しかし、もしUbuntu自体に脆弱性があって、Dockerコンテナから何か操作が出来てしまえば話は変わります。攻撃者はコンテナの脆弱性を突いてコンテナの外に危害を加える可能性があります(もちろん攻撃範囲も手段も非常に限定されるので、悪くなってるわけではありません)。そのため、Ubuntu自体のセキュリティも何らかの形で保護する必要があります。

保護の手段は有料の製品などいろいろありますが、まず第一に気をつけることはなるべく最新を保ち、セキュリティリスクを最小限に抑えることです。UbuntuはLinuxカーネルを含め、パッケージという単位で機能を組み合わせてシステムを構成しています。あるパッケージで脆弱性が発見されたらそのパッケージはバージョンアップし、テストされ、リポジトリが更新されます。そして、個々の稼働しているUbuntuはリポジトリにあるパッケージのバージョンを監視し、適時必要なバージョンアップを自動的に実施する仕組みがあるのです(他のLinux Distributionでも大抵あります)。

Ubuntu使いなら誰でも、aptコマンドで、apt updateとかapt upgradeみたいな処理はしてると思いますが、あれを自動で動かす仕組みがあるということです。勘のいい方なら気付いてそうですが、GUIの場合時折何もしてないのにポップアップとか出て「アップグレードしますか?」と聞かれたりとか、久しぶりに立ち上げたUbuntuで、それまでaptとか触ってないのに、なぜかaptコマンドを使おうとしたら使用中と怒られたりとか、ログインしてみたらいきなりupgradeできるパッケージが何個あるとか親切に教えてくれる、アレです。

unattended-upgrades

このパッケージがUbuntuのパッケージ自動更新機能を担っています。これを設定することで、その動作を変更することができます。

ドキュメント

英語ですが、この辺が本家のようです。

https://help.ubuntu.com/community/AutomaticSecurityUpdates

そして、詳細を知れるのが、Ubuntuの元となっているDebinのドキュメント。

https://wiki.debian.org/UnattendedUpgrades

今回のゴール

本家パッケージのセキュリティアップデートのみを自動でデフォルトのタイミングで実施し、必要とあらば自動でリブートする。

デフォルトの設定

ファイルとしては/etc/apt/apt.conf.d/にあり、

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
...
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}ESMApps:${distro_codename}-apps-security";
        "${distro_id}ESM:${distro_codename}-infra-security";
//      "${distro_id}:${distro_codename}-updates";
//      "${distro_id}:${distro_codename}-proposed";
//      "${distro_id}:${distro_codename}-backports";
};
...
Unattended-Upgrade::DevRelease "auto";
...
//Unattended-Upgrade::Automatic-Reboot "false";
...

コマンドとしては

$ apt-config dump | grep -E '(Unattended-Upgrade|Periodic)::'
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "0";
APT::Periodic::AutocleanInterval "0";
APT::Periodic::Unattended-Upgrade "1";
Unattended-Upgrade::Allowed-Origins "";
Unattended-Upgrade::Allowed-Origins:: "${distro_id}:${distro_codename}";
Unattended-Upgrade::Allowed-Origins:: "${distro_id}:${distro_codename}-security";
Unattended-Upgrade::Allowed-Origins:: "${distro_id}ESMApps:${distro_codename}-apps-security";
Unattended-Upgrade::Allowed-Origins:: "${distro_id}ESM:${distro_codename}-infra-security";
Unattended-Upgrade::DevRelease "auto";
$

などで内容を見ることが出来ます(コメント除く)。

項目意味デフォルト
APT::Periodic::Update-Package-Lists何日に1回パッケージリストの更新(apt-get update)を自動で行うか
(0で行わない)
1
APT::Periodic::Download-Upgradeable-Packages何日に1回パッケージのダウンロード(apt-get upgrade –download-only)を自動で行うか
(0で行わない)
0
APT::Periodic::AutocleanInterval何日に1回パッケージキャッシュの適宜削除(apt-get autoclean)を自動で行うか
(0で行わない)
0
APT::Periodic::Unattended-Upgrade何日に1回パッケージの自動更新(unattended-upgrade)を自動で行うか
(0で行わない)
1
Unattended-Upgrade::Allowed-Origins::apt-cache policyで表示される一覧にある、o(Origin)とa(Archive)で更新対象となるパッケージを選択する
(gzip -dc /usr/share/doc/unattended-upgrades/README.md.gz)
セキュリティだけは入っているように見える

以上から、

  • 本家パッケージのセキュリティアップデートのみ自動でデフォルトのタイミングで実施される
  • 必要であっても自動で再起動はしない

と考えます。

今回やること

必要とあらば自動でリブートする設定を追加します。

実際やったこと

/etc/apt/apt.conf.d/50unattended-upgrades

...
Unattended-Upgrade::Automatic-Reboot "true";
...

なお、リブートのタイミングはパッケージの更新直後となる設定がデフォルトです。パッケージの更新時間はsystemdで設定されています(man unattended-upgrade)。

$ systemctl cat apt-daily.timer
# /lib/systemd/system/apt-daily.timer
[Unit]
Description=Daily apt download activities

[Timer]
OnCalendar=*-*-* 6,18:00
RandomizedDelaySec=12h
Persistent=true

[Install]
WantedBy=timers.target
$

発火タイミングは一日2度、午前・午後6:00ですが、ランダムディレイがそれなりの時間入るのでいつかはサッパリ分かりません。発火されても設定された回数以上は動作しないと思います。

最後に再起動が入ったタイミングは

$ dmesg -T --color=always | head -10

とかで簡単に分かります。またログイン中でも容赦なく再起動がかかる設定です。

まとめ

Ubuntuのパッケージ自動更新のデフォルト設定を理解し、本家セキュリティアップデートと自動再起動を行えるように設定できました。ただ、本家以外とセキュリティアップデート以外の更新が入らないので、そこは手作業が残る形になっており、手間をかけたくないので、いずれ対応を考える必要がありそうです。

次回はVALUE SERVER→ConoHa VPS移行作業で漏れた部分に手をつけていこうと思います。

未分類ubuntu

Posted by first_user