プライム・ストラテジー「KUSANAGI」開発チームの石川です。
KUSANAGI Security Editionの主な機能の1つに「OS・ミドルウェアの自動アップデート」があります。
OS・ミドルウェアの自動アップデートって言っても、どこまで自動でやっちゃうの?
自動でアップデートされるのって不安…アップデートして動かなくなったらどうするの?
WordPressをはじめ、ミドルウェアやインフラを運用管理する方からすると、このような疑問を持たれるのではないでしょうか。
今回はこの「OS・ミドルウェアの自動アップデート」について、以下の点を中心に技術的な観点から解説します。
- 「何を」「どのように」自動でアップデートするのか
- どのように安全性を考慮しているのか
OS・ミドルウェアの自動アップデートの対象
OS・ミドルウェアの自動アップデートとは、簡単に言うと定期的に dnf upgrade
コマンドを実行する仕組みです。
dnf upgrade
はAlmaLinux OSが提供するコマンドで、各種のRPMパッケージを更新するためのコマンドです。
このコマンドを定期的に実行することで、RPMパッケージを最新に保つのがOS・ミドルウェアの自動アップデートです。
dnf upgrade
を定期的に実行することに不安を覚える方がいると思います。
しかし、アップデートする対象となるリポジトリを比較的安全なものに限定することで、自動アップデートによって不具合が極力起きないように考慮しています。
KUSANAGI Security Editionでは自動アップデートを行うリポジトリを以下のものに限定してます。この対象はkusanagi autoupdate コマンドで変更することも可能です。
- KUSANAGIのパッケージ
- kusanagi リポジトリ
- kusanagi-security リポジトリ
- AlmaLinux OSのパッケージ
- baseos リポジトリ (ただし kernel* を除きます)
- appstream リポジトリ
- extras リポジトリ
- crb リポジトリ
KUSANAGIのパッケージの自動更新
KUSANAGIのパッケージとは、KUSANAGI開発元のプライム・ストラテジーが提供しているRPMパッケージです。
KUSANAGIの機能を提供するために必要なパッケージと、KUSANAGIを構成するミドルウェアのパッケージが含まれます。
具体的には以下のコマンドを実行することで、一覧を確認できます。
dnf list --installed | egrep '@kusanagi(|-security)'
以下が代表的なパッケージです。
- Python 3.9 (KUSANAGIが使用するもの)
- PHP (KUSANAGIが使用するもの)
- Nginx (KUSANAGIが使用するもの)
- Apache HTTP Server (KUSANAGIが使用するもの)
マイナーバージョンを跨ぐミドルウェアの自動更新は行わない
PHP、Nginx、Apache HTTP Serverについては、使用してるバージョンの関するアップデートのみを適用します。
ミドルウェアによってバージョンの表記が異なるのですが、例えば PHP 8.1 を使用している場合は 8.1.1 から 8.1.2 へのアップデートを行います。同様に、Nginx 1.26 を使用している場合は 1.26.1 から 1.26.2 へのアップデートを行います。
PHPの 8.1.x の最後のバージョン x はポイントリリースと言います。通常、新規機能の追加はメジャーリリースやマイナーリリースでしか行われず、ポイントリリースはバグ修正やセキュリティ問題の対応が中心となります。そのため、メジャーリリースやマイナーリリースのような非互換が発生し難く、比較的安全に適用することができます。
Nginxの 1.26.x の最後のバージョンも同様です。特に 1.26.x の偶数リリースは安定版 (stable) であり、重大なバグ修正や脆弱性の対応が行われるリリースです。よって、このアップデートでも非互換が発生し難いと考えられます。
セキュリティ修正のアップデートであっても、ライブラリなどの内部ロジックの変更によって、アップリケーションへの影響がないか気になるかと思います。
100%ないとは言い切れないですが、PHPのようなインタプリタ言語では明確な言語仕様の変更がない限り、大きな非互換は起こり難いと言えます。同様に、Nginxも動作が極端に変わることはないでしょう。
なお、データベースのように修正によるリスクがありえるミドルウェアは自動アップデートの対象には入っていません。
動作を確認した上でリリースするプロセス
KUSANAGIのパッケージをリリースする際は、KUSANAGI開発元でテストを行い、動作に影響が出ないことを確認した上でリリースを行っています。このテストは自動化されたCI/CDプロセスによって行われてます。
AlmaLinux OSのパッケージの自動更新
AlmaLinux OSのパッケージとは、AlmaLinuxが提供しているRPMパッケージです。
具体的には以下のコマンドを実行することで、一覧を確認できます。
dnf list --installed | egrep '@(appstream|baseos|extras|crb)'
AlmaLinux OSのパッケージは、RHELのマイナーマージョンとABI互換を保っています。
そのため、AlmaLinux OSのメジャーバージョン内 (KUSANAGI Security Editionならば、AlmaLinux OS 9) で非互換が出るような大きな修正が提供されることはほぼありません。
パッケージによってはマイナーバージョンを維持したまま、必要なセキュリティ修正のみをバックポートしているものもあります。
多くのパッケージでは非互換が発生し難いため、安心して適用することができると言えます。
AlmaLinux OS以外のパッケージは更新しない
Almalinux FoundationがOSとして提供しているパッケージのみが対象で、EPELのような外部プロジェクトのパッケージは含まれません。
例えば、KUSANAGI Security EditionのVMに独自のリポジトリを設定して、RPMパッケージをインストールしている場合、そのリポジトリ対象にしません。
自動更新はOSも提供する機能
OSのパッケージを自動更新することに不安を感じるのはもっともだと思いますが、自動化が確立している分野でもあります。
例えば、Ubuntuでは UnattendedUpgrades という機能が搭載されており、自動的にパッケージをアップデートする仕組みをOSで用意しています。
同様に、AlmaLinux OSにもdnf-automaticという仕組みが用意されています。
KUSANAGI Security Editionでは、いくつかの理由からdnf-automaticは利用していませんが、似たような仕組みで比較的安全にアップデートできるパッケージの更新を行っています。
この際、kernelに関するパッケージは除外しています。kernerlの更新はVMの再起動を必要とするため、手動での対応を行った方がよいと考え、自動アップデートの対象にはしていません。
OS・ミドルウェアの自動アップデートの動作
前述の通り、OS・ミドルウェアの自動アップデートでは、dnf upgrade
コマンドを実行しています。
その後、アップデートによって再起動が必要なサービスを再起動します。アップデートを行った際にPHPやNginx、Apache HTTP Server等の再起動によって一時的にウェブサイトが表示できない場合があります。
そのため、自動アップデートではウェブサイトにアクセスが頻繁にある時間帯は避けてください。
時間帯の指定はkusanagi autoupdate コマンドで行います。
いきなり自動アップデートを実行するのが不安な場合は、「更新確認のみを行う」 --check
オプションから始めてみるのもよいでしょう。
この場合は、更新がある場合に通知はされますが、実際にパッケージの適用は行いません。
まとめ
OS・ミドルウェアの自動アップデートについてまとめると以下のようになります。
- KUSANAGIのパッケージ
- マイナーバージョンを跨ぐアップデート (例えば PHP 8.1から8.2) は行わない
- データベース (MariaDBやPostgreSQL) に関するパッケージは含まれない
- KUSANAGIのパッケージは動作検証をした上でリリースされている
- AlmaLinux OSのパッケージ
- EPELなどAlmaLinux OS以外のパッケージは更新しない
- 自動更新はOSも提供する機能である
- kernelに関するパッケージは更新しない
実はKUSANAGI開発元のプライム・ストラテジーでは、自社のウェブサイトで使用しているKUSANAGIについて、数年前からパッケージを自動更新する運用を行っています。
そして、この数年間の運用の中で、パッケージのアップデートによって非互換などが発生してウェブサイトが表示できなくなるような不具合は起きていません。
KUSANAGI Security Editionの自動アップデートは、このノウハウを元に確立したものです。
OS・ミドルウェアの自動アップデートを活用して、保守の負荷を減らしつつ、ウェブサイトのセキュリティ運用を行ってみてください。