[アップデート] Amazon Linux 2 でカーネルライブパッチが一般利用可能になりました

緊急度の高い脆弱性に対する修正パッチをダウンタイムなしに適用できますね!
2020.06.30

本日のアップデートで、Amazon Linux 2 のカーネルライブパッチが一般利用可能になりました。

4月にプレビューとしてリリースされていたものですね。

何がうれしいのか

OS を安全および安定的に運用するために、セキュリティ脆弱性やバグ修正に対応するための Linux カーネルのアップデートは欠かせない運用です。しかし、カーネルのアップデートにはアプリケーションの停止や、再起動が必要となるため、アプリーケーションの中断するタイミングを調整する手間が必要となります。

また、その調整によってアップデート適用が遅れることは、リスクのある状態を少なからずとも放置することになりますので、安定・安全を目指す運用メンバーからすれば望ましい状況ではないでしょう。

このアップデートにより、セキュリティ脆弱性やバグに対する修正を実行中のカーネルに適用することが出来るようになり、アプリーケーションのダウンタイムを減らしたメンテナンスが可能となります。

一般的なカーネルライブパッチの仕組み

Amazon Linux 2 におけるカーネルライブパッチの仕組みについて、執筆時点のドキュメントでは記載が見つかりませんでしたので、以下の図は Red Hat の例になります。Amazon Linux 2 でも kpatchftrace についての記載はありますので、概ね同じと考えてよいのかもしれません。

  1. カーネルパッチモジュールは、/var/lib/kpatch/ ディレクトリーにコピーされ、次回の起動時に systemd を介して、カーネルへの再適用として登録されます。
  2. 実行中のカーネルに kpatch モジュールがロードされ、新しいコードのメモリー内の場所を指定するポインターを使用して、このパッチが適用された機能が ftrace メカニズムに登録されます。
  3. パッチが当てられた機能にカーネルがアクセスすると、ftrace メカニズムにリダイレクトされます。これにより、元々の機能は回避され、パッチを当てたバージョンの機能にカーネルをリダイレクトします。

