Systems Manager で パッケージの一覧を取得してみた

2018.09.06

やってみた

管理対象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組のキー項目・値に一致するインスタンスのみ指定
      • インスタンスの手動選択
        • 複数選択可能

  • スケジュール
    • インベントリデータの収集間隔
      • 分・時間・日単位で指定
  • パラメータ(各データの収集を有効にするか制御)
    • Applications
      • アプリケーション(パッケージ)の情報
    • AWS Components
      • SSMエージェントなどの情報
    • Network Config
      • NICに関する情報
      • IPアドレス・サブネットマスク・MACアドレス・DHCPサーバ等
    • Windows Updates

  • 詳細設定
    • 実行履歴をS3に書き込む

インベントリを確認する

AWS Systems Manager → 共有リソース → マネージドインスタンス で対象のインスタンスのインベントリタブで内容を確認できます。

https://ap-northeast-1.console.aws.amazon.com/systems-manager/managed-instances?region=ap-northeast-1

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

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=&region=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でインスタンスにログインして、コマンド実行...みたいなオペレーションを繰り返すのと比較すると圧倒的に楽ですね。

ぜひぜひ、活用してみてください!