💽

MySQLでパスワードレス認証を実現する方法

に公開

MySQLでパスワードレス認証を実現する方法

MySQLクライアントでパスワード入力を省略してログインする方法をいくつか紹介します。開発環境での作業効率化や、セキュアなサーバー環境での運用に役立つテクニックです。

1. 基本的なパスワードレスログイン

パスワードが設定されていない場合

最もシンプルなケースです。ユーザーにパスワードが設定されていない場合は、-pオプションを付けずにログインできます。

mysql -u username -h hostname

設定ファイルを使用する方法

~/.my.cnfファイルにクレデンシャル情報を保存する方法です。

[client]
user=your_username
password=your_password
host=localhost

設定後は以下のように実行:

mysql

セキュリティ設定

# ファイルの権限を適切に設定
chmod 600 ~/.my.cnf

環境変数を使用する方法

環境変数MYSQL_PWDを設定してパスワードを渡す方法:

export MYSQL_PWD="your_password"
mysql -u username -h hostname

2. auth_socketプラグインを使用したOS認証

MySQL 8.0以降で利用可能な、最もセキュアなパスワードレス認証方法です。UnixソケットベースのOS認証を使用します。

新しいユーザーを作成

-- auth_socketプラグインを使用するユーザーを作成
CREATE USER 'your_username'@'localhost' IDENTIFIED WITH auth_socket;

-- 権限を付与
GRANT ALL PRIVILEGES ON database_name.* TO 'your_username'@'localhost';
FLUSH PRIVILEGES;

既存ユーザーの認証方法を変更

-- 既存ユーザーをauth_socketに変更
ALTER USER 'existing_user'@'localhost' IDENTIFIED WITH auth_socket;

設定の確認

-- 認証プラグインを確認
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_username';

実際の使用例

# OSユーザー名と同じMySQLユーザーでログイン
mysql -u your_username

3. 完全な設定手順

Step 1: rootでMySQLにログイン

mysql -u root -p

Step 2: auth_socketユーザーを作成

CREATE USER 'devuser'@'localhost' IDENTIFIED WITH auth_socket;
GRANT ALL PRIVILEGES ON myapp_db.* TO 'devuser'@'localhost';
FLUSH PRIVILEGES;

Step 3: 設定の確認

SELECT user, host, plugin, authentication_string 
FROM mysql.user 
WHERE user = 'devuser';

期待される出力:

+----------+-----------+-------------+-----------------------+
| user     | host      | plugin      | authentication_string |
+----------+-----------+-------------+-----------------------+
| devuser  | localhost | auth_socket |                       |
+----------+-----------+-------------+-----------------------+

Step 4: 新しいユーザーでログインテスト

# OSユーザー 'devuser' として
mysql -u devuser

4. セキュリティ上の考慮事項

auth_socketの利点

  • OSレベルの認証: OSユーザーの認証情報を使用するため、パスワードの管理が不要
  • ネットワーク経由の攻撃に対する耐性: localhostからの接続のみ許可
  • パスワード漏洩のリスク軽減: パスワードが設定されていないため、漏洩リスクがない

注意点

  • OSユーザーのセキュリティが重要: OSレベルでの適切なアクセス制御が必要
  • localhost限定: ネットワーク経由での接続には使用できない
  • ユーザー名の一致: OSユーザー名とMySQLユーザー名が一致している必要がある

5. トラブルシューティング

プラグインが利用できない場合

-- 利用可能なプラグインを確認
SHOW PLUGINS;

認証エラーが発生した場合

-- 元の認証方法に戻す
ALTER USER 'username'@'localhost' 
IDENTIFIED WITH caching_sha2_password BY 'new_password';

デバッグ用のSQL

-- 現在のユーザー情報を確認
SELECT CURRENT_USER();

-- 接続情報を確認
SELECT USER(), CONNECTION_ID();

6. 実用的な使用例

開発環境での設定

# 開発用ユーザーを作成
sudo useradd -m developer
sudo su - developer

# MySQLでユーザーを作成
mysql -u root -p -e "
CREATE USER 'developer'@'localhost' IDENTIFIED WITH auth_socket;
GRANT ALL PRIVILEGES ON dev_*.* TO 'developer'@'localhost';
FLUSH PRIVILEGES;
"

# パスワードなしでログイン
mysql -u developer

自動化スクリプトでの使用

#!/bin/bash
# バックアップスクリプト例

# auth_socketユーザーを使用してパスワードなしでダンプ
mysqldump -u backup_user database_name > backup_$(date +%Y%m%d).sql

まとめ

MySQLでパスワードレス認証を実現する方法として、auth_socketプラグインを使用したOS認証が最もセキュアで実用的です。開発環境での作業効率化や、自動化スクリプトでの利用に適しています。

ただし、本番環境で使用する場合は、OSレベルでの適切なセキュリティ設定と、必要最小限の権限付与を心がけることが重要です。

Discussion