Systems Manager で パッケージの一覧を取得してみた
やってみた
管理対象EC2インスタンスの作成
OSはAmazon Linux2 を使用しました。Amazon Linux2 には最初からSystems Manager(以降、SSM)のエージェントがインストール済みです。
条件
AWS管理ポリシーのAmazonEC2RoleforSSMがアタッチされているIAMロールを作成し、EC2インスタンスに設定してください。
EC2インスタンスはインターネットアクセスが可能なサブネットに作成してください、アウトバウントど戻りの通信が可能であればOKです。
インベントリを有効にする
SSMエージェントがインストールされているだけではミドルウェアの状態は把握できません、インベントリを有効にするという作業を行う必要があります。
下記のリンクからSSMのインベントリ画面にアクセスしてください。
https://ap-northeast-1.console.aws.amazon.com/systems-manager/inventory?region=ap-northeast-1
アクセスするとSSMエージェントがインストールされたEC2インスタンス(以降、マネージドインスタンス)が表示されます。
私の環境ではマネージドインスタンスが1台のみで、インベントリが無効状態なので左側の円グラフでは全てがDisabledになっています。
インベントリを有効にしましょう、画面右上のセットアップインベントリをクリックします。
セットアップインベントリの画面ではターゲットEC2インスタンスの指定や取得する項目を設定します。
今回はデフォルトまま、全てのインスタンスを対象で設定しました。
- 名前
- インベントリの名前を指定します
- ターゲット
- ターゲットEC2インスタンスを指定します
- 全て
- タグ
- 1組のキー項目・値に一致するインスタンスのみ指定
- インスタンスの手動選択
- 複数選択可能
- ターゲットEC2インスタンスを指定します
- スケジュール
- インベントリデータの収集間隔
- 分・時間・日単位で指定
- インベントリデータの収集間隔
- パラメータ(各データの収集を有効にするか制御)
- Applications
- アプリケーション(パッケージ)の情報
- AWS Components
- SSMエージェントなどの情報
- Network Config
- NICに関する情報
- IPアドレス・サブネットマスク・MACアドレス・DHCPサーバ等
- Windows Updates
- Applications
- パラメータ
- Instance Detailed Information
- 主にCPUに関する情報
- ソケット数・コア数・動作周波数・Hyper-Threadingの状態
- ソケット数・コア数・動作周波数・Hyper-Threadingの状態
- Services
- Windows Roles
- Custom Inventory
- ファイル
- Windows レジストリ
- Instance Detailed Information
- 詳細設定
- 実行履歴をS3に書き込む
インベントリを確認する
AWS Systems Manager → 共有リソース → マネージドインスタンス で対象のインスタンスのインベントリタブで内容を確認できます。
リソースデータ同期の設定
SSMインベントリの内容はAmazon Athena および Amazon QuickSight で扱うことができます。その為には保存用のS3バケットを作成し同期の設定を行う必要があります。
任意のS3バケットを作成し下記のバケットポリシーを設定してください。 バケットポリシーは以下の表に従って置換が必要です。
置換前 | 置換後 |
backet-name | バケット名 |
bucket-prefix | ディレクトリ名 任意で決めてOK |
account-id | AWSアカウント番号 |
{ "Version": "2012-10-17", "Statement": [ { "Sid": "SSMBucketPermissionsCheck", "Effect": "Allow", "Principal": { "Service": "ssm.amazonaws.com" }, "Action": "s3:GetBucketAcl", "Resource": "arn:aws:s3:::bucket-name" }, { "Sid": " SSMBucketDelivery", "Effect": "Allow", "Principal": { "Service": "ssm.amazonaws.com" }, "Action": "s3:PutObject", "Resource": ["arn:aws:s3:::bucket-name/bucket-prefix/*/accountid=account-id/*"], "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } } } ] }
作成したバケットにデータを同期する設定を行います。
https://ap-northeast-1.console.aws.amazon.com/systems-manager/inventory?region=ap-northeast-1
リソースデータの同期をクリックします。
- 同期名
- 任意の名前
- バケット名
- 作成したバケットの名前
- バケットプレフィックス
- バケットポリシーと一致するようにプレフィックスを入力
値を入力して作成をクリックします。
Athenaでテーブル化
データをAthenaでテーブル化してみましょう。
https://ap-northeast-1.console.aws.amazon.com/athena/home?force=®ion=ap-northeast-1#query
データベースを作成します。
CREATE DATABASE ssminventory
テーブルを作成します。
bucket-name・bucket-prefixは置換してください。
CREATE EXTERNAL TABLE IF NOT EXISTS ssminventory.AWS_Application ( Name string, ApplicationType string, Publisher string, Version string, InstalledTime string, Architecture string, URL string, Summary string, PackageId string ) PARTITIONED BY (AccountId string, Region string, ResourceType string) ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe' WITH SERDEPROPERTIES ( 'serialization.format' = '1' ) LOCATION 's3://bucket-name/bucket-prefix/AWS:Application/'
テーブルを分割します。
MSCK REPAIR TABLE ssminventory.AWS_Application
テーブルをプレビューしてみます。データベースでssminventoryを選んでオプションからテーブルのプレビューを実行します。
表示されました!
S3に保存されたデータの確認
S3にはどういった形式で保存されているのか確認してみましょう。
Applicationはバケット内の下記に保存されています。
bucket-name / bucket-prefix /AWS:Application/accountid=account-id /region=ap-northeast-1/resourcetype=ManagedInstanceInventory / instance-id.json
ファイルをダウンロードして確認してみましょう。
{ ApplicationType : Development/Languages , InstalledTime : 2018-08-11T02:02:08Z , Architecture : x86_64 , Version : 2.7.14 , Summary : An interpreted, interactive, object-oriented programming language , PackageId : python-2.7.14-58.amzn2.0.3.src.rpm , Publisher : Amazon Linux , Release : 58.amzn2.0.3 , URL : http://www.python.org/ , Name : python , resourceId : i-xxxxxxxxxxxxxxxxx , captureTime : 2018-09-07T06:52:49Z , schemaVersion : 1.1 }
例としてPythonの箇所を抽出しました。Athenaを利用せずにS3からjsonをダウンロードして利用することも可能です。
あとがき
SSMインベントリ機能でパッケージを可視化してみました。定期的にパッケージのリストをレポートする場合や脆弱性発覚時に影響のあるEC2インスタンスを特定したい時などに活用できそうです。
SSHでインスタンスにログインして、コマンド実行...みたいなオペレーションを繰り返すのと比較すると圧倒的に楽ですね。
ぜひぜひ、活用してみてください!