CloudSQLのSQL監査ログを取得してみた！

## はじめに
**CloudSQL**のSQLクエリの実行内容を監査出来ないか検証したので、備忘録で記事にしてみました！
※CloudSQLは、`MySQL`または`PostgreSQL`のマネージドDBサービスです。(AWSでいうところのRDSですね)

**【参考】**
・[CloudSQLとは][00]

## 利用環境
| product | version | region | database_id | table name |
|---------|---------|--------|------------|-------------|
| PostgreSQL | 9.6 | us-west1 |  test | testtable |

## やりたいこと
CloudSQLに格納されている機密情報に対して、不正なSQLクエリが実行されていないか監査したい。

## 設定方法
- GCPのWeb管理コンソールにログイン後、[SQL]をクリックし、インスタンスIDをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/f081e5f2-14fb-7499-1fc9-99492bbfac54.png)

- [設定] > [設定の編集]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/bb7c6903-5eee-ff86-5128-dc1c95bef458.png)

- [設定オプション] > [データベース フラグの追加]で[+項目を追加]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/14c27d3d-896e-66cd-5084-2cd4c0e5120f.png)

- [フラグを選択]をクリックし、[log_statement]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/ea71f5cf-ff3b-125b-9cb7-c835a81d8a03.png)

- 全てのログを取得するように[all]を指定します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/6a264679-75ea-2524-ea08-add282f2a7c8.png)

- [保存]します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/70e801b8-06c4-3b24-fd2a-17ce36b0574f.png)

- [設定]で内容に追加されていればOKです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/189a8bce-2039-3573-9e19-fb4700aaa324.png)

**【参考】**
・[データベース フラグを構成する][01]
・[log_statement][02]

## 動作確認
- [Cloud Shellを使用して接続]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/bb7771a7-5736-d729-781f-014f1335da7e.png)

- Cloud ShellでDB接続後、以下のように`①テーブル作成`、`②データ投入`、`③データを参照`を実施します。

```console
Welcome to Cloud Shell! Type "help" to get started.
Your Cloud Platform project in this session is set to [PROJECT_ID].
Use “gcloud config set project [PROJECT_ID]” to change to a different project.
user@cloudshell:~ ([PROJECT_ID])$ gcloud sql connect test --user=postgres --quiet #作成したDBインスタンスに接続
Whitelisting your IP for incoming connection for 5 minutes...done.
Connecting to database with SQL user [postgres].Password for user postgres: #postgresユーザのパスワードを入力
psql (9.6.13, server 9.6.11)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128, compression: off)
Type "help" for help.

postgres=> CREATE TABLE testtable (Name VARCHAR(255), Text VARCHAR(255)); #①testtableというテーブルを新規作成
CREATE TABLE
postgres=> INSERT INTO testtable (Name, Text) values ('Guest01', 'Test01'); #②データを適当に投入
INSERT 0 1
postgres=> SELECT * FROM testtable ; #③作成したtesttableから全データを参照
  name   |  text
---------+--------
 Guest01 | Test01
(1 row)
```

- [SQL]から抜けて、[Logging]をクリックします。`postgres.log`を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/17df6d7e-9d70-2275-b2ea-bf1020511f23.png)

- テーブル名(text:testtable)で検索します。(叩いたSQL文が3件出てきましたね)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/211371/7b564866-88be-5e9c-e2a9-8c8a0f694a63.png)

- 上記のログのうち最後に実施した`SELECT * FROM testtable; `の中身は以下の通りです。

```json
{
 insertId:  "s=80fd93ba8bdf46e28a8625aba4d6d6aa;i=256b;b=c048e1bb5f6044f9875dd774b312af0f;m=3fc50c74;t=58a802863540d;x=2d634c26fcfd4ebc-0@a4"  
 logName:  "projects/[PROJECT_ID]/logs/cloudsql.googleapis.com%2Fpostgres.log"  
 receiveTimestamp:  "2019-06-04T14:18:48.536405622Z"  
 resource: {
  labels: {
   database_id:  "[PROJECT_ID]:test"    
   project_id:  "[PROJECT_ID]"    
   region:  "us-west1"    
  }
  type:  "cloudsql_database"   
 }
 severity:  "INFO"  
 textPayload:  "[162]: [5-1] db=postgres,user=postgres LOG:  statement: SELECT * FROM testtable ;"  
 timestamp:  "2019-06-04T14:18:42.109868Z"  
}
```

## まとめ
簡単でしたが、GCP CloudSQL(PostgreSQL)のSQL監査は無事取得できました！
MySQLも同様に取得できるようです。

Stackdriverに溜めたSQL監査ログをBigqueryにLoadして、監査業務に活用出来ると良い感じですね^^


[00]:https://cloud.google.com/sql/?hl=ja "CloudSQL"
[01]:https://cloud.google.com/sql/docs/postgres/flags "データベース フラグを構成する"
[02]:https://www.postgresql.org/docs/9.6/runtime-config-logging.html#GUC-LOG-STATEMENT "log_statement"