はじめに
ユーザー管理は、MySQLデータベースシステムを管理しようとする人にとって最も重要な責任の1つです。環境内のユーザーとサービスを最もよく表すためにユーザーアカウントを作成、変更、および削除することは、アクセスをロックダウンし、変更の範囲を制限し、変更の監査とアカウンタビリティを実装するための基礎を築くのに役立ちます。
このガイドでは、MySQL内でユーザーアカウントを管理する方法について説明します。まず、MySQLで有効なユーザーとは何かについて説明し、システムにユーザーを追加する方法を示します。これにより、各ユーザーの認証を構成する方法と、システムが可能性のリストから認証オプションを選択する方法についての説明につながります。既存のユーザーへの変更、作成したアカウントでログインする方法、不要になったユーザーを削除する方法について引き続き説明します。
前提条件
このガイドに従うには、適切な権限を持つMySQLサーバーのアカウントが必要です。
使用するコマンド
MySQL内でユーザーを作成、変更、および削除するために必要なコアコマンドは次のとおりです。
CREATE USER
:新しいユーザーアカウントを作成するALTER USER
:既存のユーザーアカウントに変更を加えるDROP USER
:既存のユーザーアカウントを削除する
必要な権限
上記のコマンドを実行するには、CREATE USER
権限を持つアカウントでMySQLにログインする必要があります。CREATE USER
権限を使用すると、他のアクションの中でも、ユーザーの作成、変更、削除、および名前変更を行うことができます。既存のユーザーに関する情報を表示するには、mysql
データベースに対するSELECT
権限も必要になります。
優先順位の高い順に、次のアカウントを使用してログインする必要があります。
CREATE USER
権限とmysql
データベースに対するSELECT
権限を持つ制限付きアカウント- MySQL内で完全な権限を持つ
root
または管理者ユーザー
MySQLがユーザーアカウントを定義および解釈する方法の理解
新しいアカウントの作成を開始する前に、MySQLがユーザーの作成と参照に使用するさまざまな方法に慣れておくことをお勧めします。また、MySQLの認証アルゴリズムを理解して、接続を認証するために使用するユーザーアカウントを理解する必要があります。
MySQLのユーザーアカウントの構文は何ですか?
MySQLでは、ユーザーアカウントは、アットマーク(@)で結合された2つの別々の情報で構成されています。
- ユーザー名
- ユーザーが接続しているホスト
一般に、システム上のユーザーアカウントは次のようになります。
'<user>'@'<host>'
上記の例のように、単一引用符を使用して、ユーザーアカウントのユーザーコンポーネントとホストコンポーネントを個別にラップできます。コンポーネントのいずれかに誤って解釈される文字が含まれている場合は、必要な場合があります。一般に、それらを明示的に追加することは常に良い考えです。
したがって、MySQLでは、単に'john'
という名前のアカウントを持つのではなく、完全なアカウント名には、'john'@'localhost'
などの何らかのホストが必要です。これは、システムに複数の'john'
アカウントが存在する可能性があり、MySQLは、異なるドメインから来ている限り、それらをそれぞれ一意のアカウントと見なすことを意味します。
そうは言っても、ユーザーまたはホストコンポーネントを持たないユーザーアカウントを定義することは可能ですが、注意すべき重要な意味があります。
空の文字列を使用して、ユーザー値なしでユーザーアカウントを定義できます。
''@'<host>'
たとえば、''@'localhost'
としてユーザーを作成できます。このユーザーは、ローカルコンピューターから接続する任意のユーザー名に一致します。
同様に、任意のホストから一致するユーザーアカウントを持つことができます。ホスト値には、空の文字列を使用するのではなく、%
ワイルドカードを次のように使用します。
'<user>'@'%'
たとえば、'john'@'%'
を作成すると、そのアカウントは任意のホストから接続する'john'
ユーザーに一致します。
MySQLはどのようにユーザーを認証しますか?
MySQLが実際に各認証リクエストをどのように処理するかを理解することは、合理的だが誤った前提から生じる一般的な認証問題を回避するために非常に重要です。これについては、MySQLの記事の認証と認可の概要で詳しく説明しました。
接続リクエストを認証するとき、MySQLは内部mysql
データベースのuser
テーブル内の多数のフィールドを使用して、接続を許可するかどうかを決定します。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>';
これにより、作成時にユーザーとホスト以外の詳細を構成せずに基本アカウントが作成されます。
パスワード付きユーザーを作成するには?
多くの場合、ユーザーの作成中に認証を構成する必要があります。CREATE USER
ステートメントにオプションのIDENTIFIED BY
句を追加することで、これを行うことができます。
CREATE USER '<user>'@'<host>' IDENTIFED BY '<password>';
これにより、以前と同様に新しいユーザーアカウントが作成され、同時にアカウントのパスワードが割り当てられます。後でパスワードを割り当てる方法、またはユーザーのパスワードを変更する方法については後で説明します。
Unixソケット認証でユーザーを作成するには?
パスワード認証はほとんどのユーザーにとって最も一般的な認証方法ですが、それだけではありません。MySQLは、ユーザーアカウントで使用するように構成できる多くの異なる内部および外部認証メカニズムを提供します。例として、Unixソケット認証を使用して新しいアカウントを構成します。
Unixソケット認証は、LinuxまたはUnixライクな環境で使用して、オペレーティングシステムのアカウントに、MySQL内の同じアカウント名へのアクセスを、追加の認証なしで付与できます。この構成では、MySQL管理者は、オペレーティングシステムのユーザーアカウントが厳密に制御されていることを認識しています。
したがって、オペレーティングシステムにmary
ユーザーがいる場合、Unixソケット認証が定義された認証メカニズムである場合、MySQL内の'mary'@'localhost'
アカウントにログインできます。これを今すぐ構成しましょう。
ソケット認証にはauth_socket
プラグインが必要なため、最初に次のように入力してプラグインをロードします。
INSTALL PLUGIN auth_socket SONAME 'auth_socket.so';
次に、オペレーティングシステムのアカウントに一致するユーザーアカウントを作成します。この例では、上記で説明したmary
アカウントを使用します。オペレーティングシステム名のいずれかに一致する名前を使用しない場合、このユーザーを使用して認証することはできません。
ソケット認証でユーザーを作成するには、使用する認証プラグインを指定するためにIDENTIFIED WITH
句(以前に使用したIDENTIFIED BY
句とは異なります)を使用する必要があります。
CREATE USER 'mary'@'localhost' IDENTIFIED WITH auth_socket;
これで、オペレーティングシステムのmary
ユーザーから'mary'@'localhost'
MySQLユーザーを認証できるようになるはずです。mary
としてログインしたら、ユーザー名またはパスワードを指定せずにデータベースに接続します。
mysql
構成したUnixソケット認証を介して自動的にサインインされるはずです。
既存のユーザーを表示するには?
次に、既存のユーザーに関する情報を検索する方法を見てみましょう。
ユーザーとホストコンポーネント、および現在使用している認証プラグインで構成される既存のすべてのMySQLユーザーを表示するには、mysql.user
データベースからそれらのフィールドをSELECT
できます。
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$ORl7lM;@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ユーザーを変更するには?
MySQL内の既存のユーザーは、ALTER USER
コマンドを使用して変更できます。これは、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ユーザーの認証プラグインを変更するには?
アカウントを認証するために使用されるメカニズムまたはプラグインを変更することもできます。
前の例では、Unixソケット認証を使用するように'mary'@'localhost'
というアカウントを構成しました。後でそのアカウントを従来のパスワード認証を使用するように変更する場合は、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
クライアントは、ローカルおよびリモートデータベースへの接続に使用できる強力なコマンドラインクライアントです。これを使用して、上記で構成した方法を使用して認証する方法について説明します。
パスワードを使用してローカルデータベースにログインする方法
パスワードを持つユーザーアカウントを使用してローカルでホストされているMySQLデータベースにログインするには、基本的な構文は次のようになります。
mysql --user=<username> --password <dbname>
たとえば、'kamal'@'localhost'
ユーザーがMySQLにログインし、システムがホストされているコンピューターから testing
データベースに接続する場合、次のように入力できます。
mysql --user=kamal --password testing
mysql
クライアントは、'kamal'@'localhost'
のパスワードを要求します。正しい認証情報を提供すると、testing
データベースに接続されます。
コマンドラインでデータベースを指定することはオプションです。何も指定しない場合、サーバーには接続しますが、特定のデータベースには接続しません。
Unixソケット認証を使用してローカルデータベースにログインする方法
Unixソケット認証を使用してローカルMySQLサーバーにログインするには、一致するアカウント名としてオペレーティングシステムにログインする必要があります。したがって、Unixソケット認証を使用して 'mary'@'localhost'
に対して認証する場合、まずユーザー名 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内でユーザーを作成、変更、および情報を取得する方法を学ぶことは、データベースシステムをより効果的に管理するのに役立ちます。
セキュリティのベストプラクティスでは、それぞれの固有のユースケースに対してアカウントを作成し、そのスコープを実行するために必要なレベルのアクセス権のみを付与する必要があることが示されています。アカウントの作成と認証は、このプロセスの最初の段階です。別のガイドでは、その戦略のもう一方の部分を満たすために、特権の付与と取り消しについて説明します。
よくある質問(FAQ)
ユーザーのパスワードを変更する最も一般的な方法は、ALTER USER
を使用することです。たとえば、次を使用すると、'kamal'@'localhost'
のパスワードを変更できます。
ALTER USER 'kamal'@'localhost' IDENTIFIED BY '<new_password>';
次を使用して一時パスワードを設定することもできます。
ALTER USER 'kamal'@'localhost' IDENTIFIED BY '<new_password>' PASSWORD EXPIRE;
MySQLデータベースにrootユーザーとしてログインしようとしたときにエラーが発生する可能性のある理由はいくつかあります。MySQLは、ドキュメントで実行できるトラブルシューティングチェックについて説明しています。
一般的なケースには、rootユーザーのパスワードをリセットしたり、構成ファイルを編集したりする必要がある場合があります。
DROP USER
コマンドを使用すると、MySQLでユーザーを削除できます。基本的な構文は次のようになります。
DROP USER '<user>'@'<host>';
存在しないユーザーを削除しようとするのを避けるために、アカウント名の前に IF EXISTS
句を含めることができます。
MySQLインスタンス内のすべてのユーザーを一覧表示するには、mysql.user
データベースで SELECT
ステートメントを使用できます。構文は、host
および plugin
も含めると、次のようになります。
SELECT user,host,plugin FROM mysql.user;
現在のユーザーの権限を表示するには、次の構文を使用できます。
SHOW GRANTS;
他のユーザーの場合は、次を使用できます。
SHOW GRANTS FOR '<user>'@'<host>';