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クラスターの作成が開始されます。
S3バケットへの監査ログ出力
それでは、S3バケットへの監査ログ出力確認から行います。
作成したRedshiftクラスターのプロパティ
タブを確認すると、監査ログ記録は無効となっています。監査ログをS3に出力するために、編集
-監査ログを編集
をクリックします。
監査ログ記録を設定は無効化になっています。
こちらを有効化に変更します。今回は新しいバケットを作成し、そこに出力するようにしました。なお、プレフィックスは必須なので今回はRedshiftクラスター名にしました。
Query EditorからRedshiftクラスターに接続し、適当にクエリを実行すると数分後には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を確認すると、/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_logging
をtrue
に変更して、保存
をクリックします。
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)でした!