MariaDBのSHA-256認証プラグインとは?安全な接続設定を徹底解説

2025-05-27

MariaDBの認証プラグイン - SHA-256とは

MariaDBやMySQLでは、ユーザーがデータベースに接続する際の認証方式を決定するために「認証プラグイン」を使用します。この認証プラグインは、パスワードのハッシュ化(暗号化)方法を定義し、より安全な認証を実現するために導入されました。

「SHA-256」認証プラグインは、パスワードのハッシュ化に「SHA-256」という強力なハッシュアルゴリズムを使用するものです。従来のmysql_native_passwordプラグインが使用していたSHA-1ベースのハッシュよりも、セキュリティが強化されています。

MariaDB(およびMySQL)では、SHA-256ベースの認証プラグインとして主に以下の2つが存在します。

    • これは基本的なSHA-256認証プラグインです。MySQL 5.6で追加されました。
    • MariaDBでも互換性のあるクライアントプラグインとして提供されていますが、より新しいcaching_sha2_passwordが推奨されることが多く、一部のMariaDBバージョンではサポートされない場合もあります。
  1. caching_sha2_password

    • これはMySQL 8.0でデフォルトの認証プラグインとなったものです。sha256_passwordと同様にSHA-256を使用しますが、サーバー側でのキャッシュ機能によりパフォーマンスが向上しており、より広範な適用性を持ちます。
    • MariaDBでも、このcaching_sha2_passwordに対応するクライアント認証プラグインが提供されています。多くの最新のMariaDB環境では、こちらが推奨される認証方式となります。

認証プラグインは、ユーザーがデータベースにログインする際に、以下のステップで機能します。

  1. パスワードのハッシュ化: ユーザーのパスワードは、データベースに保存される際に、選択された認証プラグイン(例: SHA-256)によってハッシュ化されます。これにより、データベースに平文のパスワードが保存されるのを防ぎます。
  2. 認証時のチャレンジ-レスポンス: クライアントがデータベースに接続しようとすると、サーバーはランダムな「スクランブル」と呼ばれるデータとハッシュ化されたパスワードの一部を基に「チャレンジ」をクライアントに送ります。
  3. クライアントでの処理: クライアントは、ユーザーが入力したパスワードとサーバーから受け取ったチャレンジを使って計算を行い、その結果をサーバーに送り返します。
  4. サーバーでの検証: サーバーは、クライアントから受け取った結果と、自身の保存しているハッシュ化されたパスワードを比較し、一致すれば認証成功となります。

SHA-256認証を使用するメリット

  • 最新の標準: MySQL 8.0以降のデフォルトであり、より安全な認証方式として広く採用されています。
  • セキュリティの向上: SHA-1よりも強力なSHA-256ハッシュアルゴリズムを使用するため、パスワードの安全性が高まります。ブルートフォース攻撃や辞書攻撃に対する耐性が向上します。

注意点

  • MariaDBとMySQLの互換性: MariaDBはMySQLから派生したデータベースですが、認証プラグインの実装には一部違いがある場合があります。特に、特定のバージョンや環境においては、互換性の問題が発生する可能性もあります。MariaDBの公式ドキュメントで推奨される認証プラグインを確認することが重要です。
  • RSA鍵の配布(一部ケース): sha256_passwordプラグインを使用する場合、特にセキュリティを強化するためにRSA公開鍵/秘密鍵のペアが必要となる場合があります。これにより、パスワードがネットワーク上で平文で送信されるのを防ぐことができます。caching_sha2_passwordは、この部分で改善されており、RSA鍵の配布が不要なケースもあります。
  • クライアントの対応: SHA-256認証を使用する場合、接続するクライアント(アプリケーション、ライブラリ、ツールなど)もこの認証方式に対応している必要があります。古いクライアントでは接続できない場合があります。

MariaDBでユーザーを作成または変更する際に、IDENTIFIED WITH句を使って認証プラグインを指定します。

例えば、sha256_passwordプラグインを使用するユーザーを作成する場合:

CREATE USER 'your_user'@'localhost' IDENTIFIED WITH sha256_password BY 'your_password';

caching_sha2_passwordプラグインを使用するユーザーを作成する場合:

CREATE USER 'your_user'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'your_password';

