はじめに
ユーザー管理は、MySQLデータベースシステムの管理を希望するすべての人にとって最も重要な責任です。環境内のユーザーとサービスを最もよく表すユーザーアカウントの作成、変更、削除は、アクセスをロックダウンし、変更の範囲を制限し、変更の監査と説明責任を実装するための基礎を築くのに役立ちます。
このガイドでは、MySQL内でユーザーアカウントを管理する方法について説明します。最初に、MySQLで有効なユーザーとは何かについて説明し、システムにユーザーを追加する方法を示します。これは、各ユーザーの認証を構成する方法と、システムが可能性のリストから認証オプションを選択する方法についての議論につながります。既存のユーザーに変更を加える方法、作成したアカウントでログインする方法、不要になったユーザーを削除する方法については、引き続き説明します。
前提条件
このガイドに従うには、適切な権限を持つMySQLサーバー上のアカウントが必要です。
使用するコマンド
MySQL内でユーザーを作成、変更、および削除するには、必要なコアコマンドは次のとおりです。
-
CREATE USER
:新しいユーザーアカウントを作成する -
ALTER USER
:既存のユーザーアカウントに変更を加える -
DROP USER
:既存のユーザーアカウントを削除する
必要な権限
上記のコマンドを実行するには、CREATE USER
のアカウントでMySQLにログインする必要があります 特権。 CREATE USER
特権を使用すると、他のアクションの中でも、ユーザーを作成、変更、削除、および名前変更できます。 SELECT
も必要です mysql
の特権 データベースを使用して、既存のユーザーに関する情報を確認します。
優先順に、次を使用してログインする必要があります:
-
CREATE USER
を持つ限定アカウント 特権とSELECT
mysql
の特権 データベース root
またはMySQL内で完全な権限を持つ管理ユーザー
MySQLがユーザーアカウントを定義および解釈する方法を理解する
新しいアカウントの作成を開始する前に、MySQLがユーザーの作成と参照に使用するさまざまなことを理解しておくと役に立ちます。また、MySQLが接続の認証に使用するユーザーアカウントを理解するには、MySQLの認証アルゴリズムに精通している必要があります。
MySQLのユーザーアカウントの構文は何ですか?
MySQLでは、ユーザーアカウントは、アットマーク(@)で結合された2つの別個の情報で構成されています。
- ユーザー名
- ユーザーが接続しているホスト
一般に、システム上のユーザーアカウントは次のようになります。
'<user>'@'<host>'
上記のように、一重引用符を使用して、ユーザーアカウントのユーザーコンポーネントとホストコンポーネントを個別にラップできます。コンポーネントのいずれかに、誤解される可能性のある文字が含まれている場合に、これらが必要になることがあります。一般に、それらを追加することは、常に明示的にすることをお勧めします。
つまり、'john'
というアカウントを持っているだけではありません。 、MySQLでは、完全なアカウント名には、'john'@'localhost'
などの何らかのホストが必要です。 。これは、複数の'john'
が存在する可能性があることを意味します システム上のアカウントとMySQLは、それらが異なるドメインからのものである限り、それぞれを一意のアカウントとして表示します。
以上のことから、ユーザーまたはホストコンポーネントを持たないユーザーアカウントを定義することは可能ですが、注意しなければならない重要な意味があります。
空の文字列を使用して、ユーザー値なしでユーザーアカウントを定義できます:
''@'<host>'
たとえば、''@'localhost'
としてユーザーを作成できます。 。このユーザーはanyと一致します ローカルコンピュータから接続しているユーザー名。
同様に、任意のホストから一致するユーザーアカウントを持つことができます。ホスト値には、空の文字列を使用するのではなく、%
を使用します。 このようなワイルドカード:
'<user>'@'%'
たとえば、'john'@'%'
を作成した場合 、そのアカウントは'john'
と一致します 任意のから接続しているユーザー ホスト。
MySQLはどのようにユーザーを認証しますか?
MySQLが実際に各認証要求を処理する方法を理解することは、合理的ではあるが誤った仮定に起因する一般的なクラスの認証問題を回避するために非常に重要です。これについては、MySQLの記事での認証と承認の概要で詳しく説明しました。
接続要求を認証するとき、MySQLはuser
内のいくつかのフィールドを使用します 内部のmysql
のテーブル 接続を許可するかどうかを決定するデータベース。 MySQLは最大を使用します 1つ 接続の認証を試みるユーザーアカウントレコード。つまり、MySQLには、接続に一致する可能性のあるアカウントが複数ある場合に、使用するユーザーアカウントを決定する方法が必要です。
ユーザーを認証するためのMySQLのアルゴリズムは、サーバーの起動時に開始されます。起動時に、MySQLはmysql.user
全体をロードします テーブルをメモリに入れます。また、通常のMySQLコマンドを使用してユーザーアカウントが作成されるたびにこれを行います。テーブルをロードするときに、エントリを優先度の高いものから低いものへと並べ替えます。
MySQLはHost
を使用します 列をプライマリソートフィールドとして使用し、より具体的な値で結果に優先順位を付けます。したがって、リテラル値は最高の優先度として最上位に並べ替えられ、%
のようにワイルドカードを使用する値が並べ替えられます。 、は下に並べ替えられます。最終的なエントリは、%
のみを含むエントリです。 他の文字は含まれず、その後に完全に空白のホストを持つエントリが続きます。
User
列は、同じHost
を持つすべてのエントリのセカンダリソートフィールドとして使用されます 価値。ここでも、より正確な一致が優先されます。 User
以降 列はワイルドカードを使用できません。空白のUser
を持つエントリを除いて、すべてのエントリは同じ位置にあります。 価値。それらは一番下にソートされます。 User
が空白のエントリがある場合 値を選択すると、ユーザーは「匿名ユーザー」として認証されます。これは通常、特権がないことを意味します。
これで、接続要求が行われるたびに、MySQLはメモリ内のソートされたテーブルを上から下に移動します。 最初のを使用します 一致する他のエントリがあるかどうかに関係なく、ユーザーを認証するために検出したエントリ。クライアントがそのエントリで定義された方法を使用して認証に失敗した場合、接続は失敗し、他のエントリはチェックされません。
とはMySQLユーザーアカウント定義にユーザーまたはホストを含めないことの意味は?
MySQLの認証アルゴリズムのため、ユーザーまたはホストコンポーネントなしでユーザーアカウントを作成するときに注意しないと、問題が発生する可能性があります。これは、MySQLが認証に使用するレコードを決定する方法が、直感的でなく、驚くべきものになる可能性があるためです。
たとえば、ユーザーがユーザー部分を空白の文字列としてMySQLに対して認証する場合、MySQLはセッションの残りの部分でそれらを「匿名ユーザー」と見なします。原則として、匿名ユーザーにはほとんど力がなく、接続するとほとんど何もできません。別のユーザーアカウントを使用して認証しようとすると、誤って匿名ユーザーとして認証される可能性もあります。
ワイルドカードホストの使用に関する課題 ユーザーアカウントの場合は、含む他のユーザーアカウントです。 ホスト値は、ワイルドカードを使用するユーザーアカウントを簡単にマスクしたり、使用できなくしたりする可能性があります。
たとえば、'emily'@'%'
として定義されたユーザーアカウントがある場合 、'emily'
への認証が期待できる場合があります 任意のホストから。ただし、空白のユーザーを持つユーザーアカウントを持っているが、ホストの値がホストの'emily'
と一致する場合 から接続している場合、MySQLは代わりにそのアカウントを使用して認証します(上記のように匿名ユーザーのログインにつながります)。
したがって、例として、MySQLは次のアカウントを次の順序に並べ替えます。
優先度 | MySQLアカウント | コメント |
---|---|---|
1 | 'emily'@'localhost' および'emily'@'example.com' | これらは同じ優先度ですが、接続に一致するのはそのうちの1つだけであるため問題ありません。 |
2 | ''@'localhost' および''@'example.com' | これらの2つのエントリも、同じ優先度です。ユーザーコンポーネントはありませんが、 リテラルホストコンポーネントがあり、正確なホスト値を持つエントリの下部に配置されます。 |
3 | 'emily'@'%.example.com' | このエントリのホストコンポーネントにはワイルドカードが含まれているため、正確なホスト値を持つエントリよりも優先度が低くなります。 |
4 | ''@'%.example.com' | このエントリは、ホスト値内にワイルドカードが含まれるエントリとグループ化されます。ユーザーコンポーネントがないため、このグループの一番下にあります。 |
5 | 'emily'@'%' | このエントリには、ワイルドカードのみで構成されるホスト値があります。どのホストとも一致するため、優先度は非常に低くなります。 |
7 | ''@'%' | このエントリは、任意のホストの任意のユーザーを匿名ユーザーとして認証するために使用できます。どの接続とも一致するため、優先度は非常に低くなります。 |
6 | 'emily'@'' | このエントリのホスト値は完全に空白です。これは、ワイルドカードホストのみを含むホストよりも優先度が低くなります。 |
8 | ''@'' | これは最も優先度の低いユーザーです。ホスト情報が含まれていないため、ホストの並べ替え中に最後に配置されます。空白のユーザーも含まれているため、このグループの他のエントリの下に配置されます。ユーザーのいないすべてのエントリと同様に、このエントリで認証された接続は匿名ユーザーとしてサインインされます。 |
どのようにユーザーを作成しますか?
MySQLがユーザーアカウントを処理する方法を理解したので、新しいユーザーの作成を開始できます。前提条件に記載されている権限を持つユーザーでログインすることを忘れないでください。
基本的な構文
新しいユーザーを作成するための基本的な構文は比較的単純です。 CREATE USER
を使用します コマンドを実行してから、新しいアカウントのユーザーとホストを指定します。
CREATE USER '<user>'@'<host>';
これにより、作成時にユーザーとホスト以外の詳細を構成することなく、基本的なアカウントが作成されます。
パスワードを使用してユーザーを作成するにはどうすればよいですか?
多くの場合、ユーザーの作成中に認証を構成する必要があります。これを行うには、オプションのIDENTIFIED BY
を追加します。 CREATE USER
への句 ステートメント:
CREATE USER '<user>'@'<host>' IDENTIFED BY '<password>';
これにより、以前と同様に新しいユーザーアカウントが作成され、同時にアカウントにパスワードが割り当てられます。事後にパスワードを割り当てる方法や、後でユーザーのパスワードを変更する方法について説明します。
Unixソケット認証を使用してユーザーを作成するにはどうすればよいですか?
パスワード認証はほとんどのユーザーにとって最も一般的な認証方法ですが、それが唯一のオプションではありません。 MySQLは、使用するユーザーアカウントに構成できるさまざまな内部および外部認証メカニズムを提供します。例として、Unixソケット認証を使用して新しいアカウントを構成します。
Unixソケット認証はLinuxまたはUnixライクな環境で使用できるため、オペレーティングシステム上のアカウントには、それ以上の認証なしでMySQL内の同じアカウント名へのアクセスが許可されます。この構成では、MySQL管理者は、オペレーティングシステムのユーザーアカウントが厳密に制御されていることを認識しています。
したがって、mary
がある場合 オペレーティングシステムのユーザーは、'mary'@'localhost'
にログインできます。 Unixソケット認証が定義された認証メカニズムである場合は、MySQL内のアカウント。これを今すぐ設定しましょう。
ソケット認証にはauth_socket
が必要です プラグインなので、最初に次のように入力してプラグインをロードします:
INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';
次に、オペレーティングシステムにあるユーザーアカウントと一致するユーザーアカウントを作成します。この例では、mary
を使用します 上で説明したアカウント。オペレーティングシステム名の1つと一致する名前を使用しない場合、このユーザーを使用して認証することはできません。
ソケット認証を使用してユーザーを作成するには、IDENTIFIED WITH
を使用する必要があります 句(IDENTIFIED BY
とは異なります 以前に使用した句)使用する認証プラグインを指定するには:
CREATE USER 'mary'@'localhost' IDENTIFIED WITH auth_socket;
これで、'mary'@'localhost'
に対して認証できるようになります。 mary
のMySQLユーザー オペレーティングシステム上のユーザー。 mary
としてログインした場合 、ユーザー名やパスワードを入力せずにデータベースに接続します:
mysql
構成したUnixソケット認証を介して自動的にサインインする必要があります。
既存のユーザーをどのように表示しますか?
次に、既存のユーザーに関する情報を見つける方法を見てみましょう。
ユーザーとホストコンポーネントで構成される既存のすべてのMySQLユーザーと、現在使用している認証プラグインを表示するには、SELECT
mysql.user
のフィールド データベース:
SELECT user,host,plugin FROM mysql.user
+------------------+-----------+-----------------------+ user | host | plugin |+------------------+-----------+-----------------------+ mary | localhost | auth_socket | mysql.infoschema | localhost | caching_sha2_password | mysql.session | localhost | caching_sha2_password | mysql.sys | localhost | caching_sha2_password | root | localhost | caching_sha2_password | useradmin | localhost | caching_sha2_password |+------------------+-----------+-----------------------+6 rows in set (0.00 sec)
ここでは、システムに6人のユーザーが定義されており、そのすべてがローカルでのみログインできることがわかります。アカウントのうち5つは、パスワード認証を使用するように構成されています。 'mary'@'localhost'
アカウントはUnixソケット認証を使用するように構成されています。
SHOW CREATE USER
を使用すると、ユーザープロパティに関する追加情報を見つけることができます。 指図。その名前にもかかわらず、ユーザーアカウントの現在のプロパティがすべて表示されますが、必ずしも最初のアカウント作成時に使用されたものではありません。
SHOW CREATE USER
コマンドは引数としてアカウント名を取ります:
SHOW CREATE USER '<user>'@'<host>'\G
通常は、コマンドを\G
で終了するのが最適です。 通常のコロンの代わりにステートメントターミネータ(;
)結果をもう少し明確に表示できるようにします。
'useradmin'@'localhost'
のプロパティを表示するには アカウントの場合、次のように入力します:
SHOW CREATE USER 'useradmin'@'localhost'\G
*************************** 1. row ***************************CREATE USER for useradmin@localhost: CREATE USER 'useradmin'@'localhost' IDENTIFIED WITH 'caching_sha2_password' AS '$A$005$O Rl7lM;@Gt{roB4EWchqDdYM142Lq7pfzcCNiK4yUxnRBlrAgr0sE3' REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT PASSWORD REQUIRE CURRENT DEFAULT1 row in set (0.00 sec)
既存のMySQLユーザーをどのように変更しますか?
ALTER USER
を使用して、MySQL内の既存のユーザーを変更できます 指図。これは、GRANT
によって制御されるアカウント権限を除いて、アカウントのユーザー関連のプロパティのほとんどを変更するために使用できます。 およびREVOKE
コマンド。
ALTER USER
の基本構文 次のようになります:
ALTER USER <user> <properties_to_change>;
MySQLユーザーのパスワードをどのように変更しますか?
ほとんどの人にとって、ALTER USER
の最も一般的な使用法 パスワードを変更することです。
たとえば、'kamal'@'localhost'
のパスワードを変更できます。 次のように入力します:
ALTER USER 'kamal'@'localhost' IDENTIFIED BY '<new_password>';
ユーザーがすぐに置き換える必要がある一時的なパスワードを設定する場合は、パスワードの設定と有効期限の設定を同時に行うことができます。
ALTER USER 'kamal'@'localhost' IDENTIFIED BY '<new_password>' PASSWORD EXPIRE;
CREATE USER
がなくても、いつでも自分のパスワードを変更できます。 特権。 USER()
を使用するのが最も簡単です 自分のユーザー名を自動的に入力する機能:
ALTER USER USER() IDENTIFIED BY '<new_password>';
MySQLユーザーの認証プラグインをどのように変更しますか?
アカウントの認証に使用されるメカニズムやプラグインを変更することもできます。
前の例では、'mary'@'localhost'
というアカウントを構成しました Unixソケット認証を使用します。後でそのアカウントを変更して従来のパスワード認証を使用する場合は、ALTER USER
を使用できます。 もう一度コマンドします。
まず、サーバーのデフォルトの認証プラグインを特定します。パスワードベースの認証方法の場合は、デフォルトの選択を再利用するのがおそらく最善です:
SHOW VARIABLES LIKE 'default_authentication_plugin';
この場合、デフォルトの認証プラグインはcaching_sha2_password
です。 、パスワード認証に切り替えるときに使用します。
ここで、'mary'@'localhost'
を変更します caching_sha2_password
を使用するには 新しいパスワードのプラグイン:
ALTER USER 'mary'@'localhost' IDENTIFIED WITH 'caching_sha2_password' BY '<marys_password>';
'mary'@'localhost'
ユーザーはUnixソケット認証を使用してログインできなくなりますが、提供されたパスワードを使用してログインできます。
MySQLにログインするにはどうすればよいですか?
認証を含め、MySQLユーザーアカウントを作成および変更する方法について説明しました。ただし、これらの認証方法を使用して実際にログインする方法については説明していません。
mysql
clientは、ローカルおよびリモートデータベースへの接続に使用できる強力なコマンドラインクライアントです。これを使用して、上記で構成した方法を使用して認証する方法について説明します。
パスワードを使用してローカルデータベースにログインするにはどうすればよいですか?
>パスワード付きのユーザーアカウントを使用してローカルでホストされているMySQLデータベースにログインするには、基本的な構文は次のようになります。
mysql --user=<username> --password <dbname>
したがって、'kamal'@'localhost'
ユーザーがMySQLにログインしてtesting
に接続したい システムがホストされているコンピューターのデータベースには、次のように入力できます。
mysql --user=kamal --password testing
mysql
クライアントは、'kamal'@'localhost'
のパスワードの入力を求めます 。正しいクレデンシャルを入力すると、testing
に接続されます データベース。
コマンドラインでのデータベースの指定はオプションです。何も指定されていない場合は、サーバーに接続しますが、特定のデータベースには接続しません。
Unixソケット認証を使用してローカルデータベースにログインするにはどうすればよいですか?
Unixソケット認証を使用してローカルMySQLサーバーにログインするには、一致するアカウント名としてオペレーティングシステムにログインする必要があります。したがって、'mary'@'localhost'
に対して認証する場合 Unixソケット認証を使用して、最初にmary
というユーザー名でコンピューターにログインする必要があります。 。
正しいオペレーティングシステムアカウントを使用すると、オプションなしでクライアントを実行することにより、ローカルデータベースに直接接続できます。
mysql
以前と同様に、オプションでデータベース名を追加して、必要な特定のデータベースに接続できます。
パスワードを使用してリモートデータベースにログインするにはどうすればよいですか?
>
MySQLサーバーがローカルサーバーで実行されていない場合は、クライアントが接続を試行するホストを指定する必要があります。これを行うには、--host
を追加します オプション。
ほとんどの場合、リモートMySQLサーバーへのパスワードを使用して認証するため、コマンドは次のようになります。
mysql --user=<username> --password --host=<host> <dbname>
したがって、'tanya'@'<tanyas_domain>'
example.com
にあるMySQLサーバーに接続できます 次のように入力します:
mysql --user='tanya' --password --host='example.com'
MySQLユーザーを削除するにはどうすればよいですか?
目的を果たさなくなったユーザーアカウントを維持することは、セキュリティ上のリスクです。 DROP USER
を使用するとアカウントを簡単に削除できます コマンド。
基本的な構文は次のようになります:
DROP USER '<user>'@'<host>';
したがって、'mary'@'localhost'
を削除するには ユーザー、次のように入力します:
DROP USER 'mary'@'localhost';
存在しないユーザーを削除しようとすると、エラーが発生します:
ERROR 1396 (HY000): Operation DROP USER failed for 'mary'@'localhost'
これを回避するには、IF EXISTS
を追加します。 アカウント名の前の句。ユーザーが存在する場合は削除されます。そうでない場合は、警告のみが表示されます:
Query OK, 0 rows affected, 1 warning (0.00 sec)
結論
MySQLのユーザーアカウント管理と認証構成は非常に柔軟です。 MySQL内のユーザーに関する情報を作成、変更、および取得する方法を学ぶことは、データベースシステムをより効果的に管理するのに役立ちます。
セキュリティのベストプラクティスでは、スコープを実行するために必要なアクセスレベルのみを考慮して、固有のユースケースごとにアカウントを作成する必要があります。アカウントの作成と認証は、このプロセスの最初の段階です。別のガイドでは、その戦略の他の部分を実行するための特権の付与と取り消しについて説明します。