文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
Man Pages (TGZ) - 258.2Kb
Man Pages (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  PAM 可插拔驗證

8.4.1.4 PAM 可插拔驗證

注意

PAM 可插拔驗證是 MySQL 企業版(商業產品)中包含的擴充功能。若要進一步了解商業產品,請參閱 https://mysql.dev.org.tw/products/

MySQL 企業版支援一種驗證方法,讓 MySQL 伺服器可以使用 PAM(可插拔驗證模組)來驗證 MySQL 使用者。PAM 讓系統可以使用標準介面來存取各種驗證方法,例如傳統的 Unix 密碼或 LDAP 目錄。

PAM 可插拔驗證提供以下功能

  • 外部驗證:PAM 驗證讓 MySQL 伺服器可以接受來自在 MySQL 授權表之外定義,且使用 PAM 支援的方法驗證的使用者的連線。

  • Proxy 使用者支援:PAM 驗證可以根據外部使用者所屬的 PAM 群組和提供的驗證字串,將不同於用戶端程式傳遞的外部使用者名稱的使用者名稱傳回給 MySQL。這表示外掛程式可以傳回定義外部 PAM 驗證使用者應具有的權限的 MySQL 使用者。例如,名為 joe 的作業系統使用者可以連線,並擁有名為 developer 的 MySQL 使用者的權限。

PAM 可插拔驗證已在 Linux 和 macOS 上測試過;請注意,Windows 不支援 PAM。

下表顯示外掛程式和程式庫檔案名稱。檔案名稱後綴在您的系統上可能有所不同。檔案必須位於 plugin_dir 系統變數所指定的目錄中。如需安裝資訊,請參閱 安裝 PAM 可插拔驗證

表格 8.18 PAM 驗證的外掛程式和程式庫名稱

外掛程式或檔案 外掛程式或檔案名稱
伺服器端外掛程式 authentication_pam
用戶端外掛程式 mysql_clear_password
程式庫檔案 authentication_pam.so

與伺服器端 PAM 外掛程式通訊的用戶端 mysql_clear_password 明文外掛程式,是建置在 libmysqlclient 用戶端程式庫中,並包含在所有散佈版本中,包括社群散佈版本。在所有 MySQL 散佈版本中加入用戶端明文外掛程式,讓來自任何散佈版本的用戶端可以連線至已載入伺服器端 PAM 外掛程式的伺服器。

以下章節提供 PAM 可插拔驗證專屬的安裝和用法資訊

關於 MySQL 中可插入式驗證的一般資訊,請參閱第 8.2.17 節,「可插入式驗證」。關於 mysql_clear_password 外掛程式的資訊,請參閱第 8.4.1.3 節,「客戶端明文可插入式驗證」。關於 Proxy 使用者的資訊,請參閱第 8.2.19 節,「Proxy 使用者」

MySQL 使用者 PAM 驗證的運作方式

本節概述 MySQL 和 PAM 如何協同工作以驗證 MySQL 使用者。有關如何設定 MySQL 帳戶以使用特定 PAM 服務的範例,請參閱使用 PAM 可插入式驗證

  1. 客戶端程式和伺服器進行通訊,客戶端將客戶端使用者名稱(預設為作業系統使用者名稱)和密碼傳送到伺服器

    • 客戶端使用者名稱為外部使用者名稱。

    • 對於使用 PAM 伺服器端驗證外掛程式的帳戶,對應的客戶端外掛程式為 mysql_clear_password。此客戶端外掛程式不執行任何密碼雜湊,因此客戶端會以明文形式將密碼傳送到伺服器。

  2. 伺服器會根據外部使用者名稱和客戶端連線的主機尋找符合的 MySQL 帳戶。PAM 外掛程式會使用 MySQL Server 傳遞給它的資訊(例如使用者名稱、主機名稱、密碼和驗證字串)。當您定義使用 PAM 驗證的 MySQL 帳戶時,驗證字串會包含

    • PAM 服務名稱,系統管理員可以使用此名稱來指稱特定應用程式的驗證方法。單一資料庫伺服器執行個體可能會有多個應用程式與其關聯,因此服務名稱的選擇會留給 SQL 應用程式開發人員。

    • (選擇性)如果要使用 Proxy,則會使用從 PAM 群組到 MySQL 使用者名稱的映射。

  3. 外掛程式會使用驗證字串中命名的 PAM 服務來檢查使用者憑證,並傳回 '驗證成功,使用者名稱為 user_name''驗證失敗'。密碼必須適用於 PAM 服務使用的密碼儲存區。範例

    • 對於傳統的 Unix 密碼,服務會在 /etc/shadow 檔案中查找儲存的密碼。

    • 對於 LDAP,服務會在 LDAP 目錄中查找儲存的密碼。

    如果憑證檢查失敗,伺服器會拒絕連線。

  4. 否則,驗證字串會指出是否發生 Proxy。如果字串不包含 PAM 群組映射,則不會發生 Proxy。在此情況下,MySQL 使用者名稱與外部使用者名稱相同。

  5. 否則,會根據 PAM 群組映射來指出 Proxy,並根據映射清單中第一個相符的群組來判斷 MySQL 使用者名稱。「PAM 群組」的意義取決於 PAM 服務。範例

    • 對於傳統的 Unix 密碼,群組是在 /etc/group 檔案中定義的 Unix 群組,可能會在 /etc/security/group.conf 等檔案中新增額外的 PAM 資訊。

    • 對於 LDAP,群組是在 LDAP 目錄中定義的 LDAP 群組。

    如果 Proxy 使用者(外部使用者)具有被 Proxy 的 MySQL 使用者名稱的 PROXY 權限,則會發生 Proxy,Proxy 使用者會取得被 Proxy 使用者的權限。

安裝 PAM 可插入式驗證

本節說明如何安裝伺服器端 PAM 驗證外掛程式。有關安裝外掛程式的一般資訊,請參閱第 7.6.1 節,「安裝和解除安裝外掛程式」

為了讓伺服器可使用此外掛程式,外掛程式程式庫檔案必須位於 MySQL 外掛程式目錄中(由 plugin_dir 系統變數命名的目錄)。如有必要,請在伺服器啟動時設定 plugin_dir 的值來配置外掛程式目錄位置。

外掛程式程式庫檔案的基礎名稱為 authentication_pam,通常使用 .so 後綴進行編譯。

若要在伺服器啟動時載入此外掛程式,請使用 --plugin-load-add 選項來命名包含此外掛程式的程式庫檔案。使用此外掛程式載入方法,每次伺服器啟動時都必須提供此選項。例如,將以下幾行放在伺服器 my.cnf 檔案中

[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

若要驗證外掛程式安裝,請檢查資訊結構描述 PLUGINS 資料表,或使用 SHOW PLUGINS 陳述式(請參閱第 7.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 驗證的運作方式)。以下討論中的範例使用服務名稱 mysql-unix 進行使用傳統 Unix 密碼的驗證,並使用 mysql-ldap 進行使用 LDAP 的驗證。

  • 針對 Proxy 支援,PAM 提供一種方式,讓 PAM 模組將除了客戶端程式連線到伺服器時傳遞的外部使用者名稱之外的 MySQL 使用者名稱傳回給伺服器。使用驗證字串來控制從外部使用者名稱到 MySQL 使用者名稱的映射。如果您想利用 Proxy 使用者功能,則驗證字串必須包含這種類型的映射。

例如,如果帳戶使用 mysql-unix PAM 服務名稱,並應將 rootusers PAM 群組中的作業系統使用者分別映射到 developerdata_entry MySQL 使用者,請使用類似以下的陳述式

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

PAM 驗證外掛程式的驗證字串語法遵循以下規則

  • 字串由 PAM 服務名稱組成,選擇性地後面接著一個 PAM 群組映射清單,該清單由一個或多個關鍵字/值對組成,每個關鍵字/值對指定一個 PAM 群組名稱和一個 MySQL 使用者名稱

    pam_service_name[,pam_group_name=mysql_user_name]...

    外掛程式會剖析每次使用該帳戶連線嘗試的驗證字串。為了盡量減少額外負荷,請盡可能縮短字串。

  • 每個 pam_group_name=mysql_user_name 對前面都必須加上一個逗號。

  • 會忽略雙引號外的前導和尾隨空格。

  • 未加引號的 pam_service_namepam_group_namemysql_user_name 值可以包含任何內容,但等號、逗號或空格除外。

  • 如果使用雙引號引述 pam_service_namepam_group_namemysql_user_name 值,則引號之間的所有內容都是該值的一部分。例如,如果該值包含空格字元,則此為必要。所有字元都合法,但雙引號和反斜線 (\) 除外。若要包含任一字元,請使用反斜線跳脫它。

如果外掛程式成功驗證了外部使用者名稱(客戶端傳遞的名稱),則它會在驗證字串中尋找 PAM 群組映射清單,如果存在,則根據外部使用者所屬的 PAM 群組將不同的 MySQL 使用者名稱傳回給 MySQL 伺服器

  • 如果驗證字串不包含 PAM 群組映射清單,則外掛程式會傳回外部名稱。

  • 如果身份驗證字串包含 PAM 群組對應清單,則外掛程式會從左到右檢查清單中的每個 pam_group_name=mysql_user_name 配對,並嘗試在已驗證使用者的非 MySQL 目錄群組中找到 pam_group_name 值的相符項,並針對找到的第一個相符項傳回 mysql_user_name。如果外掛程式找不到任何 PAM 群組的相符項,則會傳回外部名稱。如果外掛程式無法在目錄中查找群組,則會忽略 PAM 群組對應清單並傳回外部名稱。

以下章節說明如何設定數個使用 PAM 身份驗證外掛程式的身份驗證情境

  • 無代理使用者。這僅使用 PAM 來檢查登入名稱和密碼。每個允許連線到 MySQL 伺服器的外部使用者都應具有一個相符的 MySQL 帳戶,該帳戶定義為使用 PAM 身份驗證。(對於要與外部使用者相符的 'user_name'@'host_name' 的 MySQL 帳戶,user_name 必須是外部使用者名稱,而 host_name 必須符合用戶端連線的主機。)可以使用各種 PAM 支援的方法執行身份驗證。稍後的討論將說明如何使用傳統的 Unix 密碼和 LDAP 中的密碼來驗證用戶端憑證。

    當不透過代理使用者或 PAM 群組完成時,PAM 身份驗證要求 MySQL 使用者名稱與作業系統使用者名稱相同。MySQL 使用者名稱限制為 32 個字元(請參閱第 8.2.3 節,「授權表格」),這將 PAM 非代理身份驗證限制為名稱最多 32 個字元的 Unix 帳戶。

  • 僅限代理使用者,具有 PAM 群組對應。對於這種情境,請建立一個或多個定義不同權限集的 MySQL 帳戶。(理想情況下,不應有人直接使用這些帳戶連線。)然後定義一個透過 PAM 進行驗證的預設使用者,該使用者使用某些對應方案(通常基於使用者所屬的外部 PAM 群組)將所有外部使用者名稱對應到少數幾個持有權限集的 MySQL 帳戶。任何連線並將外部使用者名稱指定為用戶端使用者名稱的用戶端都會對應到其中一個 MySQL 帳戶,並使用其權限。討論說明如何使用傳統的 Unix 密碼進行設定,但也可以改用其他 PAM 方法,例如 LDAP。

這些情境的變體是可能的

  • 您可以允許某些使用者直接登入(不使用代理),但要求其他使用者透過代理帳戶連線。

  • 您可以在 PAM 驗證帳戶之間使用不同的 PAM 服務名稱,來對某些使用者使用一種 PAM 驗證方法,而對其他使用者使用另一種方法。例如,您可以對某些使用者使用 mysql-unix PAM 服務,而對其他使用者使用 mysql-ldap

這些範例基於以下假設。如果您的系統設定不同,您可能需要進行一些調整。

  • 登入名稱和密碼分別是 antonioantonio_password。將這些變更為對應於您要驗證的使用者。

  • PAM 設定目錄是 /etc/pam.d

  • PAM 服務名稱對應於身份驗證方法(在本討論中為 mysql-unixmysql-ldap)。若要使用給定的 PAM 服務,您必須在 PAM 設定目錄中設定具有相同名稱的 PAM 檔案(如果檔案不存在,則建立該檔案)。此外,您必須在任何使用該 PAM 服務進行驗證的帳戶的CREATE USER 陳述式的驗證字串中命名 PAM 服務。

PAM 身份驗證外掛程式會在初始化時檢查伺服器啟動環境中是否設定了 AUTHENTICATION_PAM_LOG 環境值。如果已設定,則外掛程式會啟用診斷訊息記錄到標準輸出。根據伺服器的啟動方式,訊息可能會顯示在主控台上或錯誤日誌中。當外掛程式執行身份驗證時,這些訊息對於偵錯 PAM 相關問題很有幫助。如需更多資訊,請參閱PAM 身份驗證偵錯

無代理使用者的 PAM Unix 密碼身份驗證

這種身份驗證情境使用 PAM 來檢查根據作業系統使用者名稱和 Unix 密碼定義的外部使用者,而不使用代理。每個允許連線到 MySQL 伺服器的外部使用者都應該具有一個相符的 MySQL 帳戶,該帳戶定義為透過傳統 Unix 密碼儲存來使用 PAM 身份驗證。

注意

傳統的 Unix 密碼會使用 /etc/shadow 檔案進行檢查。如需有關此檔案可能存在的相關問題的資訊,請參閱PAM 身份驗證存取 Unix 密碼儲存

  1. 確認 Unix 身份驗證允許使用使用者名稱 antonio 和密碼 antonio_password 登入作業系統。

  2. 透過建立名為 /etc/pam.d/mysql-unixmysql-unix PAM 服務檔案,設定 PAM 使用傳統的 Unix 密碼來驗證 MySQL 連線。檔案內容取決於系統,因此請檢查 /etc/pam.d 目錄中現有的登入相關檔案,以了解它們的外觀。在 Linux 上,mysql-unix 檔案可能看起來像這樣

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

    對於 macOS,請使用 login 而不是 password-auth

    在某些系統上,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 伺服器。例如

    $> 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 作業系統使用者已通過驗證,可以擁有授予 antonio MySQL 使用者的權限,並且沒有發生任何代理。

注意

用戶端 mysql_clear_password 身份驗證外掛程式會保持密碼不變,因此用戶端程式會將其以明文形式傳送至 MySQL 伺服器。這會使密碼能夠原封不動地傳遞到 PAM。必須使用明文密碼才能使用伺服器端 PAM 程式庫,但在某些設定中可能會構成安全問題。這些措施將風險降至最低

無代理使用者的 PAM LDAP 身份驗證

這種身份驗證情境使用 PAM 來檢查根據作業系統使用者名稱和 LDAP 密碼定義的外部使用者,而不使用代理。每個允許連線到 MySQL 伺服器的外部使用者都應具有一個相符的 MySQL 帳戶,該帳戶定義為透過 LDAP 使用 PAM 身份驗證。

若要將 PAM LDAP 可插入式身份驗證用於 MySQL,必須滿足以下先決條件

  • PAM LDAP 服務必須有可通訊的 LDAP 伺服器。

  • 要由 MySQL 驗證的每個 LDAP 使用者都必須存在於 LDAP 伺服器管理的目錄中。

注意

另一種使用 LDAP 進行 MySQL 使用者身份驗證的方法是使用 LDAP 特定的身份驗證外掛程式。請參閱第 8.4.1.6 節,「LDAP 可插入式身份驗證」

按如下所示設定 MySQL 的 PAM LDAP 身份驗證

  1. 確認 Unix 身份驗證允許使用使用者名稱 antonio 和密碼 antonio_password 登入作業系統。

  2. 透過建立名為 /etc/pam.d/mysql-ldapmysql-ldap PAM 服務檔案,設定 PAM 使用 LDAP 來驗證 MySQL 連線。檔案內容取決於系統,因此請檢查 /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 檔案進行檢查。如需有關此檔案可能存在的相關問題的資訊,請參閱PAM 身份驗證存取 Unix 密碼儲存

  1. 確認 Unix 身份驗證允許使用使用者名稱 antonio 和密碼 antonio_password 登入作業系統。

  2. 確認 antoniorootusers PAM 群組的成員。

  3. 透過建立名為 /etc/pam.d/mysql-unix 的檔案,設定 PAM 透過作業系統使用者來驗證 mysql-unix PAM 服務。檔案內容取決於系統,因此請檢查 /etc/pam.d 目錄中現有的登入相關檔案,以了解它們的外觀。在 Linux 上,mysql-unix 檔案可能看起來像這樣

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

    對於 macOS,請使用 login 而不是 password-auth

    在某些系統上,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 密碼。身份驗證字串也會將 rootusers PAM 群組中的外部使用者,分別對應到 developerdata_entry MySQL 使用者名稱。

    當您設定 Proxy 使用者時,PAM 服務名稱之後的 PAM 群組對應清單是必要的。否則,外掛程式無法判斷如何將外部使用者名稱對應到適當的 Proxy MySQL 使用者名稱。

    注意

    如果您的 MySQL 安裝有匿名使用者,它們可能會與預設的 Proxy 使用者衝突。關於此問題以及處理方式的更多資訊,請參閱預設 Proxy 使用者和匿名使用者衝突

  5. 建立 Proxy 帳戶,並授與每個帳戶應有的權限。

    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';

    Proxy 帳戶使用 mysql_no_login 身份驗證外掛程式,以防止用戶端使用這些帳戶直接登入 MySQL 伺服器。相反地,透過 PAM 驗證的使用者,預期會根據其 PAM 群組,以 Proxy 方式使用 developerdata_entry 帳戶。(這假設外掛程式已安裝。如需指示,請參閱第 8.4.1.8 節,「禁止登入的可插拔身份驗證」。)如需保護 Proxy 帳戶免於直接使用的替代方法,請參閱防止直接登入 Proxy 帳戶

  6. 授與 Proxy 帳戶針對每個 Proxy 帳戶的PROXY權限。

    GRANT PROXY
      ON 'developer'@'localhost'
      TO ''@'';
    GRANT PROXY
      ON 'data_entry'@'localhost'
      TO ''@'';
  7. 使用 mysql 命令列用戶端以 antonio 的身分連接到 MySQL 伺服器。

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

    伺服器使用預設的 ''@'' Proxy 帳戶驗證連線。antonio 的結果權限取決於 antonio 是哪個 PAM 群組的成員。如果 antonioroot PAM 群組的成員,則 PAM 外掛程式會將 root 對應到 developer MySQL 使用者名稱,並將該名稱返回給伺服器。伺服器會驗證 ''@'' 是否擁有 developerPROXY 權限,並允許連線。以下查詢會返回如下所示的輸出:

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

    這表明 antonio 作業系統使用者已通過驗證,擁有授予 developer MySQL 使用者的權限,且 Proxy 是透過預設的 Proxy 帳戶進行的。

    如果 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 使用者的權限,且 Proxy 是透過預設的 Proxy 帳戶進行的。

注意

用戶端 mysql_clear_password 身份驗證外掛程式會保持密碼不變,因此用戶端程式會將其以明文形式傳送至 MySQL 伺服器。這會使密碼能夠原封不動地傳遞到 PAM。必須使用明文密碼才能使用伺服器端 PAM 程式庫,但在某些設定中可能會構成安全問題。這些措施將風險降至最低

PAM 驗證存取 Unix 密碼儲存區

在某些系統上,Unix 驗證使用密碼儲存區,例如 /etc/shadow,這是一個通常具有受限存取權限的檔案。這可能會導致 MySQL 基於 PAM 的驗證失敗。不幸的是,PAM 實作不允許區分「無法檢查密碼」(例如,由於無法讀取 /etc/shadow)與「密碼不符」。如果您使用 Unix 密碼儲存區進行 PAM 驗證,您可以使用以下方法之一,從 MySQL 啟用對其的存取權限:

  • 假設 MySQL 伺服器是從 mysql 作業系統帳戶執行的,請將該帳戶放入具有 /etc/shadow 存取權限的 shadow 群組中。

    1. /etc/group 中建立 shadow 群組。

    2. mysql 作業系統使用者新增至 /etc/group 中的 shadow 群組。

    3. /etc/group 指定給 shadow 群組,並啟用群組讀取權限。

      chgrp shadow /etc/shadow
      chmod g+r /etc/shadow
    4. 重新啟動 MySQL 伺服器。

  • 如果您正在使用 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 相關問題有所幫助。

設定 AUTHENTICATION_PAM_LOG=1(或其他任意值)不會包含任何密碼。如果您希望在這些訊息中包含密碼,請設定 AUTHENTICATION_PAM_LOG=PAM_LOG_WITH_SECRET_INFO

某些訊息包含對 PAM 外掛程式原始檔和行號的引用,這使得外掛程式動作能夠更緊密地與它們在程式碼中發生的位置關聯起來。

偵錯連線失敗並判斷連線嘗試期間發生情況的另一種技術是將 PAM 驗證設定為允許所有連線,然後檢查系統記錄檔。此技術應僅暫時使用,而不是在生產伺服器上使用。

使用以下內容設定名為 /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 服務檔案,以停用任何密碼存取。