pam_group.so를 통해 할당된 newgrp 및 그룹

pam_group.so를 통해 할당된 newgrp 및 그룹

편의상 이 그룹의 디렉토리 서버에 모든 사용자를 추가하는 대신 /etc/security/group.conf(pam_group.so) 메커니즘을 통해 플로피, 오디오, 플러그개발, 비디오 등과 같은 특수 그룹 멤버십을 할당하는 것을 선호합니다. .

이는 장치 액세스에는 잘 작동하지만 외부 프로그램이 getgrent를 통해 특정 그룹의 사용자 멤버십을 확인하려고 할 때 문제를 일으키는 경향이 있습니다.

이제 나는 이 그룹 중 하나에 newgrp를 시도했고 이것이 불가능하다는 것을 깨달았습니다(시스템은 Debian squeeze입니다). 이것은 newgrp의 버그입니까, 아니면 단지 내 사이트의 구성 문제입니까?

newgrp는 Unix API 측에서 실제로 무엇을 수행합니까? setgid는 루트 전용 시스템 호출인 것으로 보입니다. 특정 사용자가 setgit 대상 그룹의 구성원이라면 그것도 허용될 것이라고 생각했을 것입니다.

나는 실제로 이 문제를 우연히 발견했는데, 왜냐하면 mount.davfs가 내가 davfs2 그룹의 구성원이 아니라고 계속 말했기 때문입니다. 물론 그것은 사실이지만 그것은 또한 pam_group.so에 의해 할당된 그룹이기도 했습니다.

답변1

newgrp이미 액세스 권한이 있는 그룹에만 액세스할 수 있습니다. 쓸모없는 것 같나요? 기본적으로 그렇습니다. 이는 프로세스가 두 개 이상의 그룹에 속할 수 없었던 시절부터 있었던 일입니다. 비밀번호로 보호된 그룹에 액세스할 수도 있지만 이는 매우 드문 경우입니다.

커널의 관점에서 각 프로세스는 하나 이상의 그룹에 속합니다. setgid루트로 실행하거나 setgid 프로그램 내에서 실행하는 경우에만 사용할 수 있습니다(실제(실행) 그룹과 유효(실행) 그룹 간 교체). 커널은 사용자 및 그룹 데이터베이스를 인식하지 못합니다.

사용자 및 그룹 데이터베이스( /etc/passwd, /etc/group, LDAP 등) /etc/security/group.conf는 로그인 및 권한 상승(일반적으로 PAM을 통해)을 관리하는 기타 프로그램에 의해 login관리 됩니다 su. 로그인하면 및 기타 파일에 나열된 그룹에 할당됩니다 /etc/passwd. /etc/group프로세스 pam_groups는 다음과 같습니다.

gid_t groups[…] = /*extra GIDs computed from /etc/group and so on*/;
setgroups(sizeof(groups)/sizeof(gid_t), groups);
setgid(gid); /*main GID read from /etc/passwd*/
setuid(uid);
execve(shell, "-sh"); /*shell read from /etc/passwd*/

즉, 루트 권한 포기(즉, 대상 사용자로 변경)는 다른 모든 권한 관리 이후, 사용자 쉘을 호출하기 전에 수행됩니다. 프로세스가 더 이상 루트로 실행되지 않으면 추가 그룹을 얻을 수 없습니다.

방금 사용자를 그룹에 추가한 경우 해당 사용자가 다음에 로그인할 때 적용됩니다. 다른 터미널에 로그인하거나 SSH를 통해 다른 세션을 시작하면 해당 세션의 프로세스는 로그인한 그룹에 관계없이 사용자 그룹을 갖게 됩니다. groups또는 명령을 사용하여 자신이 속한 id그룹(즉, 에서 시작한 특정 프로세스)을 확인할 수 있습니다 .groups

그래서 나는 귀하의 명시적인 질문에 답변했습니다 ( newgrp그것은 제 역할을 하고 있으며 귀하가 생각한 것과는 다릅니다). 내가 당신의 문제를 해결했을 수도 있고 안 풀었을 수도 있습니다. 이는 사용자 및 그룹 데이터베이스를 찾기 위해 로그인할 수 없는 애플리케이션에서는 일반적이지 않습니다. 일반적으로 요청한 프로세스가 해당 그룹의 구성원인지 여부를 확인하여 액세스를 결정합니다. 특정 애플리케이션에 대해 궁금한 점이 있으면 알려주시기 바랍니다.

답변2

이유새 그룹귀하의 경우에는 그룹을 사용하기 때문에 그룹을 변경할 수 없습니다 게트렌트요청한 커뮤니티의 회원인지 확인합니다. 소스 파일 find_matching_group의 기능을 참조하세요 newgrp.c.

새 그룹이 확인이 필요합니까? 프로세스가 속한 그룹 집합(소위 "그룹 벡터")은 임의의 목록이기 때문에 커널은 /etc/group다른 그룹 데이터베이스에 대해 알지 못합니다. 컬렉션 그룹모든 그룹 목록을 사용할 수 있습니다. 따라서 프로세스의 그룹 벡터에 어떤 그룹이 있어야 하는지 결정하는 문제입니다.정책:[newgrp] 및 대부분의 다른 사용자 공간 도구는 그룹 벡터를 읽어 전략을 구현합니다.게트렌트. (자일스의 대답이에 대한 자세한 정보가 제공됩니다. )

반면에,pam_group다른 정책을 구현합니다. 사용자가 속하지 않은 그룹으로 그룹 벡터를 늘릴 수 있습니다( /etc/groupLDAP에 따라).

따라서 두 개의 서로 다른 정책이 생성되고 mount.davfs2첫 번째 정책만 유효하다고 가정하기 때문에 불만을 표시합니다. 이를 에 대한 버그로 보고 mount.davfs2하거나 모든 DAV 사용자를 LDAP의 적절한 그룹에 추가하거나 /etc/group다음을 사용하여 간단히 추가할 수 있습니다.FUSE 기반 DAV 파일 시스템대신에.

관련 정보