WordPress는 전 세계 웹사이트의 40% 이상을 차지하는 만큼, 해킹 시도의 주요 표적이기도 합니다. 플러그인이나 테마 취약점뿐 아니라 서버 설정도 함께 강화해야 합니다.

파일 권한 설정

잘못된 파일 권한은 해킹의 주요 경로입니다:

# WordPress 루트 디렉토리
find /var/www/html -type d -exec chmod 755 {} \;
find /var/www/html -type f -exec chmod 644 {} \;

# wp-config.php는 더 엄격하게
chmod 440 /var/www/html/wp-config.php

# 웹서버 소유권 설정
chown -R www-data:www-data /var/www/html

Nginx에서 민감한 파일 차단

/etc/nginx/sites-available/yourdomain 에 추가합니다:

# wp-config.php 직접 접근 차단
location = /wp-config.php {
    deny all;
}

# .htaccess, .git 등 숨김 파일 차단
location ~ /\. {
    deny all;
}

# xmlrpc.php 차단 (불필요하면)
location = /xmlrpc.php {
    deny all;
    access_log off;
    log_not_found off;
}

# 업로드 디렉토리에서 PHP 실행 차단
location ~* /uploads/.*\.php$ {
    deny all;
}

# 워드프레스 코어 파일 직접 접근 차단
location ~* ^/wp-admin/includes/ {
    deny all;
}

wp-login.php 보호

로그인 페이지에 대한 브루트포스 공격을 제한합니다:

# IP 제한 (관리자 IP만 허용)
location = /wp-login.php {
    allow 203.0.113.1;
    deny all;
}

# 또는 Rate Limiting 적용
limit_req_zone $binary_remote_addr zone=wp_login:10m rate=5r/m;

location = /wp-login.php {
    limit_req zone=wp_login burst=3 nodelay;
    fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}

PHP 설정 강화

/etc/php/8.1/fpm/php.ini 편집:

# 에러 메시지 외부 노출 금지
display_errors = Off
log_errors = On
error_log = /var/log/php/error.log

# 파일 업로드 제한
upload_max_filesize = 10M
post_max_size = 10M

# 실행 시간 제한
max_execution_time = 60
memory_limit = 256M

# PHP 버전 정보 숨기기
expose_php = Off

# 위험한 함수 비활성화
disable_functions = exec,passthru,shell_exec,system,proc_open,popen

보안 HTTP 헤더 추가

server {
    # 클릭재킹 방지
    add_header X-Frame-Options "SAMEORIGIN" always;

    # MIME 타입 스니핑 방지
    add_header X-Content-Type-Options "nosniff" always;

    # XSS 필터 활성화
    add_header X-XSS-Protection "1; mode=block" always;

    # HTTPS 강제 (SSL 적용 후)
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    # 서버 정보 숨기기
    server_tokens off;
}

정기 점검 체크리스트

  • WordPress 코어, 플러그인, 테마 최신 버전 유지
  • 비활성화된 플러그인/테마 삭제 (비활성화만으로는 취약점이 남음)
  • 관리자 계정 이름 admin 변경
  • 강력한 비밀번호 사용 (최소 16자)
  • 2단계 인증(2FA) 플러그인 적용
  • 정기 파일 무결성 검사
  • 접속 로그 정기 검토

해킹 후 대응

이미 해킹이 의심된다면:

# 최근 수정된 PHP 파일 확인
find /var/www/html -name "*.php" -newer /var/www/html/wp-config.php -ls

# 알 수 없는 PHP 코드 패턴 검색
grep -r "eval(base64_decode" /var/www/html --include="*.php"
grep -r "<?php \$_" /var/www/html --include="*.php"