MySQL 5.7/5.6におけるユーザー管理と権限付与の基本設計

MySQL 5.6 と 5.7 の主要な相違点

1. ビルドおよびインストール手順の変化

MySQL 5.7では、コンパイル時にBoostライブラリが必須となりました。CMake実行時にBoostのパスを指定する必要があります。
# 依存パッケージの導入
yum install -y gcc gcc-c++ cmake bison ncurses-devel libaio-devel

# Boostライブラリの準備(MySQL 5.7.x用)
wget https://boostorg.jfrog.io/artifactory/main/release/1.59.0/source/boost_1_59_0.tar.gz
tar xzf boost_1_59_0.tar.gz -C /opt/

# CMakeによる構成定義
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql-5.7 \
-DMYSQL_DATADIR=/usr/local/mysql-5.7/data \
-DWITH_BOOST=/opt/boost_1_59_0 \
-DDEFAULT_CHARSET=utf8mb4 \
-DDEFAULT_COLLATION=utf8mb4_general_ci \
-DWITH_INNOBASE_STORAGE_ENGINE=1 \
-DENABLED_LOCAL_INFILE=1

2. 初期化プロセスの変更

MySQL 5.6までは mysql_install_db スクリプトが使われていましたが、5.7以降は mysqld --initialize が推奨されています。
# MySQL 5.6 の初期化
/usr/local/mysql/scripts/mysql_install_db --user=mysql --datadir=/data/mysql/data

# MySQL 5.7 の初期化(ランダムパスワードを生成)
/usr/local/mysql/bin/mysqld --initialize --user=mysql --datadir=/data/mysql/data

# MySQL 5.7 の初期化(パスワードなしで作成)
/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --datadir=/data/mysql/data

3. 機能面の違い

  • JSON型のサポート: 5.7よりネイティブなJSONデータ型が導入されました。
  • マルチソースレプリケーション: 複数のマスターから1つのスレーブへの同期が可能になりました。
  • セキュリティの強化: デフォルトでのパスワード有効期限設定や、プラグインベースの認証が強化されています。

MySQLユーザーの定義と管理

MySQLにおけるユーザーは、単なる名前だけでなく「ユーザー名」と「接続元ホスト(ホスト域)」のペアで識別されます。

ユーザーの識別形式

'username'@'host' ホスト名の指定方法には以下のようなバリエーションがあります。
'admin'@'localhost'        # ローカル接続のみ
'service'@'192.168.1.10'   # 特定のIPのみ
'app_user'@'192.168.1.%'   # 192.168.1.0/24 ネットワーク全体
'web_node'@'%'             # すべてのホスト(制限なし)

アカウント操作の基本コマンド

-- ユーザーの作成
CREATE USER 'dev_user'@'10.0.0.%' IDENTIFIED BY 'Strong_Password_123';

-- ユーザー一覧の確認
SELECT user, host FROM mysql.user;

-- ユーザーの削除
DROP USER 'dev_user'@'10.0.0.%';

パスワードのリセット手順

rootパスワードを紛失した場合のリカバリ手順です。
# 1. サービスの停止
systemctl stop mysqld

# 2. 権限チェックをスキップして起動
mysqld_safe --skip-grant-tables --skip-networking &

# 3. ログインしてパスワードを更新
mysql -u root
mysql> FLUSH PRIVILEGES;
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewSecurePass123';
mysql> FLUSH PRIVILEGES;
mysql> EXIT;

# 4. 通常モードで再起動
mysqladmin -u root -p shutdown
systemctl start mysqld

権限(Privilege)の制御

GRANT文の構造

権限付与は GRANT コマンドで行います。
GRANT [権限種別] ON [対象スコープ] TO 'ユーザー名'@'ホスト名';

権限付与の実践例

-- 全データベース、全テーブルに対するフルアクセス権限
GRANT ALL PRIVILEGES ON *.* TO 'super_admin'@'localhost';

-- 特定のデータベース(sales_db)に対する参照・追加・更新権限
GRANT SELECT, INSERT, UPDATE ON sales_db.* TO 'sales_app'@'172.16.0.%';

-- 特定のテーブル内の、特定のカラムのみ参照を許可(マスキング/脱敏)
GRANT SELECT(user_id, email) ON customer_db.users TO 'support_staff'@'172.16.0.50';

権限の確認と剥奪

-- 現在の権限を確認
SHOW GRANTS FOR 'sales_app'@'172.16.0.%';

-- 特定の権限(DELETE)を剥奪
REVOKE DELETE ON sales_db.* FROM 'sales_app'@'172.16.0.%';

運用シナリオに基づく権限設計

開発者に環境を提供する場合、最小権限の原則(Principle of Least Privilege)に従い、必要な範囲のみを限定して付与します。
-- 1. データベースの作成
CREATE DATABASE inventory_system;

-- 2. アプリケーション用ユーザーの作成と権限付与
-- データの参照、挿入、更新、削除を許可し、テーブル定義の変更(DROP等)は禁止
GRANT SELECT, INSERT, UPDATE, DELETE ON inventory_system.* TO 'inventory_app'@'192.168.10.%' IDENTIFIED BY 'App_Pass_99';

-- 3. 設定内容の反映
FLUSH PRIVILEGES;
このような設計により、アプリケーションの脆弱性を突かれた場合でも、データベース全体や他システムへの被害を最小限に抑えることが可能になります。

タグ: MySQL database-administration SQL Security server-configuration

10月16日 06:18 投稿