MySQL 8.0 リファレンスマニュアル


6.4.1.5 PAM プラガブル認証

注記

PAM プラガブル認証は、商用製品である MySQL Enterprise Edition に含まれる拡張機能です。 商用製品の詳細は、https://www.mysql.com/products/ を参照してください。

MySQL Enterprise Edition は、MySQL Server が PAM (Pluggable Authentication Module) を使用して MySQL ユーザーを認証できるようにする認証方式をサポートしています。 PAM を使用すると、システムは標準インタフェースを使用して、従来の Unix パスワードや LDAP ディレクトリなどのさまざまな種類の認証方式にアクセスできます。

PAM プラガブル認証は、次の機能を提供します:

  • 外部認証: PAM 認証を使用すると、MySQL Server は、MySQL 付与テーブルの外部で定義され、PAM でサポートされている方法を使用して認証するユーザーからの接続を受け入れることができます。

  • プロキシユーザーのサポート: PAM 認証は、外部ユーザーがメンバーになっている PAM グループと指定された認証文字列に基づいて、クライアントプログラムによって渡された外部ユーザー名とは異なるユーザー名を MySQL に返すことができます。 つまり、このプラグインは、外部 PAM で認証されたユーザーが持つべき権限を定義する MySQL ユーザーを返すことができます。 たとえば、joe というオペレーティングシステムユーザーは、developer という MySQL ユーザーに接続して権限を持つことができます。

PAM プラガブル認証は、Linux および macOS でテストされています。

次の表には、プラグインおよびライブラリファイルの名前を示します。 ファイル名のサフィクスは、システムによって異なる場合があります。 ファイルは、plugin_dir システム変数で指定されたディレクトリに配置する必要があります。 インストールに関する情報については、PAM プラガブル認証のインストールを参照してください。

表 6.16 PAM 認証用のプラグインおよびライブラリ名

プラグインまたはファイル プラグインまたはファイル名
サーバー側プラグイン authentication_pam
クライアント側プラグイン mysql_clear_password
ライブラリファイル authentication_pam.so

サーバー側 PAM プラグインと通信するクライアント側 mysql_clear_password クリアテキストプラグインは、libmysqlclient クライアントライブラリに組み込まれており、コミュニティー配布を含むすべての配布に含まれます。 すべての MySQL ディストリビューションにクライアント側のクリアテキストプラグインを含めると、任意のディストリビューションのクライアントが、サーバー側 PAM プラグインがロードされているサーバーに接続できるようになります。

次の各セクションでは、PAM プラガブル認証に固有のインストールおよび使用方法について説明します:

MySQL のプラガブル認証に関する一般的な情報については、セクション6.2.17「プラガブル認証」を参照してください。 mysql_clear_password プラグインの詳細は、セクション6.4.1.4「クライアント側クリアテキストプラガブル認証」 を参照してください。 プロキシユーザーについては、セクション6.2.18「プロキシユーザー」を参照してください。

MySQL ユーザーの PAM 認証の仕組み

