MySQL 8.0 リファレンスマニュアル


MySQL 8.0 リファレンスマニュアル  /  ...  /  アカウントの追加、権限の割当ておよびアカウントの削除

6.2.8 アカウントの追加、権限の割当ておよびアカウントの削除

MySQL アカウントを管理するには、その目的の SQL ステートメントを使用します:

  • CREATE USER および DROP USER は、アカウントを作成および削除します。

  • GRANT および REVOKE は、アカウントに対する権限の割当ておよび取消しを行います。

  • SHOW GRANTS にアカウント権限の割当てが表示されます。

アカウント管理ステートメントを使用すると、サーバーは基礎となる付与テーブルに適切な変更を加えます。これらについては、セクション6.2.3「付与テーブル」 で説明します。

注記

INSERTUPDATEDELETE などのステートメントを使用して付与テーブルを直接変更することはお薦めできません。独自のリスクで実行してください。 これらの変更の結果として誤った形式となった行を、サーバーは随意で無視します。

付与テーブルを変更する操作の場合、サーバーはテーブルが予期された構造を持っているかどうかをチェックし、持っていない場合はエラーを生成します。 テーブルを必要な構造に更新するには、MySQL のアップグレード手順を実行します。 セクション2.11「MySQL のアップグレード」を参照してください。

アカウントを作成するためのもう 1 つのオプションは、GUI ツール MySQL Workbench を使用する方法です。 また、いくつかのサードパーティプログラムには、MySQL アカウント管理用の機能が用意されています。phpMyAdmin はそのようなプログラムです。

このセクションでは、次のトピックについて説明します。

ここで説明するステートメントの詳細は、セクション13.7.1「アカウント管理ステートメント」 を参照してください。

アカウントの作成および権限の付与

次の例では、mysql クライアントプログラムを使用して、新しいアカウントを設定する方法を示します。 これらの例では、MySQL root アカウントに CREATE USER 権限と、他のアカウントに付与されているすべての権限があることを前提としています。

コマンドラインで、MySQL root ユーザーとしてサーバーに接続し、パスワードプロンプトで適切なパスワードを指定します:

shell> mysql -u root -p
Enter password: (enter root password here)

サーバーに接続した後、新しいアカウントを追加できます。 次の例では、CREATE USER および GRANT ステートメントを使用して 4 つのアカウントを設定します ('password'が表示されている場合は、適切なパスワードを置き換えます):

CREATE USER 'finley'@'localhost'
  IDENTIFIED BY 'password';
GRANT ALL
  ON *.*
  TO 'finley'@'localhost'
  WITH GRANT OPTION;

CREATE USER 'finley'@'%.example.com'
  IDENTIFIED BY 'password';
GRANT ALL
  ON *.*
  TO 'finley'@'%.example.com'
  WITH GRANT OPTION;

CREATE USER 'admin'@'localhost'
  IDENTIFIED BY 'password';
GRANT RELOAD,PROCESS
  ON *.*
  TO 'admin'@'localhost';

CREATE USER 'dummy'@'localhost';

これらのステートメントによって作成されるアカウントには、次のプロパティがあります:

  • 2 つのアカウントのユーザー名は finley です。 どちらも、すべてを実行するための完全なグローバル権限を持つスーパーユーザーアカウントです。 'finley'@'localhost'アカウントは、ローカルホストから接続する場合にのみ使用できます。 'finley'@'%.example.com'アカウントは、ホスト部分で'%'ワイルドカードを使用するため、example.com ドメイン内の任意のホストからの接続に使用できます。

    'finley'@'localhost'アカウントは、localhost の匿名ユーザーアカウントがある場合に必要です。 'finley'@'localhost'アカウントがない場合、その匿名ユーザーアカウントは、finley がローカルホストから接続し、finley が匿名ユーザーとして処理されるときに優先されます。 これは、匿名ユーザーアカウントには'finley'@'%'アカウントよりも具体的な Host カラム値があるため、user テーブルのソート順が早いためです。 (user テーブルのソートの詳細は、セクション6.2.6「アクセス制御、ステージ 1: 接続の検証」 を参照してください。)

  • 'admin'@'localhost'アカウントは、ローカルホストから接続するために admin でのみ使用できます。 RELOAD および PROCESS のグローバル管理権限が付与されます。 これらの権限を持つ admin ユーザーは、mysqladmin reloadmysqladmin refreshmysqladmin flush-xxx コマンド、および mysqladmin processlist を実行できます。 任意のデータベースにアクセスするための権限は付与されません。 このような権限は、GRANT ステートメントを使用して追加できます。

  • 'dummy'@'localhost'アカウントにパスワードがありません (セキュアでないため、お薦めしません)。 このアカウントは、ローカルホストから接続する際にのみ使用できます。 権限は付与されません。 GRANT ステートメントを使用してアカウントに特定の権限を付与することを前提としています。

