10. 권한 및 보안
1. 계정 및 권한관리 (RBAC, Role-Based Access Control)
1.1 주요 개념
Service Account: Kubernetes 클러스터 내에서 파드가 API 서버와 상호작용할 때 사용되는 계정입니다. 각 네임스페이스에는 기본적으로
default
서비스 계정이 있습니다.Role: 특정 리소스에 대한 권한을 정의합니다. 예를 들어,
pods
리소스에 대해get
,list
,watch
권한을 정의할 수 있습니다.RoleBinding: Role을 Service Account에 바인딩하여 해당 권한을 부여합니다.
ClusterRole: 클러스터 전체에 적용될 수 있는 Role입니다.
ClusterRoleBinding: ClusterRole을 Service Account에 바인딩하여 클러스터 전체에 대한 권한을 부여합니다.
1.2 리소스 설명
Service Account는 파드가 Kubernetes API 서버와 상호작용할 때 사용할 수 있는 계정입니다.
Role과 RoleBinding을 통해 서비스 계정에 특정 권한을 부여할 수 있습니다.
ClusterRole과 ClusterRoleBinding은 클러스터 전체에 대한 권한을 부여할 수 있습니다.
서비스 계정을 사용하여 파드를 생성하면 해당 파드는 부여받은 권한 내에서 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가 올바르게 적용되는지 확인해봅시다.