본문 바로가기

해봐야 안다.OTL/PHP

php.ini 보안관련 옵션 설정


설정인자

권장값

요약설명

register_globals

Off

이 값을 On으로 설정하면 PHP가 입력으로 받아들이는 값(환경변수, GET, POST, 쿠키, Server 변수)을 무조건 Global변수로 다루게 된다. 전역변수는 프로그램의 동작 중 어디서나 변수값이 변경될 수 있기 때문에, 웹 프로그램의 파라미터 변조, 오동작으로 인한 보안문제가 발생할 수 있다. PHP 4.2.0이후로는 보안상의 문제를 고려해 디폴트로 Off로 설정되어 나오지만, 프로그램이 On상태에서만 동작하도록 했을 때는 반드시 수정하여야 한다.

safe_mode

On

이 값을 On으로 설정하면 시스템 중요파일(/etc/passwd)접근을 제한할 수 있으나, 이 때문에 웹 프로그램이 정상 작동하지 않을 수 있다.

safe_mode_gid

Off

위 설정관 관련되어 시스템 중요파일(/etc/passwd)접근을 제한 할 수 있으나, 이루 인해 웹 프로그램이 정상 작동하지 않을 수 있다.

expose_php

Off

웹 브라우저의 요청에 대해 PHP정보 노출을 방지한다.

file_uploads

Off

해당사이트의 PHP프로그램의 파일업로드를 사용하지 않는 경우 해당 값을 Off로 설정하여, 파일 업로드 공격을 차단할 수 있다.

allow_url_fopen

Off

해당 옵션을 On으로 설정하면 파일 액세스 시 외부 사이트의 파일을 호출할 수 있다. 특히 include(), require()계열의 함수 사용 시 심각한 보안상의 문제를 유발하게 되므로 반드시 Off로 사용한다. include _GET[$url]이런식으로 되어있을 때xxx.php?url=http://악성코드  요런식으로 될수도있다.

magic_quotes_gpc

On

해당옵션을 On으로 설정하면 PHP가 입력으로 받아들이는 값(환경변수, GET, POST, 쿠키, server변수)에 단일 인용부호(‘), 이중인용부호("), 백슬러시(\), 널문자가 포함된경우 자동으로 해당문자앞에 백슬래시를 추가하여 특수문자를 처리한다. 이것으로 웹 프로그램의 인자를 변경하는 SQL 구문삽입등을 차단할 수 있다.

magic_quotes_sysbase

Off

sysbase사용자의 정상적인 DB접속을 위해 만들어진 기능이며, 해당기능은 magic_quotes_gpc설정을 무의미하게 만들수 있으므로 sysbase사용자가 아니라면 off로 설정한다.

open_basedir

Directory

해당옵션에 특정디렉토리를 설정하면, 지정된 디렉토리내에서만 파일에 접근할 수 있다.

safe_mode_exec_dir

Directory

해당옵션을 사용하면 system(), exec(), passthru()등 외부 명령어 실행시 지정된 디렉토리에 존재하지 않는 프로그램은 실행할 수 없게 된다. 임의로 업로드한 공격도구나 wget, xterm등 공격에 사용될 수 있는 명령어를 제한할 수 있다.

display_errors

Off

PHP실행 중 에러정보 노출을 방지하는 역할을 제공하므로 필수적이므로 Off설정하도록 한다.

log_errors

On

해당옵션을 On으로 설정하는 경우 PHP실행 중 발생하는 경고나 에러정보를 error_log에서 지정한 파일에 기록하게 되므로 의도적인 에러(SQL Injection)발생시도를 확인해 볼 수 있다.

error_log

파일명

PHP실행중 발생하는 경고나 에러정보를 작성할 파일을 지정하는 옵션이다.


[root@web2:/usr/local/http/conf]#vi php.ini

……………………………………………………………………………………………………………

338 safe_mode = On

531 display_errors = Off

695 register_globals = Off

344 safe_mode_gid = Off

431 expose_php = Off

874 file_uploads = Off

891 allow_url_fopen = Off

748 magic_quotes_gpc = On

379 ;open_basedir =

356 safe_mode_exec_dir =

552 log_errors = On

636 ;error_log = php_errors.log

à  637 error_log = /weblogs/php_error.log (위에서 만들었던 아파치 로그 디렉토리 위치)

……………………………………………………………………………………………………………

이렇게 되어있는지 확인하고 안되어있다면 바꾸어준다.

1. safe_mode On 일 경우 파일을 이 디렉토리 및 그 하위로부터 include 하는 경우는 UID/GID 의 체크가 스킵된다.

이러한 디렉토리는 include_path 에 포함되도록 하거나 또는 include 시에 절대 경로를 사용해야 한다.
exec
관련의 함수를 통해 실행할 수 있는 권한을 safe_mode_include_dir에 있는 실행파일만으로 설정한다.
safe_mode = Off ==> safe_mode = On

2. Error Page
또는 Warning Page 노출을 피하기 위한 것이다. 공격자들은 일부러 에러를 발생하여 서버에 대한 정보를 확인한다.
이를 막기 위해 아래와 같이 수정한다.
On
으로 했을시 웹사이트의 파일 정보나 데이타베이스 스키마등의 시큐리티 정보를 접속 사용자에게 표출 될 수도 있기 때문이다.
display_errors = On ==> display_errors = Off

3.
혹시라도 낮은 버전을 사용하는 경우는 이 부분이 디폴트로 On 되어있는데, 특별한 이유가 없다면 Off 로 설정하는 것이 좋다.
register_globals = On ==> register_globals = Off

4. Sql Injection
과 같은 공격을 막는데 도움이 된다. GET/POST/Cookie 의 입력 데이터에 관해서 특수 문자를 이스케이프 Get 방식으로 입력되는 ".." 는 일반적으로 필터링 하도록 설계되고 있다. 쉘에는 ".\./" ".."과 동일하게 간주된다.
특수문자에 대한 전체적인 제한이 필요하다.
magic_quotes_gpc = Off ==> magic_quotes_gpc = On

5. URL(
http:// ftp:// )
파일로서 취급할지를 결정한다.
많이 발생하고 있는 대규모 홈페이지 변조는 php의 외부사이트 소스 실행기능을 이용하여 악의적인 프로그램을 실행시킴으로써 발생시킴.
allow_url_fopen = On ==> allow_url_fopen = Off


필요시 특정 홈페이지만 외부 사이트의 소스 실행 허용
    ServerAdmin webmaster@xxx.xxx.xxx.
    DocumentRoot /home/xxxxx/public_html
    ServerName xxxxx.xxxxxxx
    php_admin_flag allow_url_fopen On               <----------
라인 추가
    ErrorLog logs/xxxx.xxxx-error_log
    CustomLog logs/xxxx.xxxx-access_log common

6.
에러처리
만일 php나 연결된 데이터베이스, 외부 프로그램등의 에러레시지가 임의의 사용자가 볼수 있도록 화면이 나타난다면, 시스템의 정보를 노출하기 때문에 공격의 수단이 될수 있다.
에러메세지를 보여주기 보다는 서버의 에러로그로 남기도록 서정을 바꿔준다,
기본으로 Off 로 되어있는데 혹시 모르니 아래와 같이 확인하도록 한다.
mysql.trace_mode = Off

7.
로그 파일에 에러로그를 기록한다. 실제 운영환경에서는 에러 표시 기능 대신에 에러로그 기능을 사용하는 것을 추천한다.
log_errors = Off  ==> log_errors = On

8.
안전한 세션관리
session.save_path = /tmp