EC2インスタンスにインストールされているソフトウェアとバージョン一覧を表示したい

105件のシェア(ちょっぴり話題の記事)

こんにちは。
ご機嫌いかがでしょうか。
"No human labor is no human error" が大好きな吉井です。

「管理している EC2 インスタンスにインストールされているソフトウェアとそのバージョンを一覧表示したい」
という要望を受けまして実現方法を調べてみました。

今回は Systems Manager を使います。

事前準備

EC2 インスタンスのタグ付け

EC2 インスタンスに任意のタグを付けます。
必須ではありませんが、管理が楽になるので付けておきます。
下の例では 「key=Inventory, Value=true」 にしています。

データ同期用 S3 バケットの作成

Systems Manager リソースデータ同期 という機能を使い、インベントリデータを S3 バケットへ保管します。
(S3 バケットを作成する手順は割愛します)

S3 バケットを作成したら以下のバケットポリシーを設定します。
例にある「your-bucket-name」と「your-account-id」はご自身の環境値へ置き換えてください。

{
   "Version":"2012-10-17",
   "Statement":[
      {
         "Sid":"SSMBucketPermissionsCheck",
         "Effect":"Allow",
         "Principal":{
            "Service":"ssm.amazonaws.com"
         },
         "Action":"s3:GetBucketAcl",
         "Resource":"arn:aws:s3:::your-bucket-name"
      },
      {
         "Sid":" SSMBucketDelivery",
         "Effect":"Allow",
         "Principal":{
            "Service":"ssm.amazonaws.com"
         },
         "Action":"s3:PutObject",
         "Resource":[
            "arn:aws:s3:::your-bucket-name/*/accountid=your-account-id/*"
         ],
         "Condition":{
            "StringEquals":{
               "s3:x-amz-acl":"bucket-owner-full-control"
            }
         }
      }
   ]
}

実装

リソースデータ同期の設定

AWS マネジメントコンソールへログインし、Systems Manager リソースデータの同期 を開きます。

リソースデータの同期の作成 をクリックします。

"リソースデータの同期の作成" 画面では以下を入力します。

項目 入力する値
同期名 識別しやすい任意の名前
バケット名 事前準備で作った S3 バケット
バケットプレフィックス 本エントリでは言及しませんが、リソースデータ同期はアカウントまたぎ、リージョンまたぎが可能です。
プレフィックスにはアカウントIDやリージョン名、システム名など付与しておくと便利です。
バケットのリージョン S3 バケットのリージョン
KMS キー ARN S3 バケットを KMS で暗号化している場合は ARN を入力

リソースデータ同期の設定

AWS マネジメントコンソールへログインし、Systems Manager インベントリ を開きます。

セットアップインベントリ をクリックします。

"セットアップインベントリ" 画面では以下を入力します。

項目 入力する値
名前 識別しやすい任意の名前
ターゲット タグの指定を選択し、事前準備で指定したタグキーと値を入力
スケジュール インベントリを収集する間隔を指定
パラメータ 収集する項目。初めは全チェックで構わないと思います。
実行履歴を S3 に書き込む チェックを入れて S3 バケットを指定すると、インベントリ収集中の実行履歴を後から確認することが出来ます

セットアップインベントリを設定すると、インベントリ収集が即時に実行されます。
EC2 のセットアップ状況によりますが、10~15分ほどで収集が完了すると思います。

検索

インベントリ収集が完了したら、検索を試してみましょう。
Systems Manager インベントリ を開きます。

詳細ビュー タブをクリックします。

リソースデータの同期 にあるリストボックスから前手順で作成したリソースデータを選択します。
インベントリタイプ にあるリストボックスから AWS:Application を選択します。
アプリケーションの一覧が表示されました。しかし、これでは要求に答えられそうにありません。

Run Advanced Queries というボタンがあるのでそれをクリックします。
Athena が開きます。
試しに以下の SQL 文を入力して、Run query をクリックします。

select packageid, version, resourceid from aws_application where packageid like 'bash%'

検索結果としてパッケージ名、バージョン、インスタンス ID が表示されました。
これなら満足してもらえそうです。

おわりに

AWS の機能を使って EC2 インスタンスにインストールされているソフトウェアとそのバージョン一覧を表示しました。
今回は表示だけでしたが、IT 統制の観点で以下のような常用に活用出来ると考えています。

  • 許可されていないソフトウェアの検知
  • 重大なセキュリティパッチが公開された場合に現行バージョンの調査、パッチ適用の判断
  • 保守サポート切れしているソフトウェアの検索

2019/04/09 追記

私の同僚が素晴らしい記事を書いてくれました。
「インストールされているソフトウェアとは」という観点で調査しています。
ここにあるように、インストーラーを使わず実行ファイルをディレクトリに配置して動作させるタイプのソフトウェアは検知出来ません。

AWS Systems Managerインベントリはどのアプリケーション情報を収集しているのか調べてみた

参考

インベントリ収集の設定
インベントリのリソースデータの同期の設定
AWS Systems Managerインベントリはどのアプリケーション情報を収集しているのか調べてみた