デフォルトの認証プラグインを変更したい場合は、MariaDBの設定ファイル(my.cnfなど)に以下のように記述できます。

[mysqld]
default_authentication_plugin=caching_sha2_password


MariaDBでSHA-256ベースの認証プラグイン(sha256_passwordcaching_sha2_password)を使用する際に発生しがちなエラーとその解決策について説明します。

重要な注意点

MariaDBの公式ドキュメントによると、MariaDBサーバー自体は現在、MySQLのsha256_passwordcaching_sha2_password認証プラグインを直接サポートしていません。 これは、MariaDBの認証プラグイン戦略がMySQLとは異なり、特に安全性の観点から、ED25519などのより強力な認証プラグインを推奨しているためです。

ただし、MariaDBクライアントライブラリは、MySQLサーバーへの接続のためにこれらのSHA-256プラグインに対応しています。そのため、以下のエラーやトラブルシューティングは、主にMariaDBクライアントからMySQLサーバーへ接続しようとした場合、またはMariaDBサーバーが将来的にこれらのプラグインをサポートした場合、あるいはMySQLの情報をMariaDBに適用しようとした場合に役立つ可能性があります。

最も一般的なエラー

"Authentication plugin 'caching_sha2_password' cannot be loaded" または "Authentication plugin 'sha256_password' cannot be loaded"

  • トラブルシューティング

    1. クライアントライブラリ/ドライバの更新
      これが最も効果的な解決策です。使用しているプログラミング言語のMariaDB/MySQLクライアントライブラリを最新バージョンに更新してください。特にMySQL 8.0以降に接続する場合、caching_sha2_passwordに対応した最新のドライバが必要です。

      • 例: Pythonのmysql-connectorを使用している場合、pip uninstall mysql-connector && pip install mysql-connector-pythonmysql-connector-pythonをインストールし直すことで解決する場合があります。
      • Javaの場合、Connector/Jのバージョンを確認し、必要に応じて最新版をダウンロードして使用してください。
      • MariaDB Connector/Cを使用している場合、mariadb-connector-cパッケージがインストールされていることを確認してください。
    2. ユーザーの認証プラグインを一時的に変更する (推奨度が低いが、緊急時の回避策)
      もし可能であれば、問題のユーザーの認証プラグインを一時的にmysql_native_passwordに変更することで接続できる場合があります。これはセキュリティが低下するため、推奨されません。

      -- MySQLサーバーに直接接続できる場合(例えば、Unixソケット認証などで)
      ALTER USER 'your_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
      FLUSH PRIVILEGES;
      

      注意
      MariaDBサーバー自体はmysql_native_passwordをサポートしていますが、この方法はあくまで緊急の回避策であり、最新のセキュリティ標準から外れます。

    3. サーバー側の設定を確認する (MySQLの場合)
      MySQLサーバーに接続している場合、my.cnf(またはmy.ini)ファイルを確認し、以下の設定がある場合はコメントアウトするか、mysql_native_passwordに戻します。

      # [mysqld]
      # default_authentication_plugin=caching_sha2_password
      

      そして、サーバーを再起動します。

    4. SELinuxやファイアウォールの確認
      稀に、SELinuxやファイアウォールがプラグインファイルの読み込みを妨げていることがあります。関連するログ(/var/log/audit/audit.logなど)を確認し、必要であればSELinuxポリシーを調整するか、ファイアウォール設定を確認してください。

    • クライアント側の問題
      接続しようとしているクライアントアプリケーションやドライバ(Java Connector/J, Python mysql-connector-python, PHP PDO_MySQL, Go, Node.jsなど)が、新しいSHA-256認証プラグイン(特にcaching_sha2_password)に対応していないか、または対応するライブラリが不足している。これは最も一般的な原因です。
    • サーバー側の設定ミス (MySQLの場合)
      my.cnfなどの設定ファイルでdefault_authentication_pluginが誤って設定されている、またはプラグインファイル自体が破損しているか、アクセスできないパスにある。
    • MariaDBサーバーのサポート不足
      前述の通り、MariaDBサーバーがこれらのプラグインをネイティブにサポートしていないため、MariaDBサーバーでこれらの認証プラグインを使用するように設定しようとすると、このエラーが発生します。
  • エラーメッセージの例

    ERROR 2059 (HY000): Authentication plugin 'caching_sha2_password' cannot be loaded: ...
    

    または

    ERROR 1045 (28000): Plugin sha256_password could not be loaded: /usr/lib/x86_64-linux-gnu/mariadb19/plugin/sha256_password.so: cannot open shared object file: No such file or directory
    