このセクションでは、MySQL と PAM が連携して MySQL ユーザーを認証する方法の概要について説明します。 特定の PAM サービスを使用するように MySQL アカウントを設定する方法を示す例については、PAM プラガブル認証の使用 を参照してください。

  1. クライアントプログラムとサーバーは通信し、クライアントはサーバーにクライアントユーザー名 (デフォルトではオペレーティングシステムのユーザー名) とパスワードを送信します:

    • クライアントユーザー名は外部ユーザー名です。

    • PAM サーバー側認証プラグインを使用するアカウントの場合、対応するクライアント側プラグインは mysql_clear_password です。 このクライアント側プラグインはパスワードハッシュを実行せず、その結果、クライアントはパスワードをクリアテキストとしてサーバーに送信します。

  2. サーバーは、外部ユーザー名とクライアントの接続元のホストに基づいて、一致する MySQL アカウントを検索します。 PAM プラグインは、MySQL Server によって渡された情報 (ユーザー名、ホスト名、パスワード、認証文字列など) を使用します。 PAM を使用して認証する MySQL アカウントを定義する場合、認証文字列には次のものが含まれます:

    • PAM サービス名。システム管理者が特定のアプリケーションの認証方式を参照するために使用できる名前です。 単一のデータベースサーバーインスタンスに複数のアプリケーションを関連付けることができるため、サービス名の選択は SQL アプリケーション開発者に任されます。

    • オプションで、プロキシを使用する場合は、PAM グループから MySQL ユーザー名へのマッピング。

  3. プラグインは、認証文字列で指定された PAM サービスを使用してユーザー資格証明を確認し、'Authentication succeeded, Username is user_name'または'Authentication failed'を返します。 パスワードは、PAM サービスで使用されるパスワードストアに適している必要があります。 例:

    • 従来の Unix パスワードの場合、サービスは/etc/shadow ファイルに格納されているパスワードを検索します。

    • LDAP の場合、サービスは LDAP ディレクトリに格納されているパスワードを検索します。

    資格証明チェックが失敗すると、サーバーは接続を拒否します。

  4. それ以外の場合、認証文字列はプロキシが発生するかどうかを示します。 文字列に PAM グループマッピングが含まれていない場合、プロキシは発生しません。 この場合、MySQL ユーザー名は外部ユーザー名と同じです。

  5. それ以外の場合、プロキシは PAM グループマッピングに基づいて示され、MySQL ユーザー名はマッピングリスト内の最初に一致するグループに基づいて決定されます。 「PAM グループ」の意味は PAM サービスによって異なります。 例:

    • 従来の Unix パスワードの場合、グループは/etc/group ファイルで定義された Unix グループで、/etc/security/group.conf などのファイル内の追加 PAM 情報を補足する可能性があります。

    • LDAP の場合、グループは LDAP ディレクトリで定義された LDAP グループです。

    プロキシユーザー (外部ユーザー) がプロキシ設定された MySQL ユーザー名に対する PROXY 権限を持っている場合、プロキシ設定は、プロキシ設定されたユーザーがプロキシ設定されたユーザーの権限を引き受けた状態で行われます。

PAM プラガブル認証のインストール

このセクションでは、PAM 認証プラグインをインストールする方法について説明します。 プラグインのインストールについての一般的な情報は、セクション5.6.1「プラグインのインストールおよびアンインストール」を参照してください。

サーバーで使用できるようにするには、プラグインライブラリファイルを MySQL プラグインディレクトリ (plugin_dir システム変数で指定されたディレクトリ) に配置する必要があります。 必要に応じて、サーバーの起動時に plugin_dir の値を設定してプラグインディレクトリの場所を構成します。

プラグインライブラリファイルのベース名は authentication_pam です。 ファイル名の接尾辞は、プラットフォームごとに異なります (たとえば、.so for Unix and Unix-like systems, .dll for Windows)。

サーバーの起動時にプラグインをロードするには、--plugin-load-add オプションを使用して、プラグインを含むライブラリファイルに名前を付けます。 このプラグインのロード方式では、サーバーを起動するたびにオプションを指定する必要があります。 たとえば、サーバー my.cnf ファイルに次の行を入力し、必要に応じてプラットフォームの .so 接尾辞を調整します:

[mysqld]
plugin-load-add=authentication_pam.so

my.cnf を変更したら、新しい設定を有効にするためにサーバーを再起動します。

または、実行時にプラグインをロードするには、次のステートメントを使用して、必要に応じてプラットフォームの .so 接尾辞を調整します:

INSTALL PLUGIN authentication_pam SONAME 'authentication_pam.so';

INSTALL PLUGIN はプラグインをただちにロードし、mysql.plugins システムテーブルにも登録して、--plugin-load-add を必要とせずに後続の通常の起動のたびにサーバーがプラグインをロードするようにします。

プラグインのインストールを確認するには、INFORMATION_SCHEMA.PLUGINS テーブルを調べるか、SHOW PLUGINS ステートメントを使用します (セクション5.6.2「サーバープラグイン情報の取得」 を参照)。 例:

mysql> SELECT PLUGIN_NAME, PLUGIN_STATUS
       FROM INFORMATION_SCHEMA.PLUGINS
       WHERE PLUGIN_NAME LIKE '%pam%';
+--------------------+---------------+
| PLUGIN_NAME        | PLUGIN_STATUS |
+--------------------+---------------+
| authentication_pam | ACTIVE        |
+--------------------+---------------+

