お疲れ様です。すぺきよです。
AWS上でAmazon Linux 2023を使ってサーバー構築を行い、仕事用の小さなアプリを開発、運用しています。
運用を開始してからしばらく経ったので、サーバーのご機嫌を確認するついでにサーバー内のパッケージがちゃんと更新されているかなどを確認してみると・・・。
タイトルでネタバレしていますが、今日のお話はAmazon Linux 2023でパッケージを更新するには、今までの常識は通用しないよ。というお話です。
2023.09.14 自動更新の方法について追記しました。
何があったのか
パッケージがアップデートされているか確認するために、「dnf update」コマンドを使って状況を確認すると、何やら見慣れない文字列が・・・。
Last metadata expiration check: 2:33:18 ago on Fri Sep 8 08:29:25 2023.
======================================================================================================================================================================================================================================================
WARNING:
A newer release of "Amazon Linux" is available.
Available Versions:
////////////// 中略 //////////
Version 2023.1.20230906:
Run the following command to upgrade to 2023.1.20230906:
dnf upgrade --releasever=2023.1.20230906
Release notes:
https://docs.aws.amazon.com/linux/al2023/release-notes/relnotes-2023.1.20230906.html
======================================================================================================================================================================================================================================================
Dependencies resolved.
Nothing to do.
Complete!
更新自体が現状存在せず、「Nothing to do.(何もしなかったよ)」と言っているということは最新版になっているということで一見問題はなさそうなのですが、気になるのが「A newer release of “Amazon Linux” is available.(新しい”Amazon Linux” がリリース利用できるよ)」の文言。
ってことは、現状のAmazon Linuxは古いってこと?え?どういうことなの?これって脆弱性がそのままでやばいんじゃないの?
どうしてこうなったのか
現状では、パッケージを自動更新するために「dnf-automatic」をインストールして、サービス実行して満足していました。
「dnf-automatic」というのはFedoraから派生している各種LinuxディストリビューションのRed Hat Enterprise Linux(RHEL)やCentOS、Rocky Linuxのパッケージ自動更新サービスです。(正しくは、CentOS、Rocky LinuxはRHELからさらに派生したディストリビューションです。)
これらFedoraから派生しているディストリビューションでは、7系では「yum-cron」、8系からは「dnf-automatic」を使ってパッケージを自動更新するのが一般的でした。
そのため、同じくFedoraから派生しているAmazon Linux 2023も「dnf-automatic」を使って更新しとけばいいだろうと思いそうしていました。実際Amazon Linux 2の時も「yum-cron」でパッケージの自動更新をするのが一般的でしたしね。
こういう時はマニュアルだ
Amazon Linux 2023のこの挙動について、AWSが公開しているマニュアルを読める範囲で読みました。
すると、以下の記載が・・・。
ディストリビューションは Amazon Linux パッケージリポジトリの特定のバージョンにロックされるため、更新を適用する方法とタイミングを制御できます。デフォルトでは、Amazon Linux 2 とは異なり、
https://aws.amazon.com/jp/blogs/news/amazon-linux-2023-a-cloud-optimized-linux-distribution-with-long-term-support/dnf update
コマンドはインストール済みのパッケージを更新しません (dnf
はyum
の後継です)。これは、フリート全体で同じパッケージバージョンが使用されるようにするのに役立ちます。
はっきりと「dnf update
コマンドはインストール済みのパッケージを更新しません 」って書かれているじゃないですか。
「dnf update」コマンドでアップデートされないのだから「dnf-automatic」も意味がないということは明白です。
うん、これはダメですね。アップデートせずに脆弱性を抱えたままなのと同じですね。
Amazon Linux 2023を使う前に知っておけよって?・・・、はい、すみません、おっしゃる通りです。(経験と思い込みって怖い)
どうしてdnf updateは通用しないのか
これはマニュアルを読むに、Amazon Linux 2023の管理体制の問題のようですね。
フリート管理とか難しい言葉が使われているようですが、簡単に言えば、複数台のインスタンスが起動して運用する際に、バージョンを統一しようということです。
Webアプリ用に負荷分散を目的とするなどで、インスタンスを複数起動していることはよくあることだと思います。
これらすべてのサーバーのパッケージを自動更新していたとしても、自動更新のタイミングが微妙にズレるなどで、ほとんどのサーバーは全てのパッケージにに更新が当たっているけど、1台だけパッケージが更新されていなくて、挙動が変わってしまう可能性があります。
この挙動の変化のせいで、たまーにWebアプリに不具合が出るけど、まさかこんなことになっているとは思いもしないので、原因究明に時間がかかります。
そうこうしているうちに、次のパッケージ自動更新で更新が当たって挙動が勝手に治ってしまいます。
そうなっていまうと、挙動が治ったことの証明はほぼ不可能です。
ものすごくモヤモヤした状態で運用していくことになりますね。実際にこんなことがあるかどうかはわかりませんが、可能性としての話です。
これを回避するために、Amazon Linux 2023では、パッケージの組み合わせを、マイナーバージョンごとにきっちりと決め、バージョンごとでパッケージの内容に差異がないように管理しているようです。
そのため「dnf update」で、パッケージの更新をかいつまんで更新する方式ではなくこのような方針をとっているようですね。
とりあえず急ぎアップデートだ、の前にコマンドの詳細確認
では、早速アップデートしてみましょう。と、言いたいところですが、まずはアップデートのコマンドの詳細を確認しましょう。
dnf updateを実行した際の警告の中に更新用のコマンドらしき「dnf upgrade –releasever=2023.1.20230906」が記載されていますね。
AWSがこう言っているのであるから、そのまま実行してもいいのだと思いますが、念の為、コマンドの詳細を確認しておいた方がいいでしょう。疑ってるわけじゃないですけどね。
コマンドのdnfはパッケージマネージャーのコマンドなので、ここでは「upgrade」と「–releasever=2023.1.20230906」の部分について調べてみます
upgrade コマンド
dnfのマニュアルに以下の通り記載がありますね。(引用しづらかったので、画像でごめんなさい。)
名前の通り、指定されたパケージを更新するということですね。パッケージを指定しなかったら全てのパッケージを更新するようですね。コマンドの名前そのままです。
むしろ、いままで使っていた「update」のコマンドが非推奨になっていることの方が驚きです。
たしかに、コマンドのヘルプを読むために「dnf –help」を実行した時も「update」コマンドが見当たらなかったです。これはそういうことなんですね
–releasever=2023.1.20230906 オプション
同じく、こちらもマニュアルで見てみましょう。以下のように記載がありますね。
このオプションは「release」と「ver」の組み合わせでできているっぽいですね。最初は「releaseserver」と空目しました。
「dnf –help」にも以下のように記載があります。
–releasever RELEASEVER
override the value of $releasever in config and repo files
「dnf –help」コマンドの結果より
upgradeコマンドと組み合わせることで、パッケージの取得先の設定を「2023.1.20230906」に上書きして実行するという感じでしょうか。
う〜ん、確かに、この警告文に書かれているコマンドは、パッケージの更新コマンドのようです。
実際に更新してみる
では、早速このコマンドを実行してみましょう。まずは念の為、以下のコマンドを使って、本当に更新があるかみてみます。
sudo dnf check-update --releasever=2023.1.20230906
結果は以下の通り、長くなったのと、で途中までですが、対価に更新があるようですね。
では、以下のコマンドを実行して実際にアップグレードです。ドキドキですね。
sudo dnf upgrade --releasever=2023.1.20230906
実行すると見慣れた更新の確認メッセージが表示されました。なんかホッとしますね。
そして、ここで「y」を入力して更新実行!無事に更新が完了しました。
自動アップデートするにはどうしたらいいの?
パッケージの自動更新の方法がわかったので、新しい記事「Amazon Linux 2023で自動でパッケージを最新に更新する」としてまとめました。
よろしければこちらもご参照ください。
以下のドキュメントに–releaseverオプションに「latest」を指定すると常に最新になるようなことが書かれています。
Using
https://docs.aws.amazon.com/linux/al2023/ug/deterministic-upgrades-usage.htmlsudo dnf upgrade --releasever=latest
updates all packages, includingsystem-release
. Then, the version remains locked to the newsystem-release
unless you set the persistent override.
なので、以下のコマンドをcrontabなどで自動実行したら定期的に自動更新になるんじゃないかと思います。(未検証です。)
sudo dnf upgrade -y --releasever=latest
今回はもう試せないので、今後試してみます。たしかAmazon Linux 2023はCrontabが標準でインストールできなかったはずなので、その辺りも含めてなかなかクセのあるOSですね。
まとめ
Amazon Linux 2023のパッケージの更新方法につてまとめてみました。
この、リリースパッケージを固定化する方式の目的はわかるのですが、「デフォルトでセキュア」の考え方に基づいて、リリースパッケージ固定化の方をオプションにして、デフォルトでは今まで通りに更新するようにしておいてもらいたかったですね。
きっと、リリース時のニュースとかに書かれていて、それをよく読まなかった私が悪いのだと思いますが・・・。
とりあえず、早めに気が付いてよかったです。今後も気をつけないと。