"Access denied for user 'your_user'@'localhost' (using password: YES/NO)"

  • トラブルシューティング

    1. パスワードの確認
      入力しているパスワードが正しいか再確認してください。

    2. ユーザーとホストの確認
      MariaDB/MySQLサーバーにログインし、ユーザーが存在するか、正しいホストから接続しようとしているかを確認します。

      SELECT user, host, plugin FROM mysql.user WHERE user = 'your_user';
      

      ここでpluginカラムがsha256_passwordまたはcaching_sha2_passwordになっていることを確認します。

    3. クライアント側の認証プラグイン指定
      一部のクライアントライブラリでは、接続オプションで認証プラグインを明示的に指定する必要がある場合があります。

      • 例: Pythonのmysql.connectorの場合
        import mysql.connector
        mydb = mysql.connector.connect(
            host="localhost",
            user="your_user",
            password="your_password",
            auth_plugin='caching_sha2_password' # または 'sha256_password'
        )
        
    4. SSL/TLS接続の確認 (特に sha256_password の場合)
      sha256_passwordプラグインは、パスワードがネットワーク経由で平文で送信されるのを防ぐために、多くの場合SSL/TLS接続を必要とします。クライアントがSSL/TLS接続を確立しているか、またはサーバー側でSSLが正しく設定されているかを確認してください。caching_sha2_passwordは、RSA公開鍵の自動交換などにより、この問題を軽減しています。

    5. RSA公開鍵の配布 (特に sha256_password の場合)
      sha256_passwordを使用するユーザーで、SSLなしで接続する場合、クライアントがサーバーのRSA公開鍵を取得できる必要があります。これは、サーバーのログに表示される公開鍵を取得してクライアントに提供するか、クライアントが自動的に取得できるような設定を行う必要があります。

  • 原因

    • パスワードが間違っている。
    • 指定したユーザー名またはホスト名がデータベースに存在しない。
    • ユーザーがsha256_passwordまたはcaching_sha2_passwordで作成されているにも関わらず、クライアントが適切に認証ハンドシェイクを処理できていない。
    • sha256_passwordを使用している場合、SSL接続が必須となる、またはRSA公開鍵がクライアントに提供されていない。

"Unknown authentication plugin 'sha256_password'" (MariaDBサーバーで発生する場合)

  • トラブルシューティング

    • MariaDBサーバーではこれらのプラグインを使用しない
      MariaDBサーバーで新しいユーザーを作成する場合やデフォルトの認証プラグインを設定する場合、MySQLのsha256_passwordcaching_sha2_passwordではなく、MariaDBが推奨する認証プラグイン(例: mysql_native_password、またはよりセキュアなed25519)を使用してください。
      -- MariaDBでユーザーを作成する場合(推奨されるMariaDBプラグインを使用)
      CREATE USER 'your_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';
      -- または、よりセキュアなed25519プラグイン(MariaDB 10.4以降)
      CREATE USER 'your_user'@'localhost' IDENTIFIED WITH ed25519 BY 'your_password';
      
    • MySQLサーバーに接続しているか確認する
      そもそもMariaDBではなくMySQLサーバーに接続しようとしているのか、それともMariaDBサーバーに接続しようとしているのかを明確にしてください。
  • 原因

    • MariaDBサーバーが、MySQLのsha256_passwordcaching_sha2_passwordプラグインをサポートしていないため。MariaDBは独自の認証プラグイン(例: unix_socket, mysql_native_password, ed25519など)を使用します。
  • エラーメッセージの例

    ERROR 1045 (28000): Unknown authentication plugin 'sha256_password'.
    

MariaDBの認証プラグインの現状と推奨

MariaDBは、MySQLのSHA-256ベースの認証プラグインをサーバー側でサポートしていません。MariaDBでより強力な認証を求める場合、ed25519認証プラグインの使用を検討すべきです。ed25519は、より新しい暗号化アルゴリズムを使用し、caching_sha2_passwordよりもさらに優れたセキュリティとパフォーマンスを提供します。



