MariaDBユーザー作成時のHOST指定とパスワード設定|mysql CLIで安全に構成する

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > Linuxtips > データーベース管理 > MariaDBユーザー作成時のHOST指定とパスワード設定|mysql CLIで安全に構成する
「MariaDB にアプリ用ユーザーを追加したのに接続できない。CREATE USER の書き方が悪いのか、HOST 指定の問題か、どこを直せばいいかわからない」

こうなる原因のほとんどは HOST 指定のミスです。MariaDB はユーザー名と HOST の組み合わせで接続を識別するため、'appuser'@'localhost' と 'appuser'@'127.0.0.1' は別ユーザーとして扱われます。どちらか片方しか存在しなければ、もう一方で接続しようとした際に必ず「Access denied」が返ります。

この記事では、Rocky Linux 9.4 / MariaDB 10.5.22 の実機を使い、mysql CLI からの接続手順・CREATE USER 構文・HOST パターンの使い分け・認証プラグインとパスワード設定を実行例とともに解説します。

動作確認環境: Rocky Linux 9.4 / MariaDB 10.5.22(MariaDB 10.6、10.11 LTS、11.x でも同様の手順で動作)

この記事のポイント

・CREATE USER 'user'@'host' IDENTIFIED BY 'pass' でユーザーを作成できる
・localhost(UNIX ソケット)と 127.0.0.1(TCP)は別エントリ—接続方式に合わせて使い分ける
・MariaDB 10.4 以降の root は unix_socket 認証が既定—sudo mysql でパスワードなしにログイン可
・作成後は SELECT User,Host,plugin FROM mysql.user; で必ず確認する


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

MariaDB のユーザーは「名前+HOST」で識別される

MariaDB(および MySQL)では、ユーザーを「ユーザー名 + 接続元 HOST」の組み合わせで管理します。同じユーザー名でも HOST が異なれば別のアカウントです。

たとえば次の 2 行は別のユーザーです。

'appuser'@'localhost' -- localhost 経由(UNIX ソケット)でのみ接続可 'appuser'@'127.0.0.1' -- TCP/IP ループバックでのみ接続可

PHP や Python アプリが host=127.0.0.1 で接続してきたとき、'appuser'@'localhost' しか作っていなければ拒否されます。「ユーザーは作った、パスワードも合っている、なのに接続できない」という状況の大半がこれです。

まずはこの仕組みを頭に入れた上で、ユーザー作成の手順を見ていきましょう。

mysql CLI でユーザーを作成する基本手順

1. 管理者権限で MariaDB に接続する

まず管理者(root)で MariaDB に接続します。MariaDB 10.4 以降は root に unix_socket 認証が設定されているため、sudo mysql で接続できます。

[rocky@sv01 ~]$ sudo mysql Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 10 Server version: 10.5.22-MariaDB MariaDB Server Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MariaDB [(none)]>

パスワード認証の root でログインする場合は mysql -u root -p を使います。どちらでログインするかは後述の「認証プラグインの確認」を参照してください。

2. CREATE USER でユーザーを作成する

構文は次のとおりです。

CREATE USER 'ユーザー名'@'HOST' IDENTIFIED BY 'パスワード';

実際にアプリ用ユーザー appuser を作成する例を示します。

MariaDB [(none)]> CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'P@ssw0rd_2024'; Query OK, 0 rows affected (0.001 sec)

「Query OK, 0 rows affected」が返れば作成成功です。エラーが出る場合はパスワードポリシー(validate_password プラグイン)の制約か、同名のユーザーが既に存在している可能性があります。

3. GRANT で権限を付与する

ユーザーを作っただけでは何もできません。対象データベースへの権限を GRANT で付与します。

# 特定データベース(appdb)への全権限 MariaDB [(none)]> GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'localhost'; Query OK, 0 rows affected (0.001 sec) # 読み取りのみ許可する場合 MariaDB [(none)]> GRANT SELECT ON appdb.* TO 'appuser'@'localhost'; Query OK, 0 rows affected (0.001 sec)

FLUSH PRIVILEGES は不要か: CREATE USER と GRANT を使ってユーザーや権限を操作した場合、MariaDB は内部で自動的に権限テーブルをリロードします。mysql.user テーブルを直接 INSERT/UPDATE した場合にのみ FLUSH PRIVILEGES; が必要になります。

