今回はAWSサービスでパッチ運用・管理を行うにはどのように行えばいいのかについてまとめてみたいと思います。
結論から言うと①パッチマネージャー(AWS Systems Manager Patch Manager)によるアプローチと②Inspectorの結果を踏まえたRun Commandを実施するアプローチの2つがあると考えられます。
①は検証環境でガンガンパッチを当てて問題なければリリースとスピード感持ってやってくれる組織なら実現可能ですが、現実的には「検証したい」「所定の基準で評価した上で最低限の対応をしたい」と言われるケースが多いでしょう。
(特に日本企業では・・)と言うことで②の方のアプローチ、「Inspectorでスキャンの後の対応としてパッチを環境に当てる方法」を解説して行きたいと思います。
EC2(Amazon Linux)パッチ対応を手動で行う
まずはEC2に直接アクセスして行う場合、Inspectorなどで指摘の挙がった脆弱性に関してパッチが存在していることを確認して、実際にパッチを当てるにはどのようなコマンドを実行するか確認してみましょう。
Amazon Linuxの脆弱性情報はAmazon Linux Security Centerというサイトで確認可能です。
Amazon Linux 2における指定の脆弱性情報の確認方法
yum updateinfo all --cves CVE-2021-3472
Amazon Linux 2における指定の脆弱性へのパッチの当て方
sudo yum update --cves CVE-2021-3472
EC2(Amazon Linux)パッチ対応を自動で行う
まず、EC2インスタンスをAWS Systems Managerの配下にしてコマンドを実行できるようにする必要があります。
次に、コマンドを「ドキュメント」に記載し雛形を作成し実行できるようにします。
このようにRun Commanndを設定しておき、ステップバイステップで少しずつパッチマネージャによる自動管理につなげていく狙いがあります。
早速手順を確認していきましょう。
EC2インスタンスでAWS Systems Manager (SSM)を使えるようにする
Systems Managerでは、コマンド実行時は一律rootユーザとなっております(ユーザの切り替え不可)
SSM Agent ログについてAmazon Linuxの場合以下の場所に出力されます。
/var/log/amazon/ssm/amazon-ssm-agent.log
/var/log/amazon/ssm/errors.log
SSM Agent ログの設定は /etc/amazon/ssm 配下にある seelog.xml.templateを確認し必要なDEBUG レベルに設定しましょう。
Step 1. EC2インスタンスでアクションを実行するための権限を Systems Manager に付与する
①まずは上図のように「IAM」から「ロール」、「ロールの作成」を押下する
②「AWS サービス」で「EC2」を選択、「次のステップ: アクセス権限」を押下する
③AmazonEC2RoleforSSMを検索欄に入れて表示される「AmazonEC2RoleforSSM」の左にチェックを入れて,
Systems Managerの実行結果をCloudWatchに出力する場合「CloudWatchAgentServerPolicy」の左にチェックを入れて「次のステップ: タグ」を押下する
④ロール名前を設定して「ロールの作成」を押下する(仮にMY_EC2_SSM_ROLE)
Step 2. EC2インスタンスにロールをアタッチする
注意点が2つあります。1つ目は、既に IAM ロールが割り当てられているインスタンスの変更の場合、インスタンスは running 状態である必要あります。
2つ目は起動中の EC2 インスタンスの IAM ロールをアタッチして反映するまで5分から15分程度かかるということです。ちなみに再起動するとすぐ設定されます。
①EC2のメニューで左ペインの[インスタンス] を選択する。
②インスタンスを選択、「アクション>セキュリティ>IAM ロールの変更」 の順に選択する。
③インスタンスに目的のIAM ロールを選択して、[保存] を選択します。
Step 3. RunCommandを使用してシェルスクリプトを実行する<
①AWS Systems Managerサービスの左ペインの「Run Command」を選択する
②「コマンドを実行する」を押下する
③検索欄に「Shell」と入れるとAWS-RunShellScriptという項目が出てくるのでチェックを入れる。
④「コマンドのパラメータ」のフォームに実行したいコマンドを入力し「実行」を押下する。
⑤実行結果が「成功」(または「失敗」)になったら「出力の表示」で内容を確認する。
コマンドを「ドキュメント」に記載し雛形を作成し実行できるようにする
①AWS Systems Managerサービスの左ペインの共有リソース配下の「ドキュメント」を選択する。
②「コマンドまたはセッションを作成する」を押下する。
③ターゲットタイプで「/AWS::EC2::Instance」を選択、形式はYAML、JSON
以下の例はYMALで記載しました、基本的にrunCommandの部分だけ変更します。descriptionなどはわかりやすく入れておきましょう。
---
schemaVersion: "2.2"
description: "Security Patch Management"
mainSteps:
- action: "aws:runShellScript"
name: "Check Update and sudo version"
inputs:
runCommand:
- "yum updateinfo all --cves CVE-2021-3472"
- "sudo yum update --cves CVE-2021-3472"
④記載できたら「ドキュメントの作成」を押下する
⑤登録した「ドキュメント」は「自己所有」のタブ内のリストに挙がっていることを確認。
⑥「ドキュメント」を選択して「コマンドを実行する」を押下する。
⑦「ターゲット」では「インスタンスタグの指定」「インスタンスを手動で選択する」「リソースグループを設定する」のいずれかを選択して「実行」を押下する
よほど事情があって少数指定する場合は「インスタンスを手動で選択する」を選択する場合もあるかもしれませんが、エンタープライズでの運用は「インスタンスタグの指定」「リソースグループを設定する」が良いかと存じます。
リソースグループは「タグベース」または「CloudFormation スタックベース」で作成可能です。
運用としてはドキュメントを選択CVE-(ここを変える)で運用は可能です。やはりパッチマネージャで行う方がスマートですが、分担の壁があり手順書を作ることを考えるとこんな感じになります。
次の段階でLambdaからRun Commandして良いならパッチマネージャで良くなりそうですね。
参考になれば幸いです。