AWSアカウントのセキュリティ設定

[AWS](Amazon Web Services)を利用してセキュアなインフラを構築する上で、EC2インスタンスなどの設定も大事ですが、AWSアカウント自体のセキュリティ設定を行うこともとても重要です。
本投稿では[CIS][CIS](Center of Information Security)が提供している[CIS Amazon Web Services Foundations]を題材に、AWSアカウントのハードニングについて説明したいと思います。

# 概要
CISドキュメントは大きく分けて以下の章から構成されています。
1. 認証・アクセス制御 (Identity and Access Management)
2. ロギング (Logging)
3. モニタリング (Monitoring)
4. ネットワーク (Networking)

各ポイントを抑えていくことで、特定のアクセスのみを許可し、それらのアクセスを記録し、意図しないアクセスを検知することが実現されます。
1~3では[IAM]を使ってAWSアカウント内のイベントを対象として設定を行っていきますが、4では[VPC]内のトラフィックについて個々のネットワーク設定に依存しないAWSアカウント内で共通の設定を行います。

1~3ではIAMを中心として, AWSが提供する複数のサービスを利用して設定を行っていきます。下図が設定全体の概要になります。
![全体概要図](https://qiita-image-store.s3.amazonaws.com/0/34237/a839e9a8-91e1-00be-afd7-0a6c6f0eba33.jpeg)

以下、CISドキュメント内の各章について順番に説明していきます。

# 1. 認証・アクセス制御 (Identity and Access Management)
![認証・アクセス制御概要図](https://qiita-image-store.s3.amazonaws.com/0/34237/aa5cfd1a-6a34-a51b-0ff0-bd4cd2c7c57c.jpeg)

AWSアカウントの認証・アクセス制御は[Identity and Access Management(IAM)][IAM]を用いて行います。IAMを用いることで、AWSアカウント内のリソースへアクセスを行うユーザの管理、各ユーザの多要素認証・パスワードポリシなどの認証設定、呼び出し可能なAPIの制限などのアクセス制御を行う事ができます。

AWSアカウント作成直後はルートアカウントのみが用意されていますが、ルートアカウントはすべての操作を行う権限があるためアカウント全体の管理を行う場合のみ利用し、通常はIAMユーザを使うことが推奨されています。

また、CISドキュメントにはインシデント発生時に用いられるAWSからの連絡窓口の登録や、詳細な請求情報表示を有効化する、といったIAMの設定以外の項目も含まれています。

## 使用したサービス
- [IAM]: ユーザアカウントの認証・アクセス制御

# 2. ロギング (Logging)
![ロギング概要図](https://qiita-image-store.s3.amazonaws.com/0/34237/33084ee0-5996-e474-9872-12210e707954.jpeg)

[CloudTrail]を使うと、管理画面へのログインやセキュリティグループの変更などAWSアカウント内の様々なイベントログを自動的に保存することができます。これにより意図しない操作が行われていないかを監視したり、インシデント発生時などにAWSアカウント内でいつ、何に対して、どのような操作が行われたのかを調査したりすることが可能になります。

これらのログは[Simple Storage Service(S3)][S3]に保存されますが、[Key Management Service(KMS)][KMS]を使うことでS3内に保存されたログを暗号化したり、S3のアクセスログ機能を有効化することでログを保存したバケット自体の完全性をチェックすることができます。

CloudTrailのログはS3に保存するだけでなく、同時に[CloudWatch Logs]にも保存することができます。CloudWatch Logsを利用することで、リアルタイムにログの検索を行ったり、特定の条件に合致するログレコード発生を自動的に検知できるようになります。

上図に示したCloudTrailによるログ保存以外にも、[Config]を有効化することが推奨されています。[Config]は監査ポリシーを設定しておくことで、AWSアカウント内の各設定がそのポリシーに違反していないかを定期的にチェックしてくれるサービスです。また、これを有効化するとAWSアカウント内のリソースの変更履歴が自動的に保存されるため、インシデント発生時などの調査にも利用することができます。

## 使用したサービス
- [CloudTrail]: 各種ログの自動保存
- [Simple Storage Service(S3)][S3]: CloudTrailログの保管
- [Key Management Service(KMS)][KMS]: S3ログの暗号化
- [CloudWatch Logs]: CloudTrailログのリアルタイム分析
- [Config]: AWSアカウント各種設定の自動監査

# 3. モニタリング (Monitoring)
![モニタリング概要図](https://qiita-image-store.s3.amazonaws.com/0/34237/3fb2fafd-766a-1720-ad65-da7739aca57e.jpeg)

前章でCloudTrailによるCloudWatch Logsへのログ転送を設定しました。CloudWatch Logsにはあらかじめ設定した条件に合致したログレコードの出現を監視し、[Simple Notification Service(SNS)][SNS]を使って通知を行う機能があります。SNSを使うとこれらの通知をEメールやWebhookなど様々な手段で受け取る事ができます。

CISドキュメントでは例えば以下のような条件の監視設定を推奨しています。

- 認証失敗や許可されない操作の実行
- セキュリティグループなどのネットワーク設定変更
- CloudTrailなどロギング設定の変更

これらの監視設定は14項目ほどの具体的な設定内容がCISドキュメントに記載されているので、すべて設定することをお勧めします。

## 使用したサービス
- [CloudWatch Logs]: 特定パターンに適合するログの自動検出
- [SNS]: ログから検出されたイベントの通知

# 4. ネットワーク (Networking)
AWSアカウント内に実際にネットワークを構築していくには[Virtual Private Cloud(VPC)][VPC]を使いますが、本章では実際に構築する個々のネットワークではなくAWSアカウント全体として行っておくべき設定について記載されています。

[VPC Flow Logs]を有効化することで、VPC内で発生したIPトラフィックをすべてログとして保存することができます。各ログレコードにはそのトラフィックが許可(ACCEPT)されたか、拒絶(REJECT)されたかも含まれるため、例えば拒絶されたトラフィックのログを監視することで攻撃の検知などを行うことができます。

また、CISドキュメントではその他に以下のようなチェックを推奨しています。

- すべてのSecurityGroupで22番(SSH)や3389番(RDP)のポートがインターネット全体へ公開されていないか？
- デフォルトのSecurityGroupですべてのトラフィックが遮断されているか？
- VPCピアリングが使用されている場合に最小の権限設定が行われているか？

## 使用したサービス
- [Virtual Private Cloud(VPC)][VPC]: ネットワークの構築・設定
- [VPC Flow Logs]: VPC内トラフィックのログ保存

# まとめ
VPCネットワークやEC2インスタンスなどのセキュリティ対策に目が行きがちですが、AWSではアカウント全体のセキュリティ対策を行う手段を多く提供しています。本投稿ではCISが提供する[CIS Amazon Web Services Foundations]を基に、AWSアカウントのハードニングを行う手段について説明しました。

また、AWSがGitHub上に公開している[aws security benchmark]にはCIS Amazon Web Services Foundationsへの適合状況をチェックして採点してくれるPythonスクリプトが含まれています。自身のAWSアカウントが適切に設定されているか、また設定が終わった際に設定ミスがないか、などをチェックする際に便利かと思います。

[AWS]: https://aws.amazon.com/
[CIS]: https://www.cisecurity.org/
[CIS Amazon Web Services Foundations]: https://www.cisecurity.org/benchmark/amazon_web_services/
[IAM]: https://aws.amazon.com/iam/
[CloudTrail]: https://aws.amazon.com/cloudtrail/
[S3]: https://aws.amazon.com/s3/
[KMS]: https://aws.amazon.com/kms/
[Config]: https://aws.amazon.com/config/
[CloudWatch Logs]: https://aws.amazon.com/cloudwatch/
[SNS]: https://aws.amazon.com/sns/
[VPC]: https://aws.amazon.com/vpc/
[VPC Flow Logs]: https://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/flow-logs.html
[aws security benchmark]: https://github.com/awslabs/aws-security-benchmark