4. 接続テストで確認する

ユーザーが正しく作れたか、別ターミナルから接続テストします。

[rocky@sv01 ~]$ mysql -u appuser -p appdb Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MariaDB connection id is 14 Server version: 10.5.22-MariaDB MariaDB Server MariaDB [appdb]>

接続に成功したら HOST 指定は正しかった証拠です。

HOST パターンの使い分け

HOST に指定できる値は 5 種類あります。用途によって使い分けてください。

① localhost(UNIX ソケット接続)
'user'@'localhost' は UNIX ソケット(/var/lib/mysql/mysql.sock)を経由した接続にのみ一致します。TCP を使わないため、-h 127.0.0.1 を指定した接続には一致しません。ローカルの CLI ツールや PHP の PDO(host=localhost)はこちらを使います。

② 127.0.0.1(TCP ループバック)
'user'@'127.0.0.1' は TCP/IP で 127.0.0.1 に接続する場合にのみ一致します。アプリ側が DB_HOST=127.0.0.1 のような TCP 接続を使う場合はこちらが必要です。

③ 特定 IP アドレス
'user'@'192.168.10.20' のように指定すると、その IP からの接続だけ許可できます。複数台あるアプリサーバーのうち特定の 1 台だけに権限を絞りたい場合に使います。

④ サブネット指定(CIDR は使えない)
'user'@'192.168.10.%' のようにワイルドカード % を使うとサブネット全体を許可できます。MariaDB は CIDR 表記(192.168.10.0/24)に対応していないため、サブネット単位の許可はこの書き方が唯一の方法です。

⑤ %(全ホスト許可)
'user'@'%' はあらゆる接続元を許可します。プライベートネットワーク内に限定されている開発環境のみ使用し、インターネットに面したサーバーでは避けてください。

複数の HOST からアクセスを許可する場合は、同じユーザー名で HOST ごとにエントリを追加します。

-- ローカル CLI と TCP ループバックの両方を許可する例 CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'P@ssw0rd_2024'; CREATE USER 'appuser'@'127.0.0.1' IDENTIFIED BY 'P@ssw0rd_2024'; GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'localhost'; GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'127.0.0.1';

認証プラグインとパスワード設定の実務ポイント

MariaDB 10.4 以降の root は unix_socket 認証が既定

MariaDB 10.4 から、root ユーザーのデフォルト認証プラグインが unix_socket に変わりました。これにより sudo mysql でパスワードなしにログインできる一方、mysql -u root -p では「Access denied」になる場合があります。

現在の root の認証プラグインを確認するには次のクエリを使います。

MariaDB [(none)]> SELECT User, Host, plugin FROM mysql.user WHERE User='root'; +------+-----------+-------------+ | User | Host | plugin | +------+-----------+-------------+ | root | localhost | unix_socket | +------+-----------+-------------+ 1 row in set (0.001 sec)

plugin 列が unix_socket であれば、OS の root(または sudo 可能なユーザー)でのみログインできます。パスワード認証に変更したい場合は次の手順で切り替えられます。

root をパスワード認証に切り替える手順

MariaDB [(none)]> ALTER USER 'root'@'localhost' -> IDENTIFIED VIA mysql_native_password USING PASSWORD('NewRootP@ss2024'); Query OK, 0 rows affected (0.001 sec) MariaDB [(none)]> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.000 sec)

ALTER USER の場合は FLUSH PRIVILEGES が必要です。切り替え後は mysql -u root -p でパスワードが使えるようになります。

作成済みユーザーのパスワードを変更する

MariaDB [(none)]> ALTER USER 'appuser'@'localhost' IDENTIFIED BY '新しいパスワード'; Query OK, 0 rows affected (0.001 sec)

パスワードの変更は SET PASSWORD 構文でも可能ですが、ALTER USER の方が SQL 標準に近く、MariaDB 10.4 以降では推奨されています。

作成済みユーザーの確認と権限の表示

ユーザーを作ったあとは必ず確認してください。mysql.user テーブルをクエリすることで全ユーザーの HOST と認証プラグインを一覧できます。

