[アップデート] Config の適合パックに「NIST CSF 運用のベストプラクティス」が追加されました

適合パックの可能性
2020.06.05

先日のアップデートで 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としている場合、有効化してください)

  1. サービスにリンクされたロールの作成
  2. S3バケットの作成、バケットポリシーの設定
  3. 適合パックのデプロイ

サービスにリンクされたロールの作成

公式ガイド どおりに、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] > [適合パック] の画面にて [適合パックをデプロイする] を選択します。

img

サンプルテンプレートの選択で [Operational Best Practice for NIST CSF] がありました。 これを選択して [次へ] 行きましょう。

img

▼ S3バケットに先程作成した S3バケットを指定します(オプション: プレフィクス指定)

img

▼ 内容を確認して、問題なければ [適合パックをデプロイ] します。

img

▼ デプロイ直後の画面。 進行中 のステータスになっています。

img

確認

デプロイされた適合パックは 以下のようなルール構成です。修復アクションは組み込まれていません。

img

以下、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スタックが確認できました。

img

展開したテンプレートは S3バケットに格納されており、また以下 ドキュメントでも確認できます。

おわりに

「NIST CSF 運用のベストプラクティス」Config適合パックの紹介でした。 実際に運用する際は、各ルールのパラメータを確認してスコープの調整が 必要になってきます。 SecurityHub では(2020/06/05時点)まだ対応していない NISTフレームワークによる チェックが可能なので、ぜひセキュリティチェックの手段として検討すると良いと思います。

参考

▼ 適合パックデプロイの準備

▼ 適合パック関連 参考ブログ