プラグインの初期化に失敗した場合は、サーバーエラーログで診断メッセージを確認してください。

MySQL アカウントを PAM プラグインに関連付けるには、PAM プラガブル認証の使用 を参照してください。

PAM プラガブル認証のアンインストール

PAM 認証プラグインのアンインストールに使用される方法は、インストール方法によって異なります:

  • --plugin-load-add オプションを使用してサーバーの起動時にプラグインをインストールした場合は、オプションなしでサーバーを再起動します。

  • INSTALL PLUGIN ステートメントを使用して実行時にプラグインをインストールした場合、サーバーの再起動後もインストールされたままになります。 アンインストールするには、UNINSTALL PLUGIN を使用します:

    UNINSTALL PLUGIN authentication_pam;
PAM プラガブル認証の使用

このセクションでは、PAM 認証プラグインを使用して MySQL クライアントプログラムからサーバーに接続する一般的な用語について説明します。 次のセクションでは、PAM 認証を特定の方法で使用する手順について説明します。 PAM プラガブル認証のインストール で説明されているように、サーバーがサーバー側 PAM プラグインを有効にして実行されていることを前提としています。

CREATE USER ステートメントの IDENTIFIED WITH 句で PAM 認証プラグインを参照するには、authentication_pam という名前を使用します。 例:

CREATE USER user
  IDENTIFIED WITH authentication_pam
  AS 'auth_string';

認証文字列には、次のタイプの情報が指定されます。

  • PAM サービス名 (MySQL ユーザーの PAM 認証の仕組み を参照)。 次の説明の例では、従来の Unix パスワードを使用した認証に mysql-unix のサービス名を使用し、LDAP を使用した認証に mysql-ldap を使用します。

  • プロキシサポートのために、PAM は、クライアントプログラムがサーバーに接続するときに渡される外部ユーザー名以外の MySQL ユーザー名を PAM モジュールがサーバーに返す方法を提供します。 認証文字列を使用して、外部ユーザー名から MySQL ユーザー名へのマッピングを制御します。 プロキシユーザーの機能を活用するには、この種類のマッピングを認証文字列に含める必要があります。

たとえば、アカウントが mysql-unix PAM サービス名を使用し、root および users PAM グループのオペレーティングシステムユーザーを developer および data_entry MySQL ユーザーにそれぞれマップする必要がある場合は、次のようなステートメントを使用します:

CREATE USER user
  IDENTIFIED WITH authentication_pam
  AS 'mysql-unix, root=developer, users=data_entry';

PAM 認証プラグインでの認証文字列の構文は、次のようなルールに従っています。

  • 文字列は PAM サービス名で構成され、オプションで PAM グループマッピングリストが続きます。PAM グループマッピングリストは、PAM グループ名と MySQL ユーザー名を指定する 1 つ以上のキーワードと値のペアで構成されます:

    pam_service_name[,pam_group_name=mysql_user_name]...

    プラグインは、アカウントを使用する各接続試行の認証文字列を解析します。 オーバーヘッドを最小限に抑えるには、できるだけ文字列を短く保ちます。

  • pam_group_name=mysql_user_name ペアの前にカンマを付ける必要があります。

  • 二重引用符で囲まれていない先頭および末尾の空白文字は、無視されます。

  • 引用符で囲まれていない pam_service_namepam_group_name および mysql_user_name の値には、等号、カンマまたは空白以外の任意の値を含めることができます。

  • pam_service_namepam_group_name または mysql_user_name の値が二重引用符で囲まれている場合、引用符の間のすべてが値の一部になります。 たとえば、値に空白文字が含まれている場合は、これが必要です。 二重引用符およびバックスラッシュ (\) を除くすべての文字は有効です。 どちらかの文字を含めるには、バックスラッシュを使用してエスケープします。

