본문 바로가기
php

PHP 및 httpd.conf 내용중 기본적인 체크

by [김경민]™ ┌(  ̄∇ ̄)┘™ 2013. 8. 16.
728x90


[출처] http://l2j.co.kr/2433


참고 : http://www.ibm.com/developerworks/kr/library/l-tune-lamp-2.html

max_execution_time얼마나 많은 CPU-초를 스크립트가 소비하는지를 지정30
max_input_time얼마나 오랫동안(초) 스크립트가 입력 자료를 기다릴지를 지정60
memory_limit얼마나 많은 메모리를(바이트) 죽기 전에 스크립트가 소비할지를 지정32M
output_buffering얼마나 많은 자료를(바이트) 클라이언트에게 전달하기 전에 버퍼에 저장할지를 지정4096


Listing 1. prefork MPM을 위한 환경 설정

                
StartServers       50
MinSpareServers   15
MaxSpareServers   30
MaxClients       225
MaxRequestsPerChild  4000


Listing 2. 루트 디렉터리에 적용한 디렉터리 컨테이너

                
<Directory />
    AllowOverride None
    Options FollowSymLinks
</Directory>


Listing 3. 사용자 디렉터리로 FollowSymLinks를 제한하기

                
<Directory />
   Options FollowSymLinks
</Directory>

<Directory /home/*/public_html>
   Options -FollowSymLinks
</Directory>


Listing 4. .htaccess 환경 설정을 httpd.conf로 옮기기

                
<Directory /home/user/public_html/project/>
  AuthUserFile /home/user/.htpasswd
  AuthName "uber secret project"
  AuthType basic
  Require valid-user
</Directory>


Listing 5. .htaccess 점검 범위를 줄이기

                
<Directory />
  AllowOverrides None
</Directory>

<Directory /home/*/public_html>
  AllowOverrides AuthConfig
</Directory>


php.ini

# vi /usr/local/php/lib/php.ini

expose_php = Off
post_max_size = 200M
allow_url_fopen = Off
date.timezone = "Asia/Seoul"
open_basedir = "/tmp:/home/"
disable_functions=exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source
memory_limit=64M ; 32M 일 경우 XE Core 쉬운설치시 문제가 발생할 수 있습니다

Apache 연동

# vi /usr/locala/apache/conf/httpd.conf

&lt;ifmodule mime_module&gt; ... AddType application/x-httpd-php .php # 알아보기 쉬운데 아무데나 (html 파일도 적용하려면 문장끝에 '. html' 추가) ... &lt;/ifmodule&gt;


