pam_access.so は、listsep が指定されている場合に動作しません。

pam_access.so は、listsep が指定されている場合に動作しません。

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

の内容sshd は、

account required pam_access.so listsep=, debug

この設定により、指定されたグループに属しているかどうかに関係なく、すべてのユーザーがログインできるようになります。PAMlistsep=,構成から削除すると、想定どおりに動作します。

listsepデバッグ ログから、指定されている場合は、access.conf でユーザー グループが見つからないときにエラーが返されないように見えます。つまり、pam_access.so は常に listsep で成功を返します。

以下のコンテキストでは、ユーザーは「コンピュータ マネージャー」のメンバーですが、「devops」のメンバーではありません。

listsep が有効で 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。listsep が指定されていない場合のログと比較してみましょう。

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
...

rootdevopsの周囲の空白に注意してくださいALL

この設定により、指定されたグループに属しているかどうかに関係なく、すべてのユーザーがログインできるようになります。

/etc/security/access.confこれは正しい動作です。なぜなら、ルールでは空白文字 ( )を定義しているのに+ : root : ALL、 はスペースではなくコンマであると設定しているからです。そのため、特殊キーワードは (空白文字なし) であるため、listsep=,にはユーザーは含まれません。ALLALL

正しい解決策は次のようになります/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).
...

関連情報