前の例では、グローバルレベルで権限を付与しています。 次の例では、3 つのアカウントを作成し、下位レベル、つまりデータベース内の特定のデータベースまたはオブジェクトへのアクセス権を付与します。 各アカウントのユーザー名は custom ですが、ホスト名の部分は異なります:

CREATE USER 'custom'@'localhost'
  IDENTIFIED BY 'password';
GRANT ALL
  ON bankaccount.*
  TO 'custom'@'localhost';

CREATE USER 'custom'@'host47.example.com'
  IDENTIFIED BY 'password';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
  ON expenses.*
  TO 'custom'@'host47.example.com';

CREATE USER 'custom'@'%.example.com'
  IDENTIFIED BY 'password';
GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP
  ON customer.addresses
  TO 'custom'@'%.example.com';

3 つのアカウントは、次のように使用できます。

  • 'custom'@'localhost'アカウントには、bankaccount データベースにアクセスするためのすべてのデータベースレベルの権限があります。 アカウントを使用してサーバーに接続できるのは、ローカルホストからのみです。

  • 'custom'@'host47.example.com'アカウントには、expenses データベースにアクセスするための特定のデータベースレベル権限があります。 このアカウントは、ホスト host47.example.com からのみサーバーに接続するために使用できます。

  • 'custom'@'%.example.com'アカウントには、example.com ドメイン内の任意のホストから customer データベース内の addresses テーブルにアクセスするための特定のテーブルレベルの権限があります。 アカウント名のホスト部分に % ワイルドカード文字が使用されているため、アカウントを使用してドメイン内のすべてのマシンからサーバーに接続できます。

アカウントの権限およびプロパティの確認

アカウントの権限を表示するには、SHOW GRANTS を使用します:

mysql> SHOW GRANTS FOR 'admin'@'localhost';
+-----------------------------------------------------+
| Grants for admin@localhost                          |
+-----------------------------------------------------+
| GRANT RELOAD, PROCESS ON *.* TO 'admin'@'localhost' |
+-----------------------------------------------------+

アカウントの非特権プロパティーを表示するには、SHOW CREATE USER を使用します:

mysql> SET print_identified_with_as_hex = ON;
mysql> SHOW CREATE USER 'admin'@'localhost'\G
*************************** 1. row ***************************
CREATE USER for admin@localhost: CREATE USER 'admin'@'localhost'
IDENTIFIED WITH 'caching_sha2_password'
AS 0x24412430303524301D0E17054E2241362B1419313C3E44326F294133734B30792F436E77764270373039612E32445250786D43594F45354532324B6169794F47457852796E32
REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK
PASSWORD HISTORY DEFAULT
PASSWORD REUSE INTERVAL DEFAULT
PASSWORD REQUIRE CURRENT DEFAULT

print_identified_with_as_hex システム変数 (MySQL 8.0.17 で使用可能) を有効にすると、SHOW CREATE USER では、印刷できない文字を含むハッシュ値が、通常の文字列リテラルとしてではなく 16 進数文字列として表示されます。

アカウント権限の取消し

アカウント権限を取り消すには、REVOKE ステートメントを使用します。 権限は、異なるレベルで付与できるのと同様に、異なるレベルで取り消すことができます。

グローバル権限を取り消します:

REVOKE ALL
  ON *.*
  FROM 'finley'@'%.example.com';

REVOKE RELOAD
  ON *.*
  FROM 'admin'@'localhost';

データベースレベルの権限を取り消します:

REVOKE CREATE,DROP
  ON expenses.*
  FROM 'custom'@'host47.example.com';

テーブルレベルの権限を取り消します:

REVOKE INSERT,UPDATE,DELETE
  ON customer.addresses
  FROM 'custom'@'%.example.com';

権限取消しの影響を確認するには、SHOW GRANTS を使用します:

mysql> SHOW GRANTS FOR 'admin'@'localhost';
+---------------------------------------------+
| Grants for admin@localhost                  |
+---------------------------------------------+
| GRANT PROCESS ON *.* TO 'admin'@'localhost' |
+---------------------------------------------+

アカウントの削除

アカウントを削除するには、DROP USER ステートメントを使用します。 たとえば、以前に作成したアカウントの一部を削除するには、次のようにします:

DROP USER 'finley'@'localhost';
DROP USER 'finley'@'%.example.com';
DROP USER 'admin'@'localhost';
DROP USER 'dummy'@'localhost';

関連キーワード:  アカウント, 権限, CREATE, 接続, admin, パスワード, 付与, finley, GRANT, テーブル