Amazon Linux 2 のカーネルライブパッチを AWS Systems Manager のパッチマネージャーで適用する

カーネルライブパッチとAWS Systems Managerのパッチマネージャーは最高の組み合わせですね
2020.06.30

Amazon Linux 2 のカーネルライブパッチは、プレビューリリース時点では AWS Systems Manager のパッチマネージャーはサポートされていませんでしたが、GA によってパッチマネージャーによる管理もサポートされるようになっています。

ざっくりとしたカーネルライブパッチの動きは上記のブログを参照いただくとして、本記事では追加機能であるパッチマネージャー対応についてご紹介したいと思います。

パッチマネージャーとは?

パッチマネージャーは AWS Systems Manager の機能のひとつで、EC2 インスタンスのパッチ適用の運用、管理を行うことができる便利な機能です。

管理台数が多いと、セキュリティ脆弱性やバグなどの修正パッチを適用するのは大変です。

パッチマネージャーを利用することで、いまどのインスタンスが基準を満たしていないのかを管理したり、重大なセキュリティ脆弱性のパッチをなるはやで適用するために自動化する、といった運用が可能となります。

ライブカーネルパッチは再起動を必要とせず、修正パッチを適用することが出来ますのでパッチマネージャーと非常に相性が良いのではないでしょうか。

やってみる

事前準備

今回もちょっと古い AMI を使って EC2 を準備します。EC2 は AWS Systems Manager エンドポイントにアクセスできるように EIP をアタッチするか、プライベートサブネットの場合は、NAT Gateway や VPC エンドポイントを検討してください。今回は EIP をアタッチしています。

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

また、作成した EC2 には AWS Systems Manager で必要なる IAM ロールをアタッチします。従来使われていた AmazonEC2RoleforSSM ロールは現在では非推奨になっていますので、マネージドポリシーをベースに、別途、IAM ロールを作成しておきましょう。今回は AmazonSSMManagedInstanceCore と Systems Manager のログ出力のために S3 アクセス権限を持ったポリシーのみをアタッチした IAM ロールを使用しています。

パッチベースラインの確認

AWS Systems Manager の管理コンソールを開き、左ペインから [インスタンスとノード] - [パッチマネージャー] を選択し、[事前定義されたパッチベースラインの表示] をクリックします。

AWS-AmazonLinux2DefaultPatchBaseline という事前定義されたベースラインがあります。カーネルライブパッチでもこのベースラインが利用できますので、今回はこれを使用します。

内容を確認すると、Security(Critical,Important)およびBugfixが対象となっていることが判ります。気をつけていただきたいのは、自動承認遅延が 承認まで 7 日間待機 となっている点です。自動承認の運用において、「7 日間も待たずにすぐに適用したい!」ということであれば、カスタムパッチベースラインを作成して利用してください。

カーネルライブパッチを有効化するカスタム Sysmtes Manager ドキュメントの作成

AWS Systems Manager を利用してカーネルライブパッチを有効化するためのカスタム Sysmtes Manager ドキュメントを作成します。AWS Systems Manager 管理コンソールの左ペインより、[共有リソース] - [ドキュメント] を開き、[Create command or session] をクリックします。

任意のドキュメント名を入力し、その他は特に指定は不要です。公式ドキュメントのリンクから EnableKernelLivePatching.zip をダウンロードし、zip ファイル内の json ファイルの内容を [コンテンツ] 部分にコピーし [ドキュメントの作成] をクリックします。

必要に応じてカーネルライブパッチを無効化するためのドキュメント(DisableKernelLivePatching.zip)も作成してください。今回の検証では割愛します。

Run Command を使用したカーネルライブパッチの有効化

先ほど作成したカスタム Systems Manager ドキュメントを使用し、有効化します。

AWS Systems Manager 管理コンソールの左ペインより、[インスタンスとノード] - [Run Command] を開き、画面右上の [Run command] をクリックします。

先ほど作成したカスタム Systems Manager ドキュメントを選択します。コマンドパラメータで再起動有無を選択できますので、今回は NoReboot としました。

次にターゲットを指定します。今回、2 台の EC2 を準備しましたが 1 台は比較用としてカーネルライブパッチは無効化のままとしたいので live という名前のインスタンスだけを指定しました。

Run Command の出力は AWS コンソールで確認できるログ量は限られているので必要に応じて S3 への出力設定を利用してください。(出力されない場合は EC2 にアタッチしている IAM ロールに S3 への書き込み権限が付与されていない可能性があります)最後に [実行] をクリックします。

ステータスが 成功 で完了していれば OK です。

Run Command を使用したカーネルライブパッチの適用

同じく Run Command を使って、カーネルライブパッチを適用します。コマンドのドキュメントは AWS-RunPatchBaselin を指定します。まずは install の前に scan を実行して現状を把握したいと思います。[Reboot Option] は NoReboot を指定します。

ターゲットを指定し、先ほどと同樣に S3 への出力設定はを行い [実行] をクリックします。

ステータスが 成功 で完了していますので、[出力の表示] で結果を確認してみましょう。

[ステップ1 -出力] の内容を確認いただくと、利用されているベースラインが確認できます。この例では AWS-AmazonLinux2DefaultPatchBaselin が利用されていることが判ります。

もしカスタムパッチベースラインを作成したのに、意図したパッチベースラインが使われていないようでしたら、以下の記事を参照ください。

正しいパッチベースラインが利用されていることが判りましたので、再度、RunCommand で AWS-RunPatchBaseline を実行します。今度は [Operation] を install に指定し、[Reboot Option] は NoReboot としています。

画面は割愛しますが同樣にターゲットおよび S3 出力設定し、[実行] します。ステータスが 成功 で完了していれば適用は完了です。

コンプライアンス状態の確認

各インスタンスがパッチベースラインを満たしているかどうかは、AWS Systems Manager のコンプライアンスから確認することができます。

AWS Systems Manager 管理コンソールの左ペインから、[インスタンスとノード] - [コンプライアンス] を開きます。すると、準拠リソースおよび非準拠リソースが一目瞭然で確認できます。

準拠リソースのインスタンスはカーネルライブパッチを有効にした live インスタンスであることが確認できました。

同樣に非準拠リソースのインスタンスは no-live インスタンスですね。

このようにカーネルライブパッチを使用することでオンラインのまま AWS Systems Manager のパッチベースラインを適用できることが確認できました。

検証は以上です!

さいごに

カーネルライブパッチはカーネルバージョンのアップデートは実施されませんが、パッチマネージャーはライブパッチが適用されていることを読み取り、コンプライアンス準拠として判断してくれることが確認できました。

このように AWS Systems Manager のパッチマネージャーとカーネルライブパッチを利用することで、ダウンタイムは削減が可能となりますので、EC2 の安定・安全な状態を維持するための運用負荷をきっと軽減してくれることと思います。是非ともお試しください!

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

あわせて読みたい

「パッチマネージャーよくわからん!」という方は、以下の記事をあわせてお読みいただくことをオススメします。