重要な前提と注意点

前回の説明でも触れましたが、MariaDBサーバー自体は、MySQLのsha256_passwordcaching_sha2_password認証プラグインをネイティブにサポートしていません。 MariaDBで強力な認証が必要な場合は、ed25519などのMariaDBが推奨する認証プラグインを使用することを強く推奨します。

しかし、MariaDBクライアントライブラリは、MySQLサーバー(特にMySQL 8.0以降のデフォルトであるcaching_sha2_password)に接続するために、これらのSHA-256プラグインをサポートしています。

したがって、ここで示すプログラミング例は、主にMariaDBのクライアントアプリケーションから、SHA-256認証プラグインを使用しているMySQLサーバーに接続する場合を想定しています。MariaDBサーバーに接続する場合は、ユーザー作成時の認証プラグインをMariaDBがサポートしているもの(例: mysql_native_password, ed25519)に変更する必要があります。

プログラミング例:SHA-256認証プラグインを使用するMySQLサーバーへの接続

ここでは、最も一般的なプログラミング言語であるPythonとJavaを例に、SHA-256認証プラグインを使用するMySQLサーバーに接続するためのコードを示します。

前提条件

    • MySQL 8.0以降が稼働していること。
    • ユーザーがcaching_sha2_password認証プラグインを使用するように設定されていること。
      -- MySQLサーバー上で実行
      CREATE USER 'your_sha256_user'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'your_secure_password';
      -- または既存ユーザーの変更
      ALTER USER 'your_sha256_user'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'your_new_secure_password';
      FLUSH PRIVILEGES;
      
    • sha256_passwordを使用する場合は、通常SSL/TLS接続が必要になるか、RSA公開鍵の配布が必要です。caching_sha2_passwordの方が扱いやすい場合が多いです。
  1. クライアント側の準備

    • 各言語に対応した最新のMariaDB/MySQLクライアントライブラリをインストールしていること。古いバージョンのライブラリはSHA-256認証に対応していない可能性があります。

Python (mysql-connector-python を使用)

PythonでMySQLに接続する場合、mysql-connector-pythonライブラリが一般的に使用されます。このライブラリは、caching_sha2_password認証にデフォルトで対応しています。

インストール

pip install mysql-connector-python

コード例

import mysql.connector

try:
    # MySQLサーバーへの接続情報
    db_config = {
        'host': '127.0.0.1',  # MySQLサーバーのホスト名またはIPアドレス
        'user': 'your_sha256_user', # SHA-256認証のユーザー
        'password': 'your_secure_password', # ユーザーのパスワード
        'database': 'testdb',      # 接続するデータベース名
        # 'auth_plugin': 'caching_sha2_password' # 明示的に指定することも可能だが、通常は不要
    }

    # データベースに接続
    conn = mysql.connector.connect(**db_config)

    if conn.is_connected():
        print("MySQLデータベースに正常に接続されました!")
        cursor = conn.cursor()

        # サンプルクエリの実行
        cursor.execute("SELECT VERSION()")
        db_version = cursor.fetchone()
        print(f"データベースバージョン: {db_version[0]}")

        # クエリの実行例
        cursor.execute("CREATE TABLE IF NOT EXISTS users (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255))")
        conn.commit()
        print("テーブル 'users' が存在しない場合は作成されました。")

        cursor.execute("INSERT INTO users (name) VALUES (%s)", ("テストユーザー",))
        conn.commit()
        print("データが挿入されました。")

        cursor.execute("SELECT * FROM users")
        records = cursor.fetchall()
        print("usersテーブルのデータ:")
        for row in records:
            print(row)

except mysql.connector.Error as err:
    if err.errno == mysql.connector.errorcode.CR_AUTH_PLUGIN_NOT_LOADED:
        print(f"エラー: クライアントが認証プラグイン 'caching_sha2_password' をロードできません。")
        print("クライアントライブラリを更新するか、対応するバージョンであることを確認してください。")
    elif err.errno == mysql.connector.errorcode.ER_ACCESS_DENIED_ERROR:
        print(f"エラー: ユーザー名またはパスワードが間違っています。再確認してください。")
    else:
        print(f"データベース接続エラー: {err}")