MariaDB [(none)]> SELECT User, Host, plugin FROM mysql.user; +-------------+-----------+-----------------------+ | User | Host | plugin | +-------------+-----------+-----------------------+ | root | localhost | unix_socket | | appuser | localhost | mysql_native_password | | appuser | 127.0.0.1 | mysql_native_password | | mariadb.sys | localhost | mysql_native_password | +-------------+-----------+-----------------------+ 4 rows in set (0.001 sec)

特定ユーザーの権限詳細を確認するには SHOW GRANTS を使います。

MariaDB [(none)]> SHOW GRANTS FOR 'appuser'@'localhost'; +----------------------------------------------------------------+ | Grants for appuser@localhost | +----------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON `appdb`.* TO `appuser`@`localhost` | +----------------------------------------------------------------+ 1 row in set (0.000 sec)

ユーザーを削除する場合は DROP USER を使います。HOST ごとに作ったユーザーは HOST ごとに DROP する必要があります。'appuser'@'localhost' を DROP しても 'appuser'@'127.0.0.1' は残ります。

MariaDB [(none)]> DROP USER 'appuser'@'localhost'; Query OK, 0 rows affected (0.001 sec)

トラブルシュート

「Access denied for user 'xxx'@'localhost' (using password: YES)」が出る

パスワードが間違っているか、'xxx'@'localhost' のユーザーエントリが存在しない状態です。まず SELECT User, Host FROM mysql.user WHERE User='xxx'; でエントリが存在するか確認してください。

MariaDB [(none)]> SELECT User, Host FROM mysql.user WHERE User='appuser'; +---------+-----------+ | User | Host | +---------+-----------+ | appuser | 127.0.0.1 | +---------+-----------+ 1 row in set (0.000 sec)

この例では 'appuser'@'localhost' が存在せず、'appuser'@'127.0.0.1' しかありません。この状態では mysql -u appuser -p appdb(UNIX ソケット接続)はすべて拒否されます。'appuser'@'localhost' を追加するか、mysql -h 127.0.0.1 -u appuser -p appdb で TCP 接続すれば解決します。

「Access denied for user 'xxx'@'localhost' (using password: NO)」が出る

パスワードなしで接続を試みている、または unix_socket プラグインの認証が必要な状態です。mysql -u xxx -p でパスワード入力を求めるか、sudo mysql で試してください。

ユーザーは存在するのに特定 DB にアクセスできない

ユーザーは作成されているが GRANT が漏れているケースです。SHOW GRANTS FOR 'user'@'host'; で権限一覧を確認し、対象 DB への GRANT を追加してください。

MariaDB [(none)]> SHOW GRANTS FOR 'appuser'@'localhost'; +--------------------------------------------+ | Grants for appuser@localhost | +--------------------------------------------+ | GRANT USAGE ON *.* TO `appuser`@`localhost`| +--------------------------------------------+ 1 row in set (0.000 sec)

GRANT USAGE のみの場合は「接続はできるが権限は何もない」状態です。GRANT 文で必要な権限を追加してください。

本記事のまとめ

やりたいこと コマンド
ユーザーを作成する CREATE USER 'user'@'host' IDENTIFIED BY 'pass';
DB への全権限を付与する GRANT ALL PRIVILEGES ON db.* TO 'user'@'host';
読み取り権限のみ付与する GRANT SELECT ON db.* TO 'user'@'host';
ユーザー一覧と認証プラグインを確認 SELECT User,Host,plugin FROM mysql.user;
特定ユーザーの権限を確認 SHOW GRANTS FOR 'user'@'host';
パスワードを変更する ALTER USER 'user'@'host' IDENTIFIED BY '新パスワード';
ユーザーを削除する DROP USER 'user'@'host';
unix_socket 認証でログイン(root 既定) sudo mysql
TCP 接続でログイン mysql -h 127.0.0.1 -u user -p db
MariaDB のユーザー管理は「名前+HOST の組み合わせ」が基本単位です。localhost と 127.0.0.1 は同じ接続先に見えて別のエントリになるため、アプリ側の接続方式(UNIX ソケット or TCP)を確認してから HOST を決めることが、接続エラーを防ぐ一番の近道です。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、MariaDB のユーザー管理を含む Linux サーバー運用の実務を 2 日間のハンズオンで学べるセミナーを開催しています。

>> Linux Master Pro Seminar の詳細はこちら

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。