CIS AWS Foundations Benchmark v1.3.0 の変更点

## はじめに
2020/8/7 に CIS AWS Foundations Benchmark が v1.3.0 に更新されたため、
2018年にリリースされた v1.2.0 からの変更点を確認しました。
項目レベルの変更点で、参照ドキュメント追加などの細かなアップデートは除きます。

### CIS AWS Foundations Benchmark とは
米国の非営利団体である CIS (Center for Internet Secuirty) が公開している
AWS アカウントの基本的なセキュリティを実装するための技術的なベストプラクティスです。
CIS は 各種 OS、サーバー、クラウド環境などを強化するためのガイドラインとして
140 以上の CIS Benchmark を発行されており、PCI DSS などのコンプライアンス要件で
業界標準のベストプラクティスとの記載があった場合などに参照されます。

CIS AWS Foundations Benchmark は CIS のサイトから PDF 形式でダウンロードできます。
ライセンスは CC BY-NC-SA (Creative Commons Attribution-NonCommercial-ShareAlike) です。

https://www.cisecurity.org/benchmark/amazon_web_services/

以降の項目名以外の記載は私の私見や所感などを含むもので、CIS Benchmark 記載の
内容ではありませんのでご注意ください。
完全な内容は CIS AWS Foundations Benchmark v1.3.0 の PDF をご参照ください。
参照ドキュメント等の変更も含む、すべての Change History が記載されています。

## Assessment Status
ベンチマークの各項目には以下の Assessment Status (評価ステータス) が含まれています。

**Automated:**
このステータスは準拠状況の評価を完全に自動化できることを表します。

**Manual:**
このステータスは準拠状況の評価を完全に自動化することができず、一部またはすべてに
手動による確認が必要となることを表します。

これらのステータスは v1.2.0 における Scoring Information (Scored/Not Scored) が
置き換えられたものです。
AWS Foundations Benchmark に限らず、他の CIS Benchmark でも同様の変更が行われています。

## 1 Identity and Access Management
### 新たに追加された項目
5 項目が新たに追加されています。

**1.13 Ensure there is only one active access key available for any single IAM user (Automated)**
参考訳: 単一の IAM ユーザーに対して利用可能なアクティブなアクセスキーは 1 つだけであることを確認する

IAM ユーザー毎に最大2つまでアクセスキーを発行できますが、これはキーのローテーションに
使用すべきもので、常に複数のキーが有効な状態を許可すべきではありません。

**1.19 Ensure that all the expired SSL/TLS certificates stored in AWS IAM are removed (Automated)**
参考訳: AWS IAM に保存されている有効期限切れの SSL/TLS 証明書をすべて削除することを確認する

サーバー証明書の保存とデプロイに対応したサービスとして、ACM と IAM が存在しますが、
ACM がサポートされていないリージョンを除いて、 IAM を証明書マネージャーとして
使用することは推奨されていません。

https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_server-certs.html

IAM を証明書マネージャーとして使用している場合には、失効した SSL/TLS 証明書が
すべて削除されていることを確認する必要があります。

**1.20 Ensure that S3 Buckets are configured with 'Block public access (bucket settings)' (Automated)**
参考訳: S3 バケットが「パブリックアクセスをブロックする (バケット設定)」に設定されていることを確認する

ブロックパブリックアクセスはアカウントレベルの設定とバケットレベルの設定があります。
どちらか、あるいは両方の設定を行うかはデータの機密性やユースケース等に基づいて
組織的に判断すべき内容です。

ベンチマーク内では監査、是正手順についてどちらも両方の手法が記載されています。

**1.21 Ensure that IAM Access analyzer is enabled (Automated)**
参考訳: IAM Access analyzer が有効になっていることを確認する

IAM Access Analyzer を使用すると、外部エンティティ (別アカウントのユーザーやロール、
AWS サービス等) と共有されている S3 バケットや IAM ロール、KMS キーなどのリソースを
識別できるため、意図しないアクセスを特定できます。