finally:
    if 'conn' in locals() and conn.is_connected():
        cursor.close()
        conn.close()
        print("MySQL接続が閉じられました。")

Java (MariaDB Connector/J または MySQL Connector/J を使用)

JavaでMariaDB/MySQLに接続する場合、通常はMariaDB Connector/JまたはMySQL Connector/Jを使用します。どちらのドライバも、SHA-256認証プラグインへの接続をサポートしています。ここではMariaDB Connector/Jを例に示します。

依存関係 (Maven)
pom.xmlに以下を追加します。

<dependencies>
    <dependency>
        <groupId>org.mariadb.jdbc</groupId>
        <artifactId>mariadb-java-client</artifactId>
        <version>3.3.3</version> </dependency>
</dependencies>

コード例

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class Sha256AuthExample {

    public static void main(String[] args) {
        String DB_URL = "jdbc:mariadb://127.0.0.1:3306/testdb"; // MySQLサーバーへの接続URL
        String USER = "your_sha256_user"; // SHA-256認証のユーザー
        String PASS = "your_secure_password"; // ユーザーのパスワード

        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;

        try {
            // MariaDB JDBCドライバをロード(Java 6以降は不要な場合が多いが明示的に記述)
            // Class.forName("org.mariadb.jdbc.Driver"); // MariaDB Connector/Jの場合

            System.out.println("MySQLデータベースに接続中...");
            conn = DriverManager.getConnection(DB_URL, USER, PASS);
            System.out.println("MySQLデータベースに正常に接続されました!");

            stmt = conn.createStatement();

            // サンプルクエリの実行
            rs = stmt.executeQuery("SELECT VERSION()");
            if (rs.next()) {
                System.out.println("データベースバージョン: " + rs.getString(1));
            }

            // テーブル作成の例
            stmt.executeUpdate("CREATE TABLE IF NOT EXISTS products (id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), price DECIMAL(10,2))");
            System.out.println("テーブル 'products' が存在しない場合は作成されました。");

            // データ挿入の例
            stmt.executeUpdate("INSERT INTO products (name, price) VALUES ('商品A', 100.50)");
            stmt.executeUpdate("INSERT INTO products (name, price) VALUES ('商品B', 250.75)");
            System.out.println("データが挿入されました。");

            // データ取得の例
            rs = stmt.executeQuery("SELECT * FROM products");
            System.out.println("productsテーブルのデータ:");
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                double price = rs.getDouble("price");
                System.out.println("ID: " + id + ", 名前: " + name + ", 価格: " + price);
            }

        } catch (SQLException se) {
            // SQL 例外処理
            if (se.getSQLState().equals("28000") || se.getErrorCode() == 1045) { // SQLSTATE 28000 は認証エラー
                System.err.println("認証エラー: ユーザー名またはパスワードが間違っているか、" +
                                   "クライアントがSHA-256認証プラグインに対応していません。");
            } else {
                se.printStackTrace();
            }
        } catch (Exception e) {
            // その他の例外処理
            e.printStackTrace();
        } finally {
            // リソースのクリーンアップ
            try {
                if (rs != null) rs.close();
            } catch (SQLException se2) {
                // 何もしない
            }
            try {
                if (stmt != null) stmt.close();
            } catch (SQLException se2) {
                // 何もしない
            }
            try {
                if (conn != null) conn.close();
            } catch (SQLException se) {
                se.printStackTrace();
            }
            System.out.println("MySQL接続が閉じられました。");
        }
    }
}

もしMariaDBサーバーに接続し、かつSHA-256と同様のセキュリティレベルを求めるのであれば、MariaDBが推奨するed25519認証プラグインを使用することを検討してください。

MariaDBサーバーでのユーザー作成 (ED25519)

-- MariaDBサーバー上で実行 (MariaDB 10.4以降で利用可能)
CREATE USER 'your_ed25519_user'@'localhost' IDENTIFIED WITH ed25519 BY 'your_secure_password';
FLUSH PRIVILEGES;

PythonでのED25519認証への接続例 (mariadbコネクタを使用)

mariadbコネクタは、MariaDBのネイティブな認証プラグインに対応しています。

インストール

pip install mariadb

コード例

import mariadb
import sys

