[アップデート] Amazon Redshiftの監査ログをCloudWatch Logsに出力できるようになりました

Amazon Redshiftの監査ログをCloudWatch Logsに出力できるようになったアツいアップデートです
2022.04.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Amazon Redshiftの監査ログを気軽に見たい

こんにちは、のんピ(@non____97)です。

皆さんはAmazon Redshiftの監査ログを気軽に見たいと思ったことはありますか? 私はあります。

Redshiftクラスターの監査ログはS3バケットに出力可能ですが、出力されるまで1時間ほど時間がかかっていました。

今回、Amazon Redshiftの監査ログ機能が拡張され、S3バケットのログ配信の時間が短くなりました。

加えて、CloudWatch Logsに各種ログを出力できるようになりました。

これはアツイ

APIにも反映されていますね。

早速試してみたので、こちらのアップデートを紹介します。

Amazon Redshiftの監査ログについては以下AWS公式ドキュメントをご覧ください。

やってみた

Redshiftクラスターの作成

Redshiftクラスターの作成からやっていきます。

作成時のパラメータはほぼデフォルトです。なんとなくノードタイプはra3.xplusにしてみました。

クラスター設定

後でクエリを実行したいので、サンプルデータをロードします。管理者ユーザー名はデフォルトのままです。

サンプルデータとデータベース設定

特に他のAWSリソースにはアクセスしないので、IAMロールの関連付けは行いません。

クラスターの許可

クラスター作成時には監査ログの設定はできなかったので追加設定はデフォルトのままで、クラスターを作成をクリックします。

追加設定

Redshiftクラスターの作成が開始されます。

Redshiftクラスターの作成開始

S3バケットへの監査ログ出力

それでは、S3バケットへの監査ログ出力確認から行います。

作成したRedshiftクラスターのプロパティタブを確認すると、監査ログ記録無効となっています。監査ログをS3に出力するために、編集-監査ログを編集をクリックします。

デフォルトの監査ログ記録の確認

監査ログ記録を設定無効化になっています。

監査ログ記録を設定が無効化状態

こちらを有効化に変更します。今回は新しいバケットを作成し、そこに出力するようにしました。なお、プレフィックスは必須なので今回はRedshiftクラスター名にしました。

監査ログ記録を有効化に変更

Query EditorからRedshiftクラスターに接続し、適当にクエリを実行すると数分後にはS3バケットに接続ログとユーザーログが出力されていました。

S3バケットに出力した監査ログの確認

これはかなりログ出力が早くなりましたね。

CloudWatch Logsへの監査ログ出力

次にCloudWatch Logsへ監査ログを出力してみます。

2022/4/20 15時時点ではマネージメントコンソールからCloudWatch Logsへ監査ログを出力する設定変更は対応していないようでした。

AWS CLIでは既にCloudWatch Logsへ監査ログを出力する設定変更ができそうなので、AWS CLIを使用して設定変更します。

ただし、2022/4/20 15時時点のAWS CLI v2はCloudWatch Logsへ監査ログを出力する設定変更ができないので、AWS CLI v1を使う必要があります。

CloudShellにインストールされているAWS CLIはv2なので、以下のようにv1も使えるようにします。

# AWS CLIのバージョン確認
$ aws --version
aws-cli/2.5.4 Python/3.9.11 Linux/4.14.268-205.500.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off

# Pythonのバージョン確認
$ python3 -V
Python 3.7.10

# AWS CLI v1を動作させる仮想環境を作成
$ python3 -m venv ~/aws-cli-v1

# 仮想環境の作成を確認
$ cd aws-cli-v1/
$ ls -l
total 16
drwxrwxr-x 2 cloudshell-user cloudshell-user 4096 Apr 20 02:43 bin
drwxrwxr-x 2 cloudshell-user cloudshell-user 4096 Apr 20 02:42 include
drwxrwxr-x 3 cloudshell-user cloudshell-user 4096 Apr 20 02:42 lib
lrwxrwxrwx 1 cloudshell-user cloudshell-user    3 Apr 20 02:42 lib64 -> lib
-rw-rw-r-- 1 cloudshell-user cloudshell-user   70 Apr 20 02:42 pyvenv.cfg

# 仮想環境へ移動
$ source ~/aws-cli-v1/bin/activate

# 仮想環境上でAWS CLI v1をインストール
(aws-cli-v1) $ pip install awscli --upgrade
Collecting awscli
  Downloading awscli-1.22.98-py3-none-any.whl (3.8 MB)
     |████████████████████████████████| 3.8 MB 35.5 MB/s 
Collecting s3transfer<0.6.0,>=0.5.0
  Downloading s3transfer-0.5.2-py3-none-any.whl (79 kB)
     |████████████████████████████████| 79 kB 2.0 MB/s 
Collecting docutils<0.16,>=0.10
  Downloading docutils-0.15.2-py3-none-any.whl (547 kB)
     |████████████████████████████████| 547 kB 41.0 MB/s 
Collecting colorama<0.4.4,>=0.2.5
  Downloading colorama-0.4.3-py2.py3-none-any.whl (15 kB)
