작성된 파일 및 폴더에 대한 소유자 강제


21

여러 사용자가 공유하는 데이터가 포함 된 디렉토리가 있습니다. 이 디렉토리 및 그 아래에있는 모든 것에 대한 액세스는 디렉토리 그룹에 의해 제어되며, 해당 그룹은 해당 사용자에게 추가됩니다. 그래서 나는 "sticky group"폴더를 만들었습니다 chmod g+s. 디렉토리에는 디렉토리와 파일이 포함 된 트리 구조가 포함되며 총 파일 수는 수백만 개에 달합니다. 파일은 상당히 작을 것입니다. 50MB보다 큰 것은 기대하지 않습니다.

내 문제는 파일이나 디렉토리의 소유자가 여전히 그것을 만든 사용자라는 것입니다. 따라서 액세스 그룹에서 해당 사용자를 제거해야하더라도 그의 액세스를 완전히 제거하지는 않습니다.

그래서:

모든 파일과 하위 디렉토리의 소유자가 동일한 지 확인하기 위해 놓친 다른 옵션이 있습니까?

나는 cron-job을 사용하여 전체 디렉토리를 주기적으로 서핑 할 수 있기를 기대하지만, 기본적으로 한 번 pr-file 명령 인 것은 비효율적입니다.

나는 발견 예를 inotify를를 사용을하지만, 높은 유지 보수 등의 파업 나, 그것은 스크립트를 필요로하기 때문에있다.

ACL이 강제 소유권에 도움이 될 수 있는지 알아낼 수 없었습니다.

더 똑똑한 방법이 있습니까?

내가 원하는 것은 사용자에게 그룹을 추가하여 공유 할 수있는 디렉토리를 갖는 것입니다. 이 디렉토리에서 생성 된 모든 것은 부모로부터 권한 체계를 상속합니다. 내가 시도하는 것보다 더 좋은 방법이 있다면 나는 모두 귀입니다.


나는 네가 말하려는 것을 이해하지 못했다고 생각한다. 정교하게 할 수 있습니까?
마틴 닐슨

그룹 및 소유권이 동일한 모든 파일 및 하위 디렉토리를 설정하려면 chown -hR owner:group?
Pandya

가능하지만 새로운 파일이 항상 생성되고 수백만의 파일을 말하고 있기 때문에 전체 디렉토리를 주기적으로 탐색하는 크론 작업이 필요합니다. 내가 요점을 놓치지 않으면?
마틴 닐슨


이 질문을 만들기 전에 실제로 그 질문을 훑어 보았습니다. 소유자를 특정 사용자에게 강요하는 방법을 다루지 않는 것 같습니다.
마틴 닐슨

답변:


12

기본 소유자를 "자동으로"설정하려면 다음 setuid과 같은 디렉토리가 필요합니다 setgid. 그러나 이것은 FreeBSD에서 구성 될 수 있지만 다른 UNIX 및 Linux 시스템은 무시 u+s합니다. 그러나 귀하의 경우 다른 해결책이있을 수 있습니다.

내가 원하는 것은 사용자에게 그룹을 추가하여 공유 할 수있는 디렉토리를 갖는 것입니다. 이 디렉토리에서 생성 된 모든 것은 부모로부터 권한 체계를 상속합니다. 내가 시도하는 것보다 더 좋은 방법이 있다면 나는 모두 귀입니다.

따라서 기본적으로 그룹 메커니즘을 사용하여 디렉토리에 대한 액세스를 제어하려고합니다. 그러나 전체 디렉토리 구조에서 권한을 제한 할 필요는 없습니다. 실제로 디렉토리 --x실행 비트는 필요한 것일 수 있습니다. 예를 들어 보겠습니다. 그것을 가정하면 ...

  • group_dir디렉토리에 대한 액세스를 제어하는 ​​그룹 은 ourgroup입니다.
  • ourgroup그룹의 사람들 만 액세스 할 수 있습니다 group_dir.
  • user1user2속해 ourgroup있습니다.
  • 기본 umask는 0022입니다.

... 다음 설정을 고려하십시오.

drwxrws---    root:ourgroup   |- group_dir/
drwxr-sr-x    user1:ourgroup  |---- group_dir/user1_submission/
drwxr-sr-x    user2:ourgroup  |---- group_dir/user2_submission/
-rw-r--r--    user2:ourgroup  |-------- group_dir/user2_submission/README

여기서 모든 항목이 소유자에 의해 생성되었다고 가정합니다.

이제이 설정에서

  • 의 모든 사용자가 모든 디렉토리를 자유롭게 탐색 할 수 있습니다 ourgroup. 그룹의 모든 사용자는 파일을 생성, 이동, 삭제할 수 있습니다 group_dir.
  • 에없는 사람 ourgroup은 (으)로 차단 group_dir되어 그 아래의 어떤 것도 조작 할 수 없습니다. 예를 들어 user3(의 멤버가 아닌 사람)는 파일 자체에 대한 권한 이 있어도 ourgroup읽을 수 없습니다 .group_dir/user2_submission/READMEr--

