PHP 보안 환경 설정 및 운영 전환 가이드
PHP 애플리케이션을 외부 공용 인터넷망에 배포하여 운영할 때는 성능 최적화만큼이나 인프라 보안 통제 장벽(Security Hardening)을 견고히 세우는 것이 중요합니다.
PHP의 설정 파일인 php.ini는 외부 침투 세력이 악성 쉘 코드를 주입하거나 디렉터리 구조를 횡단하는 공격을 할 때, 이를 운영체제 및 컴파일러 레벨에서 차단할 수 있는 다양한 강력한 제어 옵션들을 기본 제공하고 있습니다.
이 문서에서는 모드별 환경설정의 차이점을 시각적으로 비교하고, 실제 서비스 배포 시 적용해야 할 핵심 보안 파라미터들의 세부 설정법을 학습합니다.
1. 개발(Dev) vs 운영(Prod) 설정 프로필 아키텍처
아래 다이어그램은 디버깅 편의를 위해 느슨하게 열어두는 개발 환경과, 정보 유출 차단 및 권한 격리에 집중하여 굳건히 걸어 잠그는 운영 환경의 주요 옵션 대조를 나타냅니다.
2. 운영 서버 배포 시 필수 수립할 6대 보안 설정
1) 에러 은닉 및 디바이스 격리 로그 저장
실서버에서 발생하는 에러 메시지는 서버 절대 경로 및 데이터베이스 쿼리를 포함하므로 일반 접속자에게 절대 보여주어서는 안 됩니다.
- 권장 설정:
display_errors = Off display_startup_errors = Off log_errors = On error_log = /var/log/php/php_errors.log - 효과: 사용자 웹 화면에는 에러가 노출되지 않으며, 관리자는 디스크 내부 로그 파일(
/var/log/php/php_errors.log)을 열어 안전하게 디버깅할 수 있습니다.
2) expose_php 비활성화 (버전 은닉)
- 위험: 기본 설정이
On인 경우, 서버 응답 헤더에X-Powered-By: PHP/8.3.1과 같이 PHP 구동 여부와 상세 빌드 정보가 상시 출력됩니다. 해커는 특정 버전에 알려진 보안 취약점(CVE) 정보를 수집해 맞춤형 공격을 가할 수 있습니다. - 권장 설정:
expose_php = Off - 효과: 응답 헤더에서 PHP 관련 버전 정보 노출이 완벽히 마스킹됩니다.
3) allow_url_include 차단 (RFI 공격 방어)
- 위험:
allow_url_include = On설정 시, 외부 원격 서버에 위치한 악성 스크립트 파일(http://attacker.com/malware.txt)을include나require문을 통해 내 서버 메모리에 강제 탑재하여 실행시킬 수 있는 원격 파일 포함(RFI, Remote File Inclusion) 공격에 직면합니다. - 권장 설정:
allow_url_fopen = On ; 외부 API 통신(http 요청)용 오픈은 유지 가능 allow_url_include = Off ; 원격 파일 인클루드는 절대 불가로 차단
4) open_basedir 디렉터리 접근 범위 격리 (LFI & Traversal 방어)
- 위험: 웹 서버 권한을 획득한 악성 스크립트가 리눅스의 상위 경로를 뒤져 시스템 민감 정보(
/etc/passwd등)를 탈취하는 파일 탐색 공격을 감행할 수 있습니다. - 권장 설정:
open_basedir = "/var/www/html:/tmp" - 효과: PHP 프로세스가 파일 읽기/쓰기/포함 연산을 실행할 때, 지정된
/var/www/html폴더와 임시 저장소인/tmp폴더 이외의 상위 경로 디렉터리는 시스템 권한이 있더라도 접근 시도를 즉시 거부(Permission Denied) 처리합니다.
5) disable_functions 위험 시스템 함수 차단
- 위험: 파일 업로드 취약점 등으로 인해 웹셸(WebShell)이 침투했을 때, 운영체제 시스템 터미널 제어 함수(
exec,system등)가 살아있으면 해커가 루트 권한 획득 시도 및 원격 쉘 장악(RCE)을 실행할 수 있습니다. - 권장 설정:
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,curl_exec,curl_multi_exec,parse_ini_file,show_source - 효과: 지정한 위험한 운영체제 연동 계열 함수들을 PHP 코드가 호출 시 실행을 막고 엔진 레벨에서 강제 무력화합니다.
6) 세션 쿠키 탈취 차단 및 암호화 전송 강제 (Session Hijacking 예방)
- 위험: 세션 식별자가 자바스크립트나 일반 네트워크 스니핑을 통해 해커에게 넘어갈 경우, 해커가 로그인 단계를 거치지 않고 타인의 권한을 즉시 탈취하는 세션 하이재킹이 발생합니다.
- 권장 설정:
session.cookie_secure = On ; 오직 HTTPS 보안 암호화 웹 연결 상에서만 쿠키 전송 허용 session.cookie_httponly = On ; 자바스크립트(document.cookie)를 통한 쿠키 접근 차단 (XSS 탈취 방지) session.cookie_samesite = Lax ; 교차 사이트 요청 위조(CSRF) 공격 경로 완화
3. 개발 vs 운영 주요 설정값 한눈에 비교하기
| 지시어 옵션명 (Directive) | 개발 환경 권장 (Development) | 운영 환경 권장 (Production) | 보안적 의의 및 방어 취약점 |
|---|---|---|---|
display_errors |
On |
Off |
내부 시스템 물리 경로 및 DB 쿼리 은닉 |
expose_php |
On |
Off |
엔진 버전 숨김 (버전 취약점 타겟 타격 방지) |
allow_url_include |
Off |
Off |
원격지 악성 코드 실행 차단 (RFI 대응) |
open_basedir |
None |
/var/www/html |
지정 디렉터리 외 파일 접근 봉쇄 (LFI 대응) |
disable_functions |
None |
exec,system... |
OS 쉘 탈취 및 임의 명령어 실행 차단 (RCE 대응) |
session.cookie_secure |
Off (HTTP 허용) |
On (HTTPS Only) |
일반 네트워크 스니핑 차단 (Session Hijack 방지) |
session.cookie_httponly |
Off |
On |
크로스 사이트 스크립팅을 통한 쿠키 탈취 차단 |
이전 학습
« 게시판 만들기
서브목차