Redshift Serverless の監査ログについて

Redshift Serverless は監査ログ取得をオンにすることで、CloudWatch Logs に監査ログを出力することが可能です。

## 監査ログの種類

監査ログとして取得可能なのは、以下の 3 種類です。

|監査ログの種類|説明|
|:--|:--|
|接続ログ|認証試行、接続、切断をログに記録します。|
|ユーザーログ|データベースのユーザー定義の変更に関する情報をログに記録します。|
|ユーザーアクティビティログ|各クエリをデータベースで実行される前にログに記録します。ユーザーアクティビティログについては、監査ログ設定の他、データベースパラメータ `enable_user_activity_logging` も有効にする必要がありますが、Redshift Serverless 名前空間作成時、もしくは既存の名前空間の変更でユーザーアクティビティログ有効化時に自動で有効化されます。|

各種ログの詳細は以下ドキュメントを参照ください。

https://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/serverless-audit-logging.html

監査ログは CloudWatch Logs に出力されますが、Redshift Serverless に付与する IAM ロールには CloudWatch Logs へのアクセス権限を明示的に付与しなくても、監査ログは CloudWatch Logs に作成されます。

>生成されたログデータを Amazon CloudWatch Logs にエクスポートするには、コンソールの Amazon Redshift Serverless 設定で、エクスポート対象のログを選択する必要があります。


## 検証1 拡張された VPC のルーティングが【オフ】の場合
Redshift Serverless ワークグループで拡張された VPC のルーティングがオフの状態で監査ログを有効化してみます。
拡張された VPC のルーティングについては以下のブログをご参照ください。

https://blog.serverworks.co.jp/about-redshift-enhanced-vpc-routing

VPC 、サブネット、ルートテーブル、セキュリティグループ、IAM ロールは事前に作成しておきます。
今回、監査ログ記録を試すだけなので IAM ロールに許可ポリシー（ID ベースのポリシー）は設定していません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/70edd09b-dcc5-a560-020c-cf943ca1dc69.png)

Redshift Serverless は AWS CLI で作成します。

名前空間の作成
[create-namespace — AWS CLI 2.8.4 Command Reference](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/redshift-serverless/create-namespace.html)
```
aws redshift-serverless create-namespace \
  --admin-user-password xxxxxxxxxxxx \
  --admin-username rsadmin \
  --db-name dev1 \
  --iam-roles "arn:aws:iam::123456789012:role/redshift-serverless-role" \
  --log-exports "useractivitylog" "userlog" "connectionlog" \
  --namespace-name redshift-demo-ns1 \
  --tags key=Name,value=redshift-demo-ns1
```
`--log-exports` オプションで、出力する監査ログを指定しています。
実行結果
```
[cloudshell-user@ip-10-0-182-253 ~]$ aws redshift-serverless create-namespace \
>   --admin-user-password Serverw0rk$ \
>   --admin-username rsadmin \
>   --db-name dev1 \
>   --iam-roles "arn:aws:iam::123456789012:role/redshift-serverless-role" \
>   --log-exports "useractivitylog" "userlog" "connectionlog" \
>   --namespace-name redshift-demo-ns1 \
>   --tags key=Name,value=redshift-demo-ns1
{
    "namespace": {
        "adminUsername": "rsadmin",
        "creationDate": "2022-11-20T10:02:40.580000+00:00",
        "dbName": "dev1",
        "iamRoles": [
            "arn:aws:iam::123456789012:role/redshift-serverless-role"
        ],
        "kmsKeyId": "AWS_OWNED_KMS_KEY",
        "logExports": [
            "connectionlog",
            "useractivitylog",
            "userlog"
        ],
        "namespaceArn": "arn:aws:redshift-serverless:ap-northeast-1:123456789012:namespace/a1a1c693-8a07-4d51-9967-d123d617757d",
        "namespaceId": "a1a1c693-8a07-4d51-9967-d123d617757d",
        "namespaceName": "redshift-demo-ns1",
        "status": "AVAILABLE"
    }
}
[cloudshell-user@ip-10-0-182-253 ~]$
```

