Amazon RDSにおけるrdsadminユーザとは何者か

Amazon RDSにてAurora(MySQL)クラスタを構築し、そのログを参照していたところ、
rdsadmin というユーザが多数のクエリを発行していることを確認した。
このユーザアカウントの正体がよくわからなかったので何者か調べてみる。

## AWSドキュメントに見る rdsadmin
Amazon Auroraドキュメントの [Amazon Aurora MySQL でのセキュリティ](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/AuroraMySQL.Security.html) には、以下のような記載がある。

> 各 DB クラスターに管理サービスを提供するために、DB インスタンスの作成時に rdsadmin ユーザーが作成されます

ということで、 rdsadmin はその名前の通り AWS マネージドサービスとしてのアカウントだとわかる。
残念ながらここに記載している管理サービスとは何かの説明はないので
具体的にどのような動作を行うのかはわからない。
また、Aurora(MySQL)に限らず、Auroar(PostgreSQL)やRDS MySQL、RDS PostgreSQLのドキュメントにも登場することから
DBエンジンに限らずAmazon RDSサービスに共通の要素であると推測できる。


## mysql.userテーブルに見る rdsadmin
`select * from mysql.user;` すると対象クラスタに作成されたユーザ一覧が確認できる。

```
mysql> select * from mysql.user;
+-----------+-----------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+------------------+----------------+---------------------+--------------------+------------------+------------+--------------+------------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+----------------------+-----------------------+-------------------------------------------+------------------+-----------------------+-------------------+----------------+-------------------+---------------------+--------------------+-----------------------+------------------------+
| Host      | User      | Select_priv | Insert_priv | Update_priv | Delete_priv | Create_priv | Drop_priv | Reload_priv | Shutdown_priv | Process_priv | File_priv | Grant_priv | References_priv | Index_priv | Alter_priv | Show_db_priv | Super_priv | Create_tmp_table_priv | Lock_tables_priv | Execute_priv | Repl_slave_priv | Repl_client_priv | Create_view_priv | Show_view_priv | Create_routine_priv | Alter_routine_priv | Create_user_priv | Event_priv | Trigger_priv | Create_tablespace_priv | ssl_type | ssl_cipher | x509_issuer | x509_subject | max_questions | max_updates | max_connections | max_user_connections | plugin                | authentication_string                     | password_expired | password_last_changed | password_lifetime | account_locked | Load_from_S3_priv | Select_into_S3_priv | Invoke_lambda_priv | Invoke_sagemaker_priv | Invoke_comprehend_priv |
+-----------+-----------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+------------------+----------------+---------------------+--------------------+------------------+------------+--------------+------------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+----------------------+-----------------------+-------------------------------------------+------------------+-----------------------+-------------------+----------------+-------------------+---------------------+--------------------+-----------------------+------------------------+
| %         | admin     | Y           | Y           | Y           | Y           | Y           | Y         | Y           | N             | Y            | N         | Y          | Y               | Y          | Y          | Y            | N          | Y                     | Y                | Y            | Y               | Y                | Y                | Y              | Y                   | Y                  | Y                | Y          | Y            | N                      |          |            |             |              |             0 |           0 |               0 |                    0 | mysql_native_password | *E3CFD11AB2B18B4E68DE29B2F654AD19A80380EE | N                | 2021-01-01 23:16:36   |              NULL | N              | Y                 | Y                   | Y                  | Y                     | Y                      |
| localhost | mysql.sys | N           | N           | N           | N           | N           | N         | N           | N             | N            | N         | N          | N               | N          | N          | N            | N          | N                     | N                | N            | N               | N                | N                | N              | N                   | N                  | N                | N          | N            | N                      |          |            |             |              |             0 |           0 |               0 |                    0 | mysql_native_password | *THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE | N                | 2015-11-05 07:35:40   |              NULL | Y              | N                 | N                   | N                  | N                     | N                      |
| localhost | rdsadmin  | Y           | Y           | Y           | Y           | Y           | Y         | Y           | Y             | Y            | Y         | Y          | Y               | Y          | Y          | Y            | Y          | Y                     | Y                | Y            | Y               | Y                | Y                | Y              | Y                   | Y                  | Y                | Y          | Y            | Y                      |          |            |             |              |             0 |           0 |               0 |                    0 | mysql_native_password | *3DEB5C09B97A835CAE9DA0A2FC45E8B259A62C0D | N                | 2021-01-01 23:19:43   |              NULL | N              | Y                 | Y                   | Y                  | Y                     | Y                      |
+-----------+-----------+-------------+-------------+-------------+-------------+-------------+-----------+-------------+---------------+--------------+-----------+------------+-----------------+------------+------------+--------------+------------+-----------------------+------------------+--------------+-----------------+------------------+------------------+----------------+---------------------+--------------------+------------------+------------+--------------+------------------------+----------+------------+-------------+--------------+---------------+-------------+-----------------+----------------------+-----------------------+-------------------------------------------+------------------+-----------------------+-------------------+----------------+-------------------+---------------------+--------------------+-----------------------+------------------------+
3 rows in set (0.03 sec)
```

