中学理科1626207 views
高校国語785655 views
小学理科717236 views
高校倫理1433119 views
雑学1472593 views
数学講師2852771 views
ヒストリア284143 views
高校日本史189857 views
中学社会667106 views
高校化学2913383 views
Help
Tools

English

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 上では別のユーザーとして扱われます。

'app_user'@'localhost'

ローカルからの接続のみ許可される。ソケット接続や 127.0.0.1 経由でのアクセスに使われる。

'app_user'@'%'

すべてのホストからの接続を許可する。ネットワーク経由のリモート接続に対応している。

権限の付与と取り消し

権限の管理は GRANTREVOKE で行います。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 運用の土台になります。