プラグインが外部ユーザー名 (クライアントから渡された名前) を正常に認証すると、認証文字列内で PAM グループマッピングリストが検索され、存在する場合は、それを使用して、外部ユーザーがメンバーになっている PAM グループに基づいて別の MySQL ユーザー名が MySQL サーバーに返されます:

  • 認証文字列に PAM グループマッピングリストが含まれていない場合、プラグインは外部名を返します。

  • 認証文字列に PAM グループマッピングリストが含まれている場合、プラグインはリスト内の各 pam_group_name=mysql_user_name ペアを左から右に検査し、認証されたユーザーに割り当てられたグループの non-MySQL ディレクトリ内で pam_group_name 値の一致を見つけようとし、見つかった最初の一致について mysql_user_name を返します。 どの PAM グループにも一致するものが見つからない場合、プラグインは外部名を返します。 プラグインは、ディレクトリ内のグループを検索できない場合、PAM グループマッピングリストを無視して外部名を返します。

次のセクションでは、PAM 認証プラグインを使用するいくつかの認証シナリオを設定する方法について説明します。

  • プロキシユーザーなし。 ここでは、ログイン名とパスワードをチェックする際にのみ PAM が使用されます。 MySQL Server への接続を許可されたすべての外部ユーザーには、PAM 認証を使用するように定義された一致する MySQL アカウントが必要です。 ('user_name'@'host_name'の MySQL アカウントが外部ユーザーと一致するには、user_name が外部ユーザー名であり、host_name がクライアントの接続元のホストと一致する必要があります。) PAM でサポートされているさまざまな方式で、認証を実行できます。 後で、従来の Unix パスワードおよび LDAP のパスワードを使用してクライアント資格証明を認証する方法について説明します。

    PAM 認証は、プロキシユーザーまたは PAM グループを介して行われない場合、MySQL ユーザー名がオペレーティングシステムユーザー名と同じである必要があります。 MySQL ユーザー名は 32 文字に制限され (セクション6.2.3「付与テーブル」 を参照)、PAM 非プロキシ認証は最大 32 文字の名前を持つ Unix アカウントに制限されます。

  • プロキシユーザーのみ (PAM グループマッピングを使用)。 このシナリオでは、異なる権限セットを定義する 1 つ以上の MySQL アカウントを作成します。 (理想的には、これらのアカウントを使用して誰も接続しないでください。) 次に、PAM を介して認証するデフォルトユーザーを定義します。PAM は、なんらかのマッピングスキーム (通常、ユーザーがメンバーになっている外部 PAM グループに基づく) を使用して、すべての外部ユーザー名を、権限セットを保持する少数の MySQL アカウントにマップします。 クライアントユーザー名として外部ユーザー名を接続および指定するクライアントは、いずれかの MySQL アカウントにマップされ、その権限を使用します。 ここでは、従来の Unix パスワードを使用してこれを設定する方法を示しますが、LDAP などのほかの PAM 方法を代わりに使用することもできます。

これらのシナリオには、次のバリエーションがあります:

  • 一部のユーザーは (プロキシを使用せずに) 直接ログインできますが、他のユーザーはプロキシアカウントを介して接続する必要があります。

  • PAM 認証アカウント間で異なる PAM サービス名を使用することで、ある PAM 認証方法を一部のユーザーに使用し、別の方法を他のユーザーに使用できます。 たとえば、一部のユーザーには mysql-unix PAM サービスを使用し、その他のユーザーには mysql-ldap を使用できます。

この例は、次のことが前提となっています。 システムが異なる方法で設定されている場合は、多少の調整が必要になることもあります。

  • ログイン名とパスワードは、それぞれ antonioantonio_password です。 これらを、認証するユーザーに対応するように変更します。

  • PAM 構成ディレクトリは /etc/pam.d です。

  • PAM サービス名は、認証方式 (この説明では mysql-unix または mysql-ldap) に対応します。 特定の PAM サービスを使用するには、PAM 構成ディレクトリに同じ名前の PAM ファイルを設定する必要があります (ファイルが存在しない場合は作成します)。 また、PAM サービスを使用して認証するアカウントの場合は、CREATE USER ステートメントの認証文字列に PAM サービスを指定する必要があります。

PAM 認証プラグインは、サーバーの起動環境で AUTHENTICATION_PAM_LOG 環境値が設定されているかどうかを初期化時にチェックします。 その場合、プラグインを使用すると、標準出力への診断メッセージのロギングが有効になります。 サーバーの起動方法によっては、コンソールまたはエラーログにメッセージが表示される場合があります。 これらのメッセージは、プラグインが認証を実行するときに発生する PAM 関連の問題のデバッグに役立ちます。 詳細は、PAM 認証のデバッグを参照してください。

