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
...
root
とdevops
の周囲の空白に注意してくださいALL
。
この設定により、指定されたグループに属しているかどうかに関係なく、すべてのユーザーがログインできるようになります。
/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
そして、 とdevops
はcomputer 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).
...