セキュリティは大事です。AWSのセキュリティ状況を把握するSecurity Hubというサービスの利用方法を紹介します。
AWSアカウントの新規作成
AWSアカウントの新規作成は、Organizationを使って作成しました。
Security Hub有効化手順
Configの有効化
Security Hubを使用するためにはConfigを有効化する必要があります。
- Configの管理画面を開き、1-Clickセットアップをクリック
- 確認をクリック
有効化されました。
Security Hubの有効化
続いてSecurity Hubを有効化します。
- Security Hubの管理画面を開き、Security Hubに移動をクリック
- セキュリティ基準は以下の3つから選択ができますが、デフォルトで選択されている「AWS 基礎セキュリティのベストプラクティス v1.0.0 を有効化」と「CIS AWS Foundations Benchmark v1.2.0 を有効化」を選択した状態で、Security Hubの有効化をクリック
- Security Hubが有効化されました。結果が表示されるまでは暫く掛かるようです。
ConfigのログをもとにSecurity Hubがチェックを行ってくれます。
結果確認
さて、1日経ったので、状態を確認してみましょう。
ということで、初期状態のAWSアカウントにSecurity Hubを適用した結果は、75%でした!!!
意外と高いと思いませんか?あとから改善するのは大変なので、初めからセキュリティを考慮しておくと良いです。
AWS 基礎セキュリティのベストプラクティス v1.0.0への対応
[CloudTrail.1]
This AWS control checks that there is at least one multi-region AWS CloudTrail trail.
このAWSコントロールは、少なくとも1つのマルチリージョンAWS CloudTrailトレイルがあることを確認する。
CloudTrailを有効化しましょう。
CloudTrailを有効化しました
[CloudTrail.2]
This AWS control checks whether AWS CloudTrail is configured to use the server side encryption (SSE) AWS Key Management Service (AWS KMS) customer master key (CMK) encryption. The check will pass if the KmsKeyId is defined.
この AWS コントロールは、AWS CloudTrail がサーバーサイド暗号化 (SSE) AWS Key Management Service (AWS KMS) カスタマーマスターキー (CMK) 暗号化を使用するよう設定されているかどうかをチェックします。KmsKeyIdが定義されている場合、チェックはパスします。
[CloudTrail.1] の対応後のチェックにて指摘が上がります。暗号化を有効化します。
CloudTrailも暗号化を有効に
[CloudTrail.4]
This AWS control checks whether CloudTrail log file validation is enabled.
このAWSコントロールは、CloudTrailのログファイル検証が有効になっているかどうかを確認します。
こちらも[CloudTrail.1] の対応後のチェックにて指摘が上がります。ログファイルの検証を有効化します。
CloudTrailのログは改ざんされてはいけないので検証を有効化します。
[CloudTrail.5]
This AWS control checks whether AWS CloudTrail trails are configured to send logs to Amazon CloudWatch Logs.
このAWSコントロールは、AWS CloudTrailトレイルがAmazon CloudWatch Logsにログを送信するように設定されているかどうかをチェックします。
【新規】ログのログ的なものですかね。Security Hubの重要度も低なので、実際は有効化するかどうか検討が必要だと思います。
TrailログをCloudWatchに送信することで、通知などに利用できます。
[Config.1]
This AWS control checks whether the Config service is enabled in the account for the local region and is recording all resources.
このAWSコントロールは、ローカルリージョンのアカウントでConfigサービスが有効で、すべてのリソースを記録しているかどうかを確認します。
Config自体はすでに有効化されています。手順を確認すると、グローバルリソース (AWS IAM リソースなど) を含めるのチェックが必要なようです。
Configの細かな設定もチェックされています
[GuardDuty.1]
This AWS control checks whether Amazon GuardDuty is enabled in your AWS account and region.
このAWSコントロールは、Amazon GuardDutyがAWSアカウントとリージョンで有効になっているかどうかを確認します。
GuardDutyを有効化しましょう。
GuardDutyを有効化しました。
[EC2.2]
This AWS control checks that the default security group of a VPC does not allow inbound or outbound traffic.
このAWSコントロールは、VPCのデフォルトセキュリティグループがインバウンドまたはアウトバウンドトラフィックを許可しないことをチェックします。
Security Hubの結果で、対象のリソースがわかります。初期状態なのでdefaultしかありませんが、このセキュリティグループのインバウンドルールとアウトバウンドールールを削除します。
デフォルトセキュリティグループもセキュリティリスクがあります。インバウンドルールだけでなく、アウトバウンドルールも削除する必要があります。
[EC2.6]
This control checks whether Amazon Virtual Private Cloud flow logs are found and enabled for Amazon VPCs. The traffic type is set to 'Reject'.
このコントロールは、Amazon Virtual Private Cloudのフローログが見つかり、Amazon VPCで有効になっているかどうかをチェックします。トラフィックタイプは「Reject」に設定されています。
VPCフローログを有効化します。S3に出力する場合はS3バケットの作成なども必要です。
VPCフローログを有効化しました
[EC2.7]
This control checks whether Amazon Elastic Block Store (EBS) encryption is enabled by default. The control fails if EBS default encryption is not enabled.
このコントロールは、Amazon Elastic Block Store (EBS) の暗号化がデフォルトで有効になっているかどうかをチェックします。EBSのデフォルトの暗号化が有効でない場合、このコントロールは失敗します。
設定する場所が分かりづらいですが、EC2ダッシュボードの右側アカウントの属性のEBS暗号化から設定します。
デフォルト暗号化がベストプラクティス
[EC2.10]
This control checks whether a service endpoint for Amazon EC2 is created for each VPC. The control fails if a VPC does not have a VPC endpoint created for the Amazon EC2 service.
このコントロールは、Amazon EC2用のサービスエンドポイントが各VPCに作成されているかどうかをチェックします。VPCにAmazon EC2サービス用のVPCエンドポイントが作成されていない場合、このコントロールは失敗します。
[EC2.15]の対応を行うと指摘が上がります。パブリックアクセスができない状態になったので、VPCエンドポイントを作成しましょう。
EC2エンドポイントへはVPCエンドポイント経由でのアクセスを行うようにしました
[EC2.15]
This control checks if the assignment of public IPs in Amazon Virtual Private Cloud (VPC) subnets have the MapPublicIpOnLaunch set to FALSE. The control will pass if the flag is set to FALSE.
このコントロールは、Amazon Virtual Private Cloud(VPC)サブネットのパブリックIPの割り当てに、MapPublicIpOnLaunchがFALSEに設定されているかどうかをチェックします。フラグが FALSE に設定されている場合、コントロールはパスします。
3つのサブネットが対象です。VPCの管理画面からサブネットの設定を編集です。
デフォルトはプライベートにするというのがベストプラクティス
[EC2.21]
This control checks whether a network access control list (NACL) allows unrestricted access to the default ports for SSH/RDP ingress traffic. The rule fails if a NACL inbound entry allows a source CIDR block of '0.0.0.0/0' or '::/0' for ports 22 or 3389
このコントロールは、ネットワークアクセスコントロールリスト(NACL)が、SSH/RDPのイングレストラフィックのデフォルトポートへの無制限のアクセスを許可しているかどうかをチェックします。NACL の受信エントリが、ポート 22 または 3389 に対して、ソース CIDR ブロックの '0.0.0.0/0' または '::/0' を許可している場合、このルールは失敗します。
ネットワークACLで22と3389を防ぐ必要があるようです。
[追記] 上記手順ではすべてのトラフィックを有効の前段に22番と3389番を拒否するルールを追加してみましたが、だめなようです。すべてのトラフィックを有効を80番だけ有効に変更します。
ネットワークACLで防ぐことで、サブネット単位で制御ができます
[IAM.6]
This AWS control checks whether your AWS account is enabled to use a hardware multi-factor authentication (MFA) device to sign in with root user credentials.
このAWSコントロールは、AWSアカウントが、ルートユーザー認証情報でサインインするためにハードウェア多要素認証(MFA)デバイスを使用することが有効であるかどうかをチェックします。
ハードウェアMFAは持ってないのでどうしようもありません。チェックはクリアできませんが、Google AuthenticatorによるソフトェアMFAは有効にしておきました。
ハードウェアMFAが手元になかったため、ソフトウェアで断念しました
[IAM.7]
This AWS control checks whether the account password policy for IAM users uses the following recommended configurations: RequireUppercaseCharacters: true, RequireLowercaseCharacters: true, RequireSymbols: true, RequireNumbers: true, MinimumPasswordLength: 8.
このAWSコントロールは、IAMユーザーのアカウントパスワードポリシーが、以下の推奨設定を使用しているかどうかを確認します。RequireUppercaseCharacters: true, RequireLowercaseCharacters: true, RequireSymbols: true, RequireNumbers: true, MinimumPasswordLength: 8.このAWSコントロールは、IAMユーザーのアカウントパスワードポリシーが以下の推奨設定を使用しているかどうかを確認します。
パスワードポリシーを設定します。
パスワードポリシーの推奨項目です
[S3.1]
This AWS control checks whether the following public access block settings are configured from account level: ignorePublicAcls: True, blockPublicPolicy: True, blockPublicAcls: True, restrictPublicBuckets: True.
この AWS コントロールは、アカウントレベルから以下の公開アクセスブロック設定が行われているかどうかを確認します: ignorePublicAcls: True、blockPublicPolicy: True、blockPublicAcls: True、restrictPublicBuckets: Trueを指定します。
順番が前後しますが、[S3.8]のチェックでまとめて設定済みです。
[S3.4]
This AWS control checks that your Amazon S3 bucket either has Amazon S3 default encryption enabled or that the S3 bucket policy explicitly denies put-object requests without server side encryption.
このAWSコントロールは、Amazon S3バケットがAmazon S3のデフォルト暗号化を有効にしているか、S3バケットポリシーがサーバー側暗号化なしのput-objectリクエストを明示的に拒否しているかをチェックします。
これもバケットごとに設定します。
デフォルト暗号化がベストプラクティス
[S3.5]
This AWS control checks whether S3 buckets have policies that require requests to use Secure Socket Layer (SSL).
このAWSコントロールは、S3バケットにSSL(Secure Socket Layer)を使用したリクエストが必要なポリシーがあるかどうかをチェックします。
バケットポリシーにて、各バケットに設定します。すでにバケットポリシーは定義されているので、ステートメントを追加します。
追加するステートメントはこちら。リソース名だけバケットに合わせて修正が必要です。
{
"Id": "ExamplePolicy",
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowSSLRequestsOnly",
"Action": "s3:*",
"Effect": "Deny",
"Resource": [
"arn:aws:s3:::awsexamplebucket",
"arn:aws:s3:::awsexamplebucket/*"
],
"Condition": {
"Bool": {
"aws:SecureTransport": "false"
}
},
"Principal": "*"
}
]
}
SSLを使用しな接続をブロック(未設定ではSSLなしでアクセスできてしまう)
[S3.8]
This control checks if Amazon S3 buckets have bucket level public access blocks applied. This control fails if any of the bucket level settings are set to "false" public: ignorePublicAcls, blockPublicPolicy, blockPublicAcls, restrictPublicBuckets.
このコントロールは、Amazon S3バケットにバケットレベルのパブリックアクセスブロックが適用されているかどうかをチェックします。バケットレベルの設定のいずれかが "false "に設定されている場合、このコントロールは失敗します public: ignorePublicAcls, blockPublicPolicy, blockPublicAcls, restrictPublicBuckets.このコントロールは、バケットレベルのパブリックアクセスブロックが適用されているかどうかをチェックします。
S3のパブリックアクセスを無効化します。
S3のパブリックアクセス機能はデフォルトオフがベストプラクティス。この設定を行う以前に作成したバケットには適用されませんので、個別に適用する必要があります。
[S3.9]
This control checks if an Amazon S3 Bucket has server access logging enabled to a chosen target bucket.
このコントロールは、Amazon S3 Bucketが選択されたターゲットBucketへのサーバーアクセスログを有効にしているかどうかをチェックします。
バケットごとにアクセスログを有効化します。アクセスログを出力するバケット自体のアクセスログはどうしたらいいんだろう。。
一旦アクセスログ出力用のバケットのアクセスログは無効のままとします。
S3もアクセスログを収集するのがベストプラクティス
[S3.11]
This control checks if S3 Event Notifications are enabled on an S3 bucket. This control fails if S3 Event Notifications are not enabled on a bucket.
このコントロールは、S3バケット上でS3イベント通知が有効かどうかを確認する。S3 Event Notificationsがバケット上で有効でない場合、このコントロールは失敗します。
バケットのイベント通知を有効化します。バケットひとつひとつ行う必要がありそうです。EventBridgeへの通知をオンにします。
[追記] EventBridgeへの通知で良いかと思いましたが、ダメそうです。なのでSNSへの通知を追加します。SNSの作成とSNSのアクセスポリシーの設定も必要です。
イベント通知はどうして推奨なんでしょうか。
[S3.13]
This control checks if a lifecycle policy is configured for an S3 bucket. This control fails if the lifecycle policy is not configured for an S3 bucket.
このコントロールは、S3バケットにライフサイクルポリシーが設定されているかどうかを確認する。S3 バケットにライフサイクルポリシーが設定されていない場合、このコントロールは失敗します。
ライフサイクルポリシーを設定します。
ライフサイクルで不要なファイルはアーカイブすることが推奨です
[SNS.1]
This control checks whether an Amazon SNS topic is encrypted at rest using AWS KMS.
Amazon SNSのトピックが、AWS KMSを使用して静止時に暗号化されているかどうかを確認します。
他の対応を行う際に、SNSトピックを作成します。このSNSの暗号化を有効化します。
SNSも暗号化!
[SNS.2]
This control checks whether logging is enabled for the delivery status of notification messages sent to a topic for the endpoints. This control fails if the delivery status notification for messages is not enabled.
このコントロールは、エンドポイント用のトピックに送信された通知メッセージの配信状況について、ロギングが有効であるかどうかを確認します。メッセージの配信状況通知が有効でない場合、このコントロールは失敗します。
ロギングを有効にします。
SNSもロギングするのがベストプラクティス
まとめ
以上で、改善できる分の対応が完了です。 改善できなかったものは以下の 2つ
- [S3.9] This control checks if an Amazon S3 Bucket has server access logging enabled to a chosen target bucket.
→ログ出力先に指定したバケットをどうしていいかわからない - [IAM.6] This AWS control checks whether your AWS account is enabled to use a hardware multi-factor authentication (MFA) device to sign in with root user credentials. →ハードウェアMFAを持ってない
この状態で暫く待つと結果が出ました。
セキュリティスコア99%です!! 対応できていないもの2件は想定通りのものです。
[S3.9] This control checks if an Amazon S3 Bucket has server access logging enabled to a chosen target bucket.についても、一つのバケットを除き、対応できていることが確認できました。
この件について、気になるので、re:Postで質問をしてみることにしました。(拙い英語で)投稿はこちらです。
その結果わかったことは、
"The target logging bucket does not need to have server access logging enabled, and you should suppress findings for this bucket."
ということで、結論としては suppress しちゃえでした。(日本語表記では抑制済み)
これで結果が失敗ではなくなりました。