MySQL のユーザー管理と権限設定
MySQL を運用するうえで、ユーザー管理と権限設定は避けて通れないテーマです。適切なユーザー設計ができていないと、セキュリティリスクが高まるだけでなく、運用時のトラブル対応にも支障をきたします。
ユーザーの作成と削除
MySQL のユーザーは CREATE USER 文で作成します。ユーザー名だけでなく、接続元ホストも合わせて指定するのが MySQL の特徴です。
CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'strong_password_123';この例では、192.168.1.0/24 のネットワークからのみ接続できるユーザーを作成しています。ホスト部分にはワイルドカード % を使えるため、IP アドレスの範囲指定が可能です。
ユーザーを削除するには DROP USER を使います。
DROP USER 'app_user'@'192.168.1.%';ここで注意すべき点は、ユーザー名とホストの組み合わせが一致しなければ削除できないことです。'app_user'@'localhost' と 'app_user'@'%' は MySQL 上では別のユーザーとして扱われます。
ローカルからの接続のみ許可される。ソケット接続や 127.0.0.1 経由でのアクセスに使われる。
すべてのホストからの接続を許可する。ネットワーク経由のリモート接続に対応している。
権限の付与と取り消し
権限の管理は GRANT と REVOKE で行います。MySQL の権限体系はグローバル・データベース・テーブル・カラムの 4 つのレベルに分かれており、必要最小限の権限を付与するのがベストプラクティスです。
-- データベースレベルの権限付与
GRANT SELECT, INSERT, UPDATE ON mydb.* TO 'app_user'@'192.168.1.%';
-- テーブルレベルの権限付与
GRANT SELECT ON mydb.users TO 'readonly_user'@'%';
-- 権限の取り消し
REVOKE INSERT ON mydb.* FROM 'app_user'@'192.168.1.%';権限を付与したあとは、FLUSH PRIVILEGES を実行する必要があるかどうかが議論になることがあります。GRANT 文を使った場合は自動的に権限テーブルがリロードされるため、通常は不要です。ただし、INSERT 文で mysql.user テーブルを直接操作した場合には FLUSH PRIVILEGES が必要になります。
権限レベルの階層構造
MySQL の権限はグローバルからカラムまで 4 階層で構成されています。上位の権限は下位に継承されるため、グローバルレベルで付与した権限はすべてのデータベース・テーブルに適用されます。
グローバル権限(. に対する権限)
データベース権限(mydb.* に対する権限)
テーブル権限(mydb.users に対する権限)
カラム権限(mydb.users の特定カラムに対する権限)
この階層を意識せずにグローバルレベルで広い権限を付与してしまうと、意図しないデータベースへのアクセスを許してしまうことがあります。本番環境では、データベースレベル以下で権限を設定するのが安全です。
ロールによる権限管理
MySQL 8.0 以降では、ロール機能を使って権限をグループ化できるようになりました。複数のユーザーに同じ権限セットを付与したい場合に便利です。
-- ロールの作成
CREATE ROLE 'read_only', 'read_write';
-- ロールに権限を付与
GRANT SELECT ON mydb.* TO 'read_only';
GRANT SELECT, INSERT, UPDATE, DELETE ON mydb.* TO 'read_write';
-- ユーザーにロールを割り当て
GRANT 'read_only' TO 'report_user'@'%';
GRANT 'read_write' TO 'app_user'@'192.168.1.%';ロールを割り当てただけでは有効にならない点に注意が必要です。ユーザーがログインした際にロールをアクティブにするには、SET DEFAULT ROLE を設定しておく必要があります。
SET DEFAULT ROLE 'read_write' TO 'app_user'@'192.168.1.%';この設定を忘れると、ユーザーがログインしても権限が反映されず、原因究明に時間がかかることがあります。
現在の権限を確認する
運用中に「このユーザーはどの権限を持っているのか」を確認したい場面は頻繁に発生します。SHOW GRANTS を使えば、特定ユーザーの権限を一覧表示できます。
SHOW GRANTS FOR 'app_user'@'192.168.1.%';また、現在ログインしているユーザー自身の権限を確認するには、引数なしで実行します。
SHOW GRANTS;権限の棚卸しを定期的に行い、不要になったユーザーやアカウントを削除することが、セキュリティ維持の基本となります。
パスワードポリシーの設定
MySQL にはパスワードの強度を制御する validate_password プラグインが用意されています。本番環境ではこのプラグインを有効化し、弱いパスワードの設定を防止するのが推奨されます。
-- プラグインのインストール
INSTALL COMPONENT 'file://component_validate_password';
-- ポリシーの確認
SHOW VARIABLES LIKE 'validate_password%';| パラメータ | 説明 | デフォルト |
|---|---|---|
| validate_password.length | 最小文字数 | 8 |
| validate_password.policy | 強度レベル | MEDIUM |
ポリシーには LOW・MEDIUM・STRONG の 3 段階があり、MEDIUM 以上では大文字・小文字・数字・特殊文字の混在が求められます。運用環境に合わせた適切なレベルを選択してください。
実践的なユーザー設計の指針
本番環境では、アプリケーション用・管理者用・監視用・バックアップ用といった用途ごとにユーザーを分けるのが一般的です。1 つのアカウントにすべての権限を集約すると、万が一の情報漏洩時に被害が拡大してしまいます。
対象データベースへの SELECT, INSERT, UPDATE, DELETE のみを付与する。DDL 権限は持たせず、スキーマ変更はマイグレーションツール経由で管理者が行う。
root の直接使用は避け、必要な管理権限だけを持つ専用アカウントを作成する。操作ログの追跡を容易にするために、管理者ごとに個別アカウントを用意するのが望ましい。
PROCESS, REPLICATION CLIENT 程度の権限があれば十分。書き込み権限は一切不要であり、パフォーマンス監視ツール専用のアカウントとして運用する。
最小権限の原則を徹底し、定期的な権限監査を実施することが、安全な MySQL 運用の土台になります。













