[アップデート] Config の適合パックに「NIST CSF 運用のベストプラクティス」が追加されました
先日のアップデートで AWS Config 適合パックに「NIST CSF 運用のベストプラクティス」が追加されました。
なにが嬉しいのか
以前に 「CIS コンプライアンスパック」、「AWS Control Tower Detective Guardrails」の AWS Config の適合パックが追加されていました。それと同じようなメリットがあります。
ルールをパッケージ化
適合パックは Configルール(+修復アクション)のパッケージ化です。 AWSからサンプルテンプレートが提供されています。 他にも「S3/ベストプラクティス」や「CIS 運用のベストプラクティス」の 適合パックも利用できます。
現時点(2020/06/05) で利用可能な適合パック一覧は以下参照ください。
カスタマイズ可能
Config適合パックの実態は CloudFormationテンプレートです。 スコープの設定や、必要に応じた修復アクションといったカスタマイズが可能です。
NISTフレームワーク運用の準拠確認に役立つ
このフレームワークは政府や民間から意見を集めて作成されたもので、 リスクごとに実施すべき重点対策が示されています。 CSF を活用することにより、識別、防御、検知、対応、復旧という 5 つの機能を中心としたセキュリティ対策の基盤を築き、セキュリティの強化、 リスク管理の改善、組織の信頼性向上を実現できます。
– 引用: AWS クラウドにおける NIST サイバーセキュリティフレームワークへの準拠 – 日本語のホワイトペーパーを公開しました
NIST(CFS)はサーバーセキュリティ対策のフレームワークの 1つです。 フレームワークに準拠したAWS運用ができているかどうか、確認に役立ちます。
やってみる
実際に NISTの適合パックをデプロイしてみます。 以下手順でデプロイします。 (※ Config記録をOFFとしている場合、有効化してください)
- サービスにリンクされたロールの作成
- S3バケットの作成、バケットポリシーの設定
- 適合パックのデプロイ
サービスにリンクされたロールの作成
公式ガイド どおりに、AWS CLI使ってConfig適合パック用のIAMロールを作成します。
aws iam create-service-linked-role --aws-service-name config-conforms.amazonaws.com --description "my service linked role for config-conforms"
S3バケットの作成、バケットポリシーの設定
Config適合パックに関するデータを保存するためのS3バケットを適当に作成します。 作成した S3バケットにバケットポリシーを追加します。以下 適宜置き換えてください。
- ${AccountId} :: アカウントID
- ${delivery-bucket-name} :: 作成したバケット名
- ${[optional] prefix} :: (オプション) 保存先バケットプレフィクス
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AWSConfigConformsBucketPermissionsCheck", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::${AccountId}:role/aws-service-role/config-conforms.amazonaws.com/AWSServiceRoleForConfigConforms" ] }, "Action": "s3:GetBucketAcl", "Resource": "arn:aws:s3:::${delivery-bucket-name}" }, { "Sid": "AWSConfigConformsBucketDelivery", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::${AccountId}:role/aws-service-role/config-conforms.amazonaws.com/AWSServiceRoleForConfigConforms" ] }, "Action": "s3:PutObject", "Resource": "arn:aws:s3:::${delivery-bucket-name}/${[optional] prefix}/AWSLogs/${AccountId}/Config/*", "Condition": { "StringEquals": { "s3:x-amz-acl": "bucket-owner-full-control" } } }, { "Sid": " AWSConfigConformsBucketReadAccess", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::${AccountId}:role/aws-service-role/config-conforms.amazonaws.com/AWSServiceRoleForConfigConforms" ] }, "Action": "s3:GetObject", "Resource": "arn:aws:s3:::${delivery-bucket-name}/${[optional] prefix}/AWSLogs/${AccountId}/Config/*" } ] }
適合パックのデプロイ
[AWS Config] > [適合パック] の画面にて [適合パックをデプロイする] を選択します。
サンプルテンプレートの選択で [Operational Best Practice for NIST CSF] がありました。 これを選択して [次へ] 行きましょう。
▼ S3バケットに先程作成した S3バケットを指定します(オプション: プレフィクス指定)
▼ 内容を確認して、問題なければ [適合パックをデプロイ] します。
▼ デプロイ直後の画面。 進行中
のステータスになっています。
確認
デプロイされた適合パックは 以下のようなルール構成です。修復アクションは組み込まれていません。
以下、NIST適合パックで展開される Configルール名と説明の日本語訳(DeepL 自動翻訳)を載せます。
ConfigRuleName | Description |
---|---|
AccessKeysRotated | アクティブなアクセスキーが maxAccessKeyAge で指定された日数内にローテーションされているかどうかをチェックします。maxAccessKeyAgeで指定された日数以上、アクセスキーがローテートされていない場合、このルールは違反となる。 |
AcmCertificateExpirationCheck | アカウント内の ACM 証明書が指定された日数内に期限切れとなっているかどうかをチェックします。ACM が提供する証明書は自動的に更新されます。ACMは、インポートした証明書を自動的に更新しません。 |
CloudTrailCloudWatchLogsEnabled | AWS CloudTrailのトレイルがAmazon CloudWatchのログにログを送信するように設定されているかどうかをチェックします。トレイルのCloudWatchLogsLogGroupArnプロパティが空の場合、トレイルは非準拠となります。 |
CloudTrailEnabled | AWSアカウントでAWS CloudTrailが有効になっているかどうかをチェックします。 |
CloudTrailEncryptionEnabled | AWS CloudTrailがサーバーサイド暗号化(SSE)AWS Key Management Service(AWS KMS)カスタマーマスターキー(CMK)暗号化を使用するように設定されているかどうかをチェックします。KmsKeyIdが定義されていればルールに準拠しています。 |
CloudwatchLogGroupEncrypted | Amazon CloudWatch Logsのロググループが暗号化されているかどうかをチェックします。CloudWatch Logsのロググループが暗号化されていない場合、このルールはNON\_COMPLIANTになります。 |
Ec2InstanceManagedBySsm | アカウント内のAmazon EC2インスタンスがAWS Systems Managerで管理されているかどうかを確認します。 |
Ec2InstanceNoPublicIp | Amazon Elastic Compute Cloud (Amazon EC2) インスタンスにパブリック IP アソシエーションがあるかどうかをチェックします。Amazon EC2インスタンスの構成項目にpublicIpフィールドが存在する場合、このルールはNON\_COMPLIANTです。このルールはIPv4にのみ適用されます。 |
Ec2ManagedinstanceAssociationComplianceStatusCheck | インスタンス上でのアソシエーション実行後、AWS Systems ManagerのアソシエーションのコンプライアンスステータスがCOMPLIANTかNON\_COMPLIANTかをチェックします。フィールドステータスがCOMPLIANTの場合、ルールはコンプライアントになります。 |
Ec2SecurityGroupAttachedToEni | デフォルト以外のセキュリティグループが Amazon Elastic Compute Cloud (EC2) インスタンスまたはエラスティックネットワークインターフェース (ENI) にアタッチされているかどうかをチェックします。このルールは、セキュリティグループがEC2インスタンスやENIに関連付けられていない場合、NON\_COMPLIANTを返す。 |
EfsEncryptedCheck | Amazon EFSがAWS KMSを使用してファイルデータを暗号化するように設定されているかどうかをチェックします。DescribeFileSystemsで暗号化キーがFalseに設定されているか、DescribeFileSystemsのKmsKeyIdキーがKmsKeyIdパラメータと一致しない場合、このルールはNON\_COMPLIANTになります。 |
ElasticsearchEncryptedAtRest | Amazon Elasticsearch Service (Amazon ES) ドメインで、残りの部分の設定で暗号化が有効になっているかどうかをチェックします。EncryptionAtRestOptionsフィールドが有効になっていない場合、ルールはNON\_COMPLIANTとなります。 |
ElbAcmCertificateRequired | このルールは、Elastic Load BalancerがAWS Certificate Managerが提供するSSL証明書を使用しているかどうかをチェックします。このルールを使用するには、Elastic Load BalancerでSSLまたはHTTPSリスナーを使用する必要があります。 |
EmrMasterNoPublicIp | Amazon Elastic MapReduce (EMR) クラスターのマスターノードがパブリック IP を持っているかどうかをチェックします。マスターノードにパブリックIPがある場合、ルールはNON\_COMPLIANTとなります。 |
EncryptedVolumes | アタッチ状態のEBSボリュームが暗号化されているかどうかをチェックします。 |
IamGroupHasUsersCheck | IAMグループに少なくとも1人のIAMユーザがいるかどうかをチェックします。 |
IamPasswordPolicy | IAMユーザーのアカウントパスワードポリシーが指定された要件を満たしているかどうかをチェックします。 |
IamPolicyNoStatementsWithAdminAccess | デフォルトバージョンのAWS Identity and Access Management (IAM)ポリシーに管理者アクセス権がないかどうかをチェックします。いずれかのステートメントに "Effect "がある場合 "アクション "で "許可" "Resource "の上に "**"がある場合 "**"の場合、そのルールは非準拠となります。 |
IamRootAccessKeyCheck | ルートユーザーのアクセスキーが利用可能かどうかをチェックします。ユーザーアクセスキーが存在しない場合はルールに準拠します。 |
IamUserGroupMembershipCheck | IAMユーザーが少なくとも1つのIAMグループのメンバーであるかどうかをチェックします。 |
IamUserMfaEnabled | AWS Identity and Access Managementのユーザーが多要素認証(MFA)を有効にしているかどうかをチェックします。 |
IamUserNoPoliciesCheck | IAM ユーザーにポリシーが添付されていないことをチェックします。IAMユーザーは、IAMグループまたはロールから権限を継承する必要があります。 |
IamUserUnusedCredentialsCheck | AWS Identity and Access Management (IAM)のユーザーが、指定した日数内に使用されていないパスワードまたはアクティブなアクセスキーを持っているかどうかをチェックします。 |
IncomingSshDisabled | 使用中のセキュリティグループが無制限の SSH トラフィックの着信を許可していないかどうかをチェックします。 |
InternetGatewayAuthorizedVpcOnly | インターネットゲートウェイ(IGW)が認可されたAmazon Virtual Private Cloud(VPC)にのみ接続されているかどうかをチェックします。IGWが認可されたVPCに接続されていない場合、ルールはNON\_COMPLIANTになります。 |
LambdaFunctionPublicAccessProhibited | Lambda関数ポリシーがパブリックアクセスを禁止しているかどうかをチェックします。 |
MfaEnabledForIamConsoleAccess | コンソールパスワードを使用するすべてのAWS Identity and Access Management (IAM)ユーザーに対してAWS Multi-Factor Authentication (MFA)が有効になっているかどうかをチェックします。MFAが有効になっている場合、ルールは準拠しています。 |
RdsInstancePublicAccessCheck | Amazon Relational Database Service (RDS) インスタンスがパブリックアクセスできないかどうかをチェックします。インスタンス設定項目のpublicAccessibleフィールドがtrueの場合、ルールは非準拠です。 |
RdsSnapshotsPublicProhibited | Amazon Relational Database Service (Amazon RDS) スナップショットが公開されているかどうかをチェックします。既存および新規のAmazon RDSスナップショットが公開されている場合、このルールは非準拠です。 |
RdsStorageEncrypted | RDS DB インスタンスでストレージの暗号化が有効になっているかどうかをチェックします。 |
RedshiftClusterPublicAccessCheck | Amazon Redshift クラスターがパブリックアクセスできないかどうかをチェックします。クラスタ構成項目のpublicAccessibleフィールドがtrueの場合、ルールはNON\_COMPLIANTとなります。 |
RestrictedIncomingTraffic | 使用中のセキュリティグループが、指定したポートへの無制限の着信TCPトラフィックを許可しないようになっているかどうかをチェックします。 |
RootAccountHardwareMfaEnabled | AWSアカウントで多要素認証(MFA)ハードウェアデバイスを使用してルート認証でサインインすることが有効になっているかどうかをチェックします。 |
RootAccountMfaEnabled | AWSアカウントのルートユーザーがコンソールサインインに多要素認証を必要としているかどうかをチェックします。 |
S3AccountLevelPublicAccessBlocks | 必要なパブリックアクセスブロックの設定がアカウントレベルから設定されているかどうかをチェックします。アカウントレベルからパブリックアクセスブロック設定が設定されていない場合、ルールはNON\_COMPLIANTとなります。 |
S3BucketLoggingEnabled | S3バケットのロギングが有効になっているかどうかをチェックします。 |
S3BucketPolicyGranteeCheck | Amazon S3バケットによって付与されたアクセスが、提供するAWSプリンシパル、フェデレートされたユーザー、サービスプリンシパル、IPアドレス、またはVPCのいずれかに制限されているかどうかをチェックします。バケットポリシーが存在しない場合、ルールはCOMPLIANTです。 |
S3BucketPublicReadProhibited | Amazon S3バケットがパブリックリードアクセスを許可していないことをチェックします。ルールは、パブリックアクセスのブロック設定、バケットポリシー、およびバケットアクセス制御リスト (ACL) をチェックします。 |
S3BucketServerSideEncryptionEnabled | Amazon S3 バケットが S3 デフォルトの暗号化を有効にしているか、または S3 バケットポリシーでサーバー側の暗号化なしで put-object リクエストを明示的に拒否しているかをチェックします。 |
S3BucketSslRequestsOnly | S3バケットにSSL(Secure Socket Layer)の使用を要求するポリシーがあるかどうかをチェックします。 |
SagemakerNotebookInstanceKmsKeyConfigured | Amazon SageMaker ノートブックインスタンスに AWS Key Management Service (KMS) キーが設定されているかどうかをチェックします。Amazon SageMaker ノートブックインスタンスに 'KmsKeyId' が指定されていない場合、ルールは NON\_COMPLIANT となります。 |
SagemakerNotebookNoDirectInternetAccess | Amazon SageMaker ノートブック インスタンスでインターネットへの直接アクセスが無効になっているかどうかをチェックします。Amazon SageMakerノートブックインスタンスがインターネットに対応している場合、ルールはNON\_COMPLIANTとなります。 |
SecretsmanagerRotationEnabledCheck | AWS Secret Managerのシークレットでローテーションが有効になっているかどうかをチェックします。maximumAllowedRotationFrequency パラメータが指定されている場合、シークレットの回転頻度が最大許容頻度と比較されます。 |
VpcDefaultSecurityGroupClosed | 任意のAmazon Virtual Private Cloud(VPC)のデフォルトのセキュリティグループが、インバウンドまたはアウトバウンドトラフィックを許可していないかどうかをチェックします。デフォルトのセキュリティグループに 1 つ以上のインバウンドまたはアウトバウンドトラフィックがある場合、このルールは非準拠となります。 |
VpcFlowLogsEnabled | Amazon Virtual Private Cloud のフローログが Amazon VPC で検出され、有効になっているかどうかをチェックします。 |
適合パックの実態はCloudFormationテンプレートです。以下のように CFnスタックが確認できました。
展開したテンプレートは S3バケットに格納されており、また以下 ドキュメントでも確認できます。
おわりに
「NIST CSF 運用のベストプラクティス」Config適合パックの紹介でした。 実際に運用する際は、各ルールのパラメータを確認してスコープの調整が 必要になってきます。 SecurityHub では(2020/06/05時点)まだ対応していない NISTフレームワークによる チェックが可能なので、ぜひセキュリティチェックの手段として検討すると良いと思います。
参考
▼ 適合パックデプロイの準備
▼ 適合パック関連 参考ブログ