プロキシユーザーを使用しない PAM Unix パスワード認証

この認証シナリオでは、PAM を使用して、プロキシを使用せずに、オペレーティングシステムユーザー名および Unix パスワードに関して定義された外部ユーザーをチェックします。 MySQL Server への接続を許可されたすべての外部ユーザーには、従来の Unix パスワードストアを介した PAM 認証を使用するように定義された、一致する MySQL アカウントが必要です。

注記

従来の Unix パスワードは、/etc/shadow ファイルを使用してチェックされます。 このファイルに関連して発生する可能性のある問題の詳細は、Unix パスワードストアへの PAM 認証アクセス を参照してください。

  1. Unix 認証で、ユーザー名が antonio でパスワードが antonio_password のオペレーティングシステムへのログインが許可されていることを確認します。

  2. /etc/pam.d/mysql-unix という名前の mysql-unix PAM サービスファイルを作成して、従来の Unix パスワードを使用して MySQL 接続を認証するように PAM を設定します。 ファイルの内容はシステムに依存するため、/etc/pam.d ディレクトリ内の既存のログイン関連ファイルをチェックして、それらがどのように表示されるかを確認します。 Linux では、mysql-unix ファイルは次のようになります:

    #%PAM-1.0
    auth            include         password-auth
    account         include         password-auth

    macOS の場合は、password-auth ではなく login を使用します。

    PAM ファイル形式は、一部のシステムで異なる場合があります。 たとえば、Ubuntu およびその他の Debian ベースのシステムでは、かわりに次のファイルコンテンツを使用します:

    @include common-auth
    @include common-account
    @include common-session-noninteractive
  3. オペレーティングシステムユーザー名と同じユーザー名で MySQL アカウントを作成し、PAM プラグインおよび mysql-unix PAM サービスを使用して認証するように定義します:

    CREATE USER 'antonio'@'localhost'
      IDENTIFIED WITH authentication_pam
      AS 'mysql-unix';
    GRANT ALL PRIVILEGES
      ON mydb.*
      TO 'antonio'@'localhost';

    ここで、認証文字列には PAM サービス名 (mysql-unix) のみが含まれており、これによって Unix パスワードが認証されます。

  4. mysql コマンドラインクライアントを使用して、antonio として MySQL サーバーに接続します。 例:

    shell> mysql --user=antonio --password --enable-cleartext-plugin
    Enter password: antonio_password

    サーバーは接続を許可する必要があり、次のクエリーは次のような出力を返します:

    mysql> SELECT USER(), CURRENT_USER(), @@proxy_user;
    +-------------------+-------------------+--------------+
    | USER()            | CURRENT_USER()    | @@proxy_user |
    +-------------------+-------------------+--------------+
    | antonio@localhost | antonio@localhost | NULL         |
    +-------------------+-------------------+--------------+

    これは、antonio MySQL ユーザーに付与された権限を持つように antonio オペレーティングシステムユーザーが認証され、プロキシが発生していないことを示しています。

注記

クライアント側の mysql_clear_password 認証プラグインでは、パスワードはそのまま残されるため、クライアントプログラムはクリアテキストとして MySQL サーバーに送信します。 これにより、パスワードをそのまま PAM に渡すことができます。 サーバー側 PAM ライブラリを使用するにはクリアテキストのパスワードが必要ですが、一部の構成でセキュリティーの問題が発生する可能性があります。 これらのメジャーにより、リスクが最小限に抑えられます:

プロキシユーザーを使用しない PAM LDAP 認証

この認証シナリオでは、PAM を使用して、プロキシを使用せずに、オペレーティングシステムのユーザー名および LDAP パスワードに関して定義された外部ユーザーをチェックします。 MySQL Server への接続を許可されたすべての外部ユーザーには、LDAP を介した PAM 認証を使用するように定義された一致する MySQL アカウントが必要です。