ワークグループの作成
[create-workgroup — AWS CLI 2.8.4 Command Reference](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/redshift-serverless/create-workgroup.html)
```
aws redshift-serverless create-workgroup \
   --base-capacity 32 \
   --namespace-name redshift-demo-ns1 \
   --security-group-ids "sg-03a96ec6d1036cda2" \
   --subnet-ids "subnet-021ec730242bbc555" "subnet-0429e9a0cc658de6e" "	subnet-00ace4894f695d5e6" \
   --tags key=Name,value=redshift-demo-workgp1 \
   --workgroup-name redshift-demo-workgp1
```
実行結果
```
[cloudshell-user@ip-10-0-182-253 ~]$ aws redshift-serverless create-workgroup \
>    --base-capacity 32 \
>    --namespace-name redshift-demo-ns1 \
>    --security-group-ids "sg-03a96ec6d1036cda2" \
>    --subnet-ids "subnet-021ec730242bbc555" "subnet-0429e9a0cc658de6e" "subnet-00ace4894f695d5e6" \
>    --tags key=Name,value=redshift-demo-workgp1 \
>    --workgroup-name redshift-demo-workgp1
{
    "workgroup": {
        "baseCapacity": 32,
        "configParameters": [
            {
                "parameterKey": "auto_mv",
                "parameterValue": "true"
            },
            {
                "parameterKey": "datestyle",
                "parameterValue": "ISO, MDY"
            },
            {
                "parameterKey": "enable_case_sensitive_identifier",
                "parameterValue": "false"
            },
            {
                "parameterKey": "enable_user_activity_logging",
                "parameterValue": "true"
            },
            {
                "parameterKey": "query_group",
                "parameterValue": "default"
            },
            {
                "parameterKey": "search_path",
                "parameterValue": "$user, public"
            },
            {
                "parameterKey": "max_query_execution_time",
                "parameterValue": "14400"
            }
        ],
        "creationDate": "2022-11-20T10:02:54.144000+00:00",
        "endpoint": {
            "address": "redshift-demo-workgp1.123456789012.ap-northeast-1.redshift-serverless.amazonaws.com",
            "port": 5439
        },
        "enhancedVpcRouting": false,
        "namespaceName": "redshift-demo-ns1",
        "publiclyAccessible": false,
        "securityGroupIds": [
            "sg-03a96ec6d1036cda2"
        ],
        "status": "CREATING",
        "subnetIds": [
            "subnet-021ec730242bbc555",
            "subnet-0429e9a0cc658de6e",
            "subnet-00ace4894f695d5e6"
        ],
        "workgroupArn": "arn:aws:redshift-serverless:ap-northeast-1:123456789012:workgroup/18338ffb-f280-46cf-a43f-006db60fb86d",
        "workgroupId": "18338ffb-f280-46cf-a43f-006db60fb86d",
        "workgroupName": "redshift-demo-workgp1"
    }
}
[cloudshell-user@ip-10-0-182-253 ~]$ 
```

作成された名前空間の [セキュリティと暗号化] タブを見ると、監査ログ記録がオンになっており、エクスポートされたログに 3 種類のログが表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/3897d726-d941-5b60-f067-a20e71503868.png)

CloudWatch Logs を見ると、該当の名前空間に対応する CloudWatch Logs が表示されていることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/ffce28f6-5909-1b93-97c8-98c36c645296.png)

ログイベントを見ると、ログが出力されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/f32a546c-366a-289e-167a-da7f87d8230c.png)


デフォルトではロググループの保持期間が「失効しない」になっています。要件にあわせて保持期間を変更するようにしてください。
今回は保持期間を以下の AWS CLI コマンドで 7 日間に変更します。

[put-retention-policy — AWS CLI 2.8.4 Command Reference](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/logs/put-retention-policy.html)
```
aws logs put-retention-policy \
  --log-group-name "/aws/redshift/redshift-demo-ns1/connectionlog" \
  --retention-in-days 7
```
```
aws logs put-retention-policy \
  --log-group-name "/aws/redshift/redshift-demo-ns1/useractivitylog" \
  --retention-in-days 7
```
```
aws logs put-retention-policy \
  --log-group-name "/aws/redshift/redshift-demo-ns1/userlog" \
  --retention-in-days 7
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/98462449-3dc8-d1ee-df40-4f96357313eb.png)

## 検証2 拡張された VPC のルーティングが【オン】の場合
Redshift Serverless ワークグループで拡張された VPC のルーティングをオンにして監査ログを有効化してみます。なぜ検証しようと思ったかというと、CloudWatch Logs にログを出力するのに VPC エンドポイントが必要なのかどうか気になったからです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/7634c058-c819-67a4-509b-b4503c30c737.png)

Redshift Serverless は AWS CLI で作成します。

名前空間の作成
```
aws redshift-serverless create-namespace \
  --admin-user-password xxxxxxxxxxxx \
  --admin-username rsadmin \
  --db-name dev2 \
  --iam-roles "arn:aws:iam::123456789012:role/redshift-serverless-role" \
  --log-exports "useractivitylog" "userlog" "connectionlog" \
  --namespace-name redshift-demo-ns2 \
  --tags key=Name,value=redshift-demo-ns2