IAM Access Analyzer はリージョナルサービスであるため、アカウント内のすべての
環境を分析するには対象のリソースを使用している各リージョンで
アナライザーを有効化する必要があります。

**1.22 Ensure IAM users are managed centrally via identity federation or AWS Organizations for multi-account environments (Manual)**
参考訳: マルチアカウント環境の場合、IAM ユーザを ID フェデレーションまたは AWS Organizations を介して一元管理するようにする

マルチアカウント環境では外部 IdP や AWS Organization を利用し、
IAM ユーザーの管理を一元化することで複雑さを軽減することができます。

### 削除された項目
※ v1.2.0 における項目番号です

* 1.5 Ensure IAM password policy requires at least one uppercase letter
* 1.6 Ensure IAM password policy require at least one lowercase letter
* 1.7 Ensure IAM password policy require at least one symbol
* 1.8 Ensure IAM password policy require at least one number
* 1.11 Ensure IAM password policy expires passwords within 90 days or less

パスワードに関連する推奨項目が多く削除されているのは
CIS / DISA のガイダンスに一致させるようにするためのようです。

### 変更があった項目
**1.7 Eliminate use of the root user for administrative and daily tasks (Automated)**

v1.2.0 の 1.1 Avoid the use of the "root" account から項目名が変更されています。

**1.15 Ensure IAM Users Receive Permissions Only Through Groups (Automated)**

v1.2.0 の 1.16 Ensure IAM policies are attached only to groups or roles から
項目名が変更されています。
また対象にインラインポリシーを含むよう監査手順が変更されています。

**1.16 Ensure IAM policies that allow full "*:*" administrative privileges are not attached (Automated)**

v1.2.0 の 1.22 Ensure IAM policies that allow full "*:*" administrative privileges are not created 
がアタッチされているポリシーのみを監査対象とするように変更され
項目名もそれに合わせて変更されました。

上記以外の既存の項目についても項番の順序が細かく入れ替わっていますが、詳細は割愛します。

## 2 Storage
ストレージに関連する推奨項目が 2 Storage として新規追加され、
以降の Logging, Monitoring, Networking は一つずつ項番がずれています

**2.1.1 Ensure all S3 buckets employ encryption-at-rest (Manual)**
参考訳: すべての S3 バケットに保存時の暗号化が採用されていることを確認する

バケットのデフォルト暗号化設定が AES-256 または AWS-KMS であることを確認します。

**2.1.2 Ensure S3 Bucket Policy allows HTTPS requests (Manual)**
参考訳: S3 バケットポリシーが HTTPS リクエストを許可していることを確認する

以下のようなバケットポリシーを適用してオブジェクトへのアクセスを
HTTPS 経由でのみ許可し、HTTP リクエストを明示的に拒否する必要があります。

```json
    {
        "Sid": "<optional>",
        "Effect": "Deny",
        "Principal": "*",
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::<bucket_name>/*",
        "Condition": {
            "Bool": {
                "aws:SecureTransport": "false"
            }
        }
    }
```

**2.2.1 Ensure EBS volume encryption is enabled (Manual)**
参考訳: EBS ボリュームの暗号化が有効になっていることを確認する

EBS 暗号化機能をオプトインし、すべての新しい EBS ボリュームとスナップショットについて
デフォルトの暗号化が有効になるように設定します。

デフォルト暗号化設定を変更しても、既存のボリュームには影響しません。
またデフォルト暗号化を有効にすると、暗号化をサポートしていない
旧世代のインスタンスタイプを起動できなくなります。
(C3、cr1.8xlarge、G2、I2、M3、およびR3 を除く)


## 3 Logging
### 新たに追加された項目
**3.10 Ensure that Object-level logging for write events is enabled for S3 bucket (Automated)**
参考訳: S3 バケットの書き込みイベントのオブジェクトレベルロギングが有効になっていることを確認する

**3.11 Ensure that Object-level logging for read events is enabled for S3 bucket (Automated)**
参考訳: S3 バケットの読み取りイベントのオブジェクトレベルロギングが有効になっていることを確認する