MySQL で PAM LDAP プラガブル認証を使用するには、次の前提条件を満たす必要があります:

  • PAM LDAP サービスが通信するには、LDAP サーバーが使用可能である必要があります。

  • MySQL によって認証される LDAP ユーザーは、LDAP サーバーによって管理されるディレクトリに存在する必要があります。

注記

MySQL ユーザー認証に LDAP を使用する別の方法は、LDAP 固有の認証プラグインを使用することです。 セクション6.4.1.7「LDAP プラガブル認証」を参照してください。

PAM LDAP 認証用の MySQL を次のように構成します:

  1. Unix 認証で、ユーザー名が antonio でパスワードが antonio_password のオペレーティングシステムへのログインが許可されていることを確認します。

  2. /etc/pam.d/mysql-ldap という名前の mysql-ldap PAM サービスファイルを作成して、LDAP を使用して MySQL 接続を認証するように PAM を設定します。 ファイルの内容はシステムに依存するため、/etc/pam.d ディレクトリ内の既存のログイン関連ファイルをチェックして、それらがどのように表示されるかを確認します。 Linux では、mysql-ldap ファイルは次のようになります:

    #%PAM-1.0
    auth        required    pam_ldap.so
    account     required    pam_ldap.so

    PAM オブジェクトファイルのサフィクスがシステム上の .so と異なる場合は、正しいサフィクスに置き換えてください。

    PAM ファイル形式は、一部のシステムで異なる場合があります。

  3. オペレーティングシステムユーザー名と同じユーザー名で MySQL アカウントを作成し、PAM プラグインおよび mysql-ldap PAM サービスを使用して認証するように定義します:

    CREATE USER 'antonio'@'localhost'
      IDENTIFIED WITH authentication_pam
      AS 'mysql-ldap';
    GRANT ALL PRIVILEGES
      ON mydb.*
      TO 'antonio'@'localhost';

    ここで、認証文字列には PAM サービス名 mysql-ldap のみが含まれ、LDAP を使用して認証されます。

  4. サーバーへの接続は、プロキシユーザーを使用しない PAM Unix パスワード認証 で説明されている接続と同じです。

プロキシユーザーとグループマッピングを使用した PAM Unix パスワード認証

ここで説明する認証スキームでは、プロキシと PAM グループのマッピングを使用して、PAM を使用して認証する接続 MySQL ユーザーを、異なる特権セットを定義するほかの MySQL アカウントにマップします。 ユーザーは、権限を定義するアカウントを使用して直接接続しません。 かわりに、PAM を使用して認証されたデフォルトのプロキシアカウントを介して接続し、すべての外部ユーザーが権限を保持する MySQL アカウントにマップされるようにします。 プロキシアカウントを使用して接続するユーザーは、外部ユーザーに許可されるデータベース操作を決定する権限である、これらの MySQL アカウントのいずれかにマップされます。

ここに示す手順では、Unix パスワード認証が使用されます。 代わりに LDAP を使用するには、前半で示したプロキシユーザーを使用しない PAM LDAP 認証の手順を参照してください。

注記