```
`--log-exports` オプションで、出力する監査ログを指定しています。
実行結果
```
[cloudshell-user@ip-10-0-182-253 ~]$ aws redshift-serverless create-namespace \
>   --admin-user-password Serverw0rk$ \
>   --admin-username rsadmin \
>   --db-name dev2 \
>   --iam-roles "arn:aws:iam::123456789012:role/redshift-serverless-role" \
>   --log-exports "useractivitylog" "userlog" "connectionlog" \
>   --namespace-name redshift-demo-ns2 \
>   --tags key=Name,value=redshift-demo-ns2
{
    "namespace": {
        "adminUsername": "rsadmin",
        "creationDate": "2022-11-20T10:57:31.907000+00:00",
        "dbName": "dev2",
        "iamRoles": [
            "arn:aws:iam::123456789012:role/redshift-serverless-role"
        ],
        "kmsKeyId": "AWS_OWNED_KMS_KEY",
        "logExports": [
            "connectionlog",
            "useractivitylog",
            "userlog"
        ],
        "namespaceArn": "arn:aws:redshift-serverless:ap-northeast-1:123456789012:namespace/ea37a72a-c83e-4d5e-8d9c-2f4b084a2353",
        "namespaceId": "ea37a72a-c83e-4d5e-8d9c-2f4b084a2353",
        "namespaceName": "redshift-demo-ns2",
        "status": "AVAILABLE"
    }
}
[cloudshell-user@ip-10-0-182-253 ~]$
```

ワークグループの作成
```
aws redshift-serverless create-workgroup \
   --base-capacity 32 \
   --namespace-name redshift-demo-ns2 \
   --security-group-ids "sg-03a96ec6d1036cda2" \
   --subnet-ids "subnet-021ec730242bbc555" "subnet-0429e9a0cc658de6e" "	subnet-00ace4894f695d5e6" \
   --tags key=Name,value=redshift-demo-workgp2 \
   --workgroup-name redshift-demo-workgp2
```
実行結果
```
[cloudshell-user@ip-10-0-182-253 ~]$ aws redshift-serverless create-workgroup \
>    --base-capacity 32 \
>    --enhanced-vpc-routing \
>    --namespace-name redshift-demo-ns2 \
>    --security-group-ids "sg-03a96ec6d1036cda2" \
>    --subnet-ids "subnet-021ec730242bbc555" "subnet-0429e9a0cc658de6e" "subnet-00ace4894f695d5e6" \
>    --tags key=Name,value=redshift-demo-workgp2 \
>    --workgroup-name redshift-demo-workgp2
{
    "workgroup": {
        "baseCapacity": 32,
        "configParameters": [
            {
                "parameterKey": "auto_mv",
                "parameterValue": "true"
            },
            {
                "parameterKey": "datestyle",
                "parameterValue": "ISO, MDY"
            },
            {
                "parameterKey": "enable_case_sensitive_identifier",
                "parameterValue": "false"
            },
            {
                "parameterKey": "enable_user_activity_logging",
                "parameterValue": "true"
            },
            {
                "parameterKey": "query_group",
                "parameterValue": "default"
            },
            {
                "parameterKey": "search_path",
                "parameterValue": "$user, public"
            },
            {
                "parameterKey": "max_query_execution_time",
                "parameterValue": "14400"
            }
        ],
        "creationDate": "2022-11-20T10:57:41.155000+00:00",
        "endpoint": {
            "address": "redshift-demo-workgp2.123456789012.ap-northeast-1.redshift-serverless.amazonaws.com",
            "port": 5439
        },
        "enhancedVpcRouting": true,
        "namespaceName": "redshift-demo-ns2",
        "publiclyAccessible": false,
        "securityGroupIds": [
            "sg-03a96ec6d1036cda2"
        ],
        "status": "CREATING",
        "subnetIds": [
            "subnet-021ec730242bbc555",
            "subnet-0429e9a0cc658de6e",
            "subnet-00ace4894f695d5e6"
        ],
        "workgroupArn": "arn:aws:redshift-serverless:ap-northeast-1:123456789012:workgroup/e6992912-a138-48c5-9937-bcd8e7029135",
        "workgroupId": "e6992912-a138-48c5-9937-bcd8e7029135",
        "workgroupName": "redshift-demo-workgp2"
    }
}
[cloudshell-user@ip-10-0-182-253 ~]$
```
作成された名前空間の [セキュリティと暗号化] タブを見ると、監査ログ記録がオンになっており、エクスポートされたログに 3 種類のログが表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/79db90fc-a437-aabd-883b-efa033fb9056.png)

CloudWatch Logs を見ると、該当の名前空間に対応する CloudWatch Logs が表示されていることが分かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/b321ebd7-1d9c-8e2d-f064-ffb305ecffd5.png)
ログイベントを見ると、ログが出力されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1723719/77969c3c-daf0-3e1c-345a-768bf0bf755e.png)

拡張された VPC のルーティングがオンの状態で CloudWatch Logs 用の VPC エンドポイントが無くても、監査ログが CloudWatch Logs に記録されることが分かりました。

## 参考
https://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/serverless-audit-logging.html

https://docs.aws.amazon.com/ja_jp/redshift/latest/mgmt/db-auditing.html

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/cloudwatch-logs-and-interface-VPC.html