それは常に頭痛の種です...新しいユーザーロールを追加するか、いくつかの特権を変更する必要があり、それに1つずつ...1つずつ割り当てる必要があります。これは、特に大規模な組織、複雑な特権構造を持つ会社、または多数のデータベースユーザーを管理する必要がある場合でも、通常の義務です。
たとえば、すべてのQAチームの特定のデータベースにUPDATE特権を追加する必要があるとします。彼らが5人のチームであれば問題はありませんが、50人または100人の場合は問題ありません。頑張ってください。もちろん、いつでもそのためのスクリプトを書くことができますが、この方法では常にリスクがあります。
このブログでは、ロールを使用してこのデータベースユーザー管理の問題を解決する方法と、MariaDBでロールを使用するための具体的なヒントを紹介します。
役割とは何ですか?
データベースの世界では、ロールは1人以上のユーザーに割り当てることができる特権のグループであり、ユーザーは1つ以上のロールを自分に割り当てることができます。比較すると、LinuxOSのグループのようなものです。
QAチームのUPDATE特権に関する前の例を見て、QAロールが作成されていて、すべてのQAメンバーにこのロールが割り当てられている場合、メンバーの数は関係ありません。特権を変更するだけで済みます。このQAロールで、すべてのQAユーザーに伝達されます。
MariaDBの役割
MariaDBでロールを管理するには、CREATE ROLEステートメントを使用してロールを作成し、GRANTステートメントを使用してそのロールに特権を割り当ててから、このロールを使用できるようにユーザーに特権を割り当てる必要があります。デフォルトの役割を設定して、ユーザーが接続時にその役割を引き継ぐようにすることもできます。
データベースユーザーは、データベースにアクセスするときに役割を設定する必要があり(デフォルトの役割がない場合)、必要に応じてSETROLEステートメントを使用して役割を変更できます。
アプリケーション側からは、クエリを実行する前に役割を設定(またはデフォルトを使用)できるはずなので、古いアプリケーションでは、実装が複雑になる可能性があります。
MariaDBのロールの仕様を見てみましょう。
- 現在のユーザーに対して同時にアクティブにできる役割は1つだけです。
- MariaDB 10.1以降、デフォルトの役割があります。この役割は、ユーザーが接続すると自動的に有効になります。
- ロールはメモリに保存されます。
役割を確認する方法
MariaDBでは、複数の方法で確認できます。
- SHOW GRANTS [FOR(user | role)]:現在のユーザーまたは特定のユーザーの付与を一覧表示します。
MariaDB [testing]> SHOW GRANTS for [email protected]'%'; +----------------------------------------------------------------------------------------------------------+ | Grants for [email protected]% | +----------------------------------------------------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'testuser'@'%' IDENTIFIED BY PASSWORD '*FAAFFE644E901CFAFAEC7562415E5FAEC243B8B2' | +----------------------------------------------------------------------------------------------------------+ 1 row in set (0.000 sec)
- SELECT user FROM mysql.user WHERE is_role ='Y':データベースに作成されたロールを一覧表示します。
MariaDB [testing]> SELECT user FROM mysql.user WHERE is_role='Y'; +--------+ | user | +--------+ | qateam | +--------+ 1 row in set (0.000 sec)
- SELECT * FROM information_schema.applicable_roles:現在のユーザーが利用できる役割のリストです。
MariaDB [testing]> SELECT * FROM information_schema.applicable_roles; +-------------+-----------+--------------+------------+ | GRANTEE | ROLE_NAME | IS_GRANTABLE | IS_DEFAULT | +-------------+-----------+--------------+------------+ | [email protected]% | qateam | NO | NO | +-------------+-----------+--------------+------------+ 1 row in set (0.000 sec)
- SELECT * FROM information_schema.enabled_roles:現在アクティブな役割を一覧表示します。
MariaDB [testing]> SELECT * FROM information_schema.enabled_roles; +-----------+ | ROLE_NAME | +-----------+ | qateam | +-----------+ 1 row in set (0.000 sec)
- SELECT * FROM mysql.roles_mapping:ロールとユーザー許可の間の関係を一覧表示します。
MariaDB [testing]> SELECT * FROM mysql.roles_mapping; +-----------+-----------+--------+--------------+ | Host | User | Role | Admin_option | +-----------+-----------+--------+--------------+ | localhost | root | qateam | Y | | % | testuser | qateam | N | +-----------+-----------+--------+--------------+ 2 rows in set (0.000 sec)
MariaDBでロールを管理する方法
MariaDBで管理する方法の例を見てみましょう。この場合、CentOS7で実行されているMariaDB10.3バージョンを使用します。
まず、新しいデータベースユーザーを作成しましょう:
MariaDB [testing]> CREATE USER [email protected]'%' IDENTIFIED BY 'PASSWORD';
この新しいユーザーの助成金を確認すると、次のように表示されます。
MariaDB [testing]> SHOW GRANTS for [email protected]'%';
+----------------------------------------------------------------------------------------------------------+
| Grants for [email protected]% |
+----------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'testuser'@'%' IDENTIFIED BY PASSWORD '*FAAFFE644E901CFAFAEC7562415E5FAEC243B8B2' |
+----------------------------------------------------------------------------------------------------------+
1 row in set (0.000 sec)
それでは、このユーザーでログインして、テストデータベースに接続してみましょう。
$ mysql -utestuser -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 54
Server version: 10.3.16-MariaDB-log MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> use testing
ERROR 1044 (42000): Access denied for user 'testuser'@'%' to database 'testing'
ご覧のとおり、このユーザーでテストデータベースに接続することはできません。そのため、ここで、権限を持つ「qateam」ロールを作成し、このロールをこの新しいユーザーに割り当てます。
MariaDB [testing]> CREATE ROLE qateam;
Query OK, 0 rows affected (0.001 sec)
MariaDB [testing]> GRANT SELECT,INSERT,UPDATE,DELETE ON testing.* TO qateam;
Query OK, 0 rows affected (0.000 sec)
GRANTなしでこの役割を使用しようとすると、次のエラーが表示されます。
MariaDB [(none)]> SET ROLE qateam;
ERROR 1959 (OP000): Invalid role specification `qateam`
そこで、GRANTを実行して、ユーザーが使用できるようにします。
MariaDB [(none)]> GRANT qateam TO [email protected]'%';
Query OK, 0 rows affected (0.000 sec)
現在のユーザーに役割を設定します:
MariaDB [(none)]> SET ROLE qateam;
Query OK, 0 rows affected (0.000 sec)
そして、データベースにアクセスしてみてください:
MariaDB [(none)]> use testing;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MariaDB [testing]>
現在のユーザーの助成金を確認できます:
MariaDB [(none)]> SHOW GRANTS for [email protected]'%';
+----------------------------------------------------------------------------------------------------------+
| Grants for [email protected]% |
+----------------------------------------------------------------------------------------------------------+
| GRANT qateam TO 'testuser'@'%' |
| GRANT USAGE ON *.* TO 'testuser'@'%' IDENTIFIED BY PASSWORD '*FAAFFE644E901CFAFAEC7562415E5FAEC243B8B2' |
+----------------------------------------------------------------------------------------------------------+
2 rows in set (0.000 sec)
そして現在の役割:
MariaDB [testing]> SELECT CURRENT_ROLE;
+--------------+
| CURRENT_ROLE |
+--------------+
| qateam |
+--------------+
1 row in set (0.000 sec)
ここで、qateamロールの付与を確認できます。これで、ユーザーに直接割り当てられた特権はなく、ロールの特権があり、ユーザーはそこから特権を取得します。
結論
ロールを管理することで、大企業や、それにアクセスするユーザーの数が多いデータベースでの作業が楽になります。アプリケーションから使用する場合は、アプリケーションがそれを管理できる必要があることを考慮に入れる必要があります。