【SQL実践】ユーザーを作成する(CREATE USER文)

ユーザー作成の基礎とデータベースセキュリティの要諦

データベース管理において「ユーザーの作成」は、システムのセキュリティを担保するための最初の防波堤です。単にCREATE USER文を実行するだけでなく、最小権限の原則に基づいた設計、認証方式の選定、そして接続元の制限といった多角的な視点が求められます。本稿では、RDBMSにおけるユーザー管理の深層を、プロフェッショナルな視点から詳細に解説します。

CREATE USER文の構造と概念

CREATE USER文は、データベースシステムに対して新しい認証主体(プリンシパル)を登録するコマンドです。多くのRDBMSでは、この文を実行することで「認証情報(ID/パスワード等)」と「接続元ホスト」がシステムカタログに格納されます。

MySQLやMariaDBにおいては、ユーザー名は「ユーザー名@ホスト名」という形式で定義されます。これは、単に誰であるかだけでなく、「どこから接続してくるか」を認証の要素として含めることを意味します。PostgreSQLでは、ユーザーは「ロール」という概念で統合されており、LOGIN属性を付与することで初めてユーザーとして機能します。

データベース管理者は、このコマンドを実行する際、単に「接続できるようにする」ことだけを考えてはなりません。どのアプリケーションが、どの環境から、どのような権限を持ってアクセスするのかを定義する重要な設計プロセスであることを理解する必要があります。

認証方式とセキュリティのベストプラクティス

現代のデータベース運用において、パスワード認証のみに依存することは推奨されません。特にクラウド環境やコンテナ環境では、認証情報は漏洩のリスクと隣り合わせです。

1. 認証の強固さ:複雑なパスワードポリシーの適用は必須です。可能であれば、プラグイン認証(PAM認証やLDAP/Active Directory連携)を利用し、中央集権的なアカウント管理を行うべきです。
2. ホスト制限の厳格化:’%’(ワイルドカード)による全ホストからのアクセス許可は、開発環境を除いて厳禁です。特定のアプリケーションサーバーのIPアドレス、あるいはサブネット単位で接続元を限定してください。
3. SSL/TLSの強制:ユーザー作成時にREQUIRE SSL属性を付与することで、通信経路の暗号化を強制できます。中間者攻撃を防止するため、これはエンタープライズ環境では標準的な設定です。

サンプルコード:安全なユーザー作成の実践

以下に、MySQLを例とした安全なユーザー作成のサンプルコードを示します。この例では、特定のネットワークからのみ接続可能で、かつSSL通信を必須とするユーザーを作成します。


-- 1. ユーザーの作成(ホストを限定し、SSLを必須にする)
CREATE USER 'app_user'@'192.168.10.50' 
IDENTIFIED BY 'Strong_Password_2023!' 
REQUIRE SSL;

-- 2. パスワードの有効期限を設定(セキュリティポリシー)
ALTER USER 'app_user'@'192.168.10.50' 
PASSWORD EXPIRE INTERVAL 90 DAY;

-- 3. 最小権限の付与(GRANT文)
-- データベースに対する必要な操作のみを許可する
GRANT SELECT, INSERT, UPDATE ON my_application_db.* 
TO 'app_user'@'192.168.10.50';

-- 4. 設定の反映
FLUSH PRIVILEGES;

PostgreSQLの場合、概念が異なります。


-- 1. ロールの作成(LOGIN属性を付与)
CREATE ROLE app_user WITH LOGIN PASSWORD 'Strong_Password_2023!';

-- 2. 権限の付与(スキーマ単位での管理が一般的)
GRANT USAGE ON SCHEMA public TO app_user;
GRANT SELECT, INSERT, UPDATE ON ALL TABLES IN SCHEMA public TO app_user;

実務アドバイス:DBAが守るべき運用ルール

実務において、CREATE USER文を安易に実行することは避けるべきです。特に、アプリケーションの運用中に一時的なデバッグユーザーを作成し、そのまま放置するケースは、セキュリティインシデントの温床となります。

第一に、「権限の分離」を徹底してください。アプリケーション用ユーザー、バックアップ用ユーザー、監視用ユーザー、そして管理者用ユーザーは明確に分けるべきです。アプリケーション用ユーザーにDROP TABLEやGRANT権限を与えることは、SQLインジェクション攻撃を受けた際に被害を壊滅的なものにします。

第二に、ユーザーのライフサイクル管理です。異動や退職、あるいはプロジェクトの終了に伴い、不要になったアカウントは即座に削除または無効化する必要があります。定期的な監査を行い、システムカタログをスキャンして「長期間ログインしていないユーザー」を洗い出す運用を定着させてください。

第三に、DR(災害復旧)を考慮したユーザー定義のコード管理です。CREATE USER文は手動で実行するものではなく、TerraformやAnsible、あるいはマイグレーションツール(FlywayやLiquibase)による構成管理の対象とすべきです。これにより、データベースの構成がコードとして可視化され、環境ごとの差異を防ぐことができます。

パスワード管理の落とし穴

CREATE USER文で平文のパスワードを指定することは、コマンド履歴にパスワードが残るというリスクがあります。MySQLなどでは、`IDENTIFIED WITH … AS ‘ハッシュ値’` を使用して、ハッシュ化済みの文字列を指定することで、コマンド履歴への平文露出を回避できます。プロフェッショナルであれば、こうした細部にまで気を配るべきです。

また、アプリケーションの接続設定ファイルにパスワードを直接書き込むのではなく、環境変数やAWS Secrets Manager、HashiCorp Vaultといった外部のシークレット管理サービスを利用するアーキテクチャを推奨します。データベース側でいくら強固な認証を設定しても、アプリケーション側の管理が脆弱であれば、その努力は水泡に帰します。

まとめ

ユーザー作成は、データベースセキュリティの出発点です。CREATE USER文は単なるコマンドではなく、データベースへのアクセス制御という広範なセキュリティポリシーを実装する手段です。

本稿で解説した通り、以下のステップを遵守することが、堅牢なデータベース運用への近道です。

1. 最小権限の原則:必要なテーブル、必要な操作のみを許可する。
2. 接続経路の限定:ホスト制限とSSL/TLSの強制を行う。
3. ライフサイクル管理:不要なアカウントの即時削除と定期的監査。
4. 構成のコード管理:手動操作を排除し、再現性を担保する。

データベース管理者は、データの守護者です。ユーザー管理という最も基本的な作業においてこそ、そのプロフェッショナリズムが試されます。この記事が、皆さんの安全で効率的なデータベース運用の一助となれば幸いです。常に最新のセキュリティトレンドを追い、システムに最適なアクセス制御を追求し続けてください。

コメント

タイトルとURLをコピーしました