MySQL 入門

MySQL ユーザーアカウント管理

データベースユーザーは、誰が MySQL データベースにアクセスできるか、そしてどのような操作を実行できるかを制御するために極めて重要です。適切なユーザー管理は、データのセキュリティと整合性を確保するための基盤となります。すべてのユーザーアカウントは「ユーザー名 (username)」と「ホスト (host)」の組み合わせによって識別され、これによりユーザーがどのクライアントマシンから接続できるかが決定されます。

1. 新しい MySQL ユーザーの作成 (CREATE USER)

新しいユーザーを作成するには、ユーザー名、接続を許可するホスト、および認証メソッド(Authentication method)を指定する必要があります。最も一般的な認証メソッドはパスワードによるものです。

CREATE USER 'ユーザー名'@'ホスト' IDENTIFIED BY 'パスワード';
  • username: ユーザーに割り当てる一意の名前です。Windows ではユーザー名の大文字と小文字は区別されませんが、Linux/Unix システムでは区別されます。
  • host: ユーザーがどこから接続できるかを指定します。
    • 'localhost': ユーザーは MySQL サーバーが動作しているのと同じマシンからのみ接続できます。
    • '%': ユーザーは任意のホストから接続できます。本番環境(プロダクション環境)では、このワイルドカードの使用には非常に慎重になる必要があります。
    • '192.168.1.100': ユーザーはこの特定の IPアドレスからのみ接続できます。
    • 'example.com': ユーザーは特定のホスト名からのみ接続できます。システムは DNS 解析を使用してホスト名を IPアドレスにマッピングします。
  • password: そのユーザーアカウントのパスワードです。十分に複雑で一意なものである必要があります。

1.1 ユーザー作成の例

ローカル管理者の作成: MySQL サーバー自体からのみ接続できるユーザーで、通常はローカルの管理タスクに使用されます。

CREATE USER 'admin_local'@'localhost' IDENTIFIED BY 'StrongPass123!';

アプリケーションユーザーの作成: プライベートネットワーク内の特定のサーバーにあるアプリケーションが接続するために設計されたユーザーアカウント。

CREATE USER 'app_server_user'@'192.168.1.50' IDENTIFIED BY 'AppSecurePass#';

ここでは、app_server_user は IPアドレス 192.168.1.50 のホストからのみ接続できるように制限されています。これは、内部アプリケーションの攻撃対象領域(アタックサーフェス)を最小限に抑えるための一般的なベストプラクティスです。

レポートユーザーの作成: 特定のドメイン内のさまざまなマシンから接続してレポートをプルする必要があるユーザー。

CREATE USER 'reporting_user'@'%.example.com' IDENTIFIED BY 'ReportAccess2023';

これにより、example.com ドメイン内の任意のホストから接続できる reporting_user が作成されます。ワイルドカード %.example.com は、.example.com で終わる任意のホスト名にマッチします。

1.2 CREATE USER の重要事項

  • 認証プラグイン(Authentication Plugin): デフォルトでは、MySQL はバージョンや構成に応じて caching_sha2_password または mysql_native_password を使用します。必要に応じて、IDENTIFIED WITH mysql_native_password BY 'password' のように認証プラグインを明示的に指定できます。ただし、セキュリティ上の理由から、モダンな MySQL バージョンでは通常 caching_sha2_password が推奨されます。
  • パスワードポリシー(Password Policy): MySQL サーバーはパスワードポリシー(例:最小の長さ、特殊文字の必須化など)を構成できます。作成したパスワードがポリシーの要件を満たさない場合、CREATE USER ステートメントは失敗します。
  • ユーザーテーブル: ユーザー情報はシステムテーブル mysql.user に保存されます。既存のユーザーを確認するためにこのテーブルをクエリすることはできますが、INSERTUPDATE を使用してこのテーブルを直接修正してはいけません。

2. 既存の MySQL ユーザーの確認

ユーザーとその関連ホストを確認するには、mysql.user テーブルをクエリします。画面上に機密性の高いパスワードハッシュ(Password hash)が表示されるのを避けるため、SELECT * ではなく特定のカラムを使用することをお勧めします。

SELECT user, host FROM mysql.user;

このコマンドは、すべてのユーザーアカウントと、接続が許可されているホストをリストアップします。これは、セキュリティ監査や、認可されたユーザーのみが存在することを確認するために非常に役立ちます。

3. 既存の MySQL ユーザーの変更 (ALTER USER)

ユーザーの作成後、パスワードを変更したり名前を変更(リネーム)したりする必要が生じることがあります。

3.1 ユーザーパスワードの変更

ユーザーパスワードの変更は、一般的な管理タスクです。これは ALTER USER ステートメントを使用して行います。

ALTER USER 'ユーザー名'@'ホスト' IDENTIFIED BY '新しいパスワード';

前述の admin_local がセキュリティポリシーの要件によりパスワードを更新する必要がある場合:

ALTER USER 'admin_local'@'localhost' IDENTIFIED BY 'EvenStrongerPass456!';

3.2 ユーザー名の変更

ユーザー名の変更も ALTER USER ステートメントを使用します。

ALTER USER '旧ユーザー名'@'旧ホスト' RENAME TO '新ユーザー名'@'新ホスト';

app_server_user を新しいアプリケーションの命名規約に合わせてリネームする必要がある場合:

ALTER USER 'app_server_user'@'192.168.1.50' RENAME TO 'accounting_app_user'@'192.168.1.50';

これにより、ホスト制限を維持したまま、ユーザー app_server_useraccounting_app_user にリネームされました。ユーザーはユーザー名とホストの組み合わせで一意に識別されるため、古い部分と新しい部分の両方にホスト情報を含めることが極めて重要です。

4. MySQL ユーザーの削除 (DROP USER)

ユーザーアカウントが不要になった場合は、不正アクセスを防止するために削除する必要があります。これは DROP USER ステートメントを使用して行います。

DROP USER 'ユーザー名'@'ホスト';

レポートユーザーが組織を離れたため、reporting_user を削除する必要がある場合:

DROP USER 'reporting_user'@'%.example.com';

このコマンドは、reporting_user アカウントを永久に削除します。そのユーザーに付与されていた権限(Privileges)もすべて削除されます。

4.1 DROP USER の重要事項

  • ユーザーとホストの組み合わせ: ユーザーを削除する際は、必ずユーザー名とホストを正確に指定してください。誤ったユーザーを削除すると、深刻なセキュリティ上の影響や業務への支障が出る可能性があります。
  • アプリケーションへの影響: ユーザーを削除する前に、そのアカウントを使用しているアプリケーションやサービスが他にないかを確認してください。アプリケーションが依存しているユーザーを削除すると、そのアプリケーションはデータベースに接続できなくなりクラッシュします。