try:
    conn = mariadb.connect(
        user="your_ed25519_user",
        password="your_secure_password",
        host="127.0.0.1",
        port=3306,
        database="testdb"
    )

    cur = conn.cursor()

    cur.execute("SELECT VERSION()")
    for row in cur:
        print(f"MariaDBデータベースバージョン: {row[0]}")

    cur.execute("CREATE TABLE IF NOT EXISTS test_ed25519 (id INT AUTO_INCREMENT PRIMARY KEY, message VARCHAR(255))")
    conn.commit()
    print("テーブル 'test_ed25519' が存在しない場合は作成されました。")

    cur.execute("INSERT INTO test_ed25519 (message) VALUES (?)", ("ED25519認証テスト",))
    conn.commit()
    print("データが挿入されました。")

    cur.execute("SELECT * FROM test_ed25519")
    records = cur.fetchall()
    print("test_ed25519テーブルのデータ:")
    for row in records:
        print(row)

except mariadb.Error as e:
    print(f"MariaDB接続エラー: {e}")
    sys.exit(1)
finally:
    if 'conn' in locals() and conn:
        conn.close()
        print("MariaDB接続が閉じられました。")



MariaDBの認証プラグイン - SHA-256の代替方法

MariaDBでは、以下の認証プラグインがSHA-256の代替として考慮すべき主要な選択肢となります。

ここでは、最も推奨されるed25519と、一般的なmysql_native_password、そして特殊なunix_socketのプログラミング例を示します。

前提条件

  • 各認証プラグインを使用するようにユーザーが設定されていること。
  • MariaDBサーバーが稼働していること。

ed25519 認証プラグインのプログラミング例 (Python)

MariaDBに特化したコネクタ (mariadb コネクタ) を使用します。

サーバー側のユーザー作成

-- MariaDBサーバー上で実行 (MariaDB 10.4以降)
CREATE USER 'your_ed25519_user'@'localhost' IDENTIFIED WITH ed25519 BY 'your_secure_password';
FLUSH PRIVILEGES;

Pythonコード

import mariadb
import sys

try:
    conn = mariadb.connect(
        user="your_ed25519_user",
        password="your_secure_password",
        host="127.0.0.1",
        port=3306,
        database="testdb"
    )

    cur = conn.cursor()

    cur.execute("SELECT VERSION()")
    for row in cur:
        print(f"MariaDBデータベースバージョン (ED25519接続): {row[0]}")

    # テーブル操作など...
    cur.execute("CREATE TABLE IF NOT EXISTS ed_test (id INT AUTO_INCREMENT PRIMARY KEY, message VARCHAR(255))")
    conn.commit()
    print("テーブル 'ed_test' が存在しない場合は作成されました。")

    cur.execute("INSERT INTO ed_test (message) VALUES (?)", ("ED25519認証からの挿入",))
    conn.commit()
    print("データが挿入されました。")

    cur.execute("SELECT * FROM ed_test")
    records = cur.fetchall()
    print("ed_testテーブルのデータ:")
    for row in records:
        print(row)

except mariadb.Error as e:
    print(f"MariaDB接続エラー (ED25519): {e}")
    sys.exit(1)
finally:
    if 'conn' in locals() and conn:
        conn.close()
        print("MariaDB接続が閉じられました。")

mysql_native_password 認証プラグインのプログラミング例 (Python)

ほとんどのクライアントライブラリがデフォルトで対応しています。mysql-connector-pythonでもmariadbコネクタでも同様に接続できます。

サーバー側のユーザー作成

-- MariaDBサーバー上で実行
CREATE USER 'your_native_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';
FLUSH PRIVILEGES;

Pythonコード (mysql-connector-python を使用)

import mysql.connector

try:
    conn = mysql.connector.connect(
        host="127.0.0.1",
        user="your_native_user",
        password="your_password",
        database="testdb"
    )

    if conn.is_connected():
        print("MySQLデータベースに正常に接続されました (mysql_native_password)!")
        cursor = conn.cursor()
        cursor.execute("SELECT USER(), CURRENT_AUTH_PLUGIN()")
        result = cursor.fetchone()
        print(f"接続ユーザー: {result[0]}, 認証プラグイン: {result[1]}")

except mysql.connector.Error as err:
    print(f"データベース接続エラー (mysql_native_password): {err}")
finally:
    if 'conn' in locals() and conn.is_connected():
        conn.close()
        print("接続が閉じられました。")

