pam_access.so не работает, если указан listsep

pam_access.so не работает, если указан listsep

Я столкнулся со странной проблемой при настройке PAM, пытаясь ограничить входы по ssh с помощью pam_access.so с помощью пакета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 (он же pam_access.so) всегда возвращает успешное выполнение с listsep.

В приведенном ниже контексте пользователь является членом «компьютерных менеджеров», но не «devops».

Отладочные журналы с включенным listsep и только devops в access.conf

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

Связанный контент