크라우니시큐리티 — Phase 1 엔터프라이즈 강화 완료
개요
MVP 납품 수준에서 완전 엔터프라이즈 제품 납품 수준으로 Phase 1 (5항목) 구현 완료.
완료 항목
1. SQLite 영속성 (storage.js)
- Node 22+
node:sqlite 네이티브 (외부 의존성 0)
- WAL 모드 + 동시읽기, 64MB 캐시
- 9개 테이블: events, alerts, iocs, rules, audit_log, subjects, resources, baselines, webhooks
- 해시체인 감사로그: SHA-256 체인으로 변조 탐지 (
verifyAuditChain())
- 스키마 마이그레이션, 백업 (
VACUUM INTO), 보관 정리
- 준비된 구문(prepared statements)으로 핫패스 최적화
2. AES-256-GCM at-rest 암호화 (crypto-vault.js)
- AES-256-GCM 인증된 암호화
- PBKDF2 200K 반복 키 유도 (패스프레이즈 지원)
- 자기기술형(self-describing)
enc1: 접두사 — 외부 메타데이터 불필요
- 버전화된 암호문 포맷: version(1) + iv(12) + tag(16) + ciphertext
- 키 회전: 새 키로 전환 후에도 기존 데이터 복호 가능
- 필드별 암호화: events의 detail/raw/metadata 자동 암호화
- 키링 파일 0o600 퍼미션
- API:
/api/v1/crypto/status (GET), /api/v1/crypto/rotate (POST)
3. TLS 강제 + 보안 헤더
- TLSv1.2+ 강제 (GCM + ChaCha20 시퍼만)
- HTTP→HTTPS 자동 리다이렉트 서버
- 리버스 프록시 뒤 HTTPS 강제 (
X-Forwarded-Proto)
- 보안 헤더 7종: CSP, X-Frame-Options(DENY), HSTS, X-Content-Type-Options, Referrer-Policy, Permissions-Policy, X-XSS-Protection
4. RBAC (rbac.js)
- 5개 역할: admin, operator, analyst, viewer, api
- 36개 라우트→스코프 매핑 (events.read, events.write, iocs.*, crypto.admin 등)
- 와일드카드 매칭:
admin의 * 스코프는 모든 것 허용
- JWT 토큰에 role 클레임 포함
- API:
/api/v1/auth/whoami (GET), /api/v1/auth/roles (GET)
- 미인증 → 401, 권한부족 → 403
5. Kubernetes Helm Chart (helm/crowny-security/)
- Deployment (Recreate 전략 — SQLite 단일쓰기)
- Service (HTTP + Syslog UDP/TCP)
- PVC (10Gi 기본)
- Ingress (nginx + cert-manager 지원)
- ServiceMonitor (Prometheus)
- Secret 참조 (masterKey, apiKeyHash, jwtSecret, license)
- Pod 보안: non-root(1001), readOnlyRootFilesystem, drop ALL capabilities
테스트 결과
SQLite: WAL 모드, 마이그레이션 v1, 해시체인 감사로그 ✅
암호화: enc/dec 라운드트립, 필드별 암호화, 키 회전 후 복호 ✅
RBAC: admin 쓰기 201, viewer 쓰기 403, viewer 읽기 200, key rotate viewer 403/admin 200 ✅
보안헤더: CSP, X-Frame-Options, HSTS 모두 정상 ✅
파일 위치
- SQLite:
/Users/ef/crowny-security/server/storage.js (~420줄)
- 암호화:
/Users/ef/crowny-security/server/crypto-vault.js (~210줄)
- RBAC:
/Users/ef/crowny-security/server/rbac.js (~150줄)
- Helm:
/Users/ef/crowny-security/helm/crowny-security/ (6개 템플릿)
- 서버:
/Users/ef/crowny-security/server/server.js (~1900줄)
환경변수 (신규)
| 변수 | 설명 | 기본값 |
|---|
CROWNY_MASTER_KEY | AES-256 마스터키 (hex 64자 또는 패스프레이즈) | 자동생성 |
CROWNY_MASTER_SALT | PBKDF2 salt (패스프레이즈 모드) | crowny-default-salt |
CROWNY_KEYRING_PATH | 키링 파일 경로 | data/.keyring |
CROWNY_ENCRYPT_AT_REST | 암호화 on/off | true |
CROWNY_TLS_CERT | TLS 인증서 경로 | (없으면 HTTP) |
CROWNY_TLS_KEY | TLS 키 경로 | (없으면 HTTP) |
CROWNY_ENFORCE_HTTPS | 프록시 뒤 HTTPS 강제 | false |
CROWNY_HTTP_PORT | HTTP→HTTPS 리다이렉트 포트 | 9580 |
Phase 2 남은 항목