データベースとユーザーの管理

MySQLBeginner
オンラインで実践に進む

はじめに

プロフェッショナルなシステム管理では、日常的なアプリケーション接続に root ユーザーを使うことは、大きなセキュリティリスクになります。root アカウントを使うアプリケーションが攻撃者に侵害されると、サーバー上のすべてのデータベースを完全に制御される可能性があります。

ベストプラクティスでは、各アプリケーションに専用の ユーザー を用意し、そのユーザーの権限を専用の データベース だけに制限します。

これは、オペレーティングシステムのレベルでアプリケーションごとに識別情報を分離する考え方に相当します。アクセス制御は単なる利便性ではなく、用途を反映させる必要があります。

これは、Linux のユーザー管理ですでに学んだ最小権限の原則を、データベースに適用したものです。1 つのアプリケーションアカウントが侵害されても、権限を制限していれば被害範囲を小さくできます。

この実験では、次の標準的な手順に従って環境を保護します。

  1. 仮想アプリケーション用の新しいデータベースを作成します。
  2. そのアプリケーション専用のユーザーアカウントを作成します。
  3. そのユーザーに専用データベースへの権限 だけ を付与します。
  4. 新しいユーザーでログインして、設定を確認します。

新しいデータベースを作成する

まず、新しいデータベースを作成するため、管理者権限で MySQL サーバーにログインします。

ターミナルを開き、次のコマンドを実行して MySQL シェルに接続します。

sudo mysql

注: このコマンドは sudo を使い、システムソケット経由で root として認証します。知らないパスワードを求められた場合は、mysql -u root -p を試してください。

mysql> プロンプトが表示されたら、SQL コマンドを実行できます。

この時点では、管理者権限を持つデータベースユーザーとして接続しています。データベースの作成は、権限が必要な操作だからです。通常のアプリケーションアカウントには、一般にこのレベルの制御権限はありません。

app_db という名前の新しいデータベースを作成します。このデータベースを、アプリケーションデータの格納先として使用します。

CREATE DATABASE app_db;

成功すると、MySQL は Query OK と応答します。すべてのデータベースを一覧表示して、データベースが存在することを確認できます。

SHOW DATABASES;

一覧に app_db が表示されることを確認してください。

専用ユーザーを作成する

データベースを作成したので、次にそれを管理するユーザーを用意します。ここでは app_user という名前のユーザーを作成します。

同じ MySQL シェルで、次のコマンドを実行します。

CREATE USER 'app_user'@'localhost' IDENTIFIED BY 'password';

コマンドの内容:

  • 'app_user': ユーザー名です。
  • '@'localhost': このサーバーからの接続だけを許可します(セキュリティ対策です)。
  • IDENTIFIED BY 'password': パスワードに "password" を設定します。

この時点でユーザーは存在しますが、権限はありません。ログインはできますが、データの読み取りや書き込みはできません。

ここで、アイデンティティと権限が別々に管理されることを理解しておくことが重要です。アカウントを作成しただけでは、すべてのデータベースオブジェクトを自動的に使用できるようにはなりません。

システムのユーザーテーブルを確認して、ユーザーが存在することを確認できます。

SELECT User, Host FROM mysql.user WHERE User = 'app_user';

権限を付与する

次に、app_user に app_db を使用する権限を明示的に付与します。

ここでは、app_db に対して ALL 権限(テーブルの読み取り、書き込み、変更)をユーザーに付与します。

MySQL シェルで次のコマンドを実行します。

GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'localhost';

構文の内容:

  • GRANT ALL PRIVILEGES: 完全なアクセス権を付与します。
  • ON app_db.*: app_db データベースと、その中の *(すべてのテーブル)に権限を適用します。
  • TO 'app_user'@'localhost': 権限を付与する対象を指定します。

database.* というパターンは重要です。権限の適用範囲を限定できるためです。MySQL/MariaDB では、グローバル、データベース単位、テーブル単位、さらに狭い範囲に権限を付与できる場合があります。

これにより、app_user は app_db 内では強い権限を持ちますが、それ以外の場所では権限を持ちません。

権限が正しく割り当てられたことを確認するには、次のコマンドを実行します。

SHOW GRANTS FOR 'app_user'@'localhost';

ユーザーのアクセスを確認する

すべてが想定どおりに動作することを確認するため、root アカウントからログアウトし、新しいユーザーでログインします。

まず、root セッションを終了します。

EXIT;

次に、Linux のターミナルに戻り、app_user としてログインします。

mysql -u app_user -p

パスワードを求められたら、password と入力します。

ログインしたら、参照できるデータベースを確認します。

SHOW DATABASES;

確認する内容:

  • app_db と information_schema が表示されるはずです。
  • mysql と sys は表示されないはずです。

この結果から、権限設定が正しく機能していることを確認できます。ユーザーには、アクセスを許可された対象だけが表示されます。

アクセス制御では、この確認手順が重要です。GRANT 文を実行するだけでは十分ではありません。システム上で実際に見える範囲が、意図した最小権限の設計になっていることを確認してください。

最後に、データベースを切り替えて実験を終了します。

USE app_db;
EXIT;

まとめ

この実験では、安全なデータベースアクセスモデルを実装しました。次の方法を学びました。

  • 新しいデータベース(app_db)を 作成 する。
  • 専用ユーザー(app_user)を 作成 する。
  • GRANT コマンドを使って、必要な権限を正確に 付与 する。
  • アクセス制御が意図したとおりに機能していることを 確認 する。

この「最小権限」モデルはデータベースセキュリティの基本であり、デプロイするすべてのアプリケーションで使用する必要があります。