シェアする

はじめに

複数のホストにわたって異なるユーザーやデータベースの認証情報を維持することは、使いやすさの観点から困難な場合があります。複数のMySQLサーバーに定期的にログインする場合や、セキュリティ上の理由で固有の権限を持つ個別のユーザーアカウントを持つプロジェクトがある場合、必要なアカウントに接続する方法を見失うことが容易にあります。

幸いなことに、MySQL には mysql_config_editor と呼ばれる小さなユーティリティが用意されており、MySQL の認証情報を保存および管理することで、MySQL クライアントやツールで簡単に認証できるように設計されています。このガイドでは、mysql_config_editor の仕組み、複数の認証情報を安全に管理する方法、そして他の MySQL ツールにこの設定を利用してサーバーに認証させる方法について説明します。

mysql_config_editor はどのように機能しますか?

mysql_config_editor ユーティリティは、MySQL のインストールに含まれる小さなプログラムで、異なる MySQL サーバーや異なるアカウントへの接続に使用する認証情報を管理します。認証情報は暗号化され、ホームディレクトリの .mylogin.cnf というファイルに保存されます。

MySQL アカウントへのログイン方法を記述する各認証情報のセットは「ログインパス」と呼ばれます。これらは通常、アカウントのユーザー名とパスワードを指定し、さらに MySQL がリッスンしているホスト名やポートなど、適切な MySQL サーバーに接続するための関連情報を保存できます。

MySQL クライアントとツールは、.mylogin.cnf ファイル内の情報を使用して MySQL サーバーへのログインを支援するように自動的に設定されます。mysql クライアントなどの MySQL ツールで --login-path= パラメータを使用して、どのログイン詳細を使用するかを指定できます。ログインパスが指定されていない場合、ツールは、定義されていれば client として知られるデフォルトのログインパスに関連付けられた認証情報を使用します。

ログインパスが特定の値を定義していない場合、MySQL クライアントとツールは代わりに設定されたデフォルト値を使用します。たとえば、mysql_config_editor でログインパスを作成する際にホストを指定しない場合、mysql クライアントは自動的に localhost を仮定します。これは、コマンドラインで手動で認証情報を提供するときに --host= オプションを省略した場合と同じです。

新しいログインパスを作成して認証情報を定義する

まず、mysql_config_editor ツールを使用して新しいログインパスを設定することから始めましょう。

新しいログインパスを定義するための一般的な構文は次のとおりです。

mysql_config_editor set [options]

通常、次のオプションのいくつかを含めます。

  • --login-path=: これらの認証情報に使用したいラベル
  • --user=: アカウントのユーザー名
  • --password: mysql_config_editor にアカウントのパスワードを要求するよう指示するフラグ。パスワードプロンプトを使用すると、コマンドラインで直接提供された場合のようにシェル履歴ファイルに記録されないように、パスワードを安全に入力できます。
  • --host=: MySQL サーバーがホストされているホスト名または IP アドレス。
  • --port=: MySQL サーバーがリッスンしているポート番号。
  • --socket=: Unix ソケットを介してローカルサーバーに接続する場合のローカルソケットファイルへのパス。

MySQL ユーティリティのデフォルトオプションと異なる情報のみを提供する必要があります。

エントリを作成する際、mysql_config_editor は一度作成されたログインパスに関連付けられた詳細を編集する方法を提供しないことに留意してください。詳細を変更するには、以前のエントリを上書きするために、すべての適切な接続情報を再度指定する必要があります。

ローカルアカウントの接続情報を設定する

たとえば、ローカル MySQL サーバーで salesadmin というユーザーのログインを作成するには、次のように入力します。

mysql_config_editor set --login-path=sales --user=salesadmin --password

アカウントのパスワードを求められ、新しい接続情報は sales というラベルの下に .mylogin.cnf ファイルに保存されます。--user=salesadmin でアカウント名を提供し、--password フラグを含めることで mysql_config_editor にパスワードを要求するよう指示します。

これはローカルアカウントであるため、Unix 系システムで実行されている場合はローカルソケットファイルを介して接続します。ただし、MySQL を異なる方法で実行するように変更していない場合、MySQL ツールは何をすべきかを知っており、設定時にこれらの詳細を提供する必要はありません。

リモートアカウントの接続情報を設定する

dev.example.com というホストのポート 5555 でリッスンしている MySQL サーバー上のリモートユーザー名 testuser の接続情報を保存するには、次のように入力します。

mysql_config_editor set --login-path=testing --user=testuser --password --host=dev.example.com --port=5555

testing ログインパスのエントリには、dev.example.com でホストされている MySQL データベースにユーザーアカウント testuser で自動的に接続するために必要なすべての情報が含まれます。

デフォルトの接続情報を設定する

MySQL ツールは、明示的な接続情報なしで呼び出された場合に妥当なデフォルトを使用するように設計されています。たとえば、Unix 系システムでは、上書きされていない場合、以下の詳細を使用して接続を試みます。

  • ユーザー: オペレーティングシステムのユーザー名
  • パスワード: なし
  • ホスト: localhost。これはデフォルトで、プラットフォームのデフォルトの場所にある Unix ソケットを介して接続することを意味します。

これらのオプションがユースケースに適していない場合、mysql_config_editor を使用してデフォルトの接続情報を変更できます。そのためには、ログインパスを指定せずに、デフォルトで使用したい接続情報を提供します。

例:

mysql_config_editor set --user=root --password

