일반적인 웹 프로젝트 디렉토리에 대한 완벽한 유닉스 권한은 무엇입니까?


12

작성된 웹 응용 프로그램에서 다음에 대한 8 진 형식의 완벽한 최소 권한은 무엇입니까?

  1. 사용자가 정적 파일 (images / swf / js 파일)을 업로드 한 디렉토리
  2. 관리자가 정적 파일 (images / swf / js 파일)을 업로드 한 디렉토리
  3. 응용 프로그램에 사용 된 라이브러리가있는 디렉토리
  4. 실행 가능 / 탐색 가능한 서버 측 스크립트가 상주하는 디렉토리
  5. 서버 측의 코드로 기존 파일 (txt 또는 xml)을 편집 할 디렉토리

여기 내 제안과 정당화가 있습니다.

  1. 555, 누구나 읽고 쓸 수 있으며 아무도 실행할 수 없습니다.
  2. 544, 소유자 만 쓸 수 있고, 다른 모든 사람은 읽을 수만 있으며 아무도 실행할 수 없습니다.
  3. 000, 아무도 읽고 쓰거나 실행할 필요가 없으며 웹 서버에서만 사용됩니까?
  4. 661, 소유자는 읽고 쓸 수 있으며 다른 모든 사람은 실행할 수만 있습니다
  5. 600, 소유자가 읽고 쓸 수 있으며 (필요하지 않을 수도 있음), 다른 사람은 아무것도 할 수 없습니다.

이제 두 가지에 관심이 있습니다.

  1. 첫 번째 목록에서 놓친 웹 기반 응용 프로그램에서 일반적으로 사용되는 것이 있습니까?
  2. 두 번째 목록에 동의하지 않는 것이 있습니까? 대안이 무엇이며 왜 더 낫습니까?

1
사람들 이 요즘 ACL을 사용 하지 않는 이유를 이해하지 못합니다 .
pfo

답변:


20

'웹 애플리케이션'이 아파치, nginx 등과 같은 서버에서 실행되고 PHP, Ruby 등의 동적 스크립팅 언어로 작성되었다고 가정하면 '사용자'가 누구인지 오해하고 있습니다.

사용자는 응용 프로그램에 로그인 한 사람이 아니며 응용 프로그램에서의 역할 (관리자 등)은 시나리오와 전혀 관련이 없습니다. 사용자는 프로세스가 실행되는 Linux 시스템 사용자입니다. 웹 사이트의 코드는 한 명의 사용자로만 실행됩니다. 웹 서버의 사용자 일 수도 있고 (실제로는 좋지 않은) 사용자의 사이트에 특정한 사용자 일 수도 있습니다 (훨씬 더 좋습니다).

Linux에서 사용자는 그룹에 속합니다. 다른 그룹에 사용자를 추가하고 해당 그룹에 권한을 할당 할 수 있습니다.

설정이 양호하면 서버를 한 명의 사용자로 실행하고 (이 사용자를 'webserver'라고 함) 동적 스크립팅 언어를 자체 사용자 (예 : 사이트 당 한 명의 사용자-첫 번째 사용자 인 'site1'이라고 함)로 실행합니다 (예 : FastCGI를 통해). .

파일을 제공하려면 웹 서버가 파일에 액세스해야하며 스크립팅 언어가 파일에 액세스해야합니다. 즉, 'site1'과 'webserver'는 파일을 읽을 수 있어야합니다. 그러나 그중 하나만 파일을 '소유'할 수 있습니다. 소유자는 '사용자'(사용자, 그룹, 기타)입니다. 또한 디렉토리에 쓸 수 있고 작성한 파일을 읽을 수 있도록 스크립트 언어가 필요합니다. 따라서 사용자 'site1'은 읽기 및 쓰기 권한이 필요합니다. 그룹 및 기타 권한이 가능한 한 제한적이기를 원하므로 '소유자'는 'site1'이되고 해당 사용자 권한은 읽고 쓸 수 있습니다.

