사용할 권한을 결정할 때는 사용자가 누구이며 필요한 것이 무엇인지 정확히 알아야합니다. 웹 서버는 두 가지 유형의 사용자와 상호 작용합니다.
인증 된 사용자는 서버에 사용자 계정이 있으며 특정 권한을 제공받을 수 있습니다. 일반적으로 시스템 관리자, 개발자 및 서비스 계정이 포함됩니다. 일반적으로 SSH 또는 SFTP를 사용하여 시스템을 변경합니다.
익명 사용자는 웹 사이트 방문자입니다. 파일에 직접 액세스 할 수있는 권한은 없지만 웹 페이지를 요청할 수 있으며 웹 서버가 대신 사용합니다. 웹 서버 프로세스의 권한에주의하여 익명 사용자의 액세스를 제한 할 수 있습니다. 많은 Linux 배포판에서 Apache는 www-data
사용자 로 실행 되지만 다를 수 있습니다. 사용 ps aux | grep httpd
또는 ps aux | grep apache
아파치가 시스템에 사용하는 것을 사용자가 볼 수 있습니다.
리눅스 권한에 대한 참고 사항
Linux 및 기타 POSIX 호환 시스템은 전통적인 유닉스 권한을 사용합니다. Wikipedia에 대한 파일 시스템 권한 에 대한 훌륭한 기사가 있으므로 여기에서 모든 것을 반복하지는 않습니다. 그러나 알아야 할 것이 몇 가지 있습니다.
실행 비트
해석 된 스크립트 (예 : Ruby, PHP)는 실행 권한 없이도 제대로 작동합니다. 바이너리 및 셸 스크립트에만 실행 비트가 필요합니다. 디렉토리를 순회 (입력)하려면 해당 디렉토리에 대한 실행 권한이 있어야합니다. 웹 서버는 디렉토리를 나열하거나 그 안의 파일을 제공하려면이 권한이 필요합니다.
기본 새 파일 권한
파일을 만들 때 일반적으로 파일을 만든 사람의 그룹 ID를 상속합니다. 그러나 때로는 새 파일이 생성 된 폴더의 그룹 ID를 상속하기를 원하므로 부모 폴더에서 SGID 비트를 활성화해야합니다.
기본 권한 값은 umask에 따라 다릅니다. umask는 새로 작성된 파일에서 권한을 빼므로 공통 값 022는 755로 파일을 작성합니다. 그룹과 협업 할 때 umask를 002로 변경하여 작성하는 파일을 그룹 구성원이 수정할 수 있도록하는 것이 유용합니다. 그리고 업로드 된 파일의 권한을 사용자 정의하려면 파일을 업로드 한 후 아파치의 umask를 변경하거나 chmod를 실행해야합니다.
777의 문제
당신이 chmod 777
당신의 웹 사이트를 할 때 , 당신은 보안이 전혀 없습니다. 시스템의 모든 사용자는 웹 사이트의 파일을 변경하거나 삭제할 수 있습니다. 그러나 더 진지하게, 웹 서버는 웹 사이트 방문자를 대신하여 작동하며 이제 웹 서버는 실행중인 파일과 동일한 파일을 변경할 수 있습니다. 웹 사이트에 프로그래밍 취약점이있는 경우이를 악용하여 웹 사이트를 손상 시키거나 피싱 공격을 삽입하거나 서버로부터 정보를 도용 할 수 있습니다.
또한 서버가 잘 알려진 포트 (루트를 사용하지 않는 사용자가 월드 액세스 가능한 리스닝 서비스를 생성하지 못하게해야 함) 에서 실행되는 경우 서버는 루트로 시작해야합니다. 포트가 바인드되면 권한이 적은 계정으로). 즉, 주 실행 파일이 버전 제어의 일부인 웹 서버를 실행하는 경우 (예 : CGI 앱) 사용자의 이름을 바꿀 수 있으므로 권한 (또는 그와 관련하여 포함 디렉토리의 권한)은 그대로 둡니다. 777의 실행 파일)은 모든 사용자가 모든 실행 파일을 루트 로 실행할 수 있도록 합니다 .
요구 사항 정의
- 개발자는 웹 사이트를 업데이트 할 수 있도록 파일에 대한 읽기 / 쓰기 액세스 권한이 필요합니다
- 개발자는 디렉토리에서 읽기 / 쓰기 / 실행이 필요하므로 탐색 할 수 있습니다.
- Apache는 파일 및 해석 된 스크립트에 대한 읽기 액세스 권한이 필요합니다
- Apache는 서비스 가능한 디렉토리에 대한 읽기 / 실행 액세스 권한이 필요합니다
- Apache는 업로드 된 컨텐츠의 디렉토리에 대한 읽기 / 쓰기 / 실행 액세스 권한이 필요합니다
단일 사용자가 유지 관리
한 명의 사용자 만 사이트를 관리해야하는 경우 웹 사이트 디렉토리에서 사용자 소유자로 설정하고 사용자에게 전체 rwx 권한을 부여하십시오. Apache는 여전히 파일을 제공 할 수 있도록 액세스 권한이 필요하므로 www-data를 그룹 소유자로 설정하고 그룹 rx 권한을 부여하십시오.
귀하의 경우, 사용자 이름이 인 Eve eve
는 다음을 유지 관리하는 유일한 사용자입니다 contoso.com
.
chown -R eve contoso.com/
chgrp -R www-data contoso.com/
chmod -R 750 contoso.com/
chmod g+s contoso.com/
ls -l
drwxr-s--- 2 eve www-data 4096 Feb 5 22:52 contoso.com
Apache에서 쓰기 가능해야하는 폴더가있는 경우 www-data가 쓰기 액세스 권한을 갖도록 그룹 소유자의 권한 값을 수정할 수 있습니다.
chmod g+w uploads
ls -l
drwxrws--- 2 eve www-data 4096 Feb 5 22:52 uploads
이 구성의 장점은 사용자와 그룹 소유자 만 웹 사이트 디렉토리를 탐색 할 수 있기 때문에 시스템의 다른 사용자가 스누핑하기가 더 어려워 지지만 불가능하지는 않다는 것입니다. 구성 파일에 비밀 데이터가있는 경우 유용합니다. umask에주의하십시오! 여기에서 새 파일을 작성하면 권한 값의 기본값은 755가됩니다. umask 027
새 파일의 기본값이 640 ( rw- r-- ---
)이 되도록 실행할 수 있습니다 .
사용자 그룹에 의해 유지 관리
둘 이상의 사용자가 사이트 유지 관리를 담당하는 경우 권한 할당에 사용할 그룹을 만들어야합니다. 각 웹 사이트마다 별도의 그룹을 만들고 해당 웹 사이트 이름을 따서 그룹을 지정하는 것이 좋습니다.
groupadd dev-fabrikam
usermod -a -G dev-fabrikam alice
usermod -a -G dev-fabrikam bob
이전 예에서는 그룹 소유자를 사용하여 Apache에 권한을 부여했지만 이제는 개발자 그룹에 사용됩니다. 사용자 소유자는 더 이상 우리에게 유용하지 않으므로 루트로 설정하면 권한이 유출되지 않는 간단한 방법입니다. 아파치는 여전히 액세스 권한을 필요로하므로 우리는 다른 세계에 대한 읽기 권한을 부여합니다.
chown -R root fabrikam.com
chgrp -R dev-fabrikam fabrikam.com
chmod -R 775 fabrikam.com
chmod g+s fabrikam.com
ls -l
drwxrwxr-x 2 root dev-fabrikam 4096 Feb 5 22:52 fabrikam.com
Apache에서 쓰기 가능해야하는 폴더가있는 경우 Apache를 사용자 소유자 또는 그룹 소유자로 만들 수 있습니다. 어느 쪽이든, 필요한 모든 액세스 권한을 갖습니다. 개인적으로 개발자가 업로드 폴더의 내용을 탐색하고 수정할 수 있도록 사용자 소유자로 설정하는 것을 선호합니다.
chown -R www-data uploads
ls -l
drwxrwxr-x 2 www-data dev-fabrikam 4096 Feb 5 22:52 uploads
이것이 일반적인 접근법이지만 단점이 있습니다. 시스템의 다른 모든 사용자는 웹 사이트에 대해 Apache와 동일한 권한을 가지므로 다른 사용자가 사이트를 탐색하고 구성 파일과 같은 비밀 데이터가 포함 된 파일을 쉽게 읽을 수 있습니다.
케이크를 먹고 먹을 수도 있습니다
이것은 더 향상 될 수 있습니다. 소유자는 그룹보다 적은 권한을 갖는 것이 합법적이므로 루트에 할당하여 사용자 소유자를 낭비하는 대신 Apache를 웹 사이트의 디렉토리 및 파일에서 사용자 소유자로 만들 수 있습니다. 이것은 단일 유지 관리자 시나리오의 반대이지만 동일하게 작동합니다.
chown -R www-data fabrikam.com
chgrp -R dev-fabrikam fabrikam.com
chmod -R 570 fabrikam.com
chmod g+s fabrikam.com
ls -l
dr-xrwx--- 2 www-data dev-fabrikam 4096 Feb 5 22:52 fabrikam.com
Apache에서 쓰기 가능해야하는 폴더가있는 경우 www-data가 쓰기 액세스 권한을 갖도록 사용자 소유자의 권한 값을 수정할 수 있습니다.
chmod u+w uploads
ls -l
drwxrwx--- 2 www-data dev-fabrikam 4096 Feb 5 22:52 fabrikam.com
이 솔루션에서주의해야 할 사항은 새 파일의 사용자 소유자가 www-data로 설정되지 않고 작성자와 일치한다는 것입니다. 따라서 생성 한 새 파일은 숨길 때까지 Apache에서 읽을 수 없습니다.
* 아파치 권한 분리
앞에서 언급 한 바에 따르면 사용중인 권한의 종류에 관계없이 다른 사용자가 웹 사이트를 스누핑 할 수 있습니다. 기본적으로 모든 Apache 프로세스는 동일한 www-data 사용자로 실행되므로 모든 Apache 프로세스는 동일한 서버에 구성된 다른 모든 웹 사이트에서 파일을 읽고 때로는 변경을 수행 할 수도 있습니다. Apache를 통해 스크립트를 실행할 수있는 모든 사용자는 Apache 자체와 동일한 액세스 권한을 얻을 수 있습니다.
이 문제를 해결하기 위해 Apache 에는 권한 분리 에 대한 다양한 접근 방식이 있습니다 . 그러나 각 방법에는 다양한 성능 및 보안 단점이 있습니다. 제 생각에는 보안 요구 사항이 더 높은 사이트는 공유 서버에서 VirtualHosts를 사용하는 대신 전용 서버에서 실행해야합니다.
추가 고려 사항
이전에 언급하지는 않았지만 일반적으로 개발자가 웹 사이트를 직접 편집하도록하는 것은 좋지 않습니다. 더 큰 사이트의 경우 버전 제어 시스템의 컨텐츠에서 웹 서버를 업데이트하는 일종의 릴리스 시스템을 사용하는 것이 훨씬 좋습니다. 단일 유지 관리 방법이 이상적 일 수 있지만 자동화 된 소프트웨어를 사용하는 사람이 아닙니다.
웹 사이트에서 업로드 할 필요가없는 업로드를 허용하는 경우 해당 업로드는 웹 루트 외부에 저장해야합니다. 그렇지 않으면 사람들이 비밀로 만든 파일을 다운로드하고 있음을 알 수 있습니다. 예를 들어, 학생들이 과제를 제출할 수있게하려면 Apache가 제공하지 않는 디렉토리에 과제를 저장해야합니다. 이것은 또한 비밀을 포함하는 구성 파일에 대한 좋은 접근 방법입니다.
보다 복잡한 요구 사항이있는 웹 사이트의 경우 액세스 제어 목록 사용을 살펴볼 수 있습니다 . 이를 통해 훨씬 더 정교한 권한 제어가 가능합니다.
웹 사이트에 복잡한 요구 사항이있는 경우 모든 권한을 설정하는 스크립트를 작성할 수 있습니다. 철저히 테스트 한 다음 안전하게 보관하십시오. 어떤 이유로 든 웹 사이트를 다시 만들어야하는 경우 금의 가치가 있습니다.