MariaDB Unix Socket認証の落とし穴:よくあるエラーと解決策
MariaDBにおける「Authentication Plugin - Unix Socket」は、MariaDBデータベースへの接続時に、オペレーティングシステム(OS)のユーザー認証情報を利用するための認証プラグインです。
通常、MariaDBに接続する際には、MariaDBのユーザー名とパスワードが必要ですが、「Unix Socket」認証プラグインを使用すると、以下のような特徴があります。
主な特徴:
- デフォルトでの有効化(MariaDB 10.4以降)
MariaDB 10.4以降のバージョンでは、root
ユーザーのデフォルトの認証プラグインとしてunix_socket
が設定されていることが多いです。これにより、OSのroot
ユーザーであれば、パスワードなしでMariaDBのroot
ユーザーとしてログインできるようになります。 - OSのユーザーID(UID)に基づく認証
プラグインは、接続してきたプロセスのOSユーザーID(UID)を取得し、そのUIDに対応するOSユーザー名とMariaDBのユーザー名を照合して認証を行います。 - ローカル接続限定
この認証方法は、MariaDBサーバーと同じホスト上で、Unixソケットファイル(通常は/tmp/mysql.sock
や/var/run/mysqld/mysqld.sock
など)を介して接続する場合にのみ機能します。TCP/IP経由のリモート接続では利用できません。 - パスワード不要の認証
MariaDBのユーザーと、接続元のOSのユーザーが一致している場合、パスワードなしでMariaDBに接続できます。これは、セキュリティをOSのユーザー管理に委ねることで、パスワード管理の煩わしさやリスクを軽減するものです。
- MariaDBクライアントがUnixソケットファイル経由でMariaDBサーバーに接続を試みます。
- MariaDBサーバーは、
unix_socket
認証プラグインを使用して、接続してきたクライアントプロセスのOSユーザー情報を取得します(SO_PEERCRED
ソケットオプションなどを利用)。 - 取得したOSユーザー名と、MariaDBの
mysql.user
テーブルに登録されているユーザーのplugin
カラムがunix_socket
に設定されているものを比較します。 - OSユーザー名とMariaDBのユーザー名が一致すれば、認証が成功し、パスワードなしで接続が確立されます。
利点
- 利便性
ローカル環境での開発や管理において、パスワード入力の手間が省け、迅速なアクセスが可能になります。 - セキュリティの向上
パスワードをネットワーク上に送信する必要がないため、中間者攻撃によるパスワード盗聴のリスクが減少します。また、パスワードの管理が不要になることで、パスワードの漏洩リスクも低減します。
注意点
- OSのセキュリティに依存
この認証方法のセキュリティは、OSのユーザー管理とアクセス権限に大きく依存します。OSのセキュリティが脆弱であれば、データベースのセキュリティも危険に晒されます。 - ローカル接続限定
リモートからのアクセスが必要な場合は、mysql_native_password
などの別の認証プラグインを使用するか、ユーザーごとに複数の認証プラグインを設定する必要があります。
-- OSの'myuser'ユーザーとしてMariaDBにログインできるユーザーを作成
CREATE USER 'myuser'@'localhost' IDENTIFIED VIA unix_socket;
-- OSの'root'ユーザーとしてMariaDBにログインできる'admin'ユーザーを作成
CREATE USER 'admin'@'localhost' IDENTIFIED VIA unix_socket AS 'root';
MariaDB 「Authentication Plugin - Unix Socket」のよくあるエラーとトラブルシューティング
エラーメッセージ: ERROR 1698 (28000): Access denied for user 'your_user'@'localhost'
原因
- 接続ホストがlocalhostではない
unix_socket
認証は通常、localhost
からの接続に限定されます。127.0.0.1
を指定した場合、TCP/IP接続とみなされ、unix_socket
認証は使われません。 - 権限の問題
MariaDBユーザーが、アクセスしようとしているデータベースやテーブルに対する適切な権限を持っていない可能性があります。 - MariaDBユーザーの認証プラグインがunix_socketになっていない
対象のMariaDBユーザーの認証プラグインがmysql_native_password
などの別のプラグインに設定されている場合、unix_socket
認証は機能しません。 - OSユーザー名とMariaDBユーザー名が一致しない
unix_socket
認証は、接続元のOSユーザー名とMariaDBのユーザー名が一致することを前提としています。例えば、osuser
というOSユーザーでログインしているのに、mariadbuser
というMariaDBユーザーとして接続しようとしている場合に発生します。
トラブルシューティング
- 接続コマンドの確認
MariaDBクライアントで接続する際、ホスト名としてlocalhost
または何も指定しないことを確認してください。mysql -u your_user # または mysql -u your_user -h localhost
mysql -u your_user -h 127.0.0.1
とすると、TCP/IP経由の接続となり、unix_socket
認証は機能しません。 - 適切な権限を付与
もしユーザーが存在し、プラグインも正しいのにエラーが出る場合、そのユーザーにデータベースへのアクセス権限がない可能性があります。GRANT ALL PRIVILEGES ON your_database.* TO 'your_user'@'localhost'; FLUSH PRIVILEGES;
- MariaDBユーザーの認証プラグインをunix_socketに設定(または確認)
もしOSユーザー名と一致するMariaDBユーザーが存在しない、またはプラグインが異なる場合、以下のコマンドで作成/変更します。
OSの-- 新しいユーザーを作成する場合(例: osuserと同じ名前のMariaDBユーザー) CREATE USER 'osuser'@'localhost' IDENTIFIED VIA unix_socket; -- 既存のユーザーのプラグインを変更する場合(注意: パスワード認証から切り替える際は影響を考慮) ALTER USER 'existing_user'@'localhost' IDENTIFIED VIA unix_socket; FLUSH PRIVILEGES; -- 変更を反映
root
ユーザーでMariaDBのroot
にログインしたい場合、MariaDBのroot
ユーザーのplugin
がunix_socket
になっているか確認してください。もしなっていない場合、sudo mariadb
でログインできることを確認してから、以下のコマンドで変更できます。
ただし、ALTER USER 'root'@'localhost' IDENTIFIED VIA unix_socket; FLUSH PRIVILEGES;
root
ユーザーをunix_socket
認証にすると、OSのroot権限がなければMariaDBのrootにログインできなくなるため、注意が必要です。 - OSユーザー名とMariaDBユーザー名の確認
- 現在のOSユーザー名を確認
whoami
- MariaDBのユーザーとプラグインを確認
MariaDBにログインし(もしrootでログインできれば)、以下のクエリを実行します。SELECT User, Host, plugin FROM mysql.user;
plugin
カラムがunix_socket
になっているユーザーが、OSユーザー名と一致するか確認してください。
- 現在のOSユーザー名を確認
エラーメッセージ: ERROR 1524 (HY000): Plugin 'unix_socket' is not loaded.
原因
- unix_socketプラグインがMariaDBサーバーでロードされていない
MariaDBのバージョンや設定によっては、unix_socket
プラグインが明示的にロードされていない場合があります。
トラブルシューティング
- MariaDBのバージョンを確認
MariaDBのバージョンによっては、unix_socket
プラグインがデフォルトで有効になっている場合があります。古いバージョンでは、明示的にロードする必要があるかもしれません。 - MariaDBの設定ファイルを確認
通常、MariaDBの設定ファイル(例:/etc/my.cnf
、/etc/mysql/my.cnf
、/etc/mysql/mariadb.conf.d/50-server.cnf
など)に以下の記述があるか確認します。
または[mariadb] plugin_load_add = auth_socket.so
もし記述がない場合は、[mariadb] plugin_load_add = auth_unix_socket.so
[mariadb]
セクションに追加し、MariaDBサービスを再起動します。sudo systemctl restart mariadb # または mysql
エラーメッセージ: Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)
原因
- Unixソケットファイルのパーミッションの問題
クライアントがソケットファイルを読み書きする権限がない。 - Unixソケットファイルのパスが間違っている
クライアントが探しているソケットファイルのパスと、サーバーが使用しているソケットファイルのパスが一致していません。 - MariaDBサーバーが起動していない
最も一般的な原因です。
トラブルシューティング
- パーミッションの確認
ソケットファイルが存在する場合、そのファイルの所有者とグループ、パーミッションを確認します。通常、MariaDBを実行しているユーザー(例:mysql
)が所有し、他のユーザーが読み書きできるようなパーミッションになっている必要があります。 ディレクトリのパーミッションも重要です。ソケットファイルがあるディレクトリ(例:/var/run/mysqld/
)に、MariaDBプロセスとクライアントがアクセスできる権限があるか確認します。 - Unixソケットファイルのパスを確認
- サーバー側の設定を確認
MariaDBの設定ファイル(例:/etc/my.cnf
など)の[mysqld]
セクションにsocket
の記述があるか確認します。[mysqld] socket = /var/run/mysqld/mysqld.sock
- クライアント側の設定を確認
クライアント側も、socket
オプションでサーバーと同じパスを指定する必要があります。明示的に指定しない場合、デフォルトのパス(通常/tmp/mysql.sock
や/var/run/mysqld/mysqld.sock
)を探しに行きます。
クライアントの設定ファイル(例:mysql -u your_user --socket=/var/run/mysqld/mysqld.sock
~/.my.cnf
、/etc/my.cnf
の[client]
セクション)も確認してください。 - 実際のソケットファイルの存在を確認
ファイルが存在しない場合は、MariaDBサーバーが起動していないか、異なるパスを使用しています。ls -l /var/run/mysqld/mysqld.sock # または設定されているパス
- サーバー側の設定を確認
- MariaDBサーバーの起動状態を確認
もしsudo systemctl status mariadb # または mysql
inactive (dead)
であれば、起動を試みます。sudo systemctl start mariadb # または mysql
エラー: sudo mysqlでログインできない(sudoを使わないとAccess deniedになる場合)
原因
- MariaDBの
root
ユーザーがunix_socket
認証を使用するように設定されており、その結果、MariaDBのroot
ユーザーはOSのroot
ユーザーとしてのみログインできるようになっているためです。
- パスワード認証のユーザーを作成する
もしOSのroot権限なしでMariaDBのrootユーザーとしてログインしたい場合は、パスワード認証を使用する別のユーザーを作成するか、既存のrootユーザーにパスワード認証を追加することを検討してください。
注意:-- パスワード認証のユーザーを作成 CREATE USER 'admin_user'@'localhost' IDENTIFIED BY 'your_password'; GRANT ALL PRIVILEGES ON *.* TO 'admin_user'@'localhost' WITH GRANT OPTION; FLUSH PRIVILEGES; -- または、rootユーザーにパスワード認証も許可する(非推奨だが可能) -- この場合、rootユーザーはunix_socket認証とパスワード認証の両方でログインできる -- MariaDB 10.4以降では、rootユーザーのpluginをmysql_native_passwordに戻すのが一般的 -- ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_root_password'; -- FLUSH PRIVILEGES;
root
ユーザーの認証方式を変更する際は慎重に行う必要があります。誤ってログインできなくなる可能性があるため、必ずバックアップを取るか、別の方法でログインできることを確認してから実行してください。 - sudoを使用してログインする
これが意図された動作であり、最も簡単な解決策です。sudo mysql -u root
- 異なる認証方法も検討する
もしunix_socket
認証でどうしても問題が解決しない、またはリモートからのアクセスが必要な場合は、mysql_native_password
などの他の認証プラグインを利用することを検討してください。ユーザーごとに異なる認証プラグインを設定することも可能です。 - 設定ファイルを慎重に編集する
my.cnf
などの設定ファイルを編集する際は、構文エラーがないか確認し、変更後は必ずMariaDBサービスを再起動してください。 - OSユーザーとMariaDBユーザーの対応関係を理解する
unix_socket
認証は、OSユーザーとMariaDBユーザーの対応付けが重要です。この点を常に意識して設定やトラブルシューティングを行ってください。 - MariaDBのエラーログを確認する
MariaDBのエラーログ(通常/var/log/mysql/error.log
や/var/log/mariadb/mariadb.log
など)には、起動時のエラーや認証に関する詳細な情報が記録されています。問題を特定する上で非常に役立ちます。
ここでは、一般的なプログラミング言語(Python, PHP, Node.js)での接続例を挙げながら、Unix Socket認証におけるプログラミングのポイントを説明します。
Unix Socket 認証におけるプログラミングのポイント
Unix Socket認証を利用する際のプログラミング上の主なポイントは以下の2点です。
- ホスト名を
localhost
に設定する(またはソケットファイルを指定する): データベースへの接続時に、TCP/IPではなくUnixソケット経由での接続を促すために、ホスト名をlocalhost
と明示的に指定するか、Unixソケットファイルのパスを直接指定します。 - パスワードを指定しない: Unix Socket認証ではパスワードを使用しないため、接続文字列や接続オプションでパスワードを渡す必要はありません。
Python ( mysql-connector-python ライブラリを使用)
mysql-connector-python
は、MariaDB/MySQL への接続に広く使われる公式ライブラリです。
前提条件
- MariaDB に、接続元のOSユーザー名に対応するユーザー(例: OSユーザーが
myuser
なら、MariaDBに'myuser'@'localhost'
というユーザー)がIDENTIFIED VIA unix_socket
で作成されていること。 - MariaDB サーバーが起動しており、
unix_socket
認証プラグインが有効になっていること。 mysql-connector-python
がインストールされていること:pip install mysql-connector-python
Python コード例
import mysql.connector
import os
# 現在のOSユーザー名を取得
current_os_user = os.getlogin()
try:
# Unix Socket 認証での接続
# host='localhost' を指定することで、通常はUnixソケット経由の接続が試みられます。
# password は指定しません。
# user は、接続元のOSユーザー名と同じか、MariaDBでIDENTIFIED VIA unix_socket AS 'os_user' で指定されたユーザー名です。
conn = mysql.connector.connect(
host='localhost',
user=current_os_user, # OSユーザー名を使用
database='test_db'
# Unixソケットファイルのパスを明示的に指定する場合は、以下のようにします。
# unix_socket='/var/run/mysqld/mysqld.sock'
)
if conn.is_connected():
print(f"MariaDB に '{current_os_user}' としてUnix Socket 経由で接続しました!")
cursor = conn.cursor()
# 例: データベースからデータを取得
cursor.execute("SELECT VERSION()")
db_version = cursor.fetchone()
print(f"データベースバージョン: {db_version[0]}")
# 例: 簡単なクエリを実行
cursor.execute("SHOW DATABASES")
databases = cursor.fetchall()
print("利用可能なデータベース:")
for db in databases:
print(f"- {db[0]}")
except mysql.connector.Error as err:
print(f"接続エラー: {err}")
if err.errno == 1698: # ER_ACCESS_DENIED_FOR_USER
print("おそらくOSユーザーとMariaDBユーザーの対応、またはunix_socket認証設定に問題があります。")
print("以下の点を確認してください:")
print("1. 現在のOSユーザーが、MariaDBにunix_socket認証で登録されているか。")
print("2. MariaDBユーザーのプラグインが 'unix_socket' に設定されているか。")
print("3. 接続時に -h localhost またはソケットファイルパスを指定しているか。")
elif err.errno == 2002: # CR_CONNECTION_ERROR (ソケットファイルが見つからないなど)
print("Unixソケットファイルが見つからないか、MariaDBサーバーが起動していません。")
print("MariaDBサーバーの起動状態とソケットファイルのパスを確認してください。")
finally:
if 'conn' in locals() and conn.is_connected():
cursor.close()
conn.close()
print("MariaDB 接続を閉じました。")
PHP ( PDO または mysqli を使用)
PHPでも、Unixソケット経由での接続は比較的簡単です。
前提条件
- MariaDB に、接続元のOSユーザー名に対応するユーザーが
IDENTIFIED VIA unix_socket
で作成されていること。 - MariaDB サーバーが起動しており、
unix_socket
認証プラグインが有効になっていること。 - PHP がインストールされ、
pdo_mysql
またはmysqli
拡張が有効になっていること。
PHP コード例 (PDO)
<?php
$dsn = 'mysql:host=localhost;dbname=test_db'; // host=localhost を指定
// あるいは、ソケットファイルを直接指定する場合
// $dsn = 'mysql:unix_socket=/var/run/mysqld/mysqld.sock;dbname=test_db';
$user = get_current_user(); // 現在のOSユーザー名を取得
$password = ''; // Unix Socket 認証なのでパスワードは不要
try {
$pdo = new PDO($dsn, $user, $password);
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "MariaDB に '" . $user . "' としてUnix Socket 経由で接続しました!<br>";
// 例: データベースからデータを取得
$stmt = $pdo->query("SELECT VERSION()");
$version = $stmt->fetchColumn();
echo "データベースバージョン: " . $version . "<br>";
// 例: 簡単なクエリを実行
$stmt = $pdo->query("SHOW DATABASES");
echo "利用可能なデータベース:<br>";
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
echo "- " . $row['Database'] . "<br>";
}
} catch (PDOException $e) {
echo "接続エラー: " . $e->getMessage() . "<br>";
echo "以下の点を確認してください:<br>";
echo "1. 現在のOSユーザーが、MariaDBにunix_socket認証で登録されているか。<br>";
echo "2. MariaDBユーザーのプラグインが 'unix_socket' に設定されているか。<br>";
echo "3. PHPスクリプトを実行しているWebサーバー(Apache/Nginx)のユーザー(例: `www-data`)が、<br>";
echo " MariaDBの`unix_socket`ユーザーとして登録されているか、または対応するOSユーザーで実行されているか。<br>";
echo "4. MariaDBサーバーが起動しており、ソケットファイルのパスが正しいか。<br>";
}
// 接続はスクリプト終了時に自動的に閉じられますが、明示的に閉じることも可能です
$pdo = null;
echo "MariaDB 接続を閉じました。<br>";
/**
* 現在のOSユーザー名を取得するヘルパー関数
* PHPの実行環境によって適切な方法を選択してください。
* CLIの場合: get_current_user()
* Apache/NginxなどのWebサーバーの場合: posix_getpwuid(posix_geteuid())['name'] など
*/
function get_current_user() {
if (function_exists('posix_getpwuid') && function_exists('posix_geteuid')) {
$processUser = posix_getpwuid(posix_geteuid());
return $processUser['name'];
}
// CLIの場合のフォールバック
return get_current_user();
}
?>
PHP コード例 (mysqli)
<?php
$host = 'localhost'; // host='localhost' を指定
// あるいは、ソケットファイルを直接指定する場合
// $host = null;
// $socket = '/var/run/mysqld/mysqld.sock'; // ソケットファイルのパス
$user = get_current_user(); // 現在のOSユーザー名を取得
$password = ''; // パスワードは不要
$database = 'test_db';
$port = null; // デフォルトポートを使用
$mysqli = new mysqli($host, $user, $password, $database, $port, $socket ?? null);
if ($mysqli->connect_error) {
die("接続エラー: " . $mysqli->connect_error . "<br>");
}
echo "MariaDB に '" . $user . "' としてUnix Socket 経由で接続しました!<br>";
// 例: データベースからデータを取得
$result = $mysqli->query("SELECT VERSION()");
$row = $result->fetch_row();
echo "データベースバージョン: " . $row[0] . "<br>";
$result->close();
// 例: 簡単なクエリを実行
$result = $mysqli->query("SHOW DATABASES");
echo "利用可能なデータベース:<br>";
while ($row = $result->fetch_assoc()) {
echo "- " . $row['Database'] . "<br>";
}
$result->close();
$mysqli->close();
echo "MariaDB 接続を閉じました。<br>";
/**
* 現在のOSユーザー名を取得するヘルパー関数
* PHPの実行環境によって適切な方法を選択してください。
* CLIの場合: get_current_user()
* Apache/NginxなどのWebサーバーの場合: posix_getpwuid(posix_geteuid())['name'] など
*/
function get_current_user() {
if (function_exists('posix_getpwuid') && function_exists('posix_geteuid')) {
$processUser = posix_getpwuid(posix_geteuid());
return $processUser['name'];
}
// CLIの場合のフォールバック
return get_current_user();
}
?>
注意点 (PHP)
Webサーバー(Apache/Nginxなど)からPHPスクリプトを実行する場合、PHPスクリプトはWebサーバーのプロセスを実行しているOSユーザー(例: www-data
, apache
など)としてMariaDBに接続しようとします。この場合、WebサーバーのユーザーがMariaDBにunix_socket
認証で登録されている必要があります。
例: Apache が www-data
ユーザーで実行されている場合
CREATE USER 'www-data'@'localhost' IDENTIFIED VIA unix_socket;
GRANT SELECT ON your_database.* TO 'www-data'@'localhost'; -- 適切な権限を付与
FLUSH PRIVILEGES;
Node.js ( mysql2 または mysql ライブラリを使用)
Node.jsでも、Unixソケット経由での接続が可能です。mysql2
は、より新しい機能とパフォーマンスを提供するため推奨されます。
前提条件
- MariaDB に、接続元のOSユーザー名に対応するユーザーが
IDENTIFIED VIA unix_socket
で作成されていること。 - MariaDB サーバーが起動しており、
unix_socket
認証プラグインが有効になっていること。 mysql2
またはmysql
ライブラリがインストールされていること:npm install mysql2
- Node.js がインストールされていること。
Node.js コード例 (mysql2)
const mysql = require('mysql2');
const os = require('os'); // OS情報を取得するために使用
// 現在のOSユーザー名を取得
const currentOsUser = os.userInfo().username;
// Unix Socket 認証での接続設定
// host: 'localhost' を指定することで、Unixソケット経由の接続がデフォルトで試みられます。
// user: 接続元のOSユーザー名と同じか、MariaDBでunix_socket認証に設定されたユーザー名
// password: Unix Socket 認証なので指定しません
const connection = mysql.createConnection({
host: 'localhost',
user: currentOsUser, // OSユーザー名を使用
database: 'test_db',
// Unixソケットファイルのパスを明示的に指定する場合は、以下のようにします。
// socketPath: '/var/run/mysqld/mysqld.sock'
});
connection.connect((err) => {
if (err) {
console.error('接続エラー:', err);
if (err.code === 'ER_ACCESS_DENIED_ERROR') {
console.error("おそらくOSユーザーとMariaDBユーザーの対応、またはunix_socket認証設定に問題があります。");
console.error("以下の点を確認してください:");
console.error("1. 現在のOSユーザーが、MariaDBにunix_socket認証で登録されているか。");
console.error("2. MariaDBユーザーのプラグインが 'unix_socket' に設定されているか。");
console.error("3. 接続時に host='localhost' または socketPath を指定しているか。");
} else if (err.code === 'ECONNREFUSED' || err.code === 'ENOENT') {
console.error("Unixソケットファイルが見つからないか、MariaDBサーバーが起動していません。");
console.error("MariaDBサーバーの起動状態とソケットファイルのパスを確認してください。");
}
return;
}
console.log(`MariaDB に '${currentOsUser}' としてUnix Socket 経由で接続しました!`);
// 例: データベースからデータを取得
connection.query('SELECT VERSION()', (err, results) => {
if (err) throw err;
console.log(`データベースバージョン: ${results[0]['VERSION()']}`);
});
// 例: 簡単なクエリを実行
connection.query('SHOW DATABASES', (err, results) => {
if (err) throw err;
console.log("利用可能なデータベース:");
results.forEach((db) => {
console.log(`- ${db.Database}`);
});
// 接続を閉じる
connection.end((err) => {
if (err) throw err;
console.log("MariaDB 接続を閉じました。");
});
});
});
「Authentication Plugin - Unix Socket」を使ったプログラミングでは、ほとんどの場合、ホスト名をlocalhost
に設定(またはソケットファイルのパスを明示)し、パスワードを空にするだけで接続が可能です。これは、各言語のデータベースクライアントライブラリが、これらの設定に基づいて自動的にUnixソケット経由での接続を試み、OSレベルでの認証情報を使ってMariaDBとやり取りを行うためです。
MariaDBの「Authentication Plugin - Unix Socket」は、ローカル環境でのセキュリティと利便性を高める強力な認証方法ですが、常に利用できるわけではありませんし、他の要件がある場合もあります。Unix Socket認証が適切でない場合に、プログラムからMariaDBに接続するための代替方法がいくつかあります。
Unix Socket 認証の代替方法
Unix Socket認証の主な代替方法は、TCP/IP経由のパスワード認証です。これは最も一般的で柔軟な接続方法であり、MariaDBのさまざまな認証プラグインと組み合わせて利用できます。
TCP/IP経由のパスワード認証 (最も一般的)
これは、MariaDBに接続する際に最も標準的な方法です。ユーザー名とパスワードを介して認証を行い、ローカル接続とリモート接続の両方で機能します。
特徴
- パスワードによる保護
ユーザー名とパスワードの組み合わせで認証されます。 - 幅広い互換性
ほとんどすべてのプログラミング言語、フレームワーク、ツールでサポートされています。 - 柔軟性
任意のネットワーク経由でMariaDBサーバーに接続できます。
MariaDB側の設定
ユーザーを作成する際、IDENTIFIED BY 'password'
句を使用します。ホストにはlocalhost
、具体的なIPアドレス(例: 192.168.1.100
)、またはワイルドカード(%
)を指定できます。
-- ローカルからのパスワード認証ユーザー
CREATE USER 'local_user'@'localhost' IDENTIFIED BY 'your_secure_password';
GRANT SELECT ON your_database.* TO 'local_user'@'localhost';
-- 特定のIPアドレスからのパスワード認証ユーザー
CREATE USER 'remote_user'@'192.168.1.100' IDENTIFIED BY 'another_secure_password';
GRANT ALL PRIVILEGES ON another_database.* TO 'remote_user'@'192.168.1.100';
-- 任意のホストからのパスワード認証ユーザー (セキュリティリスクがあるため注意)
CREATE USER 'any_host_user'@'%' IDENTIFIED BY 'password_for_any_host';
GRANT SELECT ON public_data.* TO 'any_host_user'@'%';
FLUSH PRIVILEGES;
プログラミング例 (Python - mysql-connector-python)
ホスト名にlocalhost
(またはサーバーのIPアドレス)を指定し、password
引数に設定したパスワードを渡します。
import mysql.connector
try:
conn = mysql.connector.connect(
host='localhost', # または '127.0.0.1', 'リモートサーバーのIPアドレス'
user='local_user',
password='your_secure_password', # 設定したパスワード
database='test_db'
)
if conn.is_connected():
print("MariaDB に TCP/IP 経由でパスワード認証で接続しました!")
cursor = conn.cursor()
cursor.execute("SELECT VERSION()")
db_version = cursor.fetchone()
print(f"データベースバージョン: {db_version[0]}")
except mysql.connector.Error as err:
print(f"接続エラー: {err}")
finally:
if 'conn' in locals() and conn.is_connected():
conn.close()
print("MariaDB 接続を閉じました。")
MariaDBの他の認証プラグインを利用したパスワード認証
TCP/IP経由の接続では、デフォルトのmysql_native_password
以外にも、より強力な認証プラグインを利用できます。
ed25519
(MariaDB独自の強力な認証プラグイン): EdDSAアルゴリズムに基づく署名を利用し、非常に強力なセキュリティを提供します。caching_sha2_password
(MySQL 8.0以降で推奨、MariaDBもサポート):sha256
ハッシュアルゴリズムを使用し、よりセキュアなパスワードストレージと認証を提供します。
これらのプラグインを使用する場合も、基本的な接続コードはパスワード認証と同じですが、MariaDBサーバー側でユーザー作成時にプラグインを明示的に指定する必要があります。
MariaDB側の設定例 (ed25519)
CREATE USER 'ed25519_user'@'%' IDENTIFIED VIA ed25519 USING PASSWORD('my_ed25519_password');
FLUSH PRIVILEGES;
プログラミング例 (Python - mysql-connector-python - プラグインは通常自動認識)
通常、クライアントライブラリはサーバーが要求する認証プラグインを自動的に認識して処理するため、接続コード自体は標準のパスワード認証と変わりません。
import mysql.connector
try:
conn = mysql.connector.connect(
host='localhost',
user='ed25519_user',
password='my_ed25519_password',
database='test_db'
# ここで認証プラグインを明示的に指定することは通常不要です。
# ライブラリがサーバーからの情報に基づいて適切なプラグインを選択します。
)
if conn.is_connected():
print("MariaDB に ed25519 認証で接続しました!")
# 以降、クエリ実行など
except mysql.connector.Error as err:
print(f"接続エラー: {err}")
finally:
if 'conn' in locals() and conn.is_connected():
conn.close()
SSL/TLSによるセキュアな接続
上記のパスワード認証と組み合わせて、SSL/TLSを使用して接続を暗号化することで、通信経路の盗聴や改ざんを防ぎ、セキュリティをさらに強化できます。特にインターネット経由での接続の場合に必須です。
特徴
- クライアント証明書認証
サーバーがクライアントの身元を確認することもできます(相互認証)。 - サーバー証明書の検証
クライアントが正当なサーバーに接続していることを確認できます。 - 通信の暗号化
データベースとの間のデータ転送が暗号化されます。
MariaDB側の設定
- ユーザーに
REQUIRE SSL
を指定することもできます。 - MariaDBサーバーにSSL/TLS証明書と秘密鍵を設定します(
ssl_cert
,ssl_key
,ca_cert
)。
<!-- end list -->
-- ユーザーにSSL接続を強制
ALTER USER 'remote_user'@'%' REQUIRE SSL;
FLUSH PRIVILEGES;
プログラミング例 (Python - mysql-connector-python - SSL有効化)
import mysql.connector
try:
conn = mysql.connector.connect(
host='your_remote_server_ip',
user='remote_user',
password='another_secure_password',
database='test_db',
ssl_ca='/path/to/ca.pem', # 認証局の証明書
ssl_cert='/path/to/client-cert.pem', # クライアント証明書 (相互認証の場合)
ssl_key='/path/to/client-key.pem' # クライアント秘密鍵 (相互認証の場合)
)
if conn.is_connected():
print("MariaDB に SSL/TLS 経由で接続しました!")
# 以降、クエリ実行など
except mysql.connector.Error as err:
print(f"接続エラー: {err}")
finally:
if 'conn' in locals() and conn.is_connected():
conn.close()
シナリオ | 推奨される代替方法 | 補足 |
---|---|---|
ローカル開発環境 | TCP/IP パスワード認証 (localhost) | unix_socket が最も便利ですが、もし設定が複雑ならこちらでも十分です。 |
同一ネットワーク内 | TCP/IP パスワード認証 | セキュリティのため、特定のIPアドレスからの接続に制限し、強力なパスワードを使用します。 |
インターネット経由 | TCP/IP パスワード認証 + SSL/TLS | 必須です。通信経路を暗号化しないと、パスワードやデータが盗聴されるリスクが高まります。ファイアウォールも適切に設定します。 |
高度なセキュリティ | ed25519 (または caching_sha2_password ) 認証 + SSL/TLS | より強力な認証アルゴリズムを求める場合に適しています。 |
「Authentication Plugin - Unix Socket」はローカル接続に特化した便利な機能ですが、MariaDBへのプログラムからの接続は、用途に応じてTCP/IP経由のパスワード認証が最も一般的で柔軟な代替手段となります。さらに、セキュリティ要件に応じてSSL/TLS暗号化やより強力な認証プラグインを組み合わせることで、安全で堅牢なデータベース接続を構築できます。