보안 개요

이 페이지는 Google Cloud에서 실행되는 Container-Optimized OS의 보안 기능에 대한 개요를 설명합니다.

OS 보안

Google의 Container-Optimized OS는 잘 구성된 프로덕션 서비스 실행용 플랫폼을 제공하기 위해 Chromium OS에 따라 여러 보안 디자인 원칙을 구현합니다.

OS 사용 공간 최소화

이는 Container-Optimized OS 보안의 핵심입니다. Container-Optimized OS는 컨테이너를 실행하는 데 최적화되어 있고, 컨테이너에는 자체 종속 항목이 패키징되어 있으므로 불필요한 패키지를 자르고, OS에서 공격에 노출되는 영역을 최소화할 수 있습니다.

변경 불가능한 루트 파일 시스템 및 자체 검사 부팅

Container-Optimized OS 루트 파일 시스템은 항상 읽기 전용으로 마운트됩니다. 또한 체크섬은 빌드 시 계산되고 부팅할 때마다 커널을 통해 확인됩니다. 이 메커니즘은 공격자가 영구적인 로컬 변경을 통해 머신을 '소유'하지 못하게 합니다. 또한 다른 여러 마운트는 기본적으로 실행 불가능합니다. 자세한 내용은 파일 시스템을 참조하세요.

상태 비추적 구성

읽기 전용 루트 파일 시스템이 있으면 보안에 좋지만 시스템 사용 편의성이 떨어집니다. 예를 들어 시스템에 로그인하려면 사용자를 만들고 추가할 수 있어야 합니다. 이를 위해 /etc/를 쓰기는 가능하나 스테이트리스(Stateless) 상태가 되도록 루트 파일 시스템을 맞춤설정합니다. 이렇게 하면 런타임 시 구성 설정을 작성할 수 있지만 이러한 설정은 재부팅 후에도 지속되지는 않습니다. 따라서 Container-Optimized OS 노드가 재부팅될 때마다 깔끔한 슬레이트에서 시작됩니다. 사용자의 홈 디렉토리, 로그, Docker 이미지와 같은 특정 데이터는 루트 파일 시스템의 일부가 아니므로 재부팅 후에도 지속됩니다.

보안 강화 커널

Container-Optimized OS는 IMA(Integrity Measurement Architecture), Audit, KPTI(Kernel Page Table Isolation), Chromium OS의 일부 LSM(Linux Security Module)을 비롯한 여러 보안 강화 커널 기능을 구현합니다. 또한 Container-Optimized OS는 더 세부적인 보안 정책을 적용할 수 있게 해주는 seccompAppArmor와 같은 보안 기능을 지원합니다.

보안 중심의 기본값

컨테이너 최적화 OS는 여러 기능에 보안을 고려한 기본값을 제공하여 보안을 더욱 강화합니다. 여기에는 ptrace 및 권한 없는 BPF를 사용 중지하고 방화벽을 잠그는 등 다양한 기능을 제공하는 sysctl 설정 등이 포함됩니다. 이러한 기본값이 인스턴스 전체에 자동으로 적용될 경우 전체 클러스터, 프로젝트, 조직의 보안을 유지하는 데 도움이 됩니다.

자동 업데이트

Container-Optimized OS의 자동 업데이트 기능은 실행 중인 VM에 보안 패치를 신속하게 제공할 수 있게 해줍니다. Kubernetes Engine에서 Container-Optimized OS를 관리하는 경우 노드 자동 업그레이드가 보안과 안정성 사이에 균형을 맞춥니다.

파일 시스템

다음은 Container-Optimized OS 노드 이미지 파일 시스템의 경로 목록과 그 속성 및 권장 용도를 보여줍니다.

경로 속성 목적
/
  • 읽기 전용
  • 실행 가능
루트 파일 시스템이 무결성 유지를 위해 읽기 전용으로 마운트됩니다. 커널이 부팅 중 무결성 루트 파일 시스템을 확인하고, 오류 발생 시 부팅을 거절합니다.
/home
/var
  • 쓰기 가능
  • 실행 불가능
  • 스테이트풀(Stateful)
이러한 경로는 부팅 디스크의 수명 동안 지속되는 데이터를 저장하기 위한 용도로 사용됩니다. /mnt/stateful_partition에서 마운트됩니다.
/var/lib/google
/var/lib/docker
/var/lib/toolbox
  • 쓰기 가능
  • 실행 가능
  • 스테이트풀(Stateful)
