Security-JAWS 第11回で紹介されたインシデントレスポンスツール「AWS IR」を使ってみた

2018.11.15

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

皆さん、こんにちは。岩城です。
最近ぬか漬けを始めたため右手にぬか臭がつき、職場の周りの人に迷惑を掛けていないかドキドキしています。

さて、1週間前になりますが、Security-JAWS第11回目に参加しました。 以下のとおり、レポートはすでに上がっていますので、私は吉江さんのセッション内で気になったツールを実際に使ってみたいと思います。

セッション内では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週間も掛かり、鮮度が落ちて残念な気持ちです。今度はもっと早くアウトプットできるように頑張ります!

以上です。