| ../ |
VPSサーバー(CentOS8.2)でMySQL 8.0を使用している。特定のデータベースに特化したユーザーを登録し、DBへのアクセス権限(GRANT)を設定する手順をメモしておく。
例として、kankeri
というデータベースに管理者としてkadmin
と一般ユーザーとしてkuser
を登録することにする。kadminにはALL PRIVILEGESを設定し、kuserには一般的なCRUD操作のみを許可する。MySQL 8.0では、認証回りが強化されたため、userテーブルからpasswordカラムがなくなっている点に注意すること。(正確には、暗号化されたパスワードはauthentification_stringというカラムに移されている。)
$ mysql -uroot -p mysql
> use mysql;
> create database kankeri; // まず、kankeriデータベースを生成
> use kankeri;
> show variables like 'char%';
> # delete from user where user='kadmin';
> # delete from user where user='kuser';
> CREATE USER kadmin@localhost IDENTIFIED BY '***'; // kadmin追加
> CREATE USER kuser@localhost IDENTIFIED BY '***'; // kuser追加
> GRANT ALL PRIVILEGES ON kankeri.* TO kadmin@localhost; // kadminの権限
> GRANT DELETE,INSERT,SELECT,UPDATE ON kankeri.* TO kuser@localhost; // kuserの権限
> select host,user,plugin from user;
+-----------+------------------+-----------------------+
| host | user | plugin |
+-----------+------------------+-----------------------+
| localhost | kadmin | mysql_native_password |
| localhost | kuser | mysql_native_password |
| localhost | mysql.infoschema | caching_sha2_password |
| localhost | mysql.session | caching_sha2_password |
| localhost | mysql.sys | caching_sha2_password |
| localhost | root | mysql_native_password |
+-----------+------------------+-----------------------+
> flush privileges;
> exit
kadmin、kuserともパスワードの認証方式は、mysql_native_passwordになっている。この設定は、/etc/my.cnf.d/mysql-default-authentication-plugin.cnfで指定したものに従っている。
以下のような手順で、権限が適切に機能しているかチェックしておこう。
$ mysql -uroot -p kankeri
> create table dummy1 (id int, name varchar(50));
> insert dummy1 values(10,’梶井基次郎’);
// kadminは、kankeriデータベース以外にはアクセスできない
$ mysql -ukadmin -p kankeri
> create table dummy2 (id int, name varchar(50));
> insert dummy2 values(20,’中島敦’);
> use mysql;
ERROR 1044 (42000): Access denied for user 'kadmin'@'localhost' to database 'mysql'
// kuserは、kankeriデータベース以外にはアクセスできない
// kuserは、create tableなどスキーマに関する操作はできない
$ mysql -ukuser -p kankeri
> create table dummy3 (id int, name varchar(50));
ERROR 1142 (42000): CREATE command denied to user 'kuser'@'localhost' for table 'dummy3'
> insert dummy1 values(30,’檸檬’);
> insert dummy2 values(40,’山月記’);
> select * from dummy1;
> select * from dummy2;
以上