PHP 응용 프로그램은 평균 보안 문제보다 높은 명성을 가지고 있습니다. 응용 프로그램을 최대한 안전하게 유지하기 위해 어떤 구성 기술을 사용합니까?
나는 다음과 같은 아이디어를 찾고 있습니다.
- 사용 강화 PHP / 수호신을
- mod_security 사용
- php.ini에서 register_globals 및 allow_url_fopen 비활성화
나는 일반적으로 Linux를 사용하지만 Windows 솔루션도 자유롭게 제안하십시오.
PHP 응용 프로그램은 평균 보안 문제보다 높은 명성을 가지고 있습니다. 응용 프로그램을 최대한 안전하게 유지하기 위해 어떤 구성 기술을 사용합니까?
나는 다음과 같은 아이디어를 찾고 있습니다.
나는 일반적으로 Linux를 사용하지만 Windows 솔루션도 자유롭게 제안하십시오.
답변:
open_basedir 지시문을 사용하여 PHP 스크립트를 홈 디렉토리 및 추가 응용 프로그램 디렉토리로 제한하십시오. 이것은 그 자체로 매우 효율적입니다.
비용이 들지 않고 도움이 될 수 있으므로 강화 된 PHP를 사용하십시오.
suPHP 를 사용 하여 PHP 스크립트가 파일의 소유자 (웹 사이트 당 한 명의 사용자)로 실행되도록하고 777과 같은 잘못된 권한을 가진 파일을 사용하지 않도록하십시오. 요구 사항이 모든 것을 파괴하지는 않습니다.
Mod_security는 큰 장점이지만 잘 사용되고 구성되어야합니다.
필자의 경험에 따르면, PHP 기반 웹 사이트의 대부분의 취약점은 PHP 자체의 결함이 아닌 (사이트) 디자인의 결과입니다.
몇 가지 빠른 팁 :
* 내가 "phpinfo ()의 종류를 고정시키는 것"이라고 쓴 짧은 글에서 엿볼 수 있고 주석을 반드시 읽으십시오 http://egovsergo.com/2009/04/03/protecting-your-phpinfo/ 프로덕션 사이트에서 제거하는 것을 잊어 버린 경우 phpinfo ()를 보호해야한다는 것이 빠른 아이디어였습니다.
보다 일반적인 방식으로 일부 개발자는 "제작 사이트"플래그가 설정되어 있는지 여부를 확인하고 프로덕션에서 민감한 기능을 비활성화하는 민감한 기능에 대한 래퍼를 작성합니다.
PHP를 강화하기 위해 변경해야하는 다른 매개 변수 :
safe_mode = Off
register_globals = Off
expose_php = Off
allow_url_fopen = Off
allow_url_include = Off
log_errors = On
error_log = /var/log/phperror.log
display_errors = Off
enable_dl = Off
disable_functions="popen,exec,system,passthru,proc_open,shell_exec,show_source,phpinfo"
모든 PHP 오류를 /var/log/phperror.log 파일에 저장하십시오 .
touch /var/log/phperror.log
chmod 666 /var/log/phperror.log
open_basedir
"사이트 별" 설정을 고려하십시오 . open_basedir
스크립트가 정의 된 화이트리스트 외부의 파일에 액세스하지 못하게하는 php.ini 설정입니다. 서버가 여러 사이트를 호스팅하는 경우 한 사이트가 다른 사이트의 데이터베이스 설정을 읽지 못하게됩니다. 또한 PHP 스크립트가 핵심 시스템 파일에 액세스하거나 수정하지 못하게합니다. Open basedir는 설정하기가 쉽습니다 php_admin_value open_basedir /my/list/of/folders:/as/a/colon/seperated/list
. 각 Apache 가상 호스트에 " " 줄을 추가하면됩니다 .
또한 PHP 스크립트를 포함하지 않아야하는 모든 사이트 / 폴더 (예 : 업로드 된 이미지 폴더)에 대해 PHP 스크립트 엔진을 끄십시오. 다시 한 번, 이것은 간단합니다. "php_admin_value engine off"를 PHP가 필요없는 Apache VirtualHosts에 추가하십시오. 디렉토리에서 PHP를 비활성화하려면 디렉토리 태그에 같은 것을 넣으십시오.
파일 권한을 최대한 엄격하게 실행하고 Apache 사용자의 PHP 스크립트에 대한 쓰기 액세스를 피하십시오. 이렇게하면 실행중인 스크립트가 동일한 사이트 / 서버에서 자체 스크립트 나 다른 스크립트를 수정하지 못하게됩니다. 가능하면 777 권한을 피하고 응용 프로그램을 실행하고 사용하는 데 필요한 최소 권한을 확인하십시오.
각각 자체 데이터베이스가있는 여러 사이트를 호스팅하는 경우 각각 별도의 MySQL / Postgres 사용자를 사용하고 각 사용자에게 관련 데이터베이스에만 액세스 할 수있는 권한을 설정하십시오. 이로 인해 악성 스크립트가 다른 응용 프로그램의 데이터베이스를 변경하지 못하게됩니다.
Suosin, HardenedPHP, mod_security 등도 모두 가치가 있지만, 대신 엄격하게 잠긴 구성 외에 이들을 사용하십시오.
Suhosin은 상당히 상당한 성능 비용을 가지고 있으므로 "비용이 들지 않습니다"라는 의견은 다소 미미합니다.
기본적인 방화벽 / 토폴로지 제안을 찾고 있습니까? 나는 씻지 않은 인터넷에서 PHP 웹 서버에 직접 액세스하는 것을 막기 위해 파운드 와 같은 것을 사용하는 아이디어를 좋아합니다 . 이렇게하면 웹 서버를 네트워크의 다른 부분과 분리 할 수도 있습니다.
Suhosin / mod_security / SuPHP를 사용하면 PHP 서버를 안전하게 보호 할 수 있습니다. exec, passthru, system 및 escapeshellcmd와 같은 특정 기능을 비활성화하면 많은 도움이 될 것입니다.