MySQLで不要なGRANT権限を削除する

MySQLのユーザーを確認していると、不要なGRANT権限が付与されたユーザーを発見。

念のため消しておこうと思ったが、ちょっと手間取ったのでメモ。

環境

MySQL v5.7.29。

状況

こんな感じのユーザーがいた。

mysql> SHOW GRANTS FOR 'user'@'host';
+----------------------------------------------------------------+
| Grants for user@host                                           |
+----------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'user'@'host' WITH GRANT OPTION |
+----------------------------------------------------------------+
1 row in set (0.00 sec)

GRANT権限は不要なので、念のため消しておきたい。

調査と対応

REVOKE で削除できないかと、ドキュメントを見てみる。

MySQL :: MySQL 5.7 Reference Manual :: 13.7.1.6 REVOKE Statement

消せそうなのは2つ目の構文、 REVOKE ALL PRIVILEGES, GRANT OPTION FROM ... だが、これだとすべての権限が消えるなあ。

1つめの構文で「priv_type」となっているところを詳しく見てみる。

MySQL :: MySQL 5.7 Reference Manual :: 13.7.1.4 GRANT Statement

「priv_type」には GRANT OPTION を指定できそう。

作業

1つめの構文では ON でレベルを指定する必要があるため、以下のように記述して実行できた。

mysql> REVOKE GRANT OPTION ON *.* FROM 'user'@'host';
Query OK, 0 rows affected (0.02 sec)

mysql> SHOW GRANTS FOR 'user'@'host';
+----------------------------------------------+
| Grants for user@host                         |
+----------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'user'@'host' |
+----------------------------------------------+
1 row in set (0.00 sec)

振り返り

REVOKE ALL PRIVILEGES, GRANT OPTION FROM ... を使っている例は見かけたが、GRANT権限だけ消す方法がなかなか出てこなかった。

REVOKE GRANT OPTION で検索すると、PostgreSQLばっかり出てくる。

古いが、ミラーサイトで見つけたMySQL 4.1のリファレンスには記載があった。

MySQL :: MySQL 4.1 リファレンスマニュアル :: 4.4.1 GRANT および REVOKE の構文

ユーザの GRANT 権限を取り消すには、次のように priv_type 値として GRANT OPTION を使用します。
mysql> REVOKE GRANT OPTION ON ... FROM ...;

今でも残しておいてくれればよかったのに...