일반적인 PHP 설정이 불안정합니까?


10

나는 대학의 시스템 관리 부서에서 일하면서 아마도 흔한 일을 우연히 발견했지만 꽤 충격적이었습니다.

모든 public_html 디렉토리 및 웹 영역은 웹 서버에 대한 읽기 권한과 함께 afs에 저장됩니다. 사용자는 public_html에 PHP 스크립트를 사용할 수 있으므로 PHP (및 기본 웹 파일)에서 서로의 파일에 액세스 할 수 있습니다.

이로 인해 .htaccess 비밀번호 보호가 완전히 쓸모 없게 될뿐만 아니라, 사용자는 mysql 데이터베이스 비밀번호와 유사한 민감한 정보가 포함 된 PHP 소스 파일을 읽을 수 있습니다. 또는 다른 사람이 웹 서버가 쓰기 액세스 권한을 가진 디렉토리 (예 : 개인 로그 또는 제출 된 양식 데이터 저장)를 가지고있는 디렉토리를 발견하면 해당 계정에 파일을 저장할 수 있습니다.

간단한 예 :

<?
  header("Content-type: text/plain");
  print file_get_contents("/afs/example.com/home/smith/public_html/.htpasswd"); 
?>

이것이 일반적인 문제입니까? 일반적으로 어떻게 해결합니까?

최신 정보:

입력 주셔서 감사합니다. 불행히도 간단한 대답이없는 것 같습니다. 이와 같은 대규모 공유 환경에서는 사용자에게 이처럼 많은 선택권이 주어지지 않아야합니다. 내가 생각할 수있는 가장 좋은 방법은 모든 "public_html"디렉토리의 기본 구성에서 "open_basedir"을 설정하고 suphp를 실행하고 깨끗한 PHP 만 허용하는 것입니다 (cgi 스크립트 없음, 백틱으로 외부 명령 실행 등).

이와 같은 정책을 변경하면 많은 문제가 발생하고 사용자가 자신의 갈퀴를 잡고 우리를 쫓아 갈 수 있습니다 ... 설정 변경 방법에 대한 결정을 내리면 동료와 논의하고 업데이트 할 것입니다.


이것은 흥미로운 질문입니다. 주요 공유 호스팅 제공 업체 (예 : DreamHost)를 확신하지만 불가능합니다. 그러나 나는 그들이 이것으로부터 어떻게 보호하는지에 관심이 있습니다. cstamas가 언급했듯이 suphp는 좋은 해결책처럼 보이지만 대부분의 호스팅 제공 업체가 사용하는 것입니까?
Lèse majesté

1
open_basedir프로덕션 공유 호스팅 시스템에서 아래 의 솔루션을 사용 했지만 모든 사람을 자체 호스트로 분할했습니다. 단일 디렉토리에서 작동하는지 확실하지 않습니다 ...
voretaq7

답변:


8

소유자의 uid로 PHP 스크립트를 실행하는 suphp를 사용할 수 있습니다.

http://www.suphp.org


이것은 아마도 위의 문제를 해결하지 못할 것입니다 (적어도 공유 호스팅 환경에서 .htpasswd 파일은 일반적으로 사이트 및 그룹 (apache) 또는 세계 (사용자가 보안에 대해 모르거나 신경 쓰지 않기 때문에)을 소유 한 사용자가 소유합니다. suphp를 사용하더라도 파일을 읽을 수 있습니다.)
voretaq7

@ voretaq7 : 다른 몇 가지 제한 사항이 적용될 수 있습니다. 내가 기억하는 한, 소유하지 않은 파일에 대한 액세스를 거부 할 수도 있습니다. 따라서 이것은 위의 공격을 배제합니다.
cstamas

파일에 대한 권한 ( "그룹 / 다른 사람 / 누구가 쓸 수 없음")을 제한 할 수 있다는 것을 알고 있지만 FS 권한 이외의 읽기를 차단하는 방법을 모르겠습니다. 그것들은 check_vhost_docroot있지만 AFAIK는 실행중인 스크립트에만 적용됩니다 (? 나는 틀릴 수 있습니다)
voretaq7

1
suphp가 이와 같은 환경에서 좋은 솔루션인지 확실하지 않습니다. 사용자에게는 www 사용자에게없는 모든 종류의 권한이있을 수 있습니다. PHP를 통해 침입자를 발견 한 공격자는 ssh 키 또는 키탭을 찾거나 사용자의 로그인 스크립트를 변경하여 백도어를 만들 수 있습니다. "vhosts"설정은 기본 가상 호스트의 "/ ~ username"을 통해 public_html 디렉토리를 사용할 수 있으므로 유용하지 않습니다. public_html의 스크립트를 완전히 비활성화해야한다고 생각합니다.
Pontus

4

내 제안은 ( open_basedir호스트 단위로 및 유사한 지시문을 통해) 파일에 대한 PHP의 액세스를 제한 하는 것입니다. 예를 들어 htpasswd파일을 저장하는 디렉토리는 아닙니다 .