従来の Unix パスワードは、/etc/shadow ファイルを使用してチェックされます。 このファイルに関連して発生する可能性のある問題の詳細は、Unix パスワードストアへの PAM 認証アクセス を参照してください。

  1. Unix 認証で、ユーザー名が antonio でパスワードが antonio_password のオペレーティングシステムへのログインが許可されていることを確認します。

  2. antonioroot または users PAM グループのメンバーであることを確認します。

  3. /etc/pam.d/mysql-unix という名前のファイルを作成して、オペレーティングシステムユーザーを介して mysql-unix PAM サービスを認証するように PAM を設定します。 ファイルの内容はシステムに依存するため、/etc/pam.d ディレクトリ内の既存のログイン関連ファイルをチェックして、それらがどのように表示されるかを確認します。 Linux では、mysql-unix ファイルは次のようになります:

    #%PAM-1.0
    auth            include         password-auth
    account         include         password-auth

    macOS の場合は、password-auth ではなく login を使用します。

    PAM ファイル形式は、一部のシステムで異なる場合があります。 たとえば、Ubuntu およびその他の Debian ベースのシステムでは、かわりに次のファイルコンテンツを使用します:

    @include common-auth
    @include common-account
    @include common-session-noninteractive
  4. 外部 PAM ユーザーをプロキシ設定されたアカウントにマップするデフォルトプロキシユーザー (''@'') を作成します:

    CREATE USER ''@''
      IDENTIFIED WITH authentication_pam
      AS 'mysql-unix, root=developer, users=data_entry';

    ここで、認証文字列には PAM サービス名 (mysql-unix) が含まれており、Unix パスワードを認証します。 また、認証文字列は、root および users PAM グループ内の外部ユーザーを、それぞれ developer および data_entry MySQL ユーザー名にマップします。

    プロキシユーザーを設定するときは、PAM サービス名のあとに PAM グループマッピングリストが必要です。 そうしないと、プラグインは、外部ユーザー名から適切なプロキシ MySQL ユーザー名へのマッピングの実行方法を認識できません。

    注記

    MySQL インストールに匿名ユーザーが含まれている場合、デフォルトのプロキシユーザーと競合する可能性があります。 この問題とその対処方法の詳細は、デフォルトのプロキシユーザーと匿名ユーザーの競合 を参照してください。

  5. プロキシ設定されたアカウントを作成し、各アカウントに次の権限を付与します:

    CREATE USER 'developer'@'localhost'
      IDENTIFIED WITH mysql_no_login;
    CREATE USER 'data_entry'@'localhost'
      IDENTIFIED WITH mysql_no_login;
    
    GRANT ALL PRIVILEGES
      ON mydevdb.*
      TO 'developer'@'localhost';
    GRANT ALL PRIVILEGES
      ON mydb.*
      TO 'data_entry'@'localhost';

    プロキシ設定されたアカウントは、mysql_no_login 認証プラグインを使用して、クライアントがアカウントを使用して MySQL サーバーに直接ログインできないようにします。 代わりに、PAM を使用して認証するユーザーは、PAM グループに基づいてプロキシによって developer または data_entry アカウントを使用することが期待されます。 (これは、プラグインがインストールされていることを前提としています。 手順については、セクション6.4.1.8「ログインなしのプラガブル認証」 を参照してください。) プロキシ設定されたアカウントを直接使用しないように保護する別の方法については、プロキシアカウントへの直接ログインの防止 を参照してください。

  6. プロキシされた各アカウントの PROXY 権限をプロキシアカウントに付与します:

    GRANT PROXY
      ON 'developer'@'localhost'
      TO ''@'';
    GRANT PROXY
      ON 'data_entry'@'localhost'
      TO ''@'';
  7. mysql コマンドラインクライアントを使用して、antonio として MySQL サーバーに接続します。

    shell> mysql --user=antonio --password --enable-cleartext-plugin
    Enter password: antonio_password

    サーバーは、デフォルトの''@''プロキシアカウントを使用して接続を認証します。 結果として生成される antonio の権限は、antonio がメンバーになっている PAM グループによって異なります。 antonioroot PAM グループのメンバーである場合、PAM プラグインは、developer MySQL ユーザー名に root をマップし、その名前をサーバーに返します。 サーバーは、''@''developer に対する PROXY 権限を持っていることを確認し、接続を許可します。 次のクエリーは、次に示すような出力を返します:

    mysql> SELECT USER(), CURRENT_USER(), @@proxy_user;
    +-------------------+---------------------+--------------+
    | USER()            | CURRENT_USER()      | @@proxy_user |
    +-------------------+---------------------+--------------+
    | antonio@localhost | developer@localhost | ''@''        |
    +-------------------+---------------------+--------------+

    これは、antonio オペレーティングシステムユーザーが developer MySQL ユーザーに付与された権限を持つように認証され、プロキシがデフォルトのプロキシアカウントを介して行われることを示しています。

    antonioroot PAM グループのメンバーではなく、users PAM グループのメンバーである場合、同様のプロセスが発生しますが、プラグインは user PAM グループメンバーシップを data_entry MySQL ユーザー名にマップし、その名前をサーバーに返します:

    mysql> SELECT USER(), CURRENT_USER(), @@proxy_user;
    +-------------------+----------------------+--------------+
    | USER()            | CURRENT_USER()       | @@proxy_user |
    +-------------------+----------------------+--------------+
    | antonio@localhost | data_entry@localhost | ''@''        |
    +-------------------+----------------------+--------------+

    これは、antonio オペレーティングシステムユーザーが data_entry MySQL ユーザーの権限を持つように認証され、そのプロキシがデフォルトのプロキシアカウントを介して行われることを示しています。