unix_socket 認証プラグインのプログラミング例 (Python)

unix_socket認証は、OSのユーザーがMariaDBユーザーと一致する場合にパスワードなしで接続できます。

サーバー側のユーザー作成
MariaDBサーバーが稼働しているOSのユーザー名(例: my_os_user)と同じ名前のMariaDBユーザーを作成します。

-- MariaDBサーバー上で実行
CREATE USER 'my_os_user'@'localhost' IDENTIFIED VIA unix_socket;
FLUSH PRIVILEGES;

Pythonコード (mariadb コネクタを使用)

import mariadb
import sys

try:
    # Unixソケットパスは通常 /var/run/mysqld/mysqld.sock など
    # MariaDBのバージョンやOSによって異なる場合があります
    conn = mariadb.connect(
        unix_socket="/var/run/mysqld/mysqld.sock",
        user="my_os_user", # OSの現在のユーザー名と一致させる
        database="testdb"
        # passwordは不要
    )

    cur = conn.cursor()

    cur.execute("SELECT USER(), CURRENT_AUTH_PLUGIN()")
    for row in cur:
        print(f"MariaDBデータベースに正常に接続されました (unix_socket)!")
        print(f"接続ユーザー: {row[0]}, 認証プラグイン: {row[1]}")

except mariadb.Error as e:
    print(f"MariaDB接続エラー (unix_socket): {e}")
    print("ヒント: OSのユーザー名とMariaDBのユーザー名が一致しているか、")
    print("unix_socketのパスが正しいか、権限があるか確認してください。")
    sys.exit(1)
finally:
    if 'conn' in locals() and conn:
        conn.close()
        print("MariaDB接続が閉じられました。")

GSSAPI 認証プラグインのプログラミング例 (Java)

GSSAPI認証は、Kerberos環境に依存するため、設定が複雑になります。ここでは基本的な接続の概念のみを示します。

サーバー側のユーザー作成

-- MariaDBサーバー上で実行
CREATE USER 'your_gssapi_user'@'localhost' IDENTIFIED VIA gssapi AS 'your_gssapi_principal@YOUR_REALM';
FLUSH PRIVILEGES;

Javaコード (簡略版)

GSSAPI認証を使用するには、JavaアプリケーションがKerberosチケットを取得できる環境(kinitコマンドでチケットが取得済み、またはlogin.confファイルで設定)にあり、Kerberos設定(krb5.conf)が適切に構成されている必要があります。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class GssapiAuthExample {

    public static void main(String[] args) {
        // Kerberos設定のシステムプロパティ
        // 通常はkrb5.confファイルで設定しますが、コードで指定することも可能
        // System.setProperty("java.security.krb5.kdc", "kdc.example.com");
        // System.setProperty("java.security.krb5.realm", "EXAMPLE.COM");
        // System.setProperty("java.security.auth.login.config", "/path/to/login.conf"); // JAAS設定ファイル

        String DB_URL = "jdbc:mariadb://your_mariadb_host:3306/testdb";
        String USER = "your_gssapi_user"; // MariaDBユーザー名 (GSSAPIプリンシパルではない)

        Connection conn = null;
        Statement stmt = null;

        try {
            // MariaDB Connector/JはGSSAPI認証に対応
            conn = DriverManager.getConnection(DB_URL, USER, ""); // GSSAPIではパスワードは不要
            System.out.println("MariaDBデータベースに正常に接続されました (GSSAPI)!");

            stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery("SELECT USER(), CURRENT_AUTH_PLUGIN()");
            if (rs.next()) {
                System.out.println("接続ユーザー: " + rs.getString(1) + ", 認証プラグイン: " + rs.getString(2));
            }

        } catch (SQLException se) {
            se.printStackTrace();
            System.err.println("GSSAPI認証エラー: Kerberosチケット、KDC/Realm設定、");
            System.err.println("またはMariaDBユーザーのプリンシパル設定を確認してください。");
        } finally {
            try {
                if (stmt != null) stmt.close();
            } catch (SQLException se2) {
                // ignore
            }
            try {
                if (conn != null) conn.close();
            } catch (SQLException se) {
                se.printStackTrace();
            }
            System.out.println("接続が閉じられました。");
        }
    }
}