10. 권한 및 보안


1. 계정 및 권한관리 (RBAC, Role-Based Access Control)

1.1 주요 개념

  1. Service Account: Kubernetes 클러스터 내에서 파드가 API 서버와 상호작용할 때 사용되는 계정입니다. 각 네임스페이스에는 기본적으로 default 서비스 계정이 있습니다.

  2. Role: 특정 리소스에 대한 권한을 정의합니다. 예를 들어, pods 리소스에 대해 get, list, watch 권한을 정의할 수 있습니다.

  3. RoleBinding: Role을 Service Account에 바인딩하여 해당 권한을 부여합니다.

  4. ClusterRole: 클러스터 전체에 적용될 수 있는 Role입니다.

  5. ClusterRoleBinding: ClusterRole을 Service Account에 바인딩하여 클러스터 전체에 대한 권한을 부여합니다.

1.2 리소스 설명

  • Service Account는 파드가 Kubernetes API 서버와 상호작용할 때 사용할 수 있는 계정입니다.

  • RoleRoleBinding을 통해 서비스 계정에 특정 권한을 부여할 수 있습니다.

  • ClusterRoleClusterRoleBinding은 클러스터 전체에 대한 권한을 부여할 수 있습니다.

  • 서비스 계정을 사용하여 파드를 생성하면 해당 파드는 부여받은 권한 내에서 Kubernetes API 서버와 상호작용할 수 있습니다.

 

1.3 Service Account 생성 및 사용 예제

(1) Service Account 생성

먼저, 네임스페이스에 새로운 서비스 계정을 생성합니다.

10/00-service-account.yaml

apiVersion: v1 kind: ServiceAccount metadata: name: my-service-account namespace: default

 

위의 YAML 파일을 service-account.yaml로 저장하고, 다음 명령어로 적용합니다:

kubectl apply -f 00-service-account.yaml

 

(2) Role 및 RoleBinding 생성

새로운 서비스 계정에 특정 권한을 부여하기 위해 Role과 RoleBinding을 생성합니다.

10/01-role.yaml

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

 

위의 YAML 파일을 role.yaml로 저장하고, 다음 명령어로 적용합니다:

 

RoleBinding 생성

10/02-rolebinding.yaml

 

위의 YAML 파일을 rolebinding.yaml로 저장하고, 다음 명령어로 적용합니다:

 

(3) 파드에서 Service Account 사용

이제 생성한 서비스 계정을 사용하여 파드를 생성합니다.

10/03-service-account-pod.yaml

 

위의 YAML 파일을 pod.yaml로 저장하고, 다음 명령어로 적용합니다:

 

 

 


2. Ingress TLS 인증서 적용

2.1 애플리케이션 생성

10/04-ingress-backend.yaml

2.2 OpenSSL을 사용하여 자체 서명된 TLS 인증서 생성

10/05-openssl-create-tls.txt

2.3 쿠버네티스 시크릿 생성

2.4 Ingress 리소스 생성

10/06-ingress-tls.yaml

2.4 hosts 파일 수정

  • ingress-controller Service의 IP를 입력합니다.

2.5 호출

 


3. Network Policy

  • 네트워크 레벨에서 파드 간 트래픽을 제어할 수 있는 리소스

  • 클러스터 보안을 강화하고, 서비스 간 통신을 제어하며, 격리된 네트워크 환경을 만들기 위해 사용

3.1 주요 개념

(1) 네임스페이스

  • Network Policy는 특정 네임스페이스에 적용됩니다.

(2) Pod Selector

  • 특정 레이블을 가진 파드에 대한 트래픽을 필터링합니다.

(3) Policy Types

  • Ingress와 Egress 트래픽을 제어할 수 있습니다.

(4) Ingress

  • 파드로 들어오는 트래픽을 제어합니다.

(5) Egress

  • 파드에서 나가는 트래픽을 제어합니다.

 

3.2 Network Policy 예제

(1) 특정 파드에 대해 모든 인바운드 트래픽을 허용

10/07-networkpolicy-allow-all.yaml

 

(2) web 네임스페이스에서 모든 Ingress 및 Egress 트래픽 차단

10/08-networkpolicy-deny-all.yaml

web 네임스페이스에 파드를 생성하여, 네트워크 상태를 확인해봅시다.

 

(3) 특정 파드로의 Ingress 트래픽 허용

10/09-networkpolicy-sample1.yaml

default 네임스페이스에 app: frontend Label을 가진 파드와 app: backend Label을 가진 파드를 생성하여 설정은 확인해봅시다.

 

(4) 특정 IP 블록으로의 Ingress 트래픽 허용

10/10-networkpolicy-sample2.yaml

 

(5) web 네임스페이스에 있는 파드가 my-service 네임스페이스의 app: myservice 라벨이 있는 파드로만 Egress 트래픽을 허용

10/11-networkpolicy-sample3.yaml

조건에 맞는 네임스페이스 및 파드를 생성하여 Network Policy가 올바르게 적용되는지 확인해봅시다.

Related content

12. 쿠버네티스 모니터링
12. 쿠버네티스 모니터링
Read with this
8. 쿠버네티스 리소스 관리 및 볼륨
8. 쿠버네티스 리소스 관리 및 볼륨
Read with this
11. 쿠버네티스 자동화 프로비저닝
11. 쿠버네티스 자동화 프로비저닝
Read with this
6. 쿠버네티스 서비스/네트워크
6. 쿠버네티스 서비스/네트워크
Read with this
1. 쿠버네티스 실습환경 구축
1. 쿠버네티스 실습환경 구축
Read with this
9. 쿠버네티스 백업/복구
9. 쿠버네티스 백업/복구
Read with this