그러나이 경우 약간의 문제가 있습니다. 일반적인 umask로 인해 사용자가 만든 항목은 그룹의 다른 구성원이 조작 할 수 없습니다. 이것은 ACL이 들어오는 곳입니다. 기본 권한을 설정하면 umask 값에도 불구하고 모든 것이 제대로 작동하는지 확인할 수 있습니다.

$ setfacl -dRm u::rwX,g::rwX,o::0 group_dir/

이 호출은 다음을 설정합니다.

  • rw(x)소유자의 기본 권한.
  • rw(x)그룹의 기본 권한.
  • 다른 사람에게는 기본적으로 권한이 없습니다. 부터하는 것으로 다른 사람이 액세스 할 수 없습니다 group_dir어쨌든, 정말 자신의 권한 아래에 어떤 문제가되지 않습니다.

지금, 아이템 등을 작성하는 경우 user2:

$ touch group_dir/user2_submission/AUTHORS
$ ls -l group_dir/user2_submission/AUTHORS
rw-rw----    user2:ourgroup    group_dir/user2_submission/AUTHORS

이 ACL을 사용하여 이전 구조를 다시 빌드 할 수 있습니다.

drwxrws---+    root:ourgroup   |- group_dir/
drwxrws---+    user1:ourgroup  |---- group_dir/user1_submission/
drwxrws---+    user2:ourgroup  |---- group_dir/user2_submission/
-rw-rw----+    user2:ourgroup  |-------- group_dir/user2_submission/README

여기서도 각 항목은 소유자가 작성합니다.

또한 디렉토리를 사용하는 사람들에게 조금 더 많은 힘 / 보안을 제공하려면 끈적 끈적한 비트를 고려할 수 있습니다. 예를 들어, 권한 이 없기 때문에 user1삭제 하지 못합니다 .user2_submission-w-group_dir

$ chmod +t group_dir/

이제, 의 디렉토리 user1를 제거하려고하면 user2, 그는 lovely하게 될 것 Operation not permitted입니다. 그러나 이렇게하면에서 디렉토리 구조 수정을 방지 할 수 있지만 그 group_dir아래의 파일 및 디렉토리에는 여전히 액세스 할 수 있습니다.

user1@host $ rm -r user2_submission
Operation not permitted

user1@host $ cat /dev/null > user2_submission/README

user1@host $ file user2_submission/README
user2_submission/README: empty (uh-oh)

고려해야 할 또 다른 사항은 우리가 사용한 ACL이 기본 권한을 설정한다는 것 입니다. 따라서 항목 소유자가 해당 항목과 관련된 권한을 변경할 수 있습니다. 예를 들어 user2완벽하게 실행할 수 있습니다 ...

$ chown g= user2_submission/ -R
or
$ chgrp nobody user2_submission -R

... 그러므로 전체 제출 디렉토리를 그룹의 모든 사람이 사용할 수 없게합니다.

그러나 원래 rws그룹의 모든 사용자 에게 모든 권한을 기꺼이 제공하기 때문에 이러한 사용자를 신뢰한다고 가정하고 악의적 인 작업이 너무 많을 것으로 예상하지 않습니다.


ACL이 기본 권한을 초과합니까? 예를 들어, $ setfacl -dRm u :: r, g :: rwX, o :: 0 group_dir /을 대신 설정하여 그룹 구성원 만 파일을 만들 수 있도록 허용하면 소유자는 파일을 편집 할 수는 없지만 그룹에서? 사용자는 소유자에 관계없이 파일이 그룹의 구성원 인 경우에만 파일을 편집 할 수 있어야합니다.
Martin Nielsen

소유자의 모든 권한을 제거 할 필요는 없습니다. 그룹에 파일에 대한 쓰기 권한이 있으면 그룹 구성원 파일을 편집 할 수 있습니다. 소유자는 "조금 더 특권"이됩니다. ACL이 항상 기본 권한을 대체하지는 않습니다 (ACL 유효 권한 참조).
John WH Smith

요점은 사용자에게 권한이 없어야하며 그룹 만 있어야한다는 것입니다. 소유자는 그룹에 속하지 않는 한 모든 의도와 목적을 위해 완전히 권한이 없어야합니다.
Martin Nielsen

기본적으로 그룹에 속하지 않은 사람은 어쨌든 권한이 group_dir없습니다. 파일을 소유하고 있는지 여부에 관계없이 처음 에 입장 할 수 없기 때문입니다. 소유자가 가진 유일한 "권한"은 자신이 생성 한 권한을 변경할 수 있다는 것입니다 (내 답변에서 조금 더 자세하게 설명합니다).
John WH Smith

1
절대적으로하지. 이 group_dir디렉토리는 root:ourgroupwith의 소유 -rwxr-x---입니다. 즉, 루트 및 그 구성원 만 디렉토리에 ourgroup액세스 할 수 있습니다. 즉, 그 아래에있는 파일로 무엇이든 할 수 있습니다. --x디렉토리에 대한 권한 이없는 경우 파일 자체에 대한 권한이 있어도 디렉토리 내의 파일에 액세스 할 수 없습니다 .
John WH Smith

