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 プラガブル認証の使用 を参照してください。
-
クライアントプログラムとサーバーは通信し、クライアントはサーバーにクライアントユーザー名 (デフォルトではオペレーティングシステムのユーザー名) とパスワードを送信します:
クライアントユーザー名は外部ユーザー名です。
PAM サーバー側認証プラグインを使用するアカウントの場合、対応するクライアント側プラグインは
mysql_clear_password
です。 このクライアント側プラグインはパスワードハッシュを実行せず、その結果、クライアントはパスワードをクリアテキストとしてサーバーに送信します。
-
サーバーは、外部ユーザー名とクライアントの接続元のホストに基づいて、一致する MySQL アカウントを検索します。 PAM プラグインは、MySQL Server によって渡された情報 (ユーザー名、ホスト名、パスワード、認証文字列など) を使用します。 PAM を使用して認証する MySQL アカウントを定義する場合、認証文字列には次のものが含まれます:
PAM サービス名。システム管理者が特定のアプリケーションの認証方式を参照するために使用できる名前です。 単一のデータベースサーバーインスタンスに複数のアプリケーションを関連付けることができるため、サービス名の選択は SQL アプリケーション開発者に任されます。
オプションで、プロキシを使用する場合は、PAM グループから MySQL ユーザー名へのマッピング。
-
プラグインは、認証文字列で指定された PAM サービスを使用してユーザー資格証明を確認し、
'Authentication succeeded, Username is
またはuser_name
''Authentication failed'
を返します。 パスワードは、PAM サービスで使用されるパスワードストアに適している必要があります。 例:従来の Unix パスワードの場合、サービスは
/etc/shadow
ファイルに格納されているパスワードを検索します。LDAP の場合、サービスは LDAP ディレクトリに格納されているパスワードを検索します。
資格証明チェックが失敗すると、サーバーは接続を拒否します。
それ以外の場合、認証文字列はプロキシが発生するかどうかを示します。 文字列に PAM グループマッピングが含まれていない場合、プロキシは発生しません。 この場合、MySQL ユーザー名は外部ユーザー名と同じです。
-
それ以外の場合、プロキシは PAM グループマッピングに基づいて示され、MySQL ユーザー名はマッピングリスト内の最初に一致するグループに基づいて決定されます。 「「PAM グループ」」の意味は PAM サービスによって異なります。 例:
従来の Unix パスワードの場合、グループは
/etc/group
ファイルで定義された Unix グループで、/etc/security/group.conf
などのファイル内の追加 PAM 情報を補足する可能性があります。LDAP の場合、グループは LDAP ディレクトリで定義された LDAP グループです。
プロキシユーザー (外部ユーザー) がプロキシ設定された MySQL ユーザー名に対する
PROXY
権限を持っている場合、プロキシ設定は、プロキシ設定されたユーザーがプロキシ設定されたユーザーの権限を引き受けた状態で行われます。
このセクションでは、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 認証プラグインのアンインストールに使用される方法は、インストール方法によって異なります:
--plugin-load-add
オプションを使用してサーバーの起動時にプラグインをインストールした場合は、オプションなしでサーバーを再起動します。-
INSTALL PLUGIN
ステートメントを使用して実行時にプラグインをインストールした場合、サーバーの再起動後もインストールされたままになります。 アンインストールするには、UNINSTALL PLUGIN
を使用します:UNINSTALL PLUGIN authentication_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_name
、pam_group_name
およびmysql_user_name
の値には、等号、カンマまたは空白以外の任意の値を含めることができます。pam_service_name
、pam_group_name
またはmysql_user_name
の値が二重引用符で囲まれている場合、引用符の間のすべてが値の一部になります。 たとえば、値に空白文字が含まれている場合は、これが必要です。 二重引用符およびバックスラッシュ (\
) を除くすべての文字は有効です。 どちらかの文字を含めるには、バックスラッシュを使用してエスケープします。
プラグインが外部ユーザー名 (クライアントから渡された名前) を正常に認証すると、認証文字列内で PAM グループマッピングリストが検索され、存在する場合は、それを使用して、外部ユーザーがメンバーになっている PAM グループに基づいて別の MySQL ユーザー名が MySQL サーバーに返されます:
認証文字列に PAM グループマッピングリストが含まれていない場合、プラグインは外部名を返します。
認証文字列に PAM グループマッピングリストが含まれている場合、プラグインはリスト内の各
ペアを左から右に検査し、認証されたユーザーに割り当てられたグループの non-MySQL ディレクトリ内でpam_group_name
=mysql_user_name
pam_group_name
値の一致を見つけようとし、見つかった最初の一致についてmysql_user_name
を返します。 どの PAM グループにも一致するものが見つからない場合、プラグインは外部名を返します。 プラグインは、ディレクトリ内のグループを検索できない場合、PAM グループマッピングリストを無視して外部名を返します。
次のセクションでは、PAM 認証プラグインを使用するいくつかの認証シナリオを設定する方法について説明します。
-
プロキシユーザーなし。 ここでは、ログイン名とパスワードをチェックする際にのみ PAM が使用されます。 MySQL Server への接続を許可されたすべての外部ユーザーには、PAM 認証を使用するように定義された一致する MySQL アカウントが必要です。 (
'
の MySQL アカウントが外部ユーザーと一致するには、user_name
'@'host_name
'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
を使用できます。
この例は、次のことが前提となっています。 システムが異なる方法で設定されている場合は、多少の調整が必要になることもあります。
ログイン名とパスワードは、それぞれ
antonio
とantonio_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 パスワードに関して定義された外部ユーザーをチェックします。 MySQL Server への接続を許可されたすべての外部ユーザーには、従来の Unix パスワードストアを介した PAM 認証を使用するように定義された、一致する MySQL アカウントが必要です。
従来の Unix パスワードは、/etc/shadow
ファイルを使用してチェックされます。 このファイルに関連して発生する可能性のある問題の詳細は、Unix パスワードストアへの PAM 認証アクセス を参照してください。
Unix 認証で、ユーザー名が
antonio
でパスワードがantonio_password
のオペレーティングシステムへのログインが許可されていることを確認します。-
/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
-
オペレーティングシステムユーザー名と同じユーザー名で 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 パスワードが認証されます。 -
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 ライブラリを使用するにはクリアテキストのパスワードが必要ですが、一部の構成でセキュリティーの問題が発生する可能性があります。 これらのメジャーにより、リスクが最小限に抑えられます:
mysql_clear_password
プラグインを誤って使用する可能性を低くするには、MySQL クライアントで明示的に有効にする必要があります (たとえば、--enable-cleartext-plugin
オプションを使用)。 セクション6.4.1.4「クライアント側クリアテキストプラガブル認証」を参照してください。mysql_clear_password
プラグインを有効にしてパスワードの公開を回避するには、MySQL クライアントは暗号化された接続を使用して MySQL サーバーに接続する必要があります。 セクション6.3.1「暗号化接続を使用するための MySQL の構成」を参照してください。
この認証シナリオでは、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 を次のように構成します:
Unix 認証で、ユーザー名が
antonio
でパスワードがantonio_password
のオペレーティングシステムへのログインが許可されていることを確認します。-
/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 ファイル形式は、一部のシステムで異なる場合があります。
-
オペレーティングシステムユーザー名と同じユーザー名で 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 を使用して認証されます。 サーバーへの接続は、プロキシユーザーを使用しない PAM Unix パスワード認証 で説明されている接続と同じです。
ここで説明する認証スキームでは、プロキシと PAM グループのマッピングを使用して、PAM を使用して認証する接続 MySQL ユーザーを、異なる特権セットを定義するほかの MySQL アカウントにマップします。 ユーザーは、権限を定義するアカウントを使用して直接接続しません。 かわりに、PAM を使用して認証されたデフォルトのプロキシアカウントを介して接続し、すべての外部ユーザーが権限を保持する MySQL アカウントにマップされるようにします。 プロキシアカウントを使用して接続するユーザーは、外部ユーザーに許可されるデータベース操作を決定する権限である、これらの MySQL アカウントのいずれかにマップされます。
ここに示す手順では、Unix パスワード認証が使用されます。 代わりに LDAP を使用するには、前半で示したプロキシユーザーを使用しない PAM LDAP 認証の手順を参照してください。
従来の Unix パスワードは、/etc/shadow
ファイルを使用してチェックされます。 このファイルに関連して発生する可能性のある問題の詳細は、Unix パスワードストアへの PAM 認証アクセス を参照してください。
Unix 認証で、ユーザー名が
antonio
でパスワードがantonio_password
のオペレーティングシステムへのログインが許可されていることを確認します。antonio
がroot
またはusers
PAM グループのメンバーであることを確認します。-
/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
-
外部 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 インストールに匿名ユーザーが含まれている場合、デフォルトのプロキシユーザーと競合する可能性があります。 この問題とその対処方法の詳細は、デフォルトのプロキシユーザーと匿名ユーザーの競合 を参照してください。
-
プロキシ設定されたアカウントを作成し、各アカウントに次の権限を付与します:
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「ログインなしのプラガブル認証」 を参照してください。) プロキシ設定されたアカウントを直接使用しないように保護する別の方法については、プロキシアカウントへの直接ログインの防止 を参照してください。 -
プロキシされた各アカウントの
PROXY
権限をプロキシアカウントに付与します:GRANT PROXY ON 'developer'@'localhost' TO ''@''; GRANT PROXY ON 'data_entry'@'localhost' TO ''@'';
-
mysql コマンドラインクライアントを使用して、
antonio
として MySQL サーバーに接続します。shell> mysql --user=antonio --password --enable-cleartext-plugin Enter password: antonio_password
サーバーは、デフォルトの
''@''
プロキシアカウントを使用して接続を認証します。 結果として生成されるantonio
の権限は、antonio
がメンバーになっている PAM グループによって異なります。antonio
がroot
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 ユーザーに付与された権限を持つように認証され、プロキシがデフォルトのプロキシアカウントを介して行われることを示しています。antonio
がroot
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 ライブラリを使用するにはクリアテキストのパスワードが必要ですが、一部の構成でセキュリティーの問題が発生する可能性があります。 これらのメジャーにより、リスクが最小限に抑えられます:
mysql_clear_password
プラグインを誤って使用する可能性を低くするには、MySQL クライアントで明示的に有効にする必要があります (たとえば、--enable-cleartext-plugin
オプションを使用)。 セクション6.4.1.4「クライアント側クリアテキストプラガブル認証」を参照してください。mysql_clear_password
プラグインを有効にしてパスワードの公開を回避するには、MySQL クライアントは暗号化された接続を使用して MySQL サーバーに接続する必要があります。 セクション6.3.1「暗号化接続を使用するための MySQL の構成」を参照してください。
一部のシステムでは、Unix 認証は、通常はアクセス権限が制限されているファイルである/etc/shadow
などのパスワードストアを使用します。 これにより、MySQL PAM ベースの認証が失敗する可能性があります。 残念ながら、PAM 実装では、「「パスワードが一致しません」」との「「パスワードを確認できませんでした」」の区別 (たとえば、/etc/shadow
を読み取れないため) は許可されていません。 PAM 認証に Unix パスワードストアを使用している場合は、次のいずれかの方法を使用して MySQL からパスワードストアへのアクセスを有効にできます:
-
MySQL サーバーが
mysql
オペレーティングシステムアカウントから実行されている場合は、/etc/shadow
アクセス権を持つshadow
グループにそのアカウントを配置します:/etc/group
でshadow
グループを作成します。mysql
オペレーティングシステムユーザーを/etc/group
のshadow
グループに追加します。-
/etc/group
をshadow
グループに割り当て、グループの読取り権限を有効にします:chgrp shadow /etc/shadow chmod g+r /etc/shadow
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 認証プラグインは、初期化時に 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 アクセスを無効にします。