애플리케이션 보안 체크리스트
애플리케이션 보안 체크리스트
쿠버네티스에서 실행되는 애플리케이션의 보안을 챙기기 위한 기본 지침을 정리한 문서예요. 이 체크리스트는 개발자 관점에서 쿠버네티스에서 돌아가는 애플리케이션을 안전하게 구성하기 위한 기본적인 지침을 제공해요. 목록이 모든 것을 빠짐없이 담으려는 것은 아니고, 시간이 지나면서 함께 발전해 나가기 위한 거예요.
이 문서를 읽고 사용하는 방법은 이래요.
- 주제의 순서는 우선순위를 의미하지 않아요.
- 일부 체크리스트 항목은 각 섹션 목록 아래의 문단에 자세히 설명돼 있어요.
- 이 체크리스트에서 말하는
개발자(developer)는 네임스페이스 범위(namespaced scope) 객체를 다루는 쿠버네티스 클러스터 사용자를 뜻해요.
참고: 체크리스트만으로 좋은 보안 상태를 유지하기에는 충분하지 않아요. 좋은 보안 상태는 지속적인 관심과 개선이 필요하지만, 체크리스트는 보안 준비를 향한 끝없는 여정의 첫걸음이 될 수 있어요. 이 체크리스트의 일부 권장 사항은 여러분의 특정 보안 요구에 비해 너무 엄격하거나 너무 느슨할 수 있어요. 쿠버네티스 보안은 "모든 경우에 맞는 단 하나의 해법"이 아니기 때문에, 각 체크리스트 항목은 그 자체의 가치에 따라 평가해 봐야 해요.
출처: 문서
본문
기본 보안 강화 (Base security hardening)
아래 체크리스트는 쿠버네티스에 배포되는 대부분의 애플리케이션에 적용할 수 있는 기본적인 보안 강화 권장 사항을 담고 있어요.
애플리케이션 설계 (Application design)
- 애플리케이션을 설계할 때 올바른 보안 원칙을 따르세요.
- 리소스의 request와 limits를 통해 애플리케이션에 적절한 QoS 클래스를 구성하세요. 요청(request)과 같거나 그 이상의 limit으로 워크로드에 메모리 한도를 설정하세요.
- 민감한 워크로드에는 CPU limit을 설정할 수도 있어요.
서비스어카운트 (Service account)
- 기본
defaultServiceAccount 사용을 피하세요. 대신 각 워크로드나 마이크로서비스별로 ServiceAccount를 만들어 사용하세요. - 파드가 쿠버네티스 API에 접근해서 동작해야 하는 특별한 경우가 아니라면
automountServiceAccountToken을false로 설정하세요.
파드 레벨 securityContext 권장 사항
runAsNonRoot: true를 설정하세요.- 컨테이너를 권한이 낮은 사용자로 실행하도록 구성하고(예:
runAsUser와runAsGroup사용), 컨테이너 이미지 안의 파일이나 디렉터리에 적절한 권한을 설정하세요. - 영구 볼륨에 접근하려면 필요에 따라
fsGroup으로 보조 그룹을 추가하세요. - 애플리케이션은 적절한 Pod 보안 표준을 강제하는 네임스페이스에 배포하세요. 애플리케이션이 배포되는 클러스터에서 이 강제 실행을 제어할 수 없다면, 문서화하거나 추가적인 심층 방어(defense in depth)를 통해 이 점을 반영하세요.
컨테이너 레벨 securityContext 권장 사항
allowPrivilegeEscalation: false로 권한 상승을 비활성화하세요.readOnlyRootFilesystem: true로 루트 파일시스템을 읽기 전용으로 구성하세요.- 권한이 있는(privileged) 컨테이너 실행을 피하세요(
privileged: false설정). - 컨테이너의 모든 capabilities를 제거하고, 컨테이너 운영에 필요한 특정 capabilities만 다시 추가하세요.
역할 기반 접근 제어 (RBAC, Role Based Access Control)
- create, patch, update, delete 같은 권한은 꼭 필요할 때만 부여하세요.
- 역할을 생성하거나 업데이트할 수 있는 RBAC 권한을 만들지 마세요. 이는 권한 상승으로 이어질 수 있어요.
system:unauthenticated그룹에 대한 바인딩을 검토하고 가능하면 제거하세요. 이 그룹은 네트워크 레벨에서 API 서버에 접근할 수 있는 모든 사람에게 접근을 허용하기 때문이에요.- create, update, delete 동사는 신중하게 허용해야 해요. Namespace에 patch 동사를 허용하면 사용자가 네임스페이스나 디플로이먼트의 라벨을 업데이트할 수 있게 되어 공격 표면이 넓어질 수 있어요.
- 민감한 워크로드의 경우, 허용되는 쓰기 동작을 더 제한하는 권장 ValidatingAdmissionPolicy를 제공하는 것을 고려하세요.
이미지 보안 (Image security)
- 이미지 스캐닝 도구를 사용해 컨테이너를 쿠버네티스 클러스터에 배포하기 전에 이미지를 스캔하세요.
- 컨테이너 이미지 서명을 사용해 쿠버네티스 클러스터에 배포하기 전에 컨테이너 이미지 서명을 검증하세요.
네트워크 정책 (Network policies)
- NetworkPolicies를 구성해 파드에서 예상되는 인그레스(ingress)와 이그레스(egress) 트래픽만 허용하세요.
- 여러분의 클러스터가 NetworkPolicy를 제공하고 강제하는지 확인하세요. 사용자가 다른 클러스터에 배포할 애플리케이션을 작성한다면, NetworkPolicy가 제공되고 강제된다고 가정할 수 있는지 고려해 보세요.
고급 보안 강화 (Advanced security hardening)
이 섹션은 다양한 쿠버네티스 환경 구성에 따라 유용할 수 있는 몇 가지 고급 보안 강화 사항을 다뤄요.
리눅스 컨테이너 보안 (Linux container security)
파드-컨테이너에 대한 Security Context를 구성하세요.
- 컨테이너에 Seccomp Profile을 설정하세요.
- AppArmor로 컨테이너의 리소스 접근을 제한하세요.
- 컨테이너에 SELinux 라벨을 할당하세요.
런타임 클래스 (Runtime classes)
- 컨테이너에 적절한 런타임 클래스를 구성하세요.
참고: 이 섹션은 쿠버네티스에 필요한 기능을 제공하는 서드파티 프로젝트를 링크해요. 쿠버네티스 프로젝트 저자들은 이 프로젝트들에 책임을 지지 않으며, 이 목록은 알파벳순으로 나열돼 있어요. 이 목록에 프로젝트를 추가하려면 변경 사항을 제출하기 전에 콘텐츠 가이드를 읽으세요. 자세한 내용 보기.
일부 컨테이너는 클러스터의 기본 런타임이 제공하는 것과 다른 격리(isolation) 수준을 요구할 수 있어요. 파드 스펙에서 runtimeClassName을 사용하면 다른 런타임 클래스를 정의할 수 있어요.
- 민감한 워크로드에는 gVisor 같은 커널 에뮬레이션 도구나 kata-containers 같은 가상화 격리 메커니즘을 사용하는 것을 고려하세요.
- 신뢰도가 높은 환경에서는 기밀 가상 머신(confidential virtual machines)을 사용해 클러스터 보안을 더욱 강화하는 것을 고려하세요.