[k8s] 클러스터에 보안 설정하기 - NetworkPolicy, ServiceAccount

🔥Log·2024년 12월 24일
0

k8s

목록 보기
10/15

☕ 개요


k8s 클러스터는 하나의 Private 서브넷처럼 동작하고, 클러스터 내부에 있는 자원들은 특별한 제약없이 서로 서로 통신이 가능하다.

하지만, 실수로 Namespace를 누군가 지워버린다거나 접근하면 안되는 자원에 특정 자원이 접근이 가능하게 될 수도 있게 되는 것이므로, 이는 보안 사고로 이어질 수도 있다.

그래서, k8s에서는 NetworkPolicy 컴포넌트를 제공하고 권한을 설정할 수 있는 Account 또한 제공한다.

한번 살펴보자!



⚓ NetworkPolicy


NetworkPolicy는 AWS의 SecurityGroup과 유사한 역할을 한다.
인바운드 또는 아웃바운드 룰을 설정하고, 그 룰에 맞는 자원만 접근 가능하도록 제한할 수 있다.

💡 특징

  • Pod 혹은 네임스페이스 기준으로 호출 가능 여부를 설정하는 객체
  • Ingress 또는 Egress 규칙은 특정 Pod를 호출할 수 있는 네임스페이스와 Pod를 지정 (Ingress: 인바운드, Egress: 아웃바운드)
  • NetworkPolicy는 화이트리스트 방식이며 지정하지 않은 대상은 모두 호출이 거부됨


🐳 NetworkPolicy 사용법


apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: my-netpol
spec:
  podSelector:
    matchLabels:
      app: my-app
  ingress:
    - from:
      - namespaceSelector: # 특정 Namespace를 허용
        matchLabels:
          profile: dev
      - podSelector: # 특정 Pod를 허용
        matchLabels:
          role: gateway
      ports: # 특정 포트만 접근 허용
        - protocol: TCP
          port: 8080

인바운드 룰을 명시한 NetworkPolicy는 위와 같은 형태로 yml을 작성하여, 생성할 수 있고

apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: my-netpol
spec:
  podSelector:
    matchLabels:
      app: my-app
  egress:
    - to:
      - namespaceSelector:
          matchLabels:
            profile: prod
        podSelector:
          matchLabels:
            role: front

아웃바운드 룰을 명시한 NetworkPolicy는 위와 같은 형태로 yml을 작성하여, 생성할 수 있다.



⚓ Account


k8s의 Account는 UserAccount와 ServiceAccount가 존재한다.
이름에서도 알 수 있듯이 UserAccount는 관리자가 특정 사람을 위해서 권한을 지정해서 발급할 수 있는 계정을 의미하고, ServiceAccount는 k8s 클러스터에 존재하는 자원에게 할당하여 그 자원이 사용하도록 존재하는 계정이다.

💡 계정에 부여할 수 있는 권한

계정에 부여할 수 있는 권한은 아래와 같은 것들이 있다.

  • Role: 어떤 객체에 대한 작업 권한의 집합
  • Cluster role: 클러스터 전체에 영향을 주흔 객체들에 대한 권한


🐳 ServiceAccount 사용법


apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: dev
  name: pod-reader
rules:
- apiGroup: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]

Role은 위와 같이 생성할 수 있고,

rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: dev
subjects:
- kind: ServiceAccount
  name: my-service-account
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io

Role을 특정 계정에 적용하기 위한 RoleBinding은 위와 같이 생성할 수 있다.

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
  namespace: default
spec:
  serviceAccountName: my-service-account # ServiceAccount의 이름
  containers:
  - name: my-container
    image: my-image

이전에 생성한 계정을 특정 Pod에 적용하고 싶다면 이렇게 yml을 작성하여 Pod를 생성하면 된다.



☕ 참고


0개의 댓글