Security by default

비밀은 감추고, 권한과 변경은 설명 가능하게

OIDC 인증, 변경 가능한 permission 기반 RBAC, 암호화된 연동 비밀, 개인 키 수명주기와 감사로그로 운영 경계를 분리합니다.

Keycloak OIDC와 Bootstrap 관리자

Keycloak 연동은 Authorization Code Flow, PKCE, state와 nonce 검증을 사용합니다. 저장 전 연결 테스트는 시스템 신뢰 저장소 기반 TLS와 discovery 필수 endpoint, Client ID 입력 여부를 검사하며, authorization code 교환·ID token·claim 검증은 실제 로그인에서 수행합니다.

SSO

  • issuer·audience·nonce·state 검증
  • 설정 가능한 username claim
  • name·email·department 동기화
  • client secret AES-256-GCM 암호화

초기 관리자

  • 최초 기동 Bootstrap 관리자
  • 12자 이상 초기 비밀번호 요구
  • 로컬 비밀번호 변경 지원
  • 로그인 제한과 작업 감사

Bootstrap 관리자는 OIDC 장애 시에도 로그인할 수 있는 로컬 계정입니다. 전용 Break Glass 활성화 시간제어는 현재 버전에 없으므로 강한 비밀번호, 접근 경로 제한과 조직의 계정 통제를 적용하세요.

변경 가능한 RBAC

현재 버전 기본 역할대표 범위
super_admin와일드카드 permission으로 전체 API 접근
user개인 프로필·비밀번호·API 키 관리

관리자 설정의 역할 관리 UI와 REST API에서 역할 CRUD 및 사용자별 역할 할당을 수행할 수 있습니다. 프런트엔드 메뉴와 route guard도 backend가 반환한 permission을 기준으로 동작하며, 역할 조회·변경 자체도 각각 roles:read·roles:write permission으로 보호됩니다.

서비스 키와 개인 키의 수명주기

DB에 저장되는 Hub token, Keycloak secret, AI key와 Webhook secret은 ENCRYPTION_KEY를 사용하는 AES-256-GCM으로 암호화하며 설정 조회 응답에는 평문을 넣지 않습니다. 키는 정확히 32바이트(raw 32자, 64자 hex 또는 32바이트 base64)여야 합니다.

  1. 생성
    개인 API 키 평문은 생성 직후 한 번만 표시하며 DB에는 SHA-256 hash와 prefix만 저장합니다.
  2. 권한·만료
    본인 permission 안에서 허용된 scope와 만료일을 지정하고 관리자는 기본 회전일·최대 수명·허용 scope 정책을 설정합니다.
  3. 회전
    새 키 생성과 이전 키의 즉시 revoke를 하나의 DB transaction으로 처리합니다. grace overlap은 제공하지 않습니다.
  4. 폐기·사용 기록
    본인 키를 즉시 revoke하고 목록에서 상태·prefix·scope·만료·마지막 사용 시각을 확인합니다.
  5. 감사
    평문 없이 생성·회전·폐기 이벤트를 기록합니다.

ENCRYPTION_KEY 온라인 재암호화·회전 기능은 현재 버전에 없습니다. DB 백업과 동일한 키를 함께 안전하게 보관하고, 키를 변경해야 한다면 저장된 연동 비밀을 다시 입력할 운영 절차를 마련하세요.

감사로그와 조건부 승인

관리자, 시간, 원격 IP, 대상 Hub/사용자, action, Before/After, 사유, 결과, correlation ID를 기록합니다. 비밀번호·token·secret은 Before/After에서도 마스킹합니다.

승인 절차는 설정한 곳에만 적용됩니다. 팀장 검토나 승인 정책이 없으면 검토·승인·반려 UI와 상태 자체를 만들지 않습니다. 설정하면 요청→검토→승인/반려→실행→감사 흐름을 적용합니다.

현재 버전에서 Workflow가 실제 실행과 연결된 대상은 서버 시작·중지·재시작입니다. 요청자는 자신의 요청을 검토·승인·반려할 수 없고, 팀장 선검토를 사용하면 검토자와 최종 승인자도 달라야 합니다. 정책·Profile·Image 등 CRUD 카탈로그 변경에 자동 승인을 일괄 적용하는 기능은 향후 확장 범위입니다.

수집하지 않는 데이터

  • Notebook source code, cell 내용, 출력 데이터
  • 사용자 파일과 SQL·Python 코드
  • LLM 사용량 모니터링 대상의 프롬프트와 모델 응답 본문
  • API key·access token·client secret의 평문 로그

LLM 사용량 관측을 켜도 Prometheus의 pod·path·status·model·hub·network 메타데이터, calls·latency·bytes와 제공되는 경우 input/output token count만 집계합니다. 원격 label 이름도 명시적 허용 목록으로 제한하고 정규화 과정에서 나머지 label을 폐기합니다. token metric이 없으면 추정하지 않고 “수집 불가”로 표시합니다. 관리자가 검증한 username named capture 정규식은 후보 형식만 확인하며, 실제 귀속은 현재 서버 인벤토리의 정확한 pod_name과 일치할 때만 DB의 서버 소유자를 사용합니다. 알 수 없거나 망 단서 없이 중복된 Pod는 집계에서 제외합니다.

AI 운영 분석 채팅은 사용자가 입력한 메시지를 설정된 외부 또는 내부 AI Provider로 전송하는 proxy입니다. 채팅에 직접 입력한 내용은 Provider로 전달되므로 조직의 데이터 분류 정책을 따라야 합니다.

운영 강화 체크리스트

  • PostgreSQL sslmode=verify-full, 최소 권한 전용 계정과 백업 암호화
  • Reverse Proxy에서 TLS 1.2+, HSTS, 요청 크기·속도 제한
  • 컨테이너 non-root, read-only root filesystem, capability drop
  • Hub·Kubernetes service account는 연동별 최소 권한
  • 관리망 IP allowlist와 관리자 세션 짧은 만료
  • 정기적인 키 회전·복원·오프라인 업데이트 리허설
  • 연결 테스트와 실패 로그에 비밀값 redaction 검증

오프라인망은 자동으로 안전하지 않습니다. 이미지 반입 승인, 해시 검증, 취약점 점검, 접근통제, 백업·복구와 감사 검토를 조직 정책에 맞게 운영하세요.

민감한 취약점의 비공개 제보 방법과 credential 노출 시 대응 순서는 저장소의 SECURITY.md를 참고하세요.