Security-JAWS 第11回で紹介されたインシデントレスポンスツール「AWS IR」を使ってみた
はじめに
皆さん、こんにちは。岩城です。
最近ぬか漬けを始めたため右手にぬか臭がつき、職場の周りの人に迷惑を掛けていないかドキドキしています。
さて、1週間前になりますが、Security-JAWS第11回目に参加しました。 以下のとおり、レポートはすでに上がっていますので、私は吉江さんのセッション内で気になったツールを実際に使ってみたいと思います。
- Security-JAWS 第11回レポート #secjaws #secjaws11 #jawsug
- [レポート]Security JAWS 第11回へ参加し、「SANS SEC545」の話を聞いてきた #secjaws #secjaws11
セッション内では2つのツール(AWS IRとMargarita Shotgun)が紹介されていました。
本ブログでは、AWS IRについて、ツールの概要と実際に動作確認するまでの流れをご紹介します。
AWS IRとは
早速ですが詳しくはこちらのサイト(ThreatResponse)をご確認ください。
私は英語が全くできませんので、google先生に通訳を依頼して理解した感じですと、マルウェアに感染したり、アクセスキーの情報漏えいといったセキュリティインシデントが発生した際、対象となるリソースへの対応を行うツールです。アクセスキーやインスタンスの操作が可能となっています。
例えば、利用中のアクセスキーを非アクティブにしたり、利用中のインスタンスを分析用端末からのみアクセス可に変更することも可能です。あるいは、インスタンスのスナップショットを取得してから停止するといったことも可能となっています。2018年11月16日時点では、アクセスキーとインスタンスのみ対応可能で、LambdaやIAMロールへの対応はCommingSoonでした。
- Host Compromises
- Key Compromises
- Lambda Compromises ( Coming Soon )
- Role Compromises ( Coming Soon )
以下より、Host CompromisesとKey Compromisesの概要を説明します。
Host Compromises
インスタンスを操作するコマンドです。gitリポジトリの履歴を見たところ、昔はhost-compromiseだったようですが、現在はinstance-compromiseに変わっています。赤枠で囲ったところがインスタンスを操作するプラグインを示しています。
プラグイン名 | 内容 |
---|---|
examineracl_host | 指定したCIDRの範囲でのみアクセス可能なセキュリティグループを作成する |
gather_host | インスタンス停止時に失われるエフェメラルデータを収集する |
isolate_host | インスタンスに設定されているセキュリティグループのIDを検索する |
snapshotdisks_host | スナップショットを取得する |
stop_host | インスタンスを停止する |
tag_host | インスタンスにインシデントケースNoを付与する |
get_memory | Margarita Shotgunを実行してメモリダンプする |
Key Compromises
アクセスキーを操作するサブコマンドです。同じく赤枠で囲ったところがアクセスキーを操作するプラグインを示しています。
プラグイン名 | 内容 |
---|---|
disableaccess_key | アクセスキーを非アクティブする |
revokests_key | 指定したアクセキーを用いたセッションを取り消す |
やってみた
アクセスキーの非アクティブ化とインスタンス停止およびスナップショットの取得をやってみます。
前提
マネージメントコンソール上で以下サービスの基本的な操作ができることを前提にしています。
そのため、詳細な操作手順は用意しておりませんのでご了承ください。
- IAM
IAMユーザの作成、MFAデバイスの割り当て、アクセスキーの作成、ポリシーの変更 - CloudFormation
スタックの作成 - EC2
EC2の起動、パブリックIPの確認、スナップショットの取得
環境構築
AWS IRをインストールする
公式サイトのインストール手順に沿って構築していきます。インストール方法は複数ありますが、今回はDockerを使用します。Dockerのインストール手順については、公式サイトをご確認ください。ちなみに私は、MacOS用をインストールしました。
$ git clone https://github.com/ThreatResponse/aws_ir.git $ cd aws_ir $ docker-compose build aws_ir $ docker-compose run aws_ir bash # pip install .
AWS IRで必要となるAWS環境を構築する
CloudFormationのテンプレートが用意されているため、簡単に作成することができます。
テンプレートは公式サイトに記載されているリンクからも入手できますが、先程git cloneしてきたディレクトリ内にも存在します。
入手したテンプレートを元にスタックを作成します。
一点注意事項です。
テンプレートをそのまま使ってAWS IRを実行すると、S3をListBucketする際に権限が足りずエラーで処理が止まります。
私の力では解決できなかったので、今回は一旦動作確認のために、Resourceでバケットの指定を追加して先に進みました。
時間を見つけて原因を探ります。。。
IAMユーザーを追加する
ユーザー名は何でも良いです。グループの選択では、CloudFormationで作成したIncidentRespondersを指定します。
アクセスキーIDとシークレットアクセスキーが表示されますので控えてください。
今回利用したCloudFormationテンプレートでは、IAMユーザへのMFAデバイスの割り当てが必須でスタックが作成されます。AWS IR実行時に必要になりますのでMFAデバイスを割り当てた後、arnを控えてください。
CloudFormationで作成されたResponderRoleのarnを控えます。
AWS CLIをインストール
次に、公式サイトのクイックスタート に沿って構築していきます。立ち上げたDockerコンテナにAWS CLIをインストールします。
# pip install awscli # which aws /usr/local/bin/aws # aws configure AWS Access Key ID [None]:<アクセスキーIDを入力> AWS Secret Access Key [None]:<シークレットアクセスキーを入力> Default region name [None]: Default output format [None]: # cd ~/.aws # ls -lrt total 8 drwxr-xr-x 3 root root 96 Nov 12 07:21 cli -rw------- 1 root root 354 Nov 13 02:08 config -rw------- 1 root root 225 Nov 13 02:11 credentials
最後に、テンプレートで作成したロールにスイッチできるようにconfigを編集します。
# cat config [default] role_arn = <ResponderRoleのarn> mfa_serial = <MFAデバイス割り当てのarn> source_profile = default
動作確認
アクセスキーを無効化する
動作確認で使うアクセスキーを作成します。作成時は当然アクティブです。
作成したアクセスキーのIDを指定して以下のコマンドを実行します。
# aws_ir key-compromise --access-key-id <動作確認用に作成したアクセスキーID> --plugins disableaccess_key Enter MFA code for arn:aws:iam::xxxxxxxxxxxx:mfa/awsir: 2018-11-15T10:19:13 - aws_ir.cli - INFO - Initialization successful proceeding to incident plan. 2018-11-15T10:19:13 - aws_ir.libs.connection - INFO - Returning session for default profile. 2018-11-15T10:19:13 - aws_ir.plans.key - INFO - Attempting key disable. Enter MFA code for arn:aws:iam::xxxxxxxxxxxx:mfa/awsir: #
すると、、、アクティブであったものが非アクティブ化されました!
インスタンスを停止してスナップショットを取得する
動作確認用にEC2インスタンスを1台起動し、パブリックIPを控えます。 インスタンスのパブリックIPやSSH鍵を指定して以下のコマンドを実行します。
# aws_ir instance-compromise --target <EC2インスタンスのパブリックIP> --user ec2-user --ssh-key /tmp/awsir.key --plugins snapshotdisks_host,stop_host Enter MFA code for arn:aws:iam::xxxxxxxxxxxx:mfa/awsir: 2018-11-15T10:29:33 - aws_ir.cli - INFO - Initialization successful proceeding to incident plan. 2018-11-15T10:29:33 - aws_ir.libs.case - INFO - Initial connection to AmazonWebServices made. 2018-11-15T10:29:46 - aws_ir.libs.case - INFO - Inventory AWS Regions Complete 15 found. 2018-11-15T10:29:46 - aws_ir.libs.case - INFO - Inventory Availability Zones Complete 43 found. 2018-11-15T10:29:46 - aws_ir.libs.case - INFO - Beginning inventory of resources world wide. This might take a minute... 2018-11-15T10:29:46 - aws_ir.libs.inventory - INFO - Searching ap-south-1 for instance. 2018-11-15T10:29:47 - aws_ir.libs.inventory - INFO - Searching eu-west-3 for instance. 2018-11-15T10:29:48 - aws_ir.libs.inventory - INFO - Searching eu-west-2 for instance. 2018-11-15T10:29:49 - aws_ir.libs.inventory - INFO - Searching eu-west-1 for instance. 2018-11-15T10:29:50 - aws_ir.libs.inventory - INFO - Searching ap-northeast-2 for instance. 2018-11-15T10:29:50 - aws_ir.libs.inventory - INFO - Searching ap-northeast-1 for instance. 2018-11-15T10:29:50 - aws_ir.libs.inventory - INFO - Searching sa-east-1 for instance. 2018-11-15T10:29:52 - aws_ir.libs.inventory - INFO - Searching ca-central-1 for instance. 2018-11-15T10:29:53 - aws_ir.libs.inventory - INFO - Searching ap-southeast-1 for instance. 2018-11-15T10:29:53 - aws_ir.libs.inventory - INFO - Searching ap-southeast-2 for instance. 2018-11-15T10:29:54 - aws_ir.libs.inventory - INFO - Searching eu-central-1 for instance. 2018-11-15T10:29:55 - aws_ir.libs.inventory - INFO - Searching us-east-1 for instance. 2018-11-15T10:29:56 - aws_ir.libs.inventory - INFO - Searching us-east-2 for instance. 2018-11-15T10:29:57 - aws_ir.libs.inventory - INFO - Searching us-west-1 for instance. 2018-11-15T10:29:57 - aws_ir.libs.inventory - INFO - Searching us-west-2 for instance. 2018-11-15T10:29:58 - aws_ir.libs.case - INFO - Inventory complete. Proceeding to resource identification. 2018-11-15T10:29:58 - aws_ir.libs.connection - INFO - Returning session for default profile. 2018-11-15T10:29:58 - aws_ir.plans.host - INFO - Proceeding with incident plan steps included are ['snapshotdisks_host', 'stop_host'] 2018-11-15T10:29:58 - aws_ir.plans.host - INFO - Executing step snapshotdisks_host. Enter MFA code for arn:aws:iam::xxxxxxxxxxxx:mfa/awsir: True 2018-11-15T10:30:10 - aws_ir.plans.host - INFO - Executing step stop_host. #
すると、、、インスタンスは停止されスナップショットが取得されました!
おわりに
幸いなことに、これまでのエンジニア人生の中でセキュリティインシデントに遭遇したことはありませんが、コマンド1行で対象のインスタンスを隔離または削除、その時点での情報収集ができるのは便利だと感じました。
AWSのことを少しだけ知っている状態で軽い気持ちで導入から動作確認まで行おうとした結果、AWS IRを使う前にそもそもAWSの初歩的なところで躓くところが多々ありました。ブログ化するまでに1週間も掛かり、鮮度が落ちて残念な気持ちです。今度はもっと早くアウトプットできるように頑張ります!
以上です。