POSA_LEAKSMS/php/.htaccess
cw2007 7a3b571b05 feat(deploy): 기기별 턴키 배포 번들 + Pi OS 하드닝 + 원샷 설치
tools/make_deploy_bundles.py: deploy/ 아래 서버1+Pi3대 폴더 생성 —
API_KEY 1개 자동 생성·4곳 동일 주입, 관리자 bcrypt(비번 stdin 전달), LF 정규화,
단일 schema.sql, var/ 런타임 상태 제외, CRON_SECRET 사전 계산. 난독화 경로
WEB_DIR 은 소스가 아닌 deploy/.secrets/web_dir.txt 에서 로드(커밋 트리 유출 차단).
시크릿 생성 전에 deploy/.gitignore 선작성 + 루트 .gitignore 에 deploy/ 이중 차단.

tools/harden_pi.sh: SSH 완전 비활성(outbound 전용 설계) · 인바운드 전부 차단
(nftables) · 불필요 서비스 제거(avahi/bluetooth/cups 등) · 자동 보안 패치
(unattended-upgrades, 자동 리부팅 끔) · config_local.py 권한 600 · 검증 증적 출력.

setup.sh(번들 생성): 설치→서비스→검증→하드닝 원샷. 검증 실패 시 set -e 로
하드닝(SSH 차단) 전에 중단 → SSH 유지되어 디버깅 가능.

검색 비노출 하드닝: php/.htaccess X-Robots-Tag noindex + Referrer-Policy
no-referrer, api/photo_upload.php CORS 제거, test_mobile.php 세션 인증 가드.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01821XP36Q6t9eWKTPSEumnC
2026-07-02 18:51:46 +09:00

55 lines
2.9 KiB
ApacheConf

# =============================================================================
# .htaccess - 누수감지 시스템 보안 설정
# =============================================================================
# ─── HTTPS 강제 리다이렉트 ─────────────────────────────────
# cafe24 호스팅 관리자 패널에서 SSL 리다이렉트 설정 사용
# (.htaccess 리다이렉트는 리버스 프록시 환경에서 무한 루프 유발)
<IfModule mod_rewrite.c>
RewriteEngine On
# var/ 디렉토리 접근 차단
RewriteRule ^var/ - [F,L]
# [v2] uploads/ 디렉토리 PHP 실행 차단
RewriteRule ^uploads/.*\.ph(p[3457]?|t|tml)$ - [F,L]
# 불필요 HTTP 메소드 차단
RewriteCond %{REQUEST_METHOD} ^(TRACE|DELETE|PUT|PATCH) [NC]
RewriteRule .* - [F,L]
</IfModule>
# ─── 민감 PHP 파일 직접 접근 차단 ─────────────────────────
<FilesMatch "^(config|config\.local|config\.local\.example|sms_send|incidents|ops_checks|setup_hash|test_mobile)\.php$">
<IfModule mod_authz_core.c>
Require all denied
</IfModule>
<IfModule !mod_authz_core.c>
Order deny,allow
Deny from all
</IfModule>
</FilesMatch>
# ─── 보안 헤더 ───────────────────────────────────────────
<IfModule mod_headers.c>
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "DENY"
Header always set X-XSS-Protection "1; mode=block"
# 내부 관리 시스템 — 검색엔진 색인 금지(HTTP 레벨, 전 응답 공통).
# robots.txt 는 쓰지 않는다: 공개 파일이라 난독화 경로를 오히려 광고하게 됨.
Header always set X-Robots-Tag "noindex, nofollow, noarchive"
# 외부로 Referer 자체를 보내지 않음(도메인 확인 유출 차단). 내부 이동은 영향 없음.
Header always set Referrer-Policy "no-referrer"
# TODO(follow-up): 'unsafe-inline' 제거 — 대시보드 인라인 스크립트/스타일을 외부
# 파일로 분리한 후 script-src/style-src 에서 'unsafe-inline' 을 삭제해야 한다.
Header always set Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; frame-ancestors 'none'; form-action 'self'"
Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()"
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
Header always unset X-Powered-By
</IfModule>
# ─── 디렉토리 목록 비활성화 ──────────────────────────────
<IfModule mod_autoindex.c>
Options -Indexes
</IfModule>