![다른 사용자의 파일에 그룹 권한 부여](https://rvso.com/image/109222/%EB%8B%A4%EB%A5%B8%20%EC%82%AC%EC%9A%A9%EC%9E%90%EC%9D%98%20%ED%8C%8C%EC%9D%BC%EC%97%90%20%EA%B7%B8%EB%A3%B9%20%EA%B6%8C%ED%95%9C%20%EB%B6%80%EC%97%AC.png)
저는 Debian 7을 사용하고 있으며 다음과 같은 htdocs 디렉토리를 사용하여 새 사용자(웹 사이트)를 만들었습니다.
$ sudo adduser website
$ sudo mkdir -p /home/website/htdocs
$ sudo chown -R website /home/website
이제 다른 그룹의 사용자(개발자)가 해당 사용자의 디렉터리에 액세스할 수 있기를 바랍니다. 나는 시도했다:
$ sudo chown -R :developers /home/website
그룹이 할당되어 있고( ls -la
또는 사용 stat
) 사용자가 그룹에 속해 있지만 액세스 권한이 없는 것을 볼 수 있습니다.
drwxr-xr-x 3 website developers 4096 May 3 09:09 website
나 또한 원해:
다른 그룹, '계약업체'가 웹사이트 파일에 액세스하도록 허용
웹사이트 사용자의 액세스를 홈 디렉토리에만 제한
새 웹사이트 파일이 이러한 권한을 상속하는지 확인하세요.
액세스 제어 목록을 사용해야 합니까? 아니면 이를 수행하는 더 좋은 방법이 있습니까(예: 각 사이트에 대해 별도의 사용자를 사용하지 않는 것)?
답변1
O/S나 배포판을 모르면 정확한 명령을 내리기가 어렵습니다. 그리고 그렇습니다! ACL이 작동하지만 표준 방식도 있습니다.
배포판 에는 adduser
및 useradd
중 하나가 사용자의 홈 디렉터리를 자동으로 생성할 수 있습니다. 그렇다면 /etc/skel/
디렉토리의 내용이 사용자의 홈 디렉토리에 복사되고 권한이 설정되며 아마도 다른 적절한 조치가 발생할 수 있습니다.
'직원'과 같이 공유를 위해 사전 정의된 그룹이 있을 수 있습니다. 하지만 공유를 위해 자체 그룹을 만들고 싶다면 아무 문제가 없습니다. 따라서 새 그룹을 만들거나 기존 그룹을 사용하세요. 그룹의 구성원이 될 사용자가 운영 체제에 따라 usermod
, moduser
또는 로 정의되었는지 확인하십시오. vigr
현재 로그인한 각 사용자는 새 그룹의 구성원이 되려면 로그아웃한 후 다시 로그인해야 합니다.
/home/share_directory/
상황에 가장 적합한 디렉터리 등 모든 사용자에게 공통적인 디렉터리를 만듭니다 . 관련 모범 사례는 디렉터리를 사용하지 않는 것입니다.이내에모든 사용자의 홈 디렉토리. 소유자와 그룹 외에는 누구도 디렉토리의 파일을 볼 수 없어야 한다면 디렉토리의 권한을 0770으로 변경하십시오. "다른 사람"이 읽을 수 있으면 0775를 사용하십시오. 디렉토리의 소유자는 루트일 것이 거의 확실합니다.
chown root:group_name /home/share_directory/
다음으로 setuid 비트를 변경합니다.
chmod +s /home/share_directory/
어떤 사용자도 다른 사용자의 파일을 수정할 수 없어야 한다면 스틱 비트도 설정하세요.
chmod +t /home/share_directory/
이 예에서는 다음을 사용하여 setuid 및 고정 비트를 동시에 설정합니다.8진수 표기법.
chmod 5775 /home/share_directory/
또는
chmod 5770 /home/share_directory/
업데이트된 질문의 경우 ACL이 올바른 도구인 것 같습니다. 이제 대부분의 Linux 배포판에는 acl
옵션에 옵션이 포함되어 있습니다 defaults
. 배포판에 acl
기본적으로 옵션이 포함되어 있지 않은 경우 사용을 시작하려면 약간의 작업이 필요합니다. 먼저 acl
/etc/fstab의 옵션을 사용하여 파일 시스템을 마운트합니다 .
sudo vim /etc/fstab
UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx / ext4 defaults,acl 0 1
필요한 경우 파일 시스템을 다시 마운트하십시오 sudo mount -o remount,acl /
. 그런 다음 이 목적을 위해 사용자가 속할 수 있는 그룹을 만듭니다. ACL 도구도 설치해야 할 수도 있습니다 apt-get install acl
.
sudo groupadd developers
sudo usermod -a -G developers $username
(또는 그룹이 "계약자"일 수도 있습니다.) 현재 로그인한 사용자가 새 그룹의 구성원이 되려면 로그아웃했다가 다시 로그인해야 합니다. 물론 /var/www 디렉토리에 유지하려는 콘텐츠가 있는 경우에는 이 작업을 수행하지 마세요. 하지만 시작하기 위한 설정을 설명하기 위한 것입니다.
sudo rm -rf /var/www
sudo mkdir -p /var/www/public
sudo chown -R root:developers /var/www/public
sudo chmod 0775 /var/www/public
sudo chmod g+s /var/www/public
sudo setfacl -d -m u::rwx,g::rwx,o::r-x /var/www/public
sudo setfacl -m u::rwx,g::rwx,o::r-x /var/www/public
sudo setfacl -d -m u::rwx,g:contractors:rwx,o::r-x /var/www/public
sudo setfacl -m u::rwx,g:contractors:rwx,o::r-x /var/www/public
위에서 명령 간의 차이점은 setfacl
다음과 같습니다. 첫 번째 인스턴스는 기본 그룹(디렉토리의 그룹 소유자)을 사용하는 반면 두 번째 인스턴스는 명시적으로 그룹을 지정합니다. 스위치 는 디렉터리 내의 모든 새 파일 시스템 개체에 대해 -d
기본 마스크( )를 설정합니다 . 그러나 디렉터리 자체에 ACL을 적용하려면 스위치 -m
없이 명령을 다시 실행해야 합니다 . -d
그런 다음 구성 파일에서 "/var/www"에 대한 참조를 "/var/www/public"으로 바꾸고 다시 로드하세요.
sudo vim /etc/apache2/sites-enabled/000-default
sudo /etc/init.d/apache2 reload
파일을 생성한 사용자를 제외한 모든 사람의 삭제 및 이름 바꾸기를 제한하려면 다음을 수행하십시오 sudo chmod +t /var/www/public
. 이렇게 하면 Apache 문서 루트 외부에 존재하는 프레임워크용 디렉터리를 생성하거나 서버 쓰기 가능 디렉터리를 생성하려는 경우에도 여전히 쉽습니다.
Apache 쓰기 가능 로그 디렉터리:
sudo mkdir /var/www/logs
sudo chgrp www-data /var/www/logs
sudo chmod 0770 /var/www/logs
Apache에서 읽을 수 있는 라이브러리 디렉터리:
sudo mkdir /var/www/lib
sudo chgrp www-data /var/www/logs
sudo chmod 0750 /var/www/logs
중요하지 않은 디렉토리에서 약간의 "재생"을 수행하면 상황에 맞게 이 작업을 수행하는 데 도움이 될 것입니다.
제한 사항에 따라 저는 두 가지 다른 접근 방식을 사용합니다. 셸은 rssh
SCP/SFTP 액세스를 제공하지만 SSH 액세스는 제공하지 않도록 만들어졌습니다. 또는 홈 디렉토리로 사용을 제한하려면 에 구성된 내부 SFTP 하위 시스템을 사용할 수 있습니다 /etc/ssh/sshd_config
.
Subsystem sftp internal-sftp
Match group sftponly
ChrootDirectory /home/%u
X11Forwarding no
AllowTcpForwarding no
ForceCommand internal-sftp
예를 들어 sftponly라는 그룹을 만듭니다. 사용자를 sftponly 그룹의 구성원으로 만듭니다. /
chroot 때문에 홈 디렉토리를 다음으로 변경하십시오 . /home/username 디렉토리는 루트가 소유해야 합니다. SSH 액세스를 방지하기 위해 사용자의 셸을 /bin/false로 설정할 수도 있습니다. 대부분 나는 대화형 액세스에 관심이 있으므로 일반적으로 경로를 따릅니다 rssh
. (그들은 내가 쓰기 능력을 정의한 곳 외에는 어디에도 쓸 수 없습니다.)