(引用元:RED HAT ENTERPRISE LINUX 7 カーネル管理ガイド

AWS Systems Manager Patch Manage でも利用可能に

執筆時点の AWS 公式ガイドを参照すると、「Kernel Live Patching is not supported by AWS Systems Manager Patch Manager.」との記載がありますが、プレビュー時の名残でしょうか。GA に伴って Patch Manage でも利用可能になっているようです。

Q. Does AWS Systems Manager Patch Manager support live patching?

Yes. You can use AWS SSM Patch Manager to automate applying kernel live patches without the need of an immediate reboot when the patch is available as a live patch. Visit the SSM Patch Manager documentation to get started.

(引用元:Amazon Linux 2のよくある質問 

注意点

前提条件

Amazon Linux 2 でカーネルライブパッチを使用するには、以下の環境である必要があります。

  • Amazon Linux 2でサポートされている64ビット(x86_64)アーキテクチャ
    • 64ビット ARM(arm64)アーキテクチャはサポートされていません
  • カーネルバージョン 4.14.165-131.185以降 の Amazon Linux 2

カーネルバージョンは更新されません

カーネルライブパッチを適用しても、カーネルのバージョンは更新されません。バージョンの更新にはインスタンスが再起動が必要となります。

最新のカーネルライブパッチの提供は 3 ヶ月間のみ

AWS provides kernel live patches for an Amazon Linux 2 kernel version for up to 3 months after its release. After the 3-month period, you must update to a later kernel version to continue to receive kernel live patches.

(引用元:Kernel Live Patching on Amazon Linux 2

Amazon Linux 2 がカーネルライブパッチを受けれるのは 3 ヶ月間のみです。3 ヶ月が経過すると当該カーネルバージョンでの新しいカーネルライブパッチはリリースされなくなります。よって、引き続きカーネルライブパッチを受信するためには、インスタンスを再起動してカーネルバージョンをアップデートする必要があります。

制限事項

  • カーネルライブパッチを適用している間は、休止状態を実行したり、高度なデバッグツール(SystemTap、kprobes、eBPFベースのツールなど)を使用したり、カーネルライブパッチインフラストラクチャで使用されるftrace出力ファイルにアクセスしたりすることはできません。

やってみる

事前準備としてちょっと古い AMI を利用して EC2 を起動しておきます。

  • AMI: amzn2-ami-hvm-2.0.20200406.0-x86_64-gp2 (ami-0f310fced6141e627)

カーネルライブパッチの有効化

まず、カーネルライブパッチの利用前提である、カーネルバージョン 4.14.165-131.185 以降 であることを確認します。

$ sudo yum list kernel
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
インストール済みパッケージ
kernel.x86_64        4.14.173-137.229.amzn2       installed
利用可能なパッケージ
kernel.x86_64        4.14.181-140.257.amzn2       amzn2-core

カーネルライブパッチを利用するために yum-plugin-kernel-livepatch をインストールします。

$ sudo yum install -y yum-plugin-kernel-livepatch

カーネルライブパッチ用のプラグインを有効化します。

$ sudo yum kernel-livepatch enable -y

上記コマンドで最新の kernel-livepatch もインストールされます。正常にインストールされていることを確認します。

$ rpm -qa | grep kernel-livepatch
kernel-livepatch-4.14.173-137.229-1.0-0.amzn2.x86_64
yum-plugin-kernel-livepatch-1.0-0.8.amzn2.noarch

kpatch サービスをアップデートし、開始します。kpatch は初期化時または起動時にすべてのカーネルライブパッチをロードします。

$ sudo yum update kpatch-runtime
$ sudo systemctl enable kpatch.service
Created symlink from /etc/systemd/system/multi-user.target.wants/kpatch.service to /usr/lib/systemd/system/kpatch.service.

カーネルライブパッチが含まれる Amazon Linux 2 カーネルライブパッチリポジトリを設定します。

$ sudo amazon-linux-extras enable livepatch
<--snip-->
43  livepatch=latest         enabled      [ =stable ]
<--snip-->

これでカーネルライブパッチの有効化は完了です。

利用可能なカーネルライブパッチの表示

yum updateinfo list で利用可能なカーネルライブパッチを確認することができます。カーネルライブパッチには ALASLIVEPATCH のプレフィックスが付与されています。

$ yum updateinfo list
読み込んだプラグイン:extras_suggestions, kernel-livepatch, langpacks, priorities, update-motd
amzn2-core/2/x86_64                       | 3.7 kB  00:00:00
amzn2extra-docker/2/x86_64                | 3.0 kB  00:00:00
amzn2extra-livepatch/2/x86_64             | 3.0 kB  00:00:00
amzn2extra-livepatch/2/x86_64/updateinfo  | 2.5 kB  00:00:00
amzn2extra-livepatch/2/x86_64/primary_db  |  10 kB  00:00:00
ALAS2-2020-1440         important/Sec. kernel-4.14.177-139.253.amzn2.x86_64
ALAS2-2020-1425         important/Sec. kernel-4.14.177-139.254.amzn2.x86_64
ALAS2-2020-1431         important/Sec. kernel-4.14.181-140.257.amzn2.x86_64
ALAS2LIVEPATCH-2020-009 important/Sec. kernel-livepatch-4.14.173-137.229-1.0-2.amzn2.x86_64
ALAS2LIVEPATCH-2020-013 important/Sec. kernel-livepatch-4.14.173-137.229-1.0-3.amzn2.x86_64
ALAS2LIVEPATCH-2020-019 important/Sec. kernel-livepatch-4.14.173-137.229-1.0-4.amzn2.x86_64
ALAS2LIVEPATCH-2020-022 important/Sec. kernel-livepatch-4.14.173-137.229-1.0-5.amzn2.x86_64
ALAS2-2020-1432         medium/Sec.    python-2.7.18-1.amzn2.x86_64
ALAS2-2020-1432         medium/Sec.    python-devel-2.7.18-1.amzn2.x86_64
ALAS2-2020-1432         medium/Sec.    python-libs-2.7.18-1.amzn2.x86_64
updateinfo list done

CVE で表示する場合は以下のようになります。

$ yum updateinfo list cves
読み込んだプラグイン:extras_suggestions, kernel-livepatch, langpacks, priorities, update-motd
 CVE-2020-12657 important/Sec. kernel-4.14.177-139.253.amzn2.x86_64
 CVE-2020-12826 important/Sec. kernel-4.14.177-139.253.amzn2.x86_64
 CVE-2020-10711 important/Sec. kernel-4.14.177-139.254.amzn2.x86_64
 CVE-2020-10751 important/Sec. kernel-4.14.181-140.257.amzn2.x86_64
 CVE-2020-1749  important/Sec. kernel-4.14.181-140.257.amzn2.x86_64
 CVE-2019-19768 important/Sec. kernel-4.14.181-140.257.amzn2.x86_64
 CVE-2019-19319 important/Sec. kernel-4.14.181-140.257.amzn2.x86_64
 CVE-2020-12770 important/Sec. kernel-4.14.181-140.257.amzn2.x86_64
 CVE-2020-10711 important/Sec. kernel-livepatch-4.14.173-137.229-1.0-2.amzn2.x86_64
 CVE-2020-12657 important/Sec. kernel-livepatch-4.14.173-137.229-1.0-3.amzn2.x86_64
 CVE-2019-19319 important/Sec. kernel-livepatch-4.14.173-137.229-1.0-4.amzn2.x86_64
 CVE-2020-1749  important/Sec. kernel-livepatch-4.14.173-137.229-1.0-5.amzn2.x86_64
 CVE-2018-20852 medium/Sec.    python-2.7.18-1.amzn2.x86_64
 CVE-2020-8492  medium/Sec.    python-2.7.18-1.amzn2.x86_64
 CVE-2018-20852 medium/Sec.    python-devel-2.7.18-1.amzn2.x86_64
 CVE-2020-8492  medium/Sec.    python-devel-2.7.18-1.amzn2.x86_64
 CVE-2018-20852 medium/Sec.    python-libs-2.7.18-1.amzn2.x86_64
 CVE-2020-8492  medium/Sec.    python-libs-2.7.18-1.amzn2.x86_64
updateinfo list done

カーネルライブパッチの適用

カーネルライブパッチの適用は通常と同じく yum install で適用します。指定するカーネルが kernel-livepatch であること以外、特に操作に変わりはありません。

先ほどのリストから ALASLIVEPATCH のプレフィックスが付いたアップデートを適用します。

$ sudo yum install kernel-livepatch-4.14.173-137.229-1.0-5.amzn2.x86_64

適用されたカーネルライブパッチは kpatch list コマンドで確認できます。

$ kpatch list
Loaded patch modules:
livepatch_CVE_2019_19319 [enabled]
livepatch_CVE_2020_10711 [enabled]
livepatch_CVE_2020_12657 [enabled]
livepatch_CVE_2020_1749 [enabled]

Installed patch modules:
livepatch_CVE_2019_19319 (4.14.173-137.229.amzn2.x86_64)
livepatch_CVE_2020_10711 (4.14.173-137.229.amzn2.x86_64)
livepatch_CVE_2020_12657 (4.14.173-137.229.amzn2.x86_64)
livepatch_CVE_2020_1749 (4.14.173-137.229.amzn2.x86_64)

ただしカーネルライブパッチだけをインストールしても、カーネルバージョンが更新されない点はご注意ください。カーネルライブパッチ

$ sudo yum list kernel
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
インストール済みパッケージ
kernel.x86_64        4.14.173-137.229.amzn2       installed
利用可能なパッケージ
kernel.x86_64        4.14.181-140.257.amzn2       amzn2-core
$ uname -r 
4.14.173-137.229.amzn2.x86_64

利用可能なカーネルライブパッチと、通常のセキュリティアップデートを適用すると、再起動後にはカーネルバージョンがアップデートされています。

$ sudo yum update --security
$ sudo reboot
$ sudo yum list kernel
読み込んだプラグイン:extras_suggestions, kernel-livepatch, langpacks, priorities, update-motd
インストール済みパッケージ
kernel.x86_64                         4.14.173-137.229.amzn2               installed
kernel.x86_64                         4.14.181-140.257.amzn2               @amzn2-core
$ uname -r
4.14.181-140.257.amzn2.x86_64

再起動後、kpatch list で確認するとカーネルライブパッチはロードされていないことが判ります。

$ kpatch list
Loaded patch modules:

Installed patch modules:
livepatch_CVE_2019_19319 (4.14.173-137.229.amzn2.x86_64)
livepatch_CVE_2020_10711 (4.14.173-137.229.amzn2.x86_64)
livepatch_CVE_2020_12657 (4.14.173-137.229.amzn2.x86_64)
livepatch_CVE_2020_1749 (4.14.173-137.229.amzn2.x86_64)

検証は以上です!

さいごに

カーネルライブパッチのサポートによって、緊急度の高い脆弱性への修正などをアプリーケーションを停止することなく迅速に対応することが可能となりました。これまで運用担当者を悩ませていた停止調整を軽減してくれる嬉しいアップデートですね。

ただし、カーネルライブパッチは再起動によるメンテナンスを完全に排除するものではないため、従来どおり定期的なメンテナンス計画は必要である点、ご注意ください。

以上!大阪オフィスの丸毛(@marumo1981)でした!