當指定listep時pam_access.so不工作

當指定listep時pam_access.so不工作

我在配置 PAM 時遇到了一個奇怪的問題,試圖透過 pam_access.so 套件限制 ssh 登入libpam-modules_1.1.8-3.6ubuntu2.18.04.1.

的內容/etc/security/access.conf

+ : root : ALL
+ : devops : ALL
#+ : computer managers : ALL
- : ALL : ALL

的內容/etc/pam.d/sshd

account required pam_access.so listsep=, debug

透過此設置,每個用戶都可以登錄,無論他們是否屬於任何指定的群組。如果我listsep=,從 PAM 配置中刪除,那麼它就會按預期工作。

從偵錯日誌看來,無論何時listsep指定,當它在 access.conf 中找不到用戶群組時,它都不會返回任何錯誤,AKA pam_access.so 將始終返回成功的 listep。

在下面的上下文中,使用者是「電腦管理員」的成員,但不是「devops」的成員

啟用了listep且僅在access.conf中進行devops的調試日誌

pam_access(sshd:account): line 1: +  :  root  :  ALL
pam_access(sshd:account): list_match: list= root , item=user
pam_access(sshd:account): user_match: tok= root , item=user
pam_access(sshd:account): string_match: tok= root , item=user
pam_access(sshd:account): user_match=0, "user"
pam_access(sshd:account): line 2: +  :  devops  :  ALL
pam_access(sshd:account): list_match: list= devops , item=user
pam_access(sshd:account): user_match: tok= devops , item=user
pam_access(sshd:account): string_match: tok= devops , item=user
pam_access(sshd:account): user_match=0, "user"
pam_access(sshd:account): line 4: -  :  ALL  :  ALL
pam_access(sshd:account): list_match: list= ALL , item=user
pam_access(sshd:account): user_match: tok= ALL , item=user
pam_access(sshd:account): string_match: tok= ALL , item=user
pam_access(sshd:account): user_match=0, "user"
Accepted password for user from IP port PORT ssh2

請參閱 pam_access 日誌的最後一行user_match=0。讓我們將它與未指定listep時的日誌進行比較

pam_access(sshd:account): line 1: +  :  root  :  ALL
pam_access(sshd:account): list_match: list= root , item=user
pam_access(sshd:account): user_match: tok=root, item=user
pam_access(sshd:account): string_match: tok=root, item=user
pam_access(sshd:account): user_match=0, "user"
pam_access(sshd:account): line 2: +  :  devops  :  ALL
pam_access(sshd:account): list_match: list= devops , item=user
pam_access(sshd:account): user_match: tok=devops, item=user
pam_access(sshd:account): string_match: tok=devops, item=user
pam_access(sshd:account): user_match=0, "user"
pam_access(sshd:account): line 4: -  :  ALL  :  ALL
pam_access(sshd:account): list_match: list= ALL , item=user
pam_access(sshd:account): user_match: tok=ALL, item=user
pam_access(sshd:account): string_match: tok=ALL, item=user
pam_access(sshd:account): user_match=2, "user"
pam_access(sshd:account): list_match: list= ALL, item=user
pam_access(sshd:account): from_match: tok=ALL, item=IP
pam_access(sshd:account): string_match: tok=ALL, item=IP
pam_access(sshd:account): from_match=2, "IP"
pam_access(sshd:account): access denied for user 'user' from 'IP'

我可以確認listsep=,指定時它正確解析群組“計算機管理器”,但無法返回錯誤代碼。

有人經歷過這個問題嗎?

當群組名稱包含空格時有什麼解決方法嗎?

先謝,

巴努

答案1

在偵錯日誌中,您可以看到,這list是使用空格。

...
pam_access(sshd:account): list_match: list= root , item=user
...
pam_access(sshd:account): list_match: list= devops , item=user
...
pam_access(sshd:account): list_match: list= ALL , item=user
...

root請注意和周圍的空格devopsALL

透過此設置,每個用戶都可以登錄,無論他們是否屬於任何指定的群組。

這是正確的行為,因為您在/etc/security/access.conf規則中定義了空格 ( + : root : ALL),而您已經設定了listsep=,是逗號而不是空格。因此沒有使用者是 的一部分ALL,因為特殊關鍵字是ALL(沒有空格)。

正確的解決方案是/etc/pam.d/sshd

account required pam_access.so listsep=, debug

還有/etc/security/access.conf

+:root:ALL
+:devops:ALL
+:computer managers:ALL
-:ALL:ALL

我猜, 和devopscomputer managers組,因此我們應該使用括號來表示組:

+:root:ALL
+:(devops):ALL
+:(computer managers):ALL
-:ALL:ALL

資料來源:

$ man pam_access
...
       listsep=separators
           This option modifies the list separator character that pam_access will recognize when parsing the access configuration file. For example:
           listsep=, will cause the default ` ' (space) and `\t' (tab) characters to be treated as part of a list element value and `,' becomes the
           only list element separator. Doing this may be useful on a system with group information obtained from a Windows domain, where the default
           built-in groups "Domain Users", "Domain Admins" contain a space.
...
$ man access.conf
...
       The second field, the users/group field, should be a list of one or more login names, group names, or ALL (which always matches). To
       differentiate user entries from group entries, group entries should be written with brackets, e.g.  (group).
...

相關內容