CloudTrail のオブジェクトレベルロギングに関する項目が追加されています。
証跡のデフォルト設定では GetObject や DeleteObject などのデータイベントを記録しないため
S3 バケットに対してオブジェクトレベルのロギングを有効にすることが推奨されます。

## 4 Monitoring
### 新たに追加された項目
**4.15 Ensure a log metric filter and alarm exists for AWS Organizations changes (Automated)**
参考訳: AWS Organizationsの変更に対してログメトリックフィルタとアラームが存在することを確認する

AWS Organizations 内の予期せぬ変更をモニタリングすることで不要な変更を
発見、修正することができます。以下のフィルタパターンでメトリクスフィルタを設定し、
有効な SNS Topic にサブスクライブします。

```
{ ($.eventSource = organizations.amazonaws.com) && (($.eventName = "AcceptHandshake")  ||
 ($.eventName = "AttachPolicy")  || ($.eventName = "CreateAccount") ||
 ($.eventName = "CreateOrganizationalUnit") || ($.eventName= "CreatePolicy") ||
 ($.eventName = "DeclineHandshake") || ($.eventName = "DeleteOrganization") ||
 ($.eventName = "DeleteOrganizationalUnit") || ($.eventName = "DeletePolicy") ||
 ($.eventName = "DetachPolicy") || ($.eventName = "DisablePolicyType") ||
 ($.eventName = "EnablePolicyType") || ($.eventName = "InviteAccountToOrganization") ||
 ($.eventName = "LeaveOrganization") || ($.eventName = "MoveAccount") ||
 ($.eventName = "RemoveAccountFromOrganization") || ($.eventName = "UpdatePolicy") ||
 ($.eventName ="UpdateOrganizationalUnit")) }
```

### 変更があった項目
**4.1 Ensure a log metric filter and alarm exist for unauthorized API calls (Automated)**

HeadBucketイベントを除外するようにメトリクスフィルタのフィルタパターンが変更されています。

```
{ ($.errorCode = "*UnauthorizedOperation") || ($.errorCode = "AccessDenied*") ||
 ($.sourceIPAddress!="delivery.logs.amazonaws.com") || ($.eventName!="HeadBucket") }
```

**4.2 Ensure a log metric filter and alarm exist for Management Console sign-in without MFA (Automated)**

SSO 環境下を考慮したフィルタパターンが追加されています。

```
{ ($.eventName = "ConsoleLogin") && ($.additionalEventData.MFAUsed != "Yes") &&
 ($.userIdentity.type = "IAMUser") && ($.responseElements.ConsoleLogin = "Success") }
```

## 5 Networking
### 新たに追加された項目
**5.1 Ensure no Network ACLs allow ingress from 0.0.0.0/0 to remote server administration ports (Automated)**
参考訳: ネットワーク ACL が 0.0.0.0/0 からリモートサーバー管理ポートへの侵入を許可しないようにする

22番ポート (SSH) や 3389 番ポート (RDP) などのリモートサーバ管理ポートへの
パブリックアクセスは Attack Surface (攻撃対象領域) を不必要に増加させるため
無制限アクセスを許可しないように設定します。

### 変更があった項目
**5.2 Ensure no security groups allow ingress from 0.0.0.0/0 to remote server administration ports (Automated)**

v1.2.0 の
4.1 Ensure no security groups allow ingress from 0.0.0.0/0 to port 22 と
4.2 Ensure no security groups allow ingress from 0.0.0.0/0 to port 3389
が統合されて、1つの項目になりました。

## AWS Security Hub の対応状況
2020年10月末時点で、Security Hub の セキュリティ標準機能では
CIS AWS Foundations Benchmark v1.3.0 に準拠したルールでのチェックに対応していません。

## 参考
**CIS Benchmarks September 2020 Update**
https://www.cisecurity.org/blog/cis-benchmarks-september-2020-update/

以上です。
参考なれば幸いです。