웹 서버에 대한 권한을 다른 '사용자'로 지정할 수 없으므로 'site1'그룹에 'webserver'를 추가합니다 (물론 'site1'과 'webserver'를 모두 사용하여 다른 그룹을 만들 수도 있습니다. 이 그룹의 멤버에게는 동일한 권한이 부여됩니다 (사용자, 그룹, 기타 세트의 대부분의 여유 권한은 권한을 결정하기 위해 지정된 사용자에게 적용됩니다.

좋은 설정을 위해서는 파일에 동적 언어에 대한 실행 권한이 필요하지 않아야합니다. 파일은 직접 실행되지 않고 인터프리터로 읽습니다. 일반적인 스크립트 (아무 것도 쓰지 않는 스크립트)를 실행하려면 읽기 권한 만 필요합니다.

디렉토리에 대한 '실행'권한은 다른 의미를 갖습니다. 내용을 읽지 않고도 순회를 허용합니다. 디렉토리에서 파일을 읽으려면 사용자는 그 위의 모든 디렉토리에 대해 '실행'권한이 있어야합니다.

웹 응용 프로그램의 경우 모든 파일은 소유자의 읽기 권한이 있어야합니다. 그렇지 않으면 상당히 의미가없는 파일입니다. 사용자 또는 관리자가 웹 애플리케이션을 통해 파일을 업로드하는지 여부에 관계없이 '소유자'(즉, 동적 언어)에는 쓰기 권한이 필요합니다. 동적 언어는 큰 파일을 읽고 내용을 반향하는 속도가 느리기 때문에 효율적인 설정은 웹 서버를 통해 직접 정적 파일을 제공하려고 시도합니다. 따라서 웹 서버는 정적 파일에 대한 읽기 액세스 권한이 필요합니다.

따라서 최소 파일 권한은 다음과 같습니다.

  • 사용자가 업로드 한 정적 파일 (images / swf / js 파일)이있는 디렉토리의 파일 : 640
  • 관리자가 업로드 한 정적 파일 (images / swf / js 파일)이있는 디렉토리의 파일 : 640
  • 응용 프로그램에 사용 된 라이브러리가있는 디렉토리의 파일 : 400 (또는 440)
  • 실행 가능 / 탐색 가능한 서버 측 스크립트가있는 디렉토리의 파일 : 400 (또는 440)
  • 이미 존재하는 파일 (txt 또는 xml)이 서버 측 코드에 의해 편집 될 디렉토리의 파일 : 640 또는 600
    • (웹 서버가 때때로 수정하지 않고이를 표시할지 여부에 따라 다름)

최소 디렉토리 권한은 다음과 같습니다.

  • 사용자가 정적 파일 (images / swf / js 파일)을 업로드 한 디렉토리는 다음과 같습니다. 750
  • 관리자가 정적 파일 (images / swf / js 파일)을 업로드 한 디렉토리 : 750
  • 응용 프로그램에 사용 된 라이브러리가있는 디렉토리 : 500 (또는 550) [최소 510 이상이어야 함]
  • 실행 가능 / 탐색 가능한 서버 측 스크립트가 상주 할 디렉토리 : 500 (또는 550) [최소 510 이상이어야 함]
  • 서버 측의 코드로 기존 파일 (txt 또는 xml)을 편집 할 디렉토리 : 750 또는 700
    • (웹 서버가 여기에서 파일을 제공할지 여부에 따라 때때로 수정되지 않음)

다시 한번-웹 서버는 액세스해야하는 디렉토리 위에있는 모든 디렉토리에 대해 '실행'권한을 가져야합니다. 따라서 웹 서버가 지정된 디렉토리에서 파일을 제공하지 않더라도 실행 권한을 부여해야합니다.

웹 서버에 대부분의 파일에 대한 읽기 액세스 권한을 부여하는 것이 일반적입니다 (그래서 500에서 550으로 변경). 기본 '안전한'권한은 일반적으로 디렉토리의 경우 755, 파일의 경우 644입니다. 실행 권한은없고 모든 사람이 읽을 수 있으며 사용자 만 쓸 수 있습니다. Linux 시스템의 파일 대부분에는 이러한 권한이 있습니다.

'기타'권한은 소유자 또는 그룹이 아닌 시스템 사용자 (즉, 나머지 모든 시스템 사용자)를 나타냅니다. '기타'권한을 제한적으로 유지하는 것이 좋습니다. 이러한 사용자는 알 수 없으므로 명시 적으로 권한을 부여하지 않은 것입니다. 다른 권한은 손상된 시스템에서 가장 쉽게 활용할 수있는 경우가 많습니다 (예 : / tmp가 일반적인 대상인 이유 중 하나).

위의 맥락에서, 나는 당신의 마지막 두 가지 질문이 그와 관련이 있다고 생각하지 않습니다. 디렉토리 권한을 550으로 설정하고 파일 권한을 440으로 설정 한 다음 응용 프로그램에서 쓸 디렉토리에 대해 사용자에게 쓰기 권한을 부여하십시오 (예 : 디렉토리 : 750; 파일 : 640).

(파일을 업로드하려면 쓰기 권한이 있어야합니다. 그러나 원하는 경우 나중에 소유자 만 쓸 수있는 디렉토리에 누군가가 글을 쓰고있는 경우 계정을 손상시킬 수 있습니다. 제한적인 권한을 유지하는 이유).


@Iain : 당연히-그 순간에 파일 권한을 생각하고 있었으며-고칠 것입니다.
cyberx86

1

작업을 수행하기위한 최소 권한 세트를 갖는 것이 일반적입니다. 웹 서버와 사용자가 공통 그룹을 공유하는 경우에 액세스 권한을 부여 할 필요가 없습니다 o. 권한은 사용자와도 관련이 있습니다. 8 진 권한을 잘못 이해 한 것 같습니다.

  1. 555는 r-xr-xr-x아닙니다 rw-rw-rw. 그런 다음 파일을 만들거나 삭제하는 디렉토리 x이므로 750 rwxr-x---을 시작하기에 좋은 장소가되도록 설정 해야합니다 . 이를 통해 디렉토리를 소유 한 사용자가 파일을 추가 / 제거 할 수 있으며 공통 그룹의 모든 사용자가 파일에 액세스 할 수 있습니다.
  2. 위의 1과 동일합니다.
  3. 이들이 실제로 정적 파일 인 경우, 050은 웹 서버 액세스를 제공하지만, 처음에 파일을 생성하기 위해 750은 최소 일 것이다.
  4. 위의 3과 동일합니다.
  5. 070은 웹 서버가 파일을 읽고 변경할 수있는 최소값이지만 770이 더 현실적 일 수 있도록 파일을 작성해야합니다.

웹 서버가 파일을 읽기 위해 디렉토리에 대한 실행 권한이 필요하지 않습니까 (포인트 1 (740?), 3, 5)?
cyberx86

도! 실제로 파일에 액세스하려면 x가 필요합니다. r 그냥 파일을 나열 할 수있게 해줍니다.
user9517

0

일반적으로 디렉토리에서 모드 0755, 0775 또는 2775를 사용합니다 (파일 시스템에 BSD 시맨틱이 마운트 된 경우 디렉토리, BSD 및 Linux의 경우 SGID 비트는 새 파일의 그룹 연관이 상위 디렉토리 설정이 아닌 상위 디렉토리 설정과 일치 함). 파일 작성자의 기본 GID). 이를 통해 모든 사용자는 해당 디렉토리를 탐색하고 (chdir을 통과하고) ls 명령을 실행하거나 readdir / read 시스템 호출을 수행 할 수 있습니다. 대안은 디렉토리에 그룹 / 쓰기 옵션을 추가하고 SGID 비트를 디렉토리에 추가하면 모든 파일과 하위 디렉토리를 적절한 그룹과 연관시킬 수 있습니다.

파일의 경우 일반적으로 0644 또는 가능하게 0664 (세계 읽기 가능 및 그룹 쓰기 가능 여부)를 사용합니다. 분명히 CGI 스크립트와 바이너리에 대해서는 x 비트를 추가해야합니다. 매우 특수하게 테스트 된 바이너리가있는 특별한 상황에서는 SUID 또는 SGID 비트를 추가 할 수 있습니다. 일반적으로 UNIX 및 Linux는 스크립트에서 SUID / SGID 비트를 무시하고 컴파일 된 기본 실행 바이너리에 대한 의미 만 존중합니다. 그러나 웹 서버가 해석 된 스크립트에서도 SUID / SGID 비트를 존중하도록하는 데 사용할 수있는 "setuidhack"과 같은 일부 모듈을 사용하여 Apache와 같은 사이트에서 사이트를 실행하고있을 수 있습니다. (이것은 각 파일을 HTTP 데몬 stat ()하고 자체 사용자 정의 fork () / execve () 코드를 사용하여 수행되며, 단순히 실행 파일을 전달하는 대신 올바르게 해석기 문자열을 execve () 벡터에 삽입합니다. '

이것들은 가장 일반적인 지침입니다. 모든 상황에 "완벽한"것은 아니며 설치 및 구성중인 웹 서버 및 웹 응용 프로그램 또는 프레임 워크에 대한 문서를 반드시 참조해야합니다. 파일, 코드 또는 서버를 공개 인터넷에 노출하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.