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: 마운트 보안¶
마운트 허용 목록은 파일시스템 접근에 대한 기본 거부 정책을 적용합니다.
검증 단계¶
- 심볼릭 링크 해석: 호스트 경로는 정규화됩니다 (모든 심볼릭 링크 해석)
-
차단 패턴 확인: 모든 경로 구성 요소가 차단 패턴 목록과 대조됩니다 (대소문자 무시):
패턴 보호 대상 .sshSSH 개인 키 .gnupgGPG 개인 키 .env시크릿이 포함된 환경 파일 .awsAWS 자격증명 .azureAzure 서비스 주체 자격증명 .gcloudGoogle Cloud 자격증명 .dockerDocker 레지스트리 자격증명 .kubeKubernetes 클러스터 자격증명 -
허용 목록 루트 확인: 정규화된 경로는 명시적으로 허용된 루트 중 하나의 하위 경로여야 합니다
- 비메인 그룹 강제 읽기 전용: 비메인 그룹의 에이전트는 요청된 모드에 관계없이 항상 읽기 전용 마운트를 받습니다
레이어 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만 해당)
감사 로그¶
보안 권장 사항¶
최소 권한 원칙
- 에이전트가 실제로 필요한 가장 작은 호스트 디렉터리 집합만 마운트 허용 목록에 추가하세요.
- 에이전트가 쓰기 권한이 필요하지 않을 때는 읽기 전용 마운트를 사용하세요.
- 홈 디렉터리 루트(예:
/Users/alice)를 허용 목록에 추가하지 마세요 — 구체적으로 지정하세요.
Management API 보호
Management API는 자격증명 매핑을 포함한 모든 컨테이너 구성을 노출합니다. 항상: * 설정 > 고급 > Management API에서 API 키 인증을 활성화하세요. * Management API를 localhost에만 바인딩하세요 (기본값). * 원격 접근이 필요한 경우 TLS를 사용하세요.
감사 로그 보존
보안 이벤트는 500개 이벤트의 인메모리 링 버퍼에 보존됩니다. 규정 준수를 위해 감사 로그 엔드포인트를 사용하여 정기적으로 이벤트를 내보내고 영구 로그 관리 시스템에 저장하세요.