クラウドセキュリティ監査ツール「Scout Suite」を使って、ゆるゆる設定のAWS環境をチェックしてみた

最近、セキュリティ関係のセミナーに参加して、「[Scout Suite](https://github.com/nccgroup/ScoutSuite)」というクラウド環境のセキュリティ監査ツールの存在を知り、個人のAWS環境にわざと緩めの設定を追加してチェックしてみたので、その際の手順を残しておきます。

# Scout Suiteとは？
[GitHubの「Description」](https://github.com/nccgroup/ScoutSuite#description)にて「Scout Suite is an open source multi-cloud security-auditing tool」と説明されているように、AWS、Azure、GCPなどの複数のクラウド事業者（[GitHubの「Cloud Provider Support」を参照](https://github.com/nccgroup/ScoutSuite#cloud-provider-support)）に対応しているセキュリティ監査ツールです。
チェックを行いたいクラウド事業者の環境に対してScout Suiteのコマンドを実行すると、所定のディレクトリに「この設定はヤバいんじゃないの？」といった内容のHTML形式のレポートファイルを出力してくれます。

# 必要なパッケージ
- AWS CLI（今回はAWS環境に対してチェックを行うため）
- python3（3.6以上）
- pip3（ `pip3 install --upgrade pip` しておくことがオススメ）
- Git（Scout Suiteのインストールを `git clone` で行う場合）

# 事前準備
今回は監査対象がAWSのため、AWSの各リソースの読み込み権限を持つIAMユーザーを作成する必要があります。
AWSはまさにこういった用途のための[「SecurityAudit」というIAMポリシー](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/access_policies_job-functions.html#jf_security-auditor)が準備されているので、この権限を付与したユーザーを作ります。

そのものズバリな「SecurityAudit」というユーザー名にしました。今回はAWS CLIやAPI呼び出しのためにしか利用しないので、「プログラムによるアクセス」にのみチェックしておきます。
![スクリーンショット 2021-03-26 20.09.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/a60c5b9b-14fa-9a8b-f85b-99e5e813a95c.png)

「既存のポリシーを直接アタッチ」を選択して、「SecurityAudit」にチェックします。
![スクリーンショット 2021-03-26 20.10.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/897139ec-2b1e-5950-3597-57c7f151c460.png)

「Name」というキー名に「SecurityAudit」を設定します。（このステップはスキップしてもOKです）
![スクリーンショット 2021-03-26 20.10.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/c8fad7be-992d-d5b1-9bc1-fc09219ce92c.png)

確認画面で内容がOKだったら作成します。
![スクリーンショット 2021-03-26 20.10.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/db1c0b4c-16c3-c7bf-4117-c3b993492f59.png)

認証情報は適切に管理しましょう。
![スクリーンショット_2021-03-26_20_10_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/eebe132e-8df9-23cd-f573-228f0a3813c5.png)

上記手順で作成したIAMユーザーの認証情報を `aws configure` で設定するか `export` で環境変数にセットします。
`aws configure` で設定する場合は常時利用しているデフォルト設定を上書きしないように引数に `--profile プロファイル名` を指定するのがオススメです。
今回は既存の「~/.aws/config」、「~/.aws/credentials」を更新せずに一時的な利用としたかったので、 `export` コマンドで対応しました。

環境変数をセットします。

```
$ export AWS_ACCESS_KEY_ID=XXXXXXXXXXXXXXXXXXXX
$ export AWS_SECRET_ACCESS_KEY=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
$ export AWS_DEFAULT_REGION=ap-northeast-1
```

意図したIAMユーザーで接続できているか確認します。

```
$ aws sts get-caller-identity
{
    "UserId": "XXXXXXXXXXXXXXXXXXXXX",
    "Account": "999999999999",
    "Arn": "arn:aws:iam::999999999999:user/SecurityAudit"
}
```

Scout Suiteを実行するにあたり「ゆるゆるのセキュリティグループ」も準備しておきます。
今回は全TCPポートで全IPを許可する大変ゆるやかなインバウンドルールを設定した「high_risk」というセキュリティグループを作成しました。
![スクリーンショット_2021-03-27_20_32_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/ba9fe41c-2aef-1cf3-50da-20f5d94b3334.png)

# Scout Suiteのインストール
準備が整ったのでScout Suiteのインストールを行います。
インストール手順については[GitHubのwiki](https://github.com/nccgroup/ScoutSuite/wiki/Setup)に `pip` でバイナリをインストールする方法と `git clone` で持ってくる方法が説明されていますが、今回は `git clone` でやってみます。


GitHubからcloneしてきます。

```
$ git clone https://github.com/nccgroup/ScoutSuite.git
```

ScoutSuiteディレクトリに移動します。

```
$ cd ScoutSuite
```

ScoutSuiteの実行に必要な依存パッケージをインストールします。

```
$ pip3 install -r requirements.txt
```

macOS環境で以下のようなエラーが表示される場合

```
$ pip3 install -r requirements.txt
・
・
・
Could not install packages due to an EnvironmentError: [Errno 13] Permission denied: '/Library/Python/3.7'
Consider using the `--user` option or check the permissions.
```

表示されているメッセージの通りに「--user」を付与して実行します。
「Successfully installed」と表示されたら問題ないはずです。

```
$ pip3 install -r requirements.txt --user
Collecting python-dateutil<2.8.1,>=2.1 (from -r requirements.txt (line 2))
  Using cached https://files.pythonhosted.org/packages/41/17/c62faccbfbd163c7f57f3844689e3a78bae1f403648a6afb1d0866d87fbb/python_dateutil-2.8.0-py2.py3-none-any.whl
Collecting netaddr>=0.7.11 (from -r requirements.txt (line 3))
  Using cached 
・
・
・
Successfully installed PyJWT-1.7.1 adal-1.2.4 aliyun-python-sdk-actiontrail-2.0.3 aliyun-python-sdk-core-2.13.32 aliyun-python-sdk-ecs-4.23.10 aliyun-python-sdk-kms-2.14.0 aliyun-python-sdk-ocs-0.0.4 aliyun-python-sdk-ram-3.2.0 aliyun-python-sdk-rds-2.5.10 aliyun-python-sdk-sts-3.0.2 aliyun-python-sdk-vpc-3.0.12 applicationinsights-0.11.9 argcomplete-1.12.2 asyncio-throttle-0.1.1 azure-cli-core-2.12.0 azure-cli-telemetry-1.0.6 azure-common-1.1.26 azure-core-1.13.0b1 azure-graphrbac-0.61.1 azure-mgmt-authorization-0.60.0 azure-mgmt-compute-5.0.0 azure-mgmt-core-1.2.0 azure-mgmt-keyvault-1.1.0 azure-mgmt-monitor-0.5.2 azure-mgmt-network-2.5.1 azure-mgmt-nspkg-3.0.2 azure-mgmt-redis-6.0.0 azure-mgmt-resource-10.2.0 azure-mgmt-security-0.4.1 azure-mgmt-sql-0.11.0 azure-mgmt-storage-7.1.0 azure-mgmt-web-0.47.0 azure-nspkg-3.0.2 bcrypt-3.2.0 boto3-1.17.38 botocore-1.20.38 cachetools-4.2.1 certifi-2020.12.5 cffi-1.14.5 chardet-4.0.0 cheroot-8.5.2 cherrypy-18.6.0 cherrypy-cors-1.6 colorama-0.4.4 coloredlogs-10.0 configparser-4.0.2 crcmod-1.7 cryptography-3.4.7 google-api-core-1.26.2 google-api-python-client-2.0.2 google-auth-1.28.0 google-auth-httplib2-0.1.0 google-cloud-container-2.4.0 google-cloud-core-1.6.0 google-cloud-iam-2.1.0 google-cloud-kms-1.3.0 google-cloud-logging-2.3.1 google-cloud-monitoring-1.1.0 google-cloud-resource-manager-0.30.3 google-cloud-storage-1.37.0 google-crc32c-1.1.2 google-resumable-media-1.2.0 googleapis-common-protos-1.53.0 grpc-google-iam-v1-0.12.3 grpcio-1.36.1 httpagentparser-1.9.1 httplib2-0.19.0 httplib2shim-0.0.3 humanfriendly-9.1 idna-2.10 importlib-metadata-3.7.3 isodate-0.6.0 jaraco.classes-3.2.1 jaraco.collections-3.2.0 jaraco.functools-3.2.1 jaraco.text-3.5.0 jmespath-0.10.0 knack-0.7.2 libcst-0.3.17 more-itertools-8.7.0 msal-1.0.0 msal-extensions-0.1.3 msrest-0.6.21 msrestazure-0.6.4 mypy-extensions-0.4.3 netaddr-0.8.0 oauth2client-4.1.3 oauthlib-3.1.0 oci-2.34.0 oss2-2.14.0 packaging-20.9 paramiko-2.7.2 pkginfo-1.7.0 policyuniverse-1.3.3.20210223 portalocker-1.7.1 portend-2.7.1 proto-plus-1.18.1 protobuf-3.15.6 pyasn1-0.4.8 pyasn1-modules-0.2.8 pycparser-2.20 pycryptodome-3.10.1 pygments-2.8.1 pynacl-1.4.0 pyopenssl-20.0.1 pyparsing-2.4.7 python-dateutil-2.8.0 pytz-2021.1 pyyaml-5.4.1 requests-2.25.1 requests-oauthlib-1.3.0 rsa-4.7.2 s3transfer-0.3.6 sqlitedict-1.7.0 tabulate-0.8.9 tempora-4.0.1 typing-extensions-3.7.4.3 typing-inspect-0.6.0 uritemplate-3.0.1 urllib3-1.26.4 zc.lockfile-2.0 zipp-3.4.1
```

macOS環境に限り、[GitHubに実行時のヒントが書いてある](https://github.com/nccgroup/ScoutSuite/wiki/Setup#osx)ので、指示通りに以下のコマンドを実行しておきます。
このようにulimitで一度に開くファイル数を制限しておかないと、認証情報は正しいはずなのに `ERROR ec2.py L134: Failed to get snapshots: Could not connect to the endpoint URL: "https://ec2.eu-west-3.amazonaws.com/"` といった謎のエラーに悩まされることになります。

```
$ ulimit -Sn 1000
```

# Scout Suiteを実行
すべての準備が整ったので、いよいよScout Suiteの実行です。

IAMの認証情報を `aws configure` で設定した場合、もしくは、 `export` で環境変数にセットした場合は `python3 scout.py aws` でOK。
`aws configure --profile プロファイル名` で個別にプロファイルを作成した場合は `python3 scout.py aws -p プロファイル名` もしくは  `python3 scout.py aws --profile プロファイル名` で実行可能です。
実行後、しばらくすると「scoutsuite-report」ディレクトリ配下（ `--report-dir ディレクトリ名` で変更可能）にレポートファイルが作成され、ブラウザが自動的に起動してレポートが表示されます。

```
$ python3 scout.py aws       
2021-03-27 21:43:22 akase244 scout[2932] INFO Launching Scout
2021-03-27 21:43:22 akase244 scout[2932] INFO Authenticating to cloud provider
2021-03-27 21:43:26 akase244 scout[2932] INFO Gathering data from APIs
2021-03-27 21:43:26 akase244 scout[2932] INFO Fetching resources for the ACM service
2021-03-27 21:43:26 akase244 scout[2932] INFO Fetching resources for the Lambda service
・
・
・
2021-03-27 21:43:46 akase244 scout[2932] INFO Fetching resources for the VPC service
2021-03-27 21:43:46 akase244 scout[2932] INFO Fetching resources for the Secrets Manager service
2021-03-27 21:45:26 akase244 scout[2932] INFO Running pre-processing engine
2021-03-27 21:45:26 akase244 scout[2932] INFO Running rule engine
2021-03-27 21:45:28 akase244 scout[2932] INFO Applying display filters
2021-03-27 21:45:28 akase244 scout[2932] INFO Running post-processing engine
2021-03-27 21:45:28 akase244 scout[2932] INFO Saving data to scoutsuite-report/scoutsuite-results/scoutsuite_results_aws-999999999999.js
2021-03-27 21:45:28 akase244 scout[2932] INFO Saving data to scoutsuite-report/scoutsuite-results/scoutsuite_exceptions_aws-999999999999.js
2021-03-27 21:45:28 akase244 scout[2932] INFO Creating scoutsuite-report/aws-999999999999.html
2021-03-27 21:45:28 akase244 scout[2932] INFO Opening the HTML report
```

いくつか赤く表示されているリソースがあって非常に不穏ですが。。。
![スクリーンショット_2021-03-27_21_54_06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/ea4e8d0e-bdf7-9dd0-34a8-4ba94389cfba.png)

今回ゆるゆるに設定したセキュリティグループ「high_risk」についてのレポートを見てみると、「Opens All Ports to All」としてしっかり警告されていました。
![スクリーンショット_2021-03-27_20_36_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/23093/81f93798-3696-7015-c3d4-9a41b360c56a.png)

# まとめ
今回は意図的にゆるゆるに設定したセキュリティグループを準備してScout Suiteを実行したわけですが、実は未使用のキーペアやIAM、セキュリティグループなど、以前作ったんだけど使ってないリソースを放置してることに気づけました。。。
こういった不用心なリソースは攻撃者に対して手招きをしているようなものです。クラウド環境は非常に便利ではありますが、デフォルト設定だったり、あまり理解せずに利用していると非常に危険な状態をインターネットに公開していることになります。
Scout Suiteをはじめ、他にも便利なセキュリティ監査ツールはたくさんあるので、こういったツールを活用しながら常日頃からセキュリティについては気をつけていきたいですね。

# 参考URL
- [Scout Suite](https://github.com/nccgroup/ScoutSuite)
- [AWSやGCPといったクラウドサービスのセキュリティ項目を無料で監査できるオープンソースソフト「Scout Suite」レビュー](https://gigazine.net/news/20200525-scout-suite/)
- [クラウドセキュリティ対策の第一歩！OSSのマルチクラウド対応セキュリティ監査ツール「Scout Suite」導入のすすめ](https://techblog.zozo.com/entry/scoutsuite)