PHP 웹 서버 보안


31

PHP 응용 프로그램은 평균 보안 문제보다 높은 명성을 가지고 있습니다. 응용 프로그램을 최대한 안전하게 유지하기 위해 어떤 구성 기술을 사용합니까?

나는 다음과 같은 아이디어를 찾고 있습니다.

나는 일반적으로 Linux를 사용하지만 Windows 솔루션도 자유롭게 제안하십시오.

답변:


15
  1. open_basedir 지시문을 사용하여 PHP 스크립트를 홈 디렉토리 및 추가 응용 프로그램 디렉토리로 제한하십시오. 이것은 그 자체로 매우 효율적입니다.

  2. 비용이 들지 않고 도움이 될 수 있으므로 강화 된 PHP를 사용하십시오.

  3. suPHP 를 사용 하여 PHP 스크립트가 파일의 소유자 (웹 사이트 당 한 명의 사용자)로 실행되도록하고 777과 같은 잘못된 권한을 가진 파일을 사용하지 않도록하십시오. 요구 사항이 모든 것을 파괴하지는 않습니다.

  4. Mod_security는 큰 장점이지만 잘 사용되고 구성되어야합니다.


일부 나쁜 사이트는 실제로 register_globals와 fopen을 필요로하기 때문에 suPHP를 사용하는 사이트 당 php.ini를 사용합니다. 한 사이트는 가미카제를 사용할 수 있고 다른 사이트는 (거의) 완벽하게 안전합니다.
Antoine Benkemoun

4
register_globals를 사용하고 fopen을 사용하면 품질이 너무 나빠서 다시 사용하고 싶을 수 있습니다. :)
David Pashley

그들이 150 € / mo를 지불한다면, 당신은 재고하지 않습니다.
Antoine Benkemoun

3

필자의 경험에 따르면, PHP 기반 웹 사이트의 대부분의 취약점은 PHP 자체의 결함이 아닌 (사이트) 디자인의 결과입니다.

몇 가지 빠른 팁 :

  • 보편적으로 필터 입력, 이스케이프 출력. Clarificaiton : 필터는 이스케이프를 의미하지 않습니다. "이 사용자 입력에서 비린내가 발견되면 제출이 실패하고 사용자에게 다시 포맷하도록 지시합니다."를 의미합니다.
  • escapeshellcmd ()를 사용하는 대신 단순히 쉘에서 사용자 입력을 허용하지 마십시오 . 그것은 위험하고 아마도 실제로는 절대 필요하지 않습니다.
  • 프로덕션 사이트에서 phpinfo ()와 같은 함수를 호출 하지 마십시오 (또는 수행하는 경우 아래 참조 *).
  • 웹 응용 프로그램을 디자인 할 때는 항상 "이것이 가능한 공격 경로입니까?"를 고려하십시오. SQL 주입이라고 가정 해보십시오. 대답이 "예"이면 즉시 연결하십시오. "좋습니다. 나중에 개발에이를 기능으로 추가하겠습니다"라고 말하지 마십시오. 보안은 결코 기능이 아닙니다.
  • 원시 오류를 사용자에게 출력 하지 마십시오 . 이것은 php.ini의 display_errors = Off, log_errors = On을 설정하는 것을 의미합니다. 런타임 오류를 트랩하고 무언가를 출력하십시오. 트위터의 고래를 예로 들어 보자. 그것은 사용자에게 디버그 수준의 정보를 제공하지 않을 뿐이다.

* 내가 "phpinfo ()의 종류를 고정시키는 것"이라고 쓴 짧은 글에서 엿볼 수 있고 주석을 반드시 읽으십시오 http://egovsergo.com/2009/04/03/protecting-your-phpinfo/ 프로덕션 사이트에서 제거하는 것을 잊어 버린 경우 phpinfo ()를 보호해야한다는 것이 빠른 아이디어였습니다.

보다 일반적인 방식으로 일부 개발자는 "제작 사이트"플래그가 설정되어 있는지 여부를 확인하고 프로덕션에서 민감한 기능을 비활성화하는 민감한 기능에 대한 래퍼를 작성합니다.


제 질문은 잘못 작성된 PHP로부터 서버를 보호하는 방법에 관한 것입니다. :) 나는 PHP 자체가 안전하지 않다는 것을 의미하지는 않았으며, 경험이 적은 개발자를 끌어 들이고 표준 라이브러리는 모든 사용자를 보호하는 라이브러리가 아니라 모든 호출을 보호해야합니다. 매우 유용한 답변이므로 +1입니다.
David Pashley 2016 년

나는 그 인상을 얻었고 그에 따라 대답했다 :) 댓글 주셔서 감사합니다! 나는 분명히 여기에 들어갈 수는 없지만 큰 구덩이입니다. 더 구체적인 질문이 있으면 반드시 스택 오버플로에 질문을 제기하면 나와 다른 사람들이 기여할 것입니다. (그리고 가치가있는 것은 ZCE입니다).
msanford

3

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

1

dotdeb 저장소를 /etc/apt/sources.lst에 추가했습니다.

deb http://packages.dotdeb.org stable all
deb-src http://packages.dotdeb.org stable all

그들이 데비안보다 php / apache / mysql을 훨씬 자주 패치합니다.


1

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 등도 모두 가치가 있지만, 대신 엄격하게 잠긴 구성 외에 이들을 사용하십시오.


0

Suhosin은 상당히 상당한 성능 비용을 가지고 있으므로 "비용이 들지 않습니다"라는 의견은 다소 미미합니다.


2
빠르고 해킹 된 웹 사이트는 무엇입니까? :) hardened-php.net/suhosin/benchmark.html 은 하나의 벤치 마크에서 8.85 % 느려질 것을 제안합니다. 그것이 제공하는 보안상의 이점으로 받아 들여질 수 있습니다. 이것은 아마도 대답이 아닌 의견이었을 것입니다.
David Pashley 2016

Suhosin은 주로 로컬 공격으로부터 보호합니다. 따라서 신뢰할 수없는 사람들과 서버를 공유하면 속도가 느려질 수 있습니다. 자체 서버 또는 자체 VM 슬라이스가 있으면 요점을 알 수 없습니다.

0

기본적인 방화벽 / 토폴로지 제안을 찾고 있습니까? 나는 씻지 않은 인터넷에서 PHP 웹 서버에 직접 액세스하는 것을 막기 위해 파운드 와 같은 것을 사용하는 아이디어를 좋아합니다 . 이렇게하면 웹 서버를 네트워크의 다른 부분과 분리 할 수도 있습니다.


아니요, PHP 런타임의 보안을 향상시키는 방법을 찾고 있습니다.
David Pashley 2016

0

Suhosin / mod_security / SuPHP를 사용하면 PHP 서버를 안전하게 보호 할 수 있습니다. exec, passthru, system 및 escapeshellcmd와 같은 특정 기능을 비활성화하면 많은 도움이 될 것입니다.


1
escapeshellcmd ()가 문자열을 이스케이프 처리하는 데 사용되지 않습니까? 프로세스를 실행할 수있는 방법을 제공하지 않습니다. 누군가가 어떻게 그것을 사용하여 문제를 일으킬 수 있습니까?
David Pashley 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.