[마이크로서비스 취약성 최소화] Kubernetes와 OPA Gatekeeper: 정책 관리의 새로운 접근법

IMKUNYOUNG·2024년 6월 26일
0

CKS

목록 보기
50/70
post-thumbnail

Kubernetes는 컨테이너화된 애플리케이션의 배포, 확장, 관리에 널리 사용되는 플랫폼입니다. 그러나 이러한 복잡한 환경에서는 정책 준수 및 보안이 중요한 과제가 됩니다. 이를 해결하기 위해 Open Policy Agent(OPA)와 GateKeeper를 활용한 새로운 접근법을 소개합니다. 이 글에서는 OPA GateKeeper를 Kubernetes에 배포하고, OPA Constraint Framework를 사용하여 정책을 관리하는 방법을 다룹니다.

OPA GateKeeper란 무엇인가?

OPA(Open Policy Agent)는 클라우드 네이티브 환경에서 정책을 정의하고 적용할 수 있는 오픈 소스 정책 엔진입니다. Gatekeeper는 OPA를 Kubernetes와 통합하여 정책을 적용하는 도구로, Kubernetes Admission Controller와 함께 작동합니다. Gatekeeper는 CRD(커스텀 리소스 정의)를 사용하여 정책을 정의하고 공유할 수 있도록 하여, 정책 관리가 더 쉽고 신뢰할 수 있도록 합니다.

OPA GateKeeper 설치하기

OPA Gatekeeper를 Kubernetes에 배포하는 것은 간단합니다. OPA GateKeeper의 설치 지침에 따라 kubectl apply 명령어를 사용해 Gatekeeper 사양 파일을 적용하면 됩니다. 배포가 완료되면, 다음과 같이 Gatekeeper 서비스가 제대로 설치되고 실행 중인지 확인할 수 있습니다.

kubectl apply -f https://raw.githubusercontent.com/open-policy-agent/gatekeeper/release-3.3/deploy/gatekeeper.yaml
kubectl get pods -n gatekeeper-system

위 명령어를 통해 여러 Controller Manager, Audit Service, Gatekeeper Webhook 서비스가 정상적으로 실행되는 것을 확인할 수 있습니다.

OPA Constraint Framework 이해하기

OPA Constraint Framework는 OPA 정책을 구현할 때 "무엇을", "어디에서", "어떻게" 적용할 것인지를 선언하는 프레임워크입니다. 이를 통해 환경 내에서 다양한 제한 사항을 정의하고 적용할 수 있습니다.

예를 들어, 특정 네임스페이스 내의 모든 객체에 billing 라벨을 갖도록 하고 싶다면, 이를 Kubernetes Admission Controller에서 적용할 수 있습니다. 이는 OPA와 OPA Contraint Framework가 Kubernetes에만 국한되지 않고, Git Webhook이나 다른 Admission Controller와 같은 솔루션에도 적용될 수 있음을 의미합니다.

정책 정의: 라벨 검증 예제

Kubernetes에서 모든 객체가 billing 라벨을 갖도록 하는 간단한 예제를 살펴보겠습니다. 이를 위해 Rego 코드를 사용하여 다음과 같이 정책을 정의합니다:

package kubernetes.admission

violation[{"msg": msg}] {
  provided := {label | input.request.object.metadata.labels[label]}
  required := {"billing"}
  missing := required - provided
  count(missing) > 0
  msg := sprintf("Missing required labels: %v", [missing])
}

이 코드에서는 객체의 라벨을 가져와 billing 라벨이 있는지 확인합니다. 만약 없다면, 누락된 라벨을 강조하는 오류 메시지를 반환합니다.

Constraint Template 생성하기

여러 요구 사항에 대해 동일한 정책을 적용하려면 이를 템플릿으로 만들어야 합니다. 이를 Contraint Template이라고 합니다. 다음은 Contraint Template을 생성하는 예제입니다:

apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
metadata:
  name: systemrequiredlabels
spec:
  crd:
    spec:
      names:
        kind: SystemRequiredLabel
      validation:
        openAPIV3Schema:
          properties:
            labels:
              type: array
              items:
                type: string
  targets:
    - target: admission.k8s.gatekeeper.sh
      rego: |
        package systemrequiredlabels

        violation[{"msg": msg}] {
          provided := {label | input.review.object.metadata.labels[label]}
          required := {label | label := input.parameters.labels[_]}
          missing := required - provided
          count(missing) > 0
          msg := sprintf("Missing required labels: %v", [missing])
        }

이 템플릿은 SystemRequiredLabel이라는 사용자 정의 리소스 정의(CRD)를 생성하고, 라벨 검증 로직을 포함합니다.

Contraint 정의하기

이제 Contraint Template을 기반으로 실제 Contraint를 생성할 수 있습니다. 예를 들어, expensive 네임스페이스는 billing 라벨을 요구하는 Contraint를 생성합니다:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: SystemRequiredLabel
metadata:
  name: require-billing-label
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    namespaces: ["expensive"]
  parameters:
    labels: ["billing"]


이와 같은 방식으로 다양한 요구사항에 대해 Contraint를 정의할 수 있습니다.

마무리

OPA Gatekeeper와 OPA Contraint Framework를 활용하면 Kubernetes 환경에서 정책을 효과적으로 관리할 수 있습니다. 이를 통해 다양한 요구사항에 맞는 정책을 쉽게 정의하고 적용할 수 있으며, 정책 위반 시 경고나 오류 메시지를 출력하여 정책 준수를 보장합니다.

0개의 댓글