Ubuntu Server 22.04 ガイド
WEB 04 / 05

MariaDBの導入と接続

ローカル専用のデータベースとアプリ専用ユーザーを作り、権限を確認します。

01 / MariaDBを導入する

Ubuntu Server 22.04の同じサーバー上で、WordPress等のPHPアプリから使うデータベースを用意します。物理マシン・仮想マシン共通です。ここではUbuntu公式パッケージのMariaDB 10.6系を使い、外部へデータベースのポートを公開しません。

サーバーの一般管理者でログインし、sudoと復旧コンソールを使えること、更新・バックアップの方針を確認します。既存のMySQL/MariaDBや既存アプリがある運用サーバーへの置き換えは対象外です。既存データを削除したり初期化し直したりしないでください。

sudo apt-get update
sudo apt-get install mariadb-server
sudo systemctl enable --now mariadb
systemctl is-active mariadb
systemctl is-enabled mariadb

activeとenabledを確認します。導入に失敗したらAPTのエラーを直し、サービスが起動しない場合はsudo journalctl -u mariadb -b --no-pagerを確認します。

02 / ローカルからだけ使う

設定変更前に退避し、保存先を控えます。バックアップはWeb公開領域やGitへ置きません。

BACKUP="$(sudo mktemp -d /root/server-guide-db.XXXXXX)" &&
sudo cp -a /etc/mysql "$BACKUP/"
printf '保存先: %s\n' "$BACKUP"

既存の設定を確認し、同名ファイルがない場合だけ次のローカル用設定を追加します。すでにMariaDBを運用中なら、読み込み順や既存の待ち受け設定を先に調べてください。

sudo test ! -e /etc/mysql/mariadb.conf.d/60-server-guide.cnf &&
sudo tee /etc/mysql/mariadb.conf.d/60-server-guide.cnf >/dev/null <<'EOF'
[mysqld]
bind-address = 127.0.0.1
EOF
sudo systemctl restart mariadb
systemctl is-active mariadb
sudo ss -lntp 'sport = :3306'

3306番の待ち受けがある場合は127.0.0.1だけであることを確認します。0.0.0.0や外部アドレスで待ち受けていれば、設定を直してから先へ進みます。UFW、ルーター、クラウドのセキュリティグループにも3306番の外部許可を追加しません。PHPは同じマシンのUnixソケット経由で接続します。

再起動に失敗した場合はコンソールからログを読み、この手順で追加した設定を退避して、保存済みの構成へ戻します。データディレクトリーは削除しません。

03 / アプリ専用DBとユーザーを作る

データベース管理者はsudo mariadbでローカルのUnixソケット認証を使います。WordPressからrootで接続しません。管理用のrootパスワードをアプリへ渡す必要もありません。

以下ではDB名をwordpress_db、専用ユーザーをwordpress_appとします。すでに同名のDBやユーザーがある場合は作り直さず、所有者と用途を確認してください。パスワードはパスワード管理ソフト等で新規生成し、安全に保存します。下のREPLACE_WITH_YOUR_RANDOM_PASSWORDをそのまま使わないでください。SQLの引用符を含む値は正しくエスケープする必要があります。

接続コマンドにパスワードを埋め込まず、SQL履歴へ残さない設定で対話的に操作します。画面録画・共有・作業ログにも秘密を残しません。

sudo env MYSQL_HISTFILE=/dev/null mariadb

MariaDBのプロンプトで、パスワードを自分の値に置き換えて実行します。

CREATE DATABASE wordpress_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'wordpress_app'@'localhost' IDENTIFIED BY 'REPLACE_WITH_YOUR_RANDOM_PASSWORD';
GRANT ALL PRIVILEGES ON wordpress_db.* TO 'wordpress_app'@'localhost';
SHOW GRANTS FOR 'wordpress_app'@'localhost';
EXIT;

権限はこのDBだけに限定します。グローバル権限やGRANT OPTIONを与えません。アカウント操作のCREATE USER/GRANTはすぐ有効になるため、この手順でFLUSH PRIVILEGESは不要です。

04 / 接続と権限を確認する

一般管理者のシェルから、専用ユーザーとして接続します。-pの後ろへパスワードを書かず、表示されたプロンプトに入力してください。

mariadb -u wordpress_app -p wordpress_db

DBのプロンプトで接続先と権限を調べます。

SELECT DATABASE(), CURRENT_USER();
SHOW GRANTS;
SELECT COUNT(*) FROM mysql.user;
EXIT;

wordpress_dbとwordpress_app@localhostが表示されること、自分のDBに権限があること、mysql.userの参照は権限エラーで拒否されることを確認します。拒否試験は失敗ではなく、管理用DBへアクセスできないことの確認です。

Access deniedならユーザー名・パスワード・接続元と許可を照合します。Can't connect to local serverならサービスとソケットを確認します。原因を調べずroot接続や外部公開へ切り替えないでください。

05 / 記録と次の作業

保存するのはバージョン、サービスの状態、ローカル待ち受け、専用DBへの接続成功と管理用DBへの拒否結果です。パスワードは記録へ含めません。運用開始前にデータベースとアプリのファイルを組み合わせたバックアップ・復元手順を用意します。

Ubuntu Server 22.04.5の実VMでMariaDB 10.6.23を導入し、active・enabledと127.0.0.1:3306の待ち受けを確認しました。専用ユーザーはwordpress_db内でテーブル作成・書込・読取・削除ができ、mysql.userの参照は権限エラー1142、別DBの作成は1044で拒否されました。これは同一サーバー内の接続試験です。公開インターネットやIPv6からの到達性は未検証です。

MariaDBのサービス・接続・権限を確認する実画面
検証用VMで撮影した実画面を掲載します。

MariaDBのサーバー設定 / CREATE USER