이러한 경로는 각각 Compute Engine 패키지(예: 계정 관리자 서비스), Docker, 도구 상자의 작업 디렉터리입니다.
/var/lib/cloud
  • 쓰기 가능
  • 실행 가능
  • 스테이트리스(Stateless)
  • tmpfs
이 경로는 cloud-init 패키지의 작업 디렉터리입니다.
/etc
  • 쓰기 가능
  • 실행 불가능
  • 스테이트리스(Stateless)
  • tmpfs
일반적으로 구성이 저장됩니다(예: cloud-init를 통해 정의된 systemd 서비스). 인스턴스를 다시 시작할 때는 물론 인스턴스를 새로 생성할 때에도 cloud-init가 적용되므로 cloud-init에서 원하는 인스턴스 상태를 캡처하는 것이 좋습니다.
/tmp
  • 쓰기 가능
  • 실행 불가능
  • 스테이트리스(Stateless)
  • tmpfs
일반적으로 스크래치 공간으로 사용되며, 영구 데이터 저장을 위해 사용되지 않습니다.
/mnt/disks
  • 쓰기 가능
  • 실행 가능
  • 스테이트리스(Stateless)
  • tmpfs
/mnt/disks 아래의 디렉터리에 영구 디스크를 마운트할 수 있습니다.

방화벽

기본적으로 Container-Optimized OS는 포트 22에서 SSH를 제외한 모든 수신 TCP/UDP 연결을 삭제하도록 구성됩니다. 기본값을 변경하여 추가 포트를 여는 방법은 호스트 방화벽 구성을 참조하세요.

인스턴스 액세스

기본적으로 Container-Optimized OS에는 액세스 가능한 사용자 계정이 포함되어 있지 않습니다. 사용자 계정과 SSH 키는 인스턴스나 프로젝트 메타데이터 또는 OS 로그인을 통해 관리됩니다. OS 로그인을 사용하면 IAM으로 인스턴스에 대한 액세스를 관리할 수 있습니다. 더 세부적인 액세스 제어(sudo 또는 비 sudo), 식별 가능한 SSH 키, 조직 로그인 정책을 사용할 수 있습니다.

SSH 데몬은 비밀번호 기반 인증을 허용하지 않고 루트 로그인을 허용하지 않도록 구성되어 있습니다. 하지만 사용자 계정이 OS 로그인으로 관리되지 않는 한 사용자는 로그인 후에 sudo를 사용하여 루트 권한을 얻을 수 있습니다.

인프라 보안

OS 자체의 여러 강화 기능 외에도 Container-Optimized OS 팀은 소프트웨어 공급망을 중요하게 여기고, Chromium OS 및 일반적인 Google에 대한 수년간의 경험을 바탕으로 이미지 개발, 빌드, 배포 시 인프라 보안을 최우선으로 고려합니다.

Google의 소스로 빌드

Linux 커널 자체를 포함한 Container-Optimized OS의 각 패키지는 ChromiumOS 코드 저장소의 소스로 빌드됩니다. 따라서 OS에 누가 체크인했고, 어떤 버전이 도입되었는지 등 OS에서 일어나는 일을 정확히 알 수 있습니다. 또한 어떤 수준에서 취약점이 발견될 경우 패키지를 빠르게 패치하고 업데이트할 수 있습니다.

지속적인 취약점(CVE) 검색 및 대응

CVE 검색 시스템은 OS의 커널이나 패키지에서 취약점이 발견될 때마다 알림을 표시합니다. 이는 Android 및 Chromium OS에서 취약점을 검색하는 데 사용되는 시스템과 동일합니다. Container-Optimized OS 팀은 패치된 출시 버전을 만드는 데 우선순위를 두고 대응합니다. Container-Optimized OS팀은 또한 Googles 문제 대응팀과 협업하여 Container-Optimized OS에서 더 광범위한 보안 패치를 빠르게 사용할 수 있게 해줍니다.

테스트 및 검증 과정

Google은 새로운 Container-Optimized OS 이미지를 Google Cloud에 게시하기 전에 syzkaller를 사용한 커널 퍼즈 테스트, Compute Engine 기능을 사용한 통합 테스트, 여러 성능 벤치마크 등을 통해 여러 수준에서 테스트를 실시합니다. 이는 출시 버전의 안정성과 품질을 보장합니다.