설정 인자권장값요약 설명
register_globalsOff이 값을 On으로 설정하면 PHP가 입력으로 받아들이는 값(환경 변수, GET, POST, 쿠키, Server 변수)을 무조건 전역(Global)변수로 다루게 됩니다. 전역 변수가 고전적인 C 프로그램에서 얼마나 많은 버그를 발생시켰는지 상기한다면, 이 값을 Off로 설정하는 것이 왜 바람직한지 짐작할 수 있을 것입니다. 전역 변수는 프로그램의 동작 중 어디서나 변수값이 바뀔 수 있기 때문에, 웹 프로그램의 인자 조작, 예기치 못한 오동작 등 다양한 보안 문제가 발생할 수 있습니다. PHP 4.2.0 이후로는 보안상의 문제를 고려해 디폴트로 Off로 설정되어 나오지만, 아직 많은 프로그램이 On 상태에서만 작동하도록 개발되어 있어 서버 관리자들이 On으로 변경하는 경우가 많습니다. On 값에 의존하는 프로그램이 있으면 개발자에게 해당 문제를 알리고 수정을 요구하시는 것이 바람직합니다.
safe_modeOn이 값을 On으로 설정하면 PHP에 의한 파일 액세스 시 권한을 점검합니다. 웹 프로그램이 /etc/passwd 등 주요 시스템 파일을 액세스 하지 못하도록 제한할 수 있으나, 이로 인해 웹 프로그램이 정상 작동하지 않을 수 있으니 주의하여야 합니다.
safe_mode_gidOff위의 설정과 함께 파일 액세스 시 권한을 점검합니다. 이로 인해 웹 프로그램이 정상 작동하지 않을 수 있으니 주의하여야 합니다.
expose_phpOff웹 브라우저의 요청에 대해 PHP 정보를 보내지 않습니다. 그러나 PHP 확장자 설정을 변경하는 등 추가적인 조치를 취하지 않는다면, 여러분이 PHP를 사용 중이라는 사실이 손쉽게 노출될 수 있으므로 보안상 큰 도움이 되지 않습니다.
file_uploadsOff해당 사이트의 PHP 프로그램들이 파일 업로드를 필요로 하지 않는다면 이 값을 Off로 설정하여, 파일 업로드 공격의 발생 가능성을 낮출 필요가 있습니다. 파일 업로드를 통한 사이트 장악은 매우 빈번하게 발생합니다.
allow_url_fopenOff이 옵션을 On으로 설정하면 파일 액세스 시 외부 사이트의 파일을 불러올 수 있습니다. 이 기능은 분산 컴퓨팅과 개발, 관리 측면에서 매우 편리하지만, 외부 공격자에 의해 서버를 침탈당하게 되는 주요 원인이 되어 왔습니다. 특히 include(), require() 계열의 함수 사용시 심각한 보안 상의 문제를 유발하게 됩니다. 특수한 경우를 제외하고는 이 기능이 필요치 않으므로 이 옵션을 반드시 Off로 설정하시기 바랍니다.
magic_quotes_gpcOn이 옵션을 On으로 설정하면 PHP가 입력으로 받아들이는 값(환경 변수, GET, POST, 쿠키, Server 변수)에 단일 인용 부호('), 이중 인용 부호(&quot;), 백슬래쉬(\), 널문자(NUL)가 포함된 경우 자동으로 해당 문자 앞에 백슬래쉬를 추가하여 특수 문자 처리를 합니다. 이로 인해 웹 프로그램의 인자를 변경하는 SQL 구문 삽입(injection) 공격의 성공률을 낮춰줍니다. 이 값을 Off로 설정하면 /etc/passwd%00 과 같이 널 문자를 사용해 시스템 상의 임의의 파일을 열람할 수 있으니 반드시 On으로 설정하여야 합니다.
magic_quotes_sybaseOffSybase 사용자의 정상적인 DB 접속을 위해 만들어진 기능이지만, 이 기능은 magic_quotes_gpc 설정을 무력화합니다. 여러분이 Sybase 사용자가 아니라면 반드시 이 값을 Off로 설정하여야 합니다.
Sybase 사용자는 PHP가 입력으로 받아들이는 모든 변수에 대해 addslashes() 함수를 사용하여 명시적으로 특수 문자 처리를 하여야 합니다.
open_basedir디렉터리이 옵션에 적절한 디렉터리를 설정하면, PHP의 파일 액세스 시 지정된 디렉터리(및 하위 디렉터리)를 벗어난 파일은 액세스 할 수 없게 됩니다.
safe_mode_exec_dir디렉터리이 옵션을 지정하면 system(), exec(), passthru() 등 외부 명령어 실행 시 지정된 디렉터리에 존재하지 않는 프로그램은 실행할 수 없게 됩니다. 공격자가 임의로 업로드한 공격 도구나 wget, xterm 등 공격에 사용될 만한 명령어를 실행할 수 없도록 막을 수 있습니다.
display_errorsOff이 옵션을 On으로 설정하는 경우 PHP 실행 중 발생하는 에러 정보가 사용자 브라우저에 반환됩니다. 이 정보에는 웹 서버 상의 절대 경로, SQL 쿼리 등 공격자에게 유용한 정보가 포함되어 있으므로, 반드시 이 값을 Off로 설정하여야 합니다.
log_errorsOn이 옵션을 On으로 설정하는 경우 PHP 실행 중 발생하는 경고나 에러 정보를 error_log 에서 지정한 파일에 기록하게 됩니다. 해당 파일에 기록할 수 없는 경우 아파치 웹 서버의 에러 로그 파일에 기록하게 됩니다. 프로그램의 동작 상태 및 공격자의 공격 동향을 파악하기 위해서 반드시 On으로 설정하여야 합니다.
error_log파일명PHP 실행 중 발생하는 경고나 에러 정보를 기록할 파일을 지정하는 옵








## 일반적인 구성


PHP 의 일부 일반 기능 및 내장된 기능들에 영향을 미치는 몇 가지 구성 매게변수들에 대하여 알아보기로 하겠습니다.


■ auto_append_file String


메인 파일 다음에 자동으로 분석되는 파일 이름을 String 에 지정한다.
이렇게 지정된 파일은 include() 함수로 호출된 것 처럼 포함된다.
특수값인 none 은 자동 추가 기능을 중지 시킨다.
만약 스크립트가 exit() 로 종료된다면 auto-append 작업이 수행되지 않는다.
이 명령어는 특정 웹 사이트에 정형화된 모습과 느낌을 주고자 PHP가 페이지를 생성할 때 유용하다.
이 스크립트는 각 페이지마다 꼬리말을 포함할 때 사용할 수 있다.


 


auto_append_file = "/path/to/script/footer.php"



■ auto_prepend_file String


메인 파일보다 먼저 자동으로 분석되는 파일 이름을 String 에 지정한다.
이렇게 지정된 파일은 include() 함수로 호출된 것 처럼 포함된다.
특수값인 none 은 auto-prepend 기능을 중지 시킨다.


이 명령어는 앞서의 스크립트에서처럼 동일한 종류의 시나리오에서 유용하다.
단지, 차이점이라면 모든 페이지에 표준 머리말을 생성하는 데 사용할 수있다는 점이다.


■ doc_root String


가상 파일 트리의 루트를 정의하며,
그 루트의 하위에 있는 파일들은 안전 모드에서 실행될때 PHP에 의해서만 서비스된다.
이 매개변수는 빈 값이 아닌 값을 가져야 하며, 그렇지 않은 경우에는 무시된다.


웹 서버의 실제 파일 시스템 트리의 특정한 하위 트리로 PHP를 제한하는 것은
보안상의 관점에서 본다면 매우 차이점이 많다.


■ engine Boolean


PHP가 아파치 모듈 버전인 경우에만 실제로 유용한 명령어이다.


디렉토리 단위로 또는 가상 서버 기반 단위로 PHP Paser 기능을 켜고 끄는 사이트에서 사용된다.
httpd.conf 파일의 적당한 위치에서 engine 를 On, Off 로 설정하면 PHP는 가능하게 되거나
불가능 하게 된다.


httpd.conf


 


<VirtualHost sample.com>
 ServerName www.sample.com
 DocumentRoot /home/sample/public_html


 php_value engine Off
</VirtualHost>



위와 같은 형식으로 사용할 수 있다.


■ open_basedir String


PHP 스크립트들이 특정한 디렉토리 트리나 디렉토리 트리 세트에 있는 파일들로만
엑세스 하도록 제한하기를 원하는 경우가 있을 것이다.
인수 String 은 엑세스를 허용하는 디렉토리나 디렉토리들의 리스트를 지정한다.
모든 상징적인 링크들이 사라지므로 이러한 제한 사항을 피하기 위해 symlink를 사용하는 것이 불가능하다.


특수값 '.' 은 스크립트가 저장되어 있는 디렉토리가 기본 디렉토리로 사용될 것이라는 의미한다.
Windows 의 경우에 String 에 여러개의 디렉토리들을 입력할때에는
각각의 디렉토리들을 콜론(:)으로 구분한다.
아파치 모듈인 경우, 상위 디렉토리들로부터의 open_basedir 경로는 이제 자동적으로 상속된다.
기본은 모든 파일들이 열리는 것을 허용하는 것이다.


■ gpc_order String


HTML 서식을 처리하는 PHP 스크립트들은 이러한 서식으로부터 변수들을 엑세스할 수 있다.
서식들은 GET, POST 메소드에 의해 제출될 것이다.
또한, 쿠키들도 변수들을 스크립트로 전달한다.
GET, POST 그리고 쿠키들로부터변수들이 분석되는 순서는 hpc_order 명령에 의해 주어진다.
인수 String 은 G, P 그리고 C 중에서 하나나 둘, 또는 셋 모두의 조합으로 이루어진다.


예를 들어, 만약 gpc_order = GCP 라면 COOKIE 변수와 동일한 이름의 POST 변수는 COOKIE 변수로서
더높은 우선순위를 가지게 되며, POST 변수는 무시된다.
이러한 순서는 GET,POST,COOKIE 변수 분석의 순서를 결정한다.


이 명령의 기본 설정값은 "GPC" 이다.


예를 들어, "GP" 로 설정되는 경우에 PHP는 쿠키들을 완전히 무시하고
어떤 GET 메소드 변수들을 동일한 이름의 POST 메소드 변수들을
동일한 이름의 POST 메소드 변수들로 겹쳐쓰기할 것 이다.


■ include_path String


require(), include(), fopen_with_path() 함수들이 파일들을 찾는 디렉토리들의 리스트를 지정한다.
대부분의 시스템에서 String 의 형식은 PATH 환경 변수와 유사하다.


즉, UNIX에서는 콜론(:)으로, Windows 에서는 세미콜론(;)으로 디렉토리들을 구분한다.


기본값은 현재 디렉토리를 의미하는 '.' 이다.


 


UNIX: "/path1:/path2"


include_path = ".:/php/includes"


Windows: "path1;path2"


include_path = ".;c:phpincludes"



■ max_execution_time Integer


파서에 의해 종료되기 전, 스크립트의 작업 허용 최대 시간을 초 단위로 설정한다.
이것은 무한 루프를 돌고 있는 스크립트들에 의해 서버가 다운되는 것을 방지한다.


■ memory_limit Integer


Integer 인수는 스크립트가 할당할 수 있는 메모리의 최대 용량을 바이트 단위로 설정한다.
이것은 잘못 작성된 스키립트가 서버의 메모리를 모두 잠식하는 것을 방지한다.


■ short_open_tag Boolean


PHP 스크립트들은 원래 <?php 와 ?> 태그 사이에 들어가지만,
단축 형식인 <? 와 ?> 태그 사이에 입력할 수도 있다.


만약 XML 지원기능을 사용한다면 이 옵션을 Off 로 설정해야 한다.
단축 태그가 XML 파서를 혼동하게 만드므로 XML 지원 기능을 사용하려면
원래의 형식으로만 스크립트를 사용해야 한다.


■ upload_tmp_dir String


인수 String 은 파일 업로드가 수행될 때 파일들을 저장하는 데 사용되는 임시디렉토리를 지정한다.
이 디렉토리는 사용자 PHP가 어떤 형식으로 수행되든지 간에 기록 가능해야 한다.
PHP 가 아파치 모듈인경우 아파치의 사용자 권한을 상속하며, 일반적으로 nobody 이다.


■ user_dir String


웹 서버는 일반적으로 각 사용자들이 자신의 홈 디렉토리들 아래에 자신의 웹 페이지들을
유지하는 것을 허용한다. (UNIX인 경우)
인수 String 은 PHP파일들을 위한 사용자의 홈 디렉토리에서 사용되는 디렉토리의 기본이름을 나타낸다.


예를 들어, 홈 디렉토리가 /home/okstart 인 사용자 okstart 가 있다고 가정하자.
만약 String 이 public_html 로 설정되었다면 그 사용자는 개인적인 스크립트들이나 페이지들을
/home/okstart/public_html 아래에 저장할 수있다.


## 전자메일 관련 구성


PHP 는 수많은 메일 엑세스 지원 기능들을 가지고 있다.
약간의 노력만 하면 IMAP(Interactive Mail Access Protocol)과 POP3(Post Office Protocol) 서버에 있는 전자메일을
엑세스하는 프로그램들을 작성할 수 있다.
그 기능들을 API 들을 통해 사용할 수 있지만, 행동을 설정하는 몇 가지 구성 파일 명령어들을 사용할 수도 있다.


■ SMTP String


이 명령어는 Windows 플랫폼상에 PHP를 설치한 경우에만 적용된다.


여기서 String 은 mail() 함수를 사용하여 메일을 전달하기 위해서 PHP 가 사용하는
SMTP 서버의 DNS 이름이나 IP 주소이다.


사용하는 서버(자신의 컴퓨터)에 SMTP 서버를 설치하였을 경우에는 localhost 를 입력하시고
그렇지 않을 경우에는 각각 사용하는 인터넷 라인의 ISP 업체의 SMTP 서버 주소를 입력합니다.


ISP별 SMTP서버는 다음과 같습니다.


 하이텔(Hitel): 
  smtp.hitel.net


 코넷(Kornet): 
  soback.kornet.net 
  mail.kornet.net 
  ppp.kornet.net


 천리안(Chollian): 
  mail.chollian.net 


 유니텔(Unitel): 
  203.241.132.90 


 나우누리(Nownuri): 
  mail.nownuri.net 


 아이프리(IFree): 
  mail.ifree.net 


 아이넷(I-net): 
  mail.nuri.net 


 두루넷(Thrunet): 
  smtp.korea.com 


 넷츠고(Netsgo): 
  netsgo.com 


 채널아이(Channel-i): 
  mail.channeli.net 


 신비로(Shinbiro): 
  mail.shinbiro.com 


 엘림넷(Elimnet): 
  elim.net 


 인터피아(Interpia): 
  pop3.interpia.net 


 키스코(Kisco): 
  203.233.144.1 


 미래텔(Miraetel): 
  miraetel.kornet.nm.kr 


 경기넷: 
  mail.kg21.net 


 하나로통신: 
  mail.hananet.net 


 에듀넷(Edunet): 
  edunet4u.net 


 보라넷: 
  mail.bora.net 


 드림라인: 
  mail.dreamx.net 


해당 되는 ISP 업체가 없거나 해당되지 않을 경우에는 공개 SMTP 서버를 사용하셔도 됩니다.


 공개 SMTP 서버: 
  203.252.32.3 
  211.40.177.184 
  211.45.135.11 
  210.182.173.132 
  211.32.116.33 
  210.119.132.13 
  163.152.3.17 
  sun.ms98.net 


메일 동작 확인 방법은 간단한 mail() 함수를 사용하는 프로그램을 이용해서 할 수 있습니다.


 


<?
 $to_mail = "메일주소";
 $to_title = "제목";
 $to_message = "메세지";
 
 $ret = mail($to_mail, $to_title, $to_message);


 if( $ret )
 {
  echo "메일 전송 성공";
 }
 else
 {
  echo "메일 전송 실패";
 }
?>



■ sendmail_from String


이 명령어는 Windows 플랫폼 상에서 PHP 를 설치한 경우에만 적용된다.


String 은 PHP 스크립트로부터 전달되는 메일에 사용되어야 하는 "From:" 메일 주소를 결정한다.


■ sendmail_path String


이 명령어는 UNIX 플랫폼 상에서 PHP 를 설치한 경우에만 적용된다.


String 은 시스템상에서 실행할 수 있는 sendmail 의 경로를 결정한다.
일반적으로, sendmail의 위치는 /usr/sbin/sendmail 이나 /usr/lib/sendmail (UNIX 상에서)이지만,
그 밖의 다른 위치에 설치한 경우에는 sendmail의 경로를 지정해야 한다.
sendmail과 유사한 qmail 도 이 명령어로 경로를 지정할 수 있다.


 


sendmail_path = "/usr/sbin/sendmail -t -i"


 


 



## 에러 메세지 관련


■ error_log String


String 은 스크립트에 의해(PHP 자체가 아닌) 생성된 오류들을 기록하는 파일을 지정한다.
만약 특정값 syslog 가 사용되었다면 오류들은 대신 시스템의 로거(logger)로 보내진다.


■ error_reporting Integer




AddType application/x-httpd-php .php : .php 확장자를 php 타입으로 실행

 

AddType application/x-httpd-php .html : .html 확장자를 php 타입으로 실행

 

AddType application/x-httpd-php .inc : .inc 확장자를 php 타입으로 실행

 

AddType application/x-httpd-php-source .phps : .phps 확장자들은 php 소스를 보게 한다.

 

AddHandler : 특정 파일 확장자는 처리기에 연결하거나 특정 파일 타입에 특정 동작 연결을 설정한다. 서버 안에 있거나 또는 action 명령을 사용해서 추가 가능한다.

 

Action : 매칭되는 파일이 불려질 때마다 해당 미디어 타입에 맞는 스크립트를 실행할 수 있다. 이 설정은 자주 사용되는 CGI 파일 프로세스에 대해 반복적으로 URL을 사용하지 않아도 된다.

 

MetaDir, MetaSuffix : MetaDir는 아파치 메타 정보 파일을 찾을 디렉토리 이름이다. 이 파일에는 문서를 보낼 때 추가할 추가 HTTP 헤더 정보가 있다. MetaSuffix는 메타 정보를 가지고 있는 파일의 접미어를 설정한다.

 

Customizable error response : 존재하지 않는 페이지를 요청 받을 경우 또는 해당 디렉토리의 퍼미션이 없을 경우 보여주는 에러 메시지 설정이다.

 

BrowserMatch : HTTP 응답 방식을 수정한다. 첫 번째 지시자는 넷스케이프 2.x와 유사한 브라우저에 대해 KeepAlive 기능을 사용하지 못하게 하는 설정이다. 두 번째 지시자는 HTTP/1.1을 잘못 구현하며 301, 302 응답에 대해 KeepAlive을 제대로 지원 못하는 MS익스플로러4.0ㅠ2를 위한 설정이다.

 

BrowserMatch : HTTP/1.1 응답도 제대로 처리하지 못해 HTTP/1.1 스팩을 위반하는 브라우저에 대해 HTTP/1.1 응답을 하지 않게 하는 설정이다.

 

erver-status, server info reports : 서버 상태 정보를 허용할 servername을 적어준다. server status 방법은 http://servername/server-status이다. 여기서 servername을 적절히 바꾸어 사용하면 된다. server info 방법은 http://servername/server-info이다.

 

버그 이용 방지 : 이전 1.1 버전에서 있던 버그를 악용하려는 사람이 있는데 #을 제거하면 버그를 이용한 공격이 있을 때 phf.apache.org상의 기록 스크립터로 방향 전환을 시키게 한다. 또 다른 방법은 직접 support/php_abuse_log.cgi 스크립트를 이용해 자신이 저장하는 것이다.

 

Proxy Server : 프록시 서버 사용을 설정하는 부분이다. 프록시 서버 모듈을 포함했을 경우 #을 제거하면 프록시 서버 사용이 가능하다.

 

ProxyVia : HTTP/1.1 <Via:> 헤더를 처리할지 여부를 설정하는 부분이다.

 

cache : 캐시 기능을 enable하기 위해서는 #을 제거한다

728x90

댓글