저는 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
운영 체제나 배포판을 모르면 정확한 명령을 내리기가 어렵습니다. ACL은 작동할 수 있지만 표준 접근 방식이 있습니다.
adduser
및 를 사용하면 useradd
배포판에서 이들 중 하나가 자동으로 사용자의 홈 디렉터리를 생성할 수 있습니다. 그렇다면 디렉터리의 내용이 /etc/skel/
사용자의 홈 디렉터리에 복사되고 권한이 설정되며 다른 적절한 작업이 수행될 수 있습니다.
"직원"과 같은 사전 정의된 공유 그룹이 있을 수 있지만 공유를 위해 자체 그룹을 생성하려는 경우 문제가 되지 않습니다. 따라서 새 그룹을 만들거나 기존 그룹을 사용하세요. 이 그룹 usermod
의 구성원인 moduser
사용자가 운영 체제를 사용하여 정의되었는지 확인하십시오 vigr
. 현재 로그인한 각 사용자는 로그아웃한 후 다시 로그인해야 새 그룹의 구성원이 됩니다.
모든 사용자에게 공통적인 디렉터리(예: /home/share_directory/
상황에 가장 적합한 디렉터리)를 만듭니다. 관련 모범 사례는 디렉터리를 사용하지 않는 것입니다.이내에모든 사용자의 홈 디렉터리. 소유자와 그룹 외에는 누구도 디렉터리의 파일을 볼 수 없는 경우 디렉터리에 대한 권한을 0770으로 변경합니다. "other"를 읽을 수 있으면 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 액세스는 제공하지 않습니다. 또는 홈 디렉터리의 사용을 제한하기 위해 /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
경로를 따릅니다. (그들은 내가 정의한 쓰기 기능 외에는 어디에도 쓸 수 없습니다.)