콘텐츠로 이동

9.6. 보안 모델

Backend.AI GO의 컨테이너 실행은 심층 방어 보안 모델로 설계되었습니다. 여러 독립적인 레이어가 함께 작동하여 컨테이너가 잘 정의된 경계 내에서 동작하도록 보장합니다.

보안 레이어

flowchart TD
    REQ[컨테이너 실행 요청]
    L1["레이어 1: 입력 검증\n(ID/이름/태그 검사)"]
    L2["레이어 2: 마운트 허용 목록\n(경로 정규화 + 허용 목록 확인)"]
    L3["레이어 3: 환경 변수 검사\n(승인된 환경 변수만 통과)"]
    L4["레이어 4: 자격증명 프록시\n(실제 API 키가 컨테이너에 절대 유입되지 않음)"]
    L5["레이어 5: IPC 권한\n(그룹 범위 전송/작업 권한)"]
    L6["레이어 6: 보안 감사\n(실행 중인 컨테이너 주기적 감사)"]
    CONT[컨테이너 실행]

    REQ --> L1 --> L2 --> L3 --> L4 --> L5 --> CONT --> L6

레이어 1: 입력 검증

모든 컨테이너 식별자, 이미지 태그, 빌드 컨텍스트는 인수 주입 공격을 방지하기 위해 사용 전에 검증됩니다.

차단된 추가 인수

다음 위험한 Docker 플래그는 extra_args를 통해 전달할 수 없습니다:

차단된 플래그 이유
--privileged 호스트에 루트 수준 접근 권한 부여
--cap-add Linux 기능 추가
--security-opt seccomp/AppArmor 프로필 수정
--device 호스트 장치 노출
--pid=host 호스트 PID 네임스페이스 공유
--network=host 호스트 네트워크 스택 공유
--userns=host 사용자 네임스페이스 격리 비활성화
--ipc=host 호스트 IPC 네임스페이스 공유

레이어 2: 마운트 보안

마운트 허용 목록은 파일시스템 접근에 대한 기본 거부 정책을 적용합니다.

검증 단계

  1. 심볼릭 링크 해석: 호스트 경로는 정규화됩니다 (모든 심볼릭 링크 해석)
  2. 차단 패턴 확인: 모든 경로 구성 요소가 차단 패턴 목록과 대조됩니다 (대소문자 무시):

    패턴 보호 대상
    .ssh SSH 개인 키
    .gnupg GPG 개인 키
    .env 시크릿이 포함된 환경 파일
    .aws AWS 자격증명
    .azure Azure 서비스 주체 자격증명
    .gcloud Google Cloud 자격증명
    .docker Docker 레지스트리 자격증명
    .kube Kubernetes 클러스터 자격증명
  3. 허용 목록 루트 확인: 정규화된 경로는 명시적으로 허용된 루트 중 하나의 하위 경로여야 합니다

  4. 비메인 그룹 강제 읽기 전용: 비메인 그룹의 에이전트는 요청된 모드에 관계없이 항상 읽기 전용 마운트를 받습니다

레이어 3: 환경 변수 검사

컨테이너는 엄격하게 제어된 환경을 받습니다:

변수 동작
ANTHROPIC_BASE_URL 호스트에서 전달 (자격증명 프록시를 가리킴)
ANTHROPIC_API_KEY 항상 플레이스홀더로 재정의 (CREDENTIAL_PROXY_PLACEHOLDER)
TZ 호스트에서 전달 (올바른 시간대를 위해)

다른 모든 환경 변수는 컨테이너 내에서 사용할 수 없습니다.

레이어 4: 자격증명 프록시

sequenceDiagram
    participant A as 컨테이너 에이전트
    participant P as 자격증명 프록시 (localhost:3001)
    participant U as 업스트림 API (api.anthropic.com)

    A->>P: POST /v1/messages\nAuthorization: Bearer CREDENTIAL_PROXY_PLACEHOLDER
    P->>P: 플레이스홀더 검증
    P->>P: 실제 API 키로 대체
    P->>U: POST /v1/messages\nAuthorization: Bearer sk-ant-...
    U-->>P: 응답
    P-->>A: 응답 전달

업스트림 URL은 등록 시 검증됩니다:

  • HTTPS를 사용해야 합니다 (개발 시 localhost/127.0.0.1에 대해서는 HTTP 허용)
  • 클라우드 메타데이터 엔드포인트(예: 169.254.169.254)를 대상으로 할 수 없습니다
  • SSRF 공격을 방지하기 위해 RFC1918 사설 주소를 대상으로 할 수 없습니다

레이어 5: IPC 권한

작업 메인 그룹 일반 그룹
모든 채팅 JID로 메시지 전송 허용 차단 — 자신의 채팅 JID만
모든 그룹에 작업 생성 허용 차단 — 자신의 그룹만
후속 메시지 수신 허용 허용
전역 지침 읽기 허용 허용

일반 그룹 컨테이너가 그룹 간 작업을 시도하면 해당 시도가 보안 위반으로 기록되고 IPC 명령이 거부됩니다.

레이어 6: 보안 감사

주기적인 보안 감사(120초마다)가 실행 중인 컨테이너가 예상 구성과 일치하는지 확인합니다.

감사 검사

  • 환경 변수: ANTHROPIC_API_KEY가 실제 키가 아닌 플레이스홀더인지 확인
  • 마운트 포인트: 마운트가 승인된 목록과 일치하는지 확인
  • 새 권한 없음: no-new-privileges 보안 옵션이 설정되어 있는지 확인 (Docker만 해당)

감사 로그

curl "http://localhost:55765/api/v1/container/audit-log?limit=50"

보안 권장 사항

최소 권한 원칙

  • 에이전트가 실제로 필요한 가장 작은 호스트 디렉터리 집합만 마운트 허용 목록에 추가하세요.
  • 에이전트가 쓰기 권한이 필요하지 않을 때는 읽기 전용 마운트를 사용하세요.
  • 홈 디렉터리 루트(예: /Users/alice)를 허용 목록에 추가하지 마세요 — 구체적으로 지정하세요.

Management API 보호

Management API는 자격증명 매핑을 포함한 모든 컨테이너 구성을 노출합니다. 항상: * 설정 > 고급 > Management API에서 API 키 인증을 활성화하세요. * Management API를 localhost에만 바인딩하세요 (기본값). * 원격 접근이 필요한 경우 TLS를 사용하세요.

감사 로그 보존

보안 이벤트는 500개 이벤트의 인메모리 링 버퍼에 보존됩니다. 규정 준수를 위해 감사 로그 엔드포인트를 사용하여 정기적으로 이벤트를 내보내고 영구 로그 관리 시스템에 저장하세요.