2번 모듈 신규(raspberry_pi4_sht30/): SHT30 온습도 → cafe24, raw-body X-Signature HMAC, 폐쇄망 오프라인 설치(vendor/install), systemd, CRC/포맷 자가점검. firmware sht30_fw wire 포맷과 byte-parity 검증. 1번 모듈 통합(raspberry_pi4/): 누수+카메라를 동일 서버로. 레거시 sha256(key+json) body-sig → X-Signature HMAC 전환, 사진 canonical=device_id|sensor_id|log_id|timestamp. 서버 통합(php/): api/sensor_data.php 누수 이벤트 수신, api/photo_upload.php 신규(HMAC·finfo·서버생성 파일명·nonce 멱등·sensor 결속), photo.php 인증 사진서빙, dashboard.php 누수 패널+사진, sms_send.php 누수 SMS, config.php 태그/요약. DB: sql/migration_add_leak.sql(가산·멱등), schema_sht30.sql 통합 스키마. 보안 하드닝(외부 펜테스트 대비, 확정 CRITICAL/HIGH 0): cron_heartbeat api_key fail-closed, setup_mfa 부트스트랩 토큰 post-enrollment 잠금, var/ PHP 실행차단, HSTS. 문서/테스트: SYSTEM_OVERVIEW.md, security_hardening_test.php 갱신. 참고: 사용자 요청으로 세션 외 기존 미커밋 변경도 함께 포함. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
52 lines
2.6 KiB
ApacheConf
52 lines
2.6 KiB
ApacheConf
# =============================================================================
|
|
# .htaccess - 누수감지 시스템 보안 설정
|
|
# 배포 경로: pores.kr/raspi_leck_detecter/
|
|
# =============================================================================
|
|
|
|
# ─── 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"
|
|
Header always set Referrer-Policy "strict-origin-when-cross-origin"
|
|
# 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>
|