Apache 웹 서버의 `.htaccess` 파일은 메인 설정 파일을 수정하지 않고도 웹사이트 보안, URL 재작성, 성능 최적화 등 핵심 기능을 구현할 수 있는 강력한 도구입니다. 본 문서에서는 일반적인 웹 공격에 대비하고 기본적인 보안 시스템을 구축하는 데 도움이 되는 10가지 실용적인 `.htaccess` 보안 설정 기법을 소개합니다.
1. HTTPS 강제 적용 및 HSTS 설정
모든 웹 접근을 HTTPS로 자동 전환하고, 중간자 공격을 방지하기 위해 HTTP Strict Transport Security (HSTS)를 활성화합니다. 이는 웹사이트 보안의 기본입니다.
RewriteEngine on
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
</IfModule>
이 설정은 모든 HTTP 요청을 HTTPS로 영구 리다이렉션하며, 브라우저에게 향후 1년간 해당 웹사이트 접속 시 항상 HTTPS를 사용하도록 지시하여 다운그레이드 공격 및 인증서 탈취를 효과적으로 방지합니다.
2. 접속 IP 주소 제한
관리자 페이지나 민감한 디렉토리에 대해 특정 IP 주소만 접근을 허용하여 무단 접근을 차단합니다.
Require all denied
Require ip 192.168.1.100
Require ip 10.0.0.0/24
`192.168.1.100`을 관리자 IP로, `10.0.0.0/24`는 전체 서브넷을 허용하도록 변경할 수 있습니다. 내부 시스템이나 개발 환경 접근 제어에 유용합니다.
3. 숨김 파일 및 민감 디렉토리 접근 차단
`.git`, `.env`, 백업 파일 등 민감한 정보가 포함될 수 있는 숨김 파일 및 디렉토리의 외부 접근을 차단합니다.
# 숨김 파일/디렉토리 접근 차단
<FilesMatch "^\.">
Require all denied
</FilesMatch>
# 백업 및 소스 파일 접근 차단
<FilesMatch "\.(bak|config|dist|fla|inc|ini|log|psd|sh|sql|swp|~)$">
Require all denied
</FilesMatch>
`Require all denied`는 403 Forbidden 오류를 반환하여 공격자가 웹사이트 설정 정보나 소스 코드를 획득하는 것을 방지합니다.
4. 이미지 도적질 방지 (Referer 체크)
HTTP Referer 헤더를 검사하여 외부 웹사이트에서 이미지 파일을 직접 링크하는 것을 막아 대역폭 낭비와 저작권 문제를 예방합니다.
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$
RewriteCond %{HTTP_REFERER} !^https?://(www\.)?yourdomain.com [NC]
RewriteRule \.(jpg|jpeg|png|gif|bmp)$ - [NC,F,L]
`yourdomain.com`을 자신의 도메인으로 바꾸면, 자신의 웹사이트 외 다른 출처에서의 이미지 요청을 차단하고 403 오류를 반환합니다. 도적질 방지 이미지를 표시하려면 마지막 줄을 `RewriteRule \.(jpg|jpeg|png|gif|bmp) http://yourdomain.com/blocked.png [R,L]`로 변경할 수 있습니다.
5. 민감 파일 및 디렉토리 비밀번호 보호
관리자 페이지 등 중요 디렉토리나 파일에 대해 `.htaccess`를 이용한 비밀번호 인증을 설정하여 이중 보안을 강화합니다.
`htpasswd` 명령으로 비밀번호 파일을 생성합니다:
htpasswd -c /path/to/your/password/.htpasswd username
`.htaccess` 파일에 다음 내용을 추가합니다:
AuthType Basic
AuthName "Restricted Content"
AuthUserFile /path/to/your/password/.htpasswd
Require valid-user
이 설정을 적용하면 해당 디렉토리에 접근 시 로그인 창이 나타나며, 올바른 사용자명과 비밀번호를 입력한 사용자만 접근할 수 있습니다.
6. 디렉토리 리스팅 비활성화
`index` 파일이 없는 디렉토리에서 Apache가 자동으로 파일 목록을 보여주는 기능을 비활성화하여 웹사이트 구조나 민감 파일 노출을 막습니다.
Options -Indexes
이 설정을 통해 `index` 파일이 없는 디렉토리에 접근 시 403 오류를 반환하여 웹사이트 구조가 노출되는 것을 방지합니다.
7. 보안 헤더 설정으로 공격 방어
HTTP 응답 헤더를 설정하여 XSS, 클릭재킹 등 일반적인 웹 공격을 방어합니다.
<IfModule mod_headers.c>
# XSS 방지
Header set X-XSS-Protection "1; mode=block"
# 클릭재킹 방지
Header set X-Frame-Options "SAMEORIGIN"
# MIME 타입 스니핑 방지
Header set X-Content-Type-Options "nosniff"
# 콘텐츠 보안 정책 (CSP) - 필요에 따라 조정
Header set Content-Security-Policy "default-src 'self';"
</IfModule>
이러한 보안 헤더는 웹사이트의 실제 요구사항에 맞게 조정하여 최신 브라우저 공격에 대한 기본적인 방어 체계를 구축할 수 있습니다.
8. HTTP 요청 메서드 제한
API 엔드포인트나 폼 제출 페이지 등에서 허용된 HTTP 요청 메서드만 제한하여 악의적인 요청을 방지합니다.
<LimitExcept GET POST HEAD>
Require all denied
</LimitExcept>
이 설정은 GET, POST, HEAD 메서드만 허용하고 서버 리소스 변경에 사용될 수 있는 PUT, DELETE 등의 메서드를 차단합니다. 정적 웹사이트나 단순 폼 처리에 적합합니다.
9. 사용자 정의 오류 페이지 설정
기본 Apache 오류 페이지는 서버 버전 등의 민감 정보를 노출할 수 있습니다. 사용자 정의 오류 페이지를 통해 사용자 경험을 개선하고 서버 정보를 숨깁니다.
ErrorDocument 400 /errors/400.html
ErrorDocument 403 /errors/403.html
ErrorDocument 404 /errors/404.html
ErrorDocument 500 /errors/500.html
오류 페이지를 `/errors/` 디렉토리에 배치하고, 서버 관련 민감 정보가 포함되지 않도록 주의합니다. 사용자 정의 오류 페이지는 웹사이트 내비게이션 및 도움말 정보를 포함하여 사용자 경험을 향상시킬 수 있습니다.
10. 보안 이벤트 모니터링 및 로깅
잠재적인 보안 위협을 기록하여 관리자가 신속하게 보안 이벤트를 감지하고 대응할 수 있도록 합니다.
# 403 오류 로깅
CustomLog "logs/forbidden_access.log" combined env=REDIRECT_STATUS:403
# SQL Injection 시도 의심 요청 로깅
SetEnvIf Request_URI "\.php\?.*(union|select|insert|update|delete)" suspicious_request
CustomLog "logs/suspicious_requests.log" combined env=suspicious_request
이 설정은 403 오류 및 SQL Injection 패턴이 포함된 요청을 별도의 로그 파일에 기록하여, 관리자가 잠재적인 보안 위협을 정기적으로 검토하고 분석할 수 있도록 돕습니다.
결론 및 모범 사례
- 정기적인 백업: `.htaccess` 파일 수정 전 반드시 백업하여 설정 오류로 인한 서비스 장애를 예방합니다.
- 최소 권한 원칙: 꼭 필요한 권한만 부여하여 보안을 강화합니다.
- 변경 후 테스트: 설정을 변경한 후에는 기능이 정상적으로 작동하는지 충분히 테스트합니다.
- 최신 보안 정보 확인: Apache 보안 관련 공지사항을 주시하고 보안 설정을 최신 상태로 유지합니다.
- 종합적인 보안: `.htaccess`는 보안의 일부일 뿐이며, 다른 보안 조치와 함께 사용해야 합니다.
`.htaccess` 파일을 적절히 설정하면 웹사이트 관리자는 일반적인 웹 보안 위협에 효과적으로 대응할 수 있는 기본적인 보안 시스템을 신속하게 구축할 수 있습니다. 이러한 기법들은 개인 블로그부터 기업 웹사이트까지 모든 규모의 웹사이트에 적용 가능합니다.