다음과 같은 디렉토리 구조 :

/Client
    /auth
    /site
        /www_root
        /www_tmp

이 요구 사항을 충족시킬 open_basedir수 있습니다. /Client/site안전하게 가리킬 수 있고 htpasswd파일을 저장할 수 있습니다 /Client/auth( .htaccess파일을 사용하거나 httpd.conf대신 적절한 위치를 가리 키도록 수정).
오프닝 다른 사람이 파일을, 그리고 혜택으로 악의적 인 사용자가에서 물건을 읽을 수 없습니다에서이 클라이언트를 방지 /Client/auth같은 시스템에 (또는 다른 것을 /etc/passwd:-)

open_basedir 및 호스트 별 구현에 대한 자세한 내용 은 http://php.net/manual/en/ini.core.php 를 참조 하십시오 .


1
suphpcstamas가 지적한 것처럼 공유 호스팅 환경에서도 정말 좋은 아이디어입니다. 설정하는 데 약간의 오버 헤드가 있지만 보안 이점은 그만한 가치가 있다고 말합니다. FreeBSD Jail이나 보안 상 가장 큰 승리 중 하나 인 전용 가상 머신과 같은 방식으로 모든 PHP 사이트를 샌드 박싱하지 않습니다.
voretaq7 2016 년

"public_html"이 자체 가상 호스트를 통해 제공되는 경우 "open_basedir"은 기본 웹 파일을 사용자 웹 파일과 분리하는 간단한 방법 인 것 같습니다. 그러나 자체 가상 호스트가 없기 때문에 사용자를 서로로부터 보호하지 않습니다. 권리?
Pontus

open_basedir<Directory> 지시문 내에서 설정을 시도 하지는 않았지만 허용되어야한다고 생각합니다 ( "시도해보십시오"-최악의 경우 작동하지 않습니다 :)
voretaq7

1
지금까지 open_basedir은 대부분의 상업용 웹 호스트가 사용하는 것 (보통 가입자는 자신의 유료 도메인을 가지고 있거나 무료 하위 도메인을 받음)처럼 보이지만 학술 기관과 같은 디렉토리 기반 홈페이지의 경우 suphp가 가장 적합합니다.
Lèse majesté

1

대부분의 공유 호스트는 각 사용자의 public_html 디렉토리 (또는 각 사용자가 고유 한 vhost를 가지고있는 경우 vhost)의 htaccess 파일에서 open_basedir 구성을 정의하기 때문에 일반적인 문제는 아닙니다.

예 : .htaccess 파일 :

# Assuming these are not set globally - its good practice to limit:
  php_flag magic_quotes_gpc off
  php_flag magic_quotes_runtime off
  php_flag register_globals off
  php_flag short_open_tag off
  php_value max_execution_time 60

# These set the user-specific paths
  php_value open_basedir /afs/example.com/home/smith:/usr/share/php/include
  php_value session.save_path /afs/example.com/home/smith/tmp
  php_value upload_tmp_dir /afs/example.com/home/smith/tmp

그러나 사용자가 open_basedir을 변경하지 못하도록 .htaccess 파일에 올바른 권한을 설정했는지 확인하십시오 (subdir / .htaccess에서 재정의하려고 시도하면 작동하지 않아야하지만 아마도 테스트해야합니다) .

HTH

씨.


2
새 계정을 처음에 보호하는 데 도움이 될 수 있습니다. 그러나 사용자가 편집 할 수 없다는 사실은 .htaccess 파일 (public_html 디렉토리에 대한 쓰기 액세스 만 필요하므로 수행 할 수있는 파일)을 제거하고 자신의 파일을 작성하려는 유혹을 줄 수 있습니다. 각 사용자에 대해 기본 구성에 "<Directory>"블록을 추가하면 작동하지만 여기서는 여전히 PHP에서 외부 명령을 역행시킬 수 있습니다. 즉, open_basedir을 쉽게 우회 할 수 있습니다.
Pontus

@Pontus : 파일 삭제에 대한 좋은 지적 (afs가 불변 파일 속성을 지원하는지 확실하지 않습니다). chroot jail에서 웹 서버를 실행하면 모든 종류의 프로그램 실행 취약점으로부터 보호 할 수 있다고 말하면 +1을주었습니다.
symcbean

1

AFS는 단순한 유닉스 사용자 권한을 무시합니다. suPHP는 PHP 프로그램을 실행하기 전에 setuid를 실행하지만 AFS에 액세스하는 데 필요한 Kerberos 토큰을 프로세스에 제공하지 않으며 권한으로 제한되지 않습니다. suPHP는 토큰을 획득하기 위해 어떤 방식 으로든 사용자로서 AFS 시스템에 자신을 표시하기 위해 수정되어야합니다. 내가 아는 한, 그것은 이루어지지 않았습니다. (사실, 나는 다른 사람이 그렇게했는지를 볼 때이 질문을 발견했습니다.)

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