6

더 똑똑한 방법이 있습니다. set-gid와 default acls 의 조합을 사용합니다 . 분명히 acl 사용 가능 파일 시스템이 필요합니다. 공유하려는 디렉토리 가 있고 /var/grpdir그룹 구성원이 sharing액세스 할 수 있어야 한다고 가정 합니다.

chown root:sharing /var/grpdir
chmod 2770 /var/grpdir #other can't read or traverse into the directory, set-gid is set
setfacl -d -m u::rwX,g::rwX,o::0 /var/grpdir

기본 ACL은 기본 ACL이있는 디렉토리에서 작성된 서브 디렉토리에 의해 상속됩니다. 즉, 작성된 모든 파일 은 디렉토리의 setgid 비트 /var/grpdirsharing의해 그룹이 설정됩니다 . 또한 특정 사용자 또는 그룹으로 ACL을 지정하지 않았기 때문에 기본 Linux 스타일 우선권을 무시하는 기본 acl을 상속합니다. 이것은 모든 파일이 소유권 <user>:sharing과 권한 으로 생성됨을 의미합니다 rw-rw----. 디렉토리는 자체 기본 ACL이 상위 ( /var/grpdir) 와 동일하게 설정되고 사용자 및 그룹에 대해 실행 가능한 비트가 설정 된다는 점을 제외하면 동일 합니다. sharing그룹 에서 사용자를 제거 하면 디렉토리에 액세스 할 수 없습니다 ( 사용자가 소유하고 있어도 디렉토리에있는 파일은 해당되지 않음).

cronjob을 사용하여 주기적으로 권한을 수정하는 것과 달리 권한은 새로 생성 된 파일 및 디렉토리로 원자 적으로 업데이트되므로 항상 동기화됩니다. 이 솔루션은 가볍습니다. 데몬이 필요하지 않으며, 한 번에 권한을 수정하는 동안 IO 급상승이 없습니다.


사용자 나 그룹을 지정하지 않으면 ACL이 일반 파일 시스템 권한을 덮어 씁니다.
Martin Nielsen

1
아니요, 파일에 이미 설정된 권한을 수정하지 않습니다. 디렉토리에 기본 권한 acls가 설정되어 있고 해당 디렉토리에 파일 또는 디렉토리가 작성되면 NEW 파일 / 디렉토리에 지정된 기본 권한이 부여됩니다. 디렉토리로 복사 / 이동 된 파일은 acl이 설정되기 전에 디렉토리에 존재했던 파일과 마찬가지로 권한을 유지합니다. 또한 chmod와 chown은 파일을 만든 후에도 소유권과 권한을 수정하기 위해 정상적으로 사용할 수 있습니다
sirlark

2

나는 이것을하는 좋은 방법을 모른다. 기술적으로 가장 깨끗한 방법은 FUSE 파일 시스템입니다. 물론 아직 아무도하지 않았다면 많은 작업이 필요합니다.

대안 :

  1. 삼바를 사용하십시오. samba에는 force user매개 변수가 있습니다. 디렉토리를 로컬로 내보내고 로컬로 마운트 할 수 있습니다. 루프백 네트워킹 만 관련되어 있으므로 더 빠르게 액세스 할 수 없지만 허용 될 수 있습니다.

  2. FAT32와 같은 비 Linux 파일 시스템을 사용하십시오. 특정 사용자가 마운트하도록 구성해야합니다. 액세스 권한은 상위 디렉토리에서 처리해야합니다.


0

파일을 특정 디렉토리로 이동할 때 파일 소유자가 변경되도록 파일 소유권을 자동으로 변경하는 방법에 대해서는 들어 본 적이 없습니다. 가장 가까운 것은 끈적 끈적한 부분이지만 그룹 소유권이 충분하지 않다고 표시 한 것처럼 보이므로 실제 사용자 소유권이 변경되어야합니다.

이 경우 Pandya가 언급했듯이 가장 좋은 방법은 chown -R 플래그가있는 cron 작업이라고 생각합니다. 매분 또는 5 분마다 실행되도록 크론에 놓으십시오.

사용자가 이것을 어떻게 사용하고 있는지 설명 할 수 있다면 더 나은 해결책이있을 수 있습니다.

ACL을 사용하면 누가 어떤 작업을 수행 할 수 있는지에 대한 세밀한 제어가 가능하며 실제 파일 소유권이 자동으로 변경되지는 않습니다. 더 높은 시야를 확보하고 솔루션을 평가 / 재 설계해야한다고 생각합니다.


0

당신은 사용할 수 있습니다 -도구를 inotify를 아래처럼 간단한 bash는 스크립트를 작성합니다. Inotify는 디렉토리 웹을 주시하고 웹 디렉토리 내부에서 디렉토리 생성 과 같은 이벤트가 발생할 때마다 무언가를 수행합니다 . 많은 이벤트가 존재합니다. 당신은 그것을 구글 하거나이 사이트를 볼 수 있습니다

while inotifywait -m -e CREATE web; do echo "A new directory has been created"; done
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.