루트가 아닌 사용자가 루트가 아닌 다른 사용자가 폴더/파일에 액세스할 수 있는지 확인하는 방법이 Linux에 있습니까?

루트가 아닌 사용자가 루트가 아닌 다른 사용자가 폴더/파일에 액세스할 수 있는지 확인하는 방법이 Linux에 있습니까?

시나리오는 다음과 같습니다. 루트로 실행될 수 없는 명령줄 프로그램이 있습니다. 요구 사항 중 일부는 특정 폴더/파일에 대한 쓰기 권한이 있는 다른 사용자에게 경고하는 것입니다.

예를 들어

  • 루트가 아닌 사용자 A로 실행 중입니다.
  • "사용자 B에게 폴더 F에 대한 쓰기 권한이 있습니까?"라는 질문에 대한 답을 얻고 싶습니다.

그래서 내 질문은

  • 루트로도 실행이 가능한가요? 그렇다면 어떨까요?
  • 루트가 아닌 사용자로 이를 수행할 수 있는 방법이 있습니까?

답변1

일반적으로 사용자 B가 디렉터리 D에 쓸 수 있는지 여부를 알 수 있는 유일한 방법은 사용자 B가 디렉터리 D에 쓰기를 시도하는 것입니다.

따라서 루트로서 su해당 사용자로 시도해 볼 수 있습니다. 비록 이것이 100% 정확하지는 않을 수도 있지만, 사용자가 로그인하고 비밀번호를 입력하면 상황이 바뀔 수 있기 때문입니다(예: pam 모듈은 사용자의 비밀번호를 기반으로 암호화 키를 설정할 수 있습니다).

거의 루트만큼 정확하므로 su사용자에게 access(2)시스템 호출이나 유사한 명령을 사용할 수 있습니다. .test -w/usr/bin/test​맨페이지에서 경고한 대로 NFSv2에서는실제검사는 서버에서 수행되지만 access시스템 호출 테스트는 로컬에서 수행되므로 잘못될 수 있습니다. 마찬가지로 FUSE 파일 시스템도 동일한 작업을 수행할 수 있습니다.

( access(2)맨페이지에는 현재 수행 중인 작업에 중요한 경쟁 조건도 언급되어 있습니다. D에 대한 B의 권한은 확인하는 시간과 B가 실제로 D에 쓰려고 시도하는 시간 사이에 변경될 수 있습니다.)

그 외에도 다음 사항을 얼마나 정확하게 받아들일 것인지 결정해야 합니다.

  1. 디렉터리 수를 계산하고 사용자 및 그룹을 확인할 수 있습니다(다른 여러 답변에 표시됨).
  2. 디렉터리에서 ACL을 확인할 수도 있습니다.

그러나 그렇게 하더라도 다음과 같은 상황이 문제를 일으킬 수 있습니다.

  1. NFS 및 기타 다양한 네트워크 파일 시스템을 통해섬기는 사람접근 허용 여부를 결정합니다. 원하는 방식으로 결정을 내릴 수 있습니다. 예를 들어 다양한 Pumpkin NFS 내보내기 옵션을 고려해 보세요.
  2. 권한 확인은 실제로 파일 시스템에 의해 수행됩니다. Unix가 아닌 파일 시스템은 예상치 못한 답변을 제공할 수 있습니다(Unix 사용자는 어떻게 NTFS SID에 매핑합니까?). 모든 베팅은 FUSE 파일 시스템에 있습니다.

답변2

"사용자 B에게 폴더 F에 대한 쓰기 권한이 있습니까?"

사용자 A가 이를 결정할 수 있는지 여부는 폴더 F에 대한 A의 액세스 권한에 따라 달라집니다. 예를 들어 F가 /home/B/foo/bar이고 A가 읽을 수 없는 경우 /home/B/fooA는 F에 어떤 권한이 설정되어 있는지는 말할 것도 없고 F가 존재하는지 확인할 수도 없습니다.

A가 F에 대한 읽기 액세스 권한을 갖고 있으므로 stat()1이 F에 대한 권한을 얻는다고 가정하면 다음 단계는 B가 소유자인지 그룹에 속하는지 확인하는 것입니다. 후자의 경우 getgrent()(기본 C - 매뉴얼 페이지가 있습니다. 매개변수를 사용하지 않고 대신 한 번에 하나의 항목을 반복합니다)를 사용하여 /etc/group그룹의 사용자 목록을 얻을 수 있습니다 struct group.

       struct group {
           char   *gr_name;       /* group name */
           char   *gr_passwd;     /* group password */
           gid_t   gr_gid;        /* group ID */
           char  **gr_mem;        /* group members */
       };

마지막 필드 gr_mem는 사용자 이름 목록을 포함하는 문자열 배열입니다(목록은 NULL포인터로 끝납니다). 파일 모드와 결합하면 특정 사용자에게 쓰기 액세스 권한이 있는지 여부를 알려주는 데 충분합니다.

getgrent()를 사용하여 ID와 구성원이 포함된 그룹 목록을 인쇄하는 예:

#include <stdio.h>
#include <sys/types.h>
#include <grp.h>

// std=c99

int main (void) {
    struct group *ent = getgrent();
    while (ent) {
        printf (
            "%s GID %d\n",
            ent->gr_name,
            ent->gr_gid
        );
        int i = 0;
        char *p = ent->gr_mem[i];
        while (p) {
            printf("\t%s\n", p);
            p = ent->gr_mem[++i];
        }
        ent = getgrent();
    }
    return 0;
} 

액세스 /etc/group(및 사용 getgrent())에는 권한이 필요하지 않습니다.

1 당신은 어떤 언어를 사용하고 있는지 언급하지 않았지만 "stat"는 상당히 불가지론적일 것으로 예상합니다. getgrent()대부분도 포팅해야 하지만, 포팅하는 방법은 언어에 따라 다릅니다.

답변3

첫 번째 질문에 대답하려면(루트로 실행):

네->su - userB -c '<command as userB to touch file in folderF>'

두 번째 질문에 답하려면:

가능 -> 비사용자가 userB와 같은 그룹에 있고 폴더F의 파일을 터치하려고 하는 경우에만 가능

답변4

제가 이해한 것이 맞다면 특정 폴더에 대한 사용자 권한을 확인해야 합니다.

따라서 기본적으로 먼저 사용자에 대해 groups 명령을 실행하십시오.

groups userB

위 명령은 자신이 속한 모든 그룹을 나열합니다 userB. 이후,

명령을 사용하여 stat8진수 권한 찾기폴더다음과 같이.

stat -c "%a %n" /some-folder

위 명령은 해당 특정 항목에 대한 8진수 권한을 반환합니다.폴더/문서.

예를 들어 위 명령이 반환되는 경우775화, 이는 user완전히 group액세스할 수 있음을 rwx의미 합니다.폴더 othersr-x접근 가능폴더.

그룹 결정사용자Agroups userA둘 다인 경우 명령을 사용하는 것뿐만 아니라사용자A그리고사용자 B같은 그룹에 속한다는 것은사용자 B가지다쓰다파일 권한.

관련 정보