注記

クライアント側の mysql_clear_password 認証プラグインでは、パスワードはそのまま残されるため、クライアントプログラムはクリアテキストとして MySQL サーバーに送信します。 これにより、パスワードをそのまま PAM に渡すことができます。 サーバー側 PAM ライブラリを使用するにはクリアテキストのパスワードが必要ですが、一部の構成でセキュリティーの問題が発生する可能性があります。 これらのメジャーにより、リスクが最小限に抑えられます:

Unix パスワードストアへの PAM 認証アクセス

一部のシステムでは、Unix 認証は、通常はアクセス権限が制限されているファイルである/etc/shadow などのパスワードストアを使用します。 これにより、MySQL PAM ベースの認証が失敗する可能性があります。 残念ながら、PAM 実装では、「パスワードが一致しません」との「パスワードを確認できませんでした」の区別 (たとえば、/etc/shadow を読み取れないため) は許可されていません。 PAM 認証に Unix パスワードストアを使用している場合は、次のいずれかの方法を使用して MySQL からパスワードストアへのアクセスを有効にできます:

  • MySQL サーバーが mysql オペレーティングシステムアカウントから実行されている場合は、/etc/shadow アクセス権を持つ shadow グループにそのアカウントを配置します:

    1. /etc/groupshadow グループを作成します。

    2. mysql オペレーティングシステムユーザーを/etc/groupshadow グループに追加します。

    3. /etc/groupshadow グループに割り当て、グループの読取り権限を有効にします:

      chgrp shadow /etc/shadow
      chmod g+r /etc/shadow
    4. MySQL Server を再起動します。

  • pam_unix モジュールおよび unix_chkpwd ユーティリティを使用している場合は、次のようにパスワードストアへのアクセスを有効にします:

    chmod u-s /usr/sbin/unix_chkpwd
    setcap cap_dac_read_search+ep /usr/sbin/unix_chkpwd

    プラットフォームに応じて、unix_chkpwd へのパスを調整します。

PAM 認証のデバッグ

PAM 認証プラグインは、初期化時に AUTHENTICATION_PAM_LOG 環境の値が設定されているかどうかをチェックします (値は問題ありません)。 その場合、プラグインを使用すると、標準出力への診断メッセージのロギングが有効になります。 これらのメッセージは、プラグインが認証を実行するときに発生する PAM 関連の問題のデバッグに役立つ場合があります。

一部のメッセージには、PAM プラグインソースファイルと行番号への参照が含まれています。これを使用すると、プラグインアクションをそれが発生するコード内の場所に、より緊密に関連付けることができます。

接続障害をデバッグし、接続試行中に何が起こっているかを判断する別の手法は、PAM 認証を構成してすべての接続を許可し、システムログファイルを確認することです。 この方法は temporary ベースでのみ使用し、本番サーバーでは使用しないでください。

/etc/pam.d/mysql-any-password という PAM サービスファイルを次の内容で構成します (一部のシステムでは形式が異なる場合があります):

#%PAM-1.0
auth        required    pam_permit.so
account     required    pam_permit.so

PAM プラグインを使用するアカウントを作成し、mysql-any-password PAM サービスに名前を付けます:

CREATE USER 'testuser'@'localhost'
  IDENTIFIED WITH authentication_pam
  AS 'mysql-any-password';

mysql-any-password サービスファイルを使用すると、不正なパスワードの場合でも、認証試行で true が返されます。 認証の試行が失敗した場合は、構成の問題が MySQL 側にあることを示します。 それ以外の場合は、オペレーティングシステム/PAM 側で問題が発生します。 何が起こっているかを確認するには、/var/log/secure, /var/log/audit.log, /var/log/syslog/var/log/messages などのシステムログファイルを確認します。

問題点を特定したら、mysql-any-password PAM サービスファイルを削除して any-password アクセスを無効にします。


関連キーワード:  PAM, 認証, ユーザー, パスワード, アカウント, サーバー, 接続, pam, グループ, Unix