Collecting PyYAML<5.5,>=3.10
  Downloading PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl (636 kB)
     |████████████████████████████████| 636 kB 44.2 MB/s 
Collecting rsa<4.8,>=3.1.2
  Downloading rsa-4.7.2-py3-none-any.whl (34 kB)
Collecting botocore==1.24.43
  Downloading botocore-1.24.43-py3-none-any.whl (8.7 MB)
     |████████████████████████████████| 8.7 MB 44.9 MB/s 
Collecting pyasn1>=0.1.3
  Downloading pyasn1-0.4.8-py2.py3-none-any.whl (77 kB)
     |████████████████████████████████| 77 kB 6.1 MB/s 
Collecting urllib3<1.27,>=1.25.4
  Downloading urllib3-1.26.9-py2.py3-none-any.whl (138 kB)
     |████████████████████████████████| 138 kB 63.8 MB/s 
Collecting jmespath<2.0.0,>=0.7.1
  Downloading jmespath-1.0.0-py3-none-any.whl (23 kB)
Collecting python-dateutil<3.0.0,>=2.1
  Downloading python_dateutil-2.8.2-py2.py3-none-any.whl (247 kB)
     |████████████████████████████████| 247 kB 21.4 MB/s 
Collecting six>=1.5
  Downloading six-1.16.0-py2.py3-none-any.whl (11 kB)
Installing collected packages: urllib3, jmespath, six, python-dateutil, botocore, s3transfer, docutils, colorama, PyYAML, pyasn1, rsa, awscli
Successfully installed PyYAML-5.4.1 awscli-1.22.98 botocore-1.24.43 colorama-0.4.3 docutils-0.15.2 jmespath-1.0.0 pyasn1-0.4.8 python-dateutil-2.8.2 rsa-4.7.2 s3transfer-0.5.2 six-1.16.0 urllib3-1.26.9
WARNING: You are using pip version 20.1.1; however, version 22.0.4 is available.
You should consider upgrading via the '/home/cloudshell-user/aws-cli-v1/bin/python3 -m pip install --upgrade pip' command.

# AWS CLIのバージョン確認
(aws-cli-v1) $ aws --version
aws-cli/1.22.98 Python/3.7.10 Linux/4.14.268-205.500.amzn2.x86_64 exec-env/CloudShell botocore/1.24.43

AWS CLI v1のインストールが完了したら、describe-logging-statusで現在の監査ログの設定を確認します。

(aws-cli-v1) $ aws redshift describe-logging-status \
>   --cluster-identifier redshift-cluster-1
{
    "LoggingEnabled": true,
    "BucketName": "redshift-auditlog-test",
    "S3KeyPrefix": "redshift-cluster-1/",
    "LastSuccessfulDeliveryTime": "2022-04-20T04:27:19.859Z"
}

S3バケットに監査ログを出力するように設定されていることが確認できました。

それでは、enable-loggingでCloudWatch Logsに監査ログを出力するようにしてあげます。今回は設定できる全てのログ(接続ログ、ユーザーログ、ユーザーアクティビティログ)を出力するようにしました。

# 監査ログの設定変更
(aws-cli-v1) $ aws redshift enable-logging \
>   --cluster-identifier redshift-cluster-1 \
>   --log-destination-typ cloudwatch \
>   --log-exports "connectionlog" "userlog" "useractivitylog"
{
    "LoggingEnabled": true,
    "LastSuccessfulDeliveryTime": "2022-04-20T04:27:19.859Z",
    "LogDestinationType": "cloudwatch",
    "LogExports": [
        "connectionlog",
        "useractivitylog",
        "userlog"
    ]
}

# 監査ログの設定内容確認
(aws-cli-v1) $ aws redshift describe-logging-status \
>   --cluster-identifier redshift-cluster-1
{
    "LoggingEnabled": true,
    "LastSuccessfulDeliveryTime": "2022-04-20T04:27:19.859Z",
    "LogDestinationType": "cloudwatch",
    "LogExports": [
        "connectionlog",
        "useractivitylog",
        "userlog"
    ]
}

マネージメントコンソールから監査ログの設定を確認すると、有効となっていました。どんな種類のログを出力するかはまだコンソールからは確認できないようですね。

CloudWatch Logsに監査ログを出力するように設定変更した状態

CloudWatch Logsを確認すると、/aws/redshift/cluster/redshift-cluster-1/connectionlogという接続ログのロググループが作成されていました。

接続ログを確認すると、確かに接続する際のログが出力されていました。

authenticated |Wed, 20 Apr 2022 04:36:17:053|::1 |58136 |1073971680|dev |IAM:awsuser |IAM AssumeUser |0|TLSv1.2 |ECDHE-RSA-AES256-GCM-SHA384 |0| | |c0b85787-6830-4f02-89ad-614fa55268ec | |Linux 4.14.268-205.500.amzn2.x86_64 amd64 |Redshift JDBC Driver 2.1.0.4 | |3|e07ae658-29e6-440e-995d-8f6776dbfaca 