これにより、接続情報は一般的な client ログインパスの下に保存され、他のログインパスが提供されていない場合に MySQL ツールによって読み取られます。

ログインパスでのログイン

設定した接続情報を使用するには、MySQL クライアントとツールのコマンドラインで --login-path= を指定します。

たとえば、以前に設定したローカルの salesadmin アカウントにログインするには、mysqlsales ログインパスを使用するように指示できます。

mysql --login-path=sales

testuser アカウントを使用して dev.example.com サーバーにログインするには、代わりに testing ログインパスを指定できます。

mysql --login-path=testing

--login-path= なしで mysql を呼び出すと、設定した client ログインパスをチェックし、root アカウントでローカルデータベースにログインしようとします。

mysql

いずれの場合も、追加の詳細を提供することなく、適切なアカウントにログインできます。

接続しているユーザーは、次のように入力して確認できます。

SELECT user();
+----------------------+
| user() |
+----------------------+
| salesadmin@localhost |
+----------------------+
1 row in set (0.00 sec)

接続しているユーザーと方法を確認したい場合は、代わりに status コマンドを使用できます。

status
--------------
mysql Ver 8.0.27-0ubuntu0.20.04.1 for Linux on x86_64 ((Ubuntu))
Connection id: 28
Current database:
Current user: sammy@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 8.0.27-0ubuntu0.20.04.1 (Ubuntu)
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8mb4
Db characterset: utf8mb4
Client characterset: utf8mb4
Conn. characterset: utf8mb4
UNIX socket: /var/run/mysqld/mysqld.sock
Binary data as: Hexadecimal
Uptime: 1 day 21 hours 37 min 49 sec
Threads: 2 Questions: 66 Slow queries: 0 Opens: 186 Flush tables: 3 Open tables: 105 Queries per second avg: 0.000
--------------

Current user の下に現在のユーザーが表示されますが、ConnectionUNIX socket の項目を確認することで、サーバーにどのように接続されているかの詳細も表示できます。

利用可能なログインパスの表示

定義した接続の詳細はホームディレクトリの .mylogin.cnf というファイルに保存されますが、セキュリティのため内容は暗号化されています。設定情報を表示するには、再度 mysql_config_editor を使用する必要があります。

設定したデフォルトのログイン情報(client ログインパスの下に保存されています)を表示するには、追加オプションなしで print サブコマンドを使用できます。

mysql_config_editor print
[client]
user = "root"
password = *****

MySQL は、適切なログインパスラベルの下に接続詳細をグループ化するために INI スタイルのファイル形式を使用します。パスワードが伏せられていることにも気づくかもしれません。これも、保存されたパスワードが漏洩しないようにするためのセキュリティ対策です。

別のログインパスを表示するには、通常通り --login-path= オプションを指定します。

mysql_config_editor print --login-path=testing
[testing]
user = "testuser"
password = *****
host = "dev.example.com"
port = 5555

設定されているすべてのログインパスを表示するには、代わりに --all フラグを追加します。

mysql_config_editor print --all
[sales]
user = "salesadmin"
password = *****
[testing]
user = "testuser"
password = *****
host = "dev.example.com"
port = 5555
[client]
user = "root"
password = *****

接続情報の削除

remove サブコマンドを使用して、ログインパスに関連付けられた接続情報を削除できます。--login-path を指定することで、mysql_config_editor が適切なエントリを対象とすることができます。

たとえば、sales ログインパスの接続情報を削除するには、次のように入力します。

mysql_config_editor remove --login-path=sales

設定されたエントリを確認すると、sales ログインパスが削除されていることがわかります。

mysql_config_editor print --all
[testing]
user = "testuser"
password = *****
host = "dev.example.com"
port = 5555
[client]
user = "root"
password = *****

ログインパスの接続情報から特定のパラメータを削除することもできます。たとえば、「dev.example.com」にある MySQL サーバーがデフォルトの 3306 ポートで実行するように再設定された場合、ポート情報を削除できます。そのためには、--login-path= とともに --port フラグを提供します。

mysql_config_editor remove --login-path=testing --port

エントリを再度表示することで、ポート指定が testing ログインパスから削除されたことを確認できます。

mysql_config_editor print --all
[testing]
user = "testuser"
password = *****
host = "dev.example.com"
[client]
user = "root"
password = *****

また、すべてのログインパスを削除し、新しい空の .mylogin.cnf ファイルを作成するには、次のように入力します。

mysql_config_editor reset

これにより、設定されているすべてのログインパスが削除されます。

まとめ

このガイドでは、接続情報を管理することでユーザーエクスペリエンスを向上させるために設計された MySQL の小さなユーティリティの1つである mysql_config_editor について説明しました。ログインパスを使用して接続情報を設定する方法と、設定済みの認証情報を使用して MySQL ツールを呼び出す方法を扱いました。また、デフォルトを上書きする方法や、既存のログインパス情報を管理する方法についても議論しました。

mysql_config_editor や MySQL プロジェクトが提供するその他のツールを活用することで、単一の場所から複数のプロジェクトを管理する際に生じる不満の一部を解消できます。これは、反復的でエラーが発生しやすいタスクを効率化し、より重要な作業に集中できるように設計された、比較的シンプルなツールの良い例です。

著者について
Justin Ellingwood

Justin Ellingwood

ジャスティンは2013年からデータベース、Linux、インフラストラクチャ、開発者ツールについて執筆しています。現在は妻と2匹のウサギと共にベルリンに住んでいます。彼は通常、三人称で書く必要がないため、関係者全員にとって安心です。
© . All rights reserved.