메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

PHP 설치와 보안

한빛미디어

|

2001-05-24

|

by HANBIT

12,633

By 대럴 브록든(Darrell Brogdon), 역 한빛 리포터 1기 이호재
PHP는 쉬운 사용법과 강력한 기능으로 인해 웹 스크립트 언어 중 가장 인기 있다. 많은 사람들이 사용하다 보니 거기에 따른 문제도 생기기 마련인데, 그 중에서도 보안에 관련된 문제가 가장 중요하다고 할 수 있다. 공개해서는 안되는 정보를 공개하는 것은 해당 사이트에 있어서 가장 치명적인 일이기 때문이다. 많은 사람들이 PHP의 사용법을 익혀서 작동하는 것만을 보고 기뻐한다. 이는 개발자의 보안에 대한 인식 부족과 개발 시간의 촉박함, 보안 관련 문서나 정보의 부족 등이 그 원인일 수 있다. 이 글이 보안에 관한 모든 것을 다룰 수는 없지만, 보안에 대해서 생각해 볼 수 있는 계기는 마련해 줄 수 있을 것이다.
이번 기사에서는 PHP와 관련된 보안 문제에 대해서 얘기하고자 한다. PHP는 매우 강력하고 종합적이며 안전한 언어이지만 주의해야 할 점이 있다. PHP는 아파치 모듈로 가장 널리 사용되고 있고, 아파치는 적절하게 설정하면 매우 안전한 환경이므로, 보안 모델의 많은 부분을 아파치에서 가져온다. 하지만 PHP를 CGI로 사용하는 경우에 이러한 이점이 사라진다. 보안을 고려할 때 개발자의 필요성도 고려하는 것이 현명하다. 필자의 친구 중 한 명은 "안전한 컴퓨터는 네트워크에 연결되어 있지 않고 전원도 연결되어 있지 않은 컴퓨터뿐"이라고 즐겨 말한다. 또한 웹 서버에 대해서도 같은 생각을 하고 있는 몇몇 시스템 관리자를 알고 있다. 그들은 보안에 대해서 너무나도 열광적이어서(물론 옳은 일이지만) 실질적으로 시스템을 쓸모없게 만든다. 이번 기사는 OS에 상관없으므로, 유닉스는 물론 윈도우에도 적용될 수 있다. 이제 자세히 살펴보도록 하자 아파치 모듈로서의 PHP 보안 PHP를 아파치 모듈로 돌리고 있다면, 아파치 서버가 "nobody"나 "www"등의 신뢰된 사용자 권한으로 실행되기 때문에, 대부분의 보안 문제는 생각할 필요가 없다. 하지만 아파치를 루트(root) 권한으로 실행하고 있다면, 당장 멈춰야 한다. 컴퓨터에서 루트는 막대한 권한을 갖는데, 아파치에서는 이러한 권한이 필요 없기 때문이다. 만약 사악한(또는 멍청한) 사용자가 rm -rf /*.*을 웹 페이지에서 실행해서 모든 파일을 완전히 지워 버려도 속수무책인 것이다. PHP는 복수의 도메인과 각 도메인당 다수 사용자가 있는 가상 호스팅 환경에서 많이 쓰인다. 이러한 상황에서는 하나의 가상 도메인 사용자가 PHP 스크립트를 이용하여 다른 사람의 파일을 훔쳐볼 수 있다는 문제가 발생한다. 이는 아래와 같은 간단한 스크립트로 쉽게 일어난다.
read()) {
    echo $entry . "
"; } $parent->close(); ?>
이제 이 스크립트를 실행시킨 사용자는 다른 가상 도메인의 모든 디렉토리를 볼 수 있고 $location을 조금만 변경하면 그 디렉토리 안의 모든 파일을 볼 수 있다. 이러한 프라이버시의 침해를 막기 위해서 php.ini 파일 안에서 safe_mode, doc_root와 user_dir 지시자를 살펴보아야 한다. safe_mode를 on 시키고 doc_root와 user_dir을 정의함으로써, 한 사용자는 자신의 가상 호스트 디렉토리 안의 파일만을 접근할 수 있게 되어, 위에서 말한 문제를 해결할 수 있다. 아래는 세 가지 지시자를 어떻게 설정하는지 그 예를 보여주는 것이다.
safe_mode = On
doc_root = /usr/local/apache/htdocs
user_dir = /home/jdoe/htdocs
역자주 : doc_root는 php 함수가 이 디렉토리 안의 파일만을 접근할 수 있도록 제한하는 기능이다. 예를 들면, /etc/passwd 파일 등은 doc_root나 그 서브디렉토리 아래에 존재하지 않기 때문에 php 함수가 접근할 수 없다. user_dir은 doc_root에는 포함되어 있지 않지만 사용자의 웹 서비스를 위해 사용자의 특정 디렉토리 안의 파일에 접근할 수 있도록 하는 기능이다. CGI로서의 PHP 보안 PHP를 CGI로 실행하는 것은 위와는 아주 다르다. CGI 바이너리(binary)가 아파치 내에서 컴파일되지 않기 때문에, 독립적인 사용자의 독립적인 프로세스로 실행이 된다. 그래서 주의하지 않으면, 공개하고 싶지 않은 정보를 제공할 수도 있다. 이때는 우선 CGI 바이너리(보통 php.cgi)를 웹 디렉토리 밖에 두어야 한다. 만약 바이너리가 /usr/local/bin같은 곳에 있다면, script-kiddie가 /etc/passwd와 같은 보안 파일을 볼 수 있는 위험을 많이 줄일 수 있다. 하지만 이러한 방법은 모든 스크립트의 페이지 첫줄에 아래와 같은 내용이 있어야 한다.
#!/usr/local/bin/php
php.ini 파일에서 safe mode를 작동시킬 수도 있다. 아파치 모듈에서와 마찬가지로, 안전모드(safe mode) 역시 파일 소유권과 디렉토리 위치에 근거하여 PHP의 몇몇 함수를 제한한다. safe mode를 on 시킴으로써 시작부터 PHP가 어떻게 동작할지를 결정할 수 있고, 보안에 있어 아주 능동적인 수단을 갖게 된다. 숨겨진 파일의 접근 권한을 획득하는 형태로 일반적인 공격이 이루어진다. 이는 위와 같은 방법으로 막을 수 있다. 사용자가 CGI 바이너리를 직접 호출하는 것을 막으려면, 아파치에서 CGI 방향재설정(redirect)을 해주면 된다. 아파치의 httpd.conf 파일에 아래와 같은 지시자를 첨가하기만 하면 된다.
Action php-script /cgi-bin/php.cgi
AddHandler php-script .php
이는 http://example.com/mywebdir/test.htm url을 http://example.com/cgi-bin/php/mywebdir/test.htm 로 재작성해주고 그 프로세스 내에서 /mywebdir에 대해 퍼미션 검사를 한다. 게다가 URL을 조금 짧게 할 수도 있다. 하지만 보안을 잘 아는 사람은 쉽게 뒤의 url을 부를 수 있다(그가 보길 원하지 않는 다른 문서들도 포함해서 말이다). 그러므로 다음과 같은 설정 옵션으로 PHP CGI 바이너리를 컴파일해야 한다.
--enable-force-cgi-redirect
여기에서 다시 php.ini 파일에 있는 doc_root와 user_dir 옵션을 설정한다. 이 작업은 꼭 필요하다. 요약 이번 기사를 통해서 보안 문제를 고려할 때 사용자가 해야할 일이 무엇인지를 살펴보았다. 또한 PHP에 국한된 보안 문제와 PHP를 설정할 때 알아야 할 점에 대해서도 살펴보았다. PHP 보안에 대한 더 많은 정보는 온라인 PHP 매뉴얼의 제 4장 보안편에서 볼 수 있다. 이번 기사가 성공적인 웹 서버를 만드는 데 올바른 방향을 제시해 주었으면 한다. 관련 도서 PHP 포켓 레퍼런스 아파치 포켓 레퍼런스 아파치 핵심 가이드 웹마스터 인어넛셀 2판 Apache: The Definitive Guide, 2nd Edtion PHP Pocket Reference Apache Pocket Reference WebMaster in a Nutshell, 2nd Edition
대럴 브록든(Darrell Brogdon)은 1996년부터 PHP를 사용해 왔으며, VA 리눅스 시스템(VA Linux Systems)의 소스포지(SourceForge) 웹 개발자이다. 이호재님은 한빛 리포터 1기로 활동 중입니다. 카드코리아 개발 실장으로 근무한 경험이 있으며, 지금은 서울대 지구환경시스템공학부(컴퓨터 공학)에 다니고 있습니다. 컴퓨터에 관련된 모든 분야에 두루 관심이 많으며, 요즈음엔 파이썬, MPI, PHP 등에 관심이 많다고 합니다.
TAG :
댓글 입력
자료실

최근 본 책0