文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美國信紙尺寸) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  PAM 可插拔身份驗證

8.4.1.5 PAM 可插拔身份驗證

注意

PAM 可插拔身份驗證是 MySQL 企業版中包含的擴充功能,這是一項商業產品。若要深入瞭解商業產品,請參閱 https://mysql.dev.org.tw/products/

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

PAM 可插拔身份驗證提供下列功能

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

  • 代理使用者支援:PAM 身份驗證可以根據外部使用者所屬的 PAM 群組和提供的身份驗證字串,向 MySQL 傳回與用戶端程式傳遞的外部使用者名稱不同的使用者名稱。這表示外掛程式可以傳回定義外部 PAM 驗證使用者應具有的權限的 MySQL 使用者。例如,名為 joe 的作業系統使用者可以連線,並具有名為 開發人員的 MySQL 使用者的權限。

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

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

表格 8.19 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.4 節,「用戶端純文字可插拔身份驗證」。如需代理使用者資訊,請參閱 第 8.2.19 節,「代理使用者」

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

若要驗證外掛程式安裝,請檢查 Information Schema 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 使用者名稱傳回至 MySQL 伺服器

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

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

以下各節說明如何設定數個使用 PAM 驗證外掛程式的驗證案例

  • 沒有 Proxy 使用者。這僅使用 PAM 來檢查登入名稱和密碼。每個獲准連線至 MySQL Server 的外部使用者都應具有符合的 MySQL 帳戶,該帳戶定義為使用 PAM 驗證。(對於 'user_name'@'host_name' 的 MySQL 帳戶,以符合外部使用者,user_name 必須是外部使用者名稱,且 host_name 必須符合用戶端連線的主機。)可以使用各種 PAM 支援的方法執行驗證。稍後的討論將說明如何使用傳統 Unix 密碼和 LDAP 中的密碼來驗證用戶端憑證。

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

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

這些情境可能會有變化。

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

  • 您可以在不同的 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 驗證偵錯

不使用 Proxy 使用者的 PAM Unix 密碼驗證

此驗證情境使用 PAM 檢查以作業系統使用者名稱和 Unix 密碼定義的外部使用者,而不使用 Proxy。每個允許連線到 MySQL Server 的外部使用者都應具有一個相符的 MySQL 帳號,該帳號已定義為透過傳統 Unix 密碼儲存使用 PAM 驗證。

注意

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

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

  2. 設定 PAM 以透過建立名為 /etc/pam.d/mysql-unixmysql-unix 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 使用者的權限,且未發生 Proxy 作業。

注意

客戶端 mysql_clear_password 驗證外掛程式會保留密碼不變,因此客戶端程式會以明文形式將其傳送至 MySQL 伺服器。這使得密碼可以原樣傳遞給 PAM。使用伺服器端 PAM 程式庫必須使用明文密碼,但在某些設定中,這可能是安全性問題。以下措施可將風險降到最低

不使用 Proxy 使用者的 PAM LDAP 驗證

此驗證情境使用 PAM 檢查以作業系統使用者名稱和 LDAP 密碼定義的外部使用者,而不使用 Proxy。每個允許連線到 MySQL Server 的外部使用者都應具有一個相符的 MySQL 帳號,該帳號已定義為透過 LDAP 使用 PAM 驗證。

若要針對 MySQL 使用 PAM LDAP 可插入式驗證,必須滿足以下先決條件

  • 必須有 LDAP 伺服器可用於 PAM LDAP 服務進行通訊。

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

注意

使用 LDAP 進行 MySQL 使用者驗證的另一種方式是使用 LDAP 專用的驗證外掛程式。請參閱 第 8.4.1.7 節,「LDAP 可插入式驗證」

設定 MySQL 以進行 PAM LDAP 驗證,如下所示

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

  2. 設定 PAM 以透過建立名為 /etc/pam.d/mysql-ldapmysql-ldap 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. 連線至伺服器的操作與 不使用 Proxy 使用者的 PAM Unix 密碼驗證中所述相同。

使用 Proxy 使用者和群組對應的 PAM Unix 密碼驗證

此處描述的驗證機制使用 Proxy 和 PAM 群組對應,將使用 PAM 驗證連線的 MySQL 使用者對應到其他定義不同權限組合的 MySQL 帳號。使用者不會直接透過定義權限的帳號進行連線。相反地,他們會透過使用 PAM 驗證的預設 Proxy 帳號進行連線,這樣所有外部使用者都會對應到擁有權限的 MySQL 帳號。任何使用 Proxy 帳號連線的使用者都會對應到其中一個 MySQL 帳號,其權限決定了外部使用者允許的資料庫操作。

此處顯示的程序使用 Unix 密碼驗證。若要改用 LDAP,請參閱 不使用 Proxy 使用者的 PAM LDAP 驗證的早期步驟。

注意

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

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

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

  3. 設定 PAM 以透過建立名為 /etc/pam.d/mysql-unix 的檔案,透過作業系統使用者驗證 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 使用者對應到 Proxy 帳號的預設 Proxy 使用者 (''@'')

    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.9 節,「無登入可插入式驗證」。) 如需保護 Proxy 帳號免於直接使用的其他方法,請參閱 防止直接登入 Proxy 帳號

  6. 授予每個被代理帳戶的代理帳戶 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

    伺服器使用預設的 ''@'' 代理帳戶驗證連線。 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 使用者的權限,並且代理是透過預設代理帳戶進行。

    如果 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 程式庫必須使用明文密碼,但在某些設定中,這可能是安全性問題。以下措施可將風險降到最低

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 外掛程式並將 PAM 服務命名為 mysql-any-password 的帳戶

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 服務檔案,以停用任何密碼存取。