k8s 클러스터는 하나의 Private 서브넷처럼 동작하고, 클러스터 내부에 있는 자원들은 특별한 제약없이 서로 서로 통신이 가능하다.
하지만, 실수로 Namespace를 누군가 지워버린다거나 접근하면 안되는 자원에 특정 자원이 접근이 가능하게 될 수도 있게 되는 것이므로, 이는 보안 사고로 이어질 수도 있다.
그래서, k8s에서는 NetworkPolicy 컴포넌트를 제공하고 권한을 설정할 수 있는 Account 또한 제공한다.
한번 살펴보자!
NetworkPolicy는 AWS의 SecurityGroup과 유사한 역할을 한다.
인바운드 또는 아웃바운드 룰을 설정하고, 그 룰에 맞는 자원만 접근 가능하도록 제한할 수 있다.
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을 작성하여, 생성할 수 있다.
k8s의 Account는 UserAccount와 ServiceAccount가 존재한다.
이름에서도 알 수 있듯이 UserAccount는 관리자가 특정 사람을 위해서 권한을 지정해서 발급할 수 있는 계정을 의미하고, ServiceAccount는 k8s 클러스터에 존재하는 자원에게 할당하여 그 자원이 사용하도록 존재하는 계정이다.
계정에 부여할 수 있는 권한은 아래와 같은 것들이 있다.
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를 생성하면 된다.