initiating session |Wed, 20 Apr 2022 04:36:17:053|::1 |58136 |1073971680|dev |IAM:awsuser |IAM AssumeUser |0|TLSv1.2 |ECDHE-RSA-AES256-GCM-SHA384 |0| | |c0b85787-6830-4f02-89ad-614fa55268ec | |Linux 4.14.268-205.500.amzn2.x86_64 amd64 |Redshift JDBC Driver 2.1.0.4 | |3|e07ae658-29e6-440e-995d-8f6776dbfaca 

set application_name |Wed, 20 Apr 2022 04:36:17:780|::1 |58136 |1073971680|dev |IAM:awsuser |IAM AssumeUser |793783|TLSv1.2 |ECDHE-RSA-AES256-GCM-SHA384 |0| | |c0b85787-6830-4f02-89ad-614fa55268ec |Amazon Redshift Query Editor V2 - AROA6KUFAVPUZTMI6DMFH:cm-yamamoto.ryota |Linux 4.14.268-205.500.amzn2.x86_64 amd64 |Redshift JDBC Driver 2.1.0.4 | |1|e07ae658-29e6-440e-995d-8f6776dbfaca

接続ログの確認

次にユーザーアクティビティログを確認します。

デフォルトのパラメータグループではユーザーアクティビティログを出力する設定になっていません。そこで、ユーザーアクティビティログを出力するようにパラメータグループを変更する必要があります。

今回はデフォルトのパラメータグループを編集することはできないので、新規にパラメータグループを作成して、それをRedshiftクラスターに関連付けます。

Amazon Redshiftのコンソールから設定-ワークロード管理-作成をクリックします。

パラメータグループの作成

適当な名前と説明を入力して作成をクリックします。

新しいパラメータグループの入力

作成したパラメータグループでパラメータを編集をクリックします。

パラメータを編集

ユーザーアクティビティログを出力するためにenable_user_activity_loggingtrueに変更して、保存をクリックします。

enable_user_activity_loggingをtrueに変更

enable_user_activity_loggingtrueになったことを確認します。

enable_user_activity_loggingがtrueになったことを確認

作成したパラメータグループをRedshiftクラスターに関連付けます。

Redshiftクラスターのプロパティタブから編集-パラメータグループを編集をクリックします。

そして、作成したパラメータグループを選択して、変更を保存をクリックします。

パラメータグループを編集

しばらくすると再起動を促されます。

再起動の保留確認

確認すると、enable_user_activity_loggingは再起動による更新が必要そうなので、Redshiftクラスターを再起動します。

再起動更新の保留中

再起動後、適当にクエリを実行すると/aws/redshift/cluster/redshift-cluster-1/useractivitylogというユーザーアクティビティログのロググループが作成されていました。

ユーザーアクティビティログのロググループの確認

ユーザーアクティビティログを確認すると、確かに実行したクエリのログがが出力されていました。

'2022-04-20T05:12:07Z UTC [ db=dev user=rdsdb pid=1073979559 userid=1 xid=4127 ]' LOG: SELECT d.datname as "Name",
       u.usename as "Owner",
       pg_catalog.pg_encoding_to_char(d.encoding) as "Encoding"
FROM pg_catalog.pg_database d
  LEFT JOIN pg_catalog.pg_user u ON d.datdba = u.usesysid
WHERE dattablespace != 0 
ORDER BY 1;

'2022-04-20T05:12:07Z UTC [ db=dev user=rdsdb pid=1073758304 userid=1 xid=4144 ]' LOG: SELECT d.datname as "Name",
       u.usename as "Owner",
       pg_catalog.pg_encoding_to_char(d.encoding) as "Encoding"
FROM pg_catalog.pg_database d
  LEFT JOIN pg_catalog.pg_user u ON d.datdba = u.usesysid
WHERE dattablespace != 0 
ORDER BY 1;

ユーザーアクティビティログの確認

最後にユーザーログの確認をします。

ユーザーログはユーザー定義の変更に関するログなので、以下のようにユーザーを作ってみてログが出力されることを確認します。

CREATE USER dbuser WITH PASSWORD 'abcD1234' CREATEDB CONNECTION LIMIT 30;

ユーザー作成後にロググループを確認すると、/aws/redshift/cluster/redshift-cluster-1/userlogというユーザーログのロググループが作成されていました。

ユーザーログのロググループの確認

ユーザーログを確認すると、確かにユーザー作成時のログが出力されていました。

101|dbuser | |create |1|0|0|9223372036854775807|1073758567|4685|Wed, 20 Apr 2022 05:22:06:972

ユーザーログの確認

すぐに確認したいログはCloudWatch Logsに

Amazon Redshiftの監査ログ機能が拡張されたアップデートを紹介しました。

CloudWatch Logsに監査ログを出力できるようになったのはアツいですね。

特に、ユーザーログをCloudWatch Logsに出力するようにしてあげれば何か不審なユーザー操作があったときに素早く気付くことができそうです。

ちなみに、こちらのアップデートはAmazon Redshiftが利用可能なすべてのAWS商用リージョンで適用されています。

この記事が誰かの助けになれば幸いです。

以上、AWS事業本部 コンサルティング部の のんピ(@non____97)でした!