admin@'%' がRDSのマネージメントコンソールを利用したときに作成される[マスターユーザ](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/AuroraUserGuide/UsingWithRDS.MasterAccounts.html)、
mysql.sys@localhost は [MySQLドキュメント](https://dev.mysql.com/doc/refman/5.7/en/reserved-accounts.html)によると sys スキーマ用のアカウントらしいがよくわからなかった。
そして rdsadmin@localhost が今回注目している管理ユーザである。

rdsadmin には全権限が付与されている。
また、[GRANT OPTION](https://dev.mysql.com/doc/refman/5.7/en/grant.html) が付与されているので
アカウントの権限制御も可能となっている。

```
mysql> show grants for rdsadmin@localhost;
+-------------------------------------------------------------------------+
| Grants for rdsadmin@localhost                                           |
+-------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'rdsadmin'@'localhost' WITH GRANT OPTION |
+-------------------------------------------------------------------------+
1 row in set (0.01 sec)
```

一方で admin ユーザには shutdown, file, superといった権限が付与されていない。
この差分から rdsadmin ユーザはインスタンス上のファイル操作やインスタンスの停止、
フェイルオーバーなどの操作を行うためのアカウントであると推測できる。

## ログに見る rdsadmin
通常は rdsadmin ユーザがどのような操作を行ったのかは確認できない。
パラメタのうち long_query_time を0にして、全ログをスロークエリとして出力すると、
大量の rdsadmin によるクエリが確認できる。

rdsadmin のクエリ例は以下の通り。

```
# Time: 2021-01-02T00:01:33.174746Z
# User@Host: rdsadmin[rdsadmin] @ localhost []  Id:     5
# Query_time: 0.005328  Lock_time: 0.000110 Rows_sent: 0  Rows_examined: 0
SET timestamp=1609545693;
INSERT INTO mysql.rds_heartbeat2(id, value) values (1,1609545693104) ON DUPLICATE KEY UPDATE value = 1609545693104;
```

```
# Time: 2021-01-02T00:01:38.120802Z
# User@Host: rdsadmin[rdsadmin] @ localhost []  Id:     4
# Query_time: 0.000736  Lock_time: 0.000104 Rows_sent: 2  Rows_examined: 2
SET timestamp=1609545698;
SELECT durable_lsn, current_read_point, server_id, last_update_timestamp FROM information_schema.replica_host_status;
```

これらは一般ログの出力を有効にした場合に確認できるログに一致する。
自分はこの結果から、一般ログに出力される内容が rdsadmin の発行したクエリであると認識できた。

## まとめ
* rdsadmin はAmazon RDSにおいてDBクラスターの管理サービス(インスタンスの再起動やフェイルオーバーなど)を提供するためのユーザー
* rdsadmin にはマスターユーザにない権限を含む全権限が付与されている
* 一般ログに出力されるシステム系のクエリは rdsadmin が発行したもの