listep이 지정되면 pam_access.so가 작동하지 않습니다.

listep이 지정되면 pam_access.so가 작동하지 않습니다.

패키지를 사용하여 pam_access.so로 ssh 로그인을 제한하려고 시도하는 PAM을 구성하는 데 이상한 문제가 발생했습니다.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

이 설정을 사용하면 지정된 그룹에 속해 있는지 여부에 관계없이 모든 사용자가 로그인할 수 있습니다. PAM 구성에서 제거하면 listsep=,예상대로 작동합니다.

listsep디버그 로그에서 가 지정될 때마다 access.conf에서 사용자 그룹을 찾을 수 없을 때 오류를 반환하지 않는 것처럼 보입니다. AKA pam_access.so는 항상 listep에서 성공을 반환합니다.

아래 컨텍스트에서 사용자는 "컴퓨터 관리자"의 구성원이지만 "devops"의 구성원은 아닙니다.

listep이 활성화되고 access.conf에 devop만 있는 디버그 로그

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

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

그리고 내 생각엔 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).
...

관련 정보