IT/CKA

CKA 준비과정 - Security (7) / Service Accounts, Image Security

Primes 2023. 6. 26. 17:09
728x90

쿠버네티스의 계정은 두 유형으로 나뉜다.

사용자가 사용하는 사용자 계정과, 컴퓨터가 사용하는 서비스 계정이 있다.

 

사용자 계정 : 관리 작업을 수행하기 위해 클러스터에 액세스하는 관리자, 프로그램 배포를 위해 클러스터에 액세스하는 개발자가 사용

서비스 계정 : 프로그램이 k8s 클러스터와 상호작용 시 사용하는 계정

 

서비스 계정의 예로, 프로메테우스와 같은 모니터링 툴과 젠킨스와 같은 자동화 빌드 툴들이 서비스 계정을 활용한다.

 

어플리케이션이 쿠버네티스 API를 사용하려면 인증이 필요하다. 이 때 요구되어지는 것이 서비스 계정이다.

kubectl create serviceaccount dashboard-sa

위 명령어로 서비스 계정 생성이 가능하다. 계정이 생성되면 토큰도 자동으로 생성된다. 해당 토큰은 API 인증 시 어플리케이션이 사용하는 토큰이다. 이 토큰은 Secret 객체로 저장된다.

서비스 계정이 생성되면 토큰이 따라 생성되고, Secret 을 생성한 뒤 해당 secret 내부에 토큰을 저장한다.

 

이와같이 쿠버네티스 클러스터에 접근이 필요한 외부 어플리케이션들은 Service Account 의 Secret 토큰을 자동으로 마운트하여 쉽게 접근할 수 있도록 한다.

 

쿠버네티스 내 모든 Namespace에는 기본 Service Account가 자동으로 생성된다. 그리고, 파드가 생성되면 자동으로 기본 Service Account와 토큰이 파드에 마운트된다.

 

파드를 정의 파일을 통해 생성할 때, 정의 파일에는 Secret이나 마운트 정보를 명시하지 않고 생성한다. 하지만 파드가 생성된 후 명령어를 통해 확인해보면 default-token Secret을 통해 볼륨이 자동생성 되어 있음을 알 수 있다. 

 

단, default 서비스 계정은 기능이 제한되어 있다. 기본적인 쿠버네티스 API 쿼리를 실행하는 권한만 가진다.

파드가 다른 Service Account를 참조하도록 하고 싶다면 파드 생성 정의 파일에서 serviceAccountName 필드를 추가해 직접 지정을 해줘야 한다. (이미 생성했을 경우 삭제 후 재생성)

 

해당 필드를 명시해주지 않으면 default 서비스 계정을 마운트하여 기능이 제한되니 주의해야 한다.

 

또한, 파드 생성시 정의 파일에 automountServiceAccountToken 필드를 추가하고 false 값을 설정하면 파드 생성 시 서비스 계정을 마운트하지 않는다.

 

K8S 1.22, 1.24에서 해당 기능에 대한 변경점이 있었다.

앞서 학습하였듯이 모든 Namespace에는 default 서비스 계정이 존재한다. 이에 따라 계정의 Secret이 있고, Secret 내에는 토큰이 있다.

 

다만, 해당 토큰은 만료일자가 없다. 따라서 계정이 존재하는 한 토큰이 유효하기 때문에 확장성이 떨어지는 문제가 있다.

이에 1.22 업데이트에서 TokenRequestAPI가 등장하여 만료일자를 가진 토큰이 생성되어 파드에 마운트된다.

 

 

여기서 추가로 1.24 버전에서는 더 이상 자동으로 Secret과 토큰이 생성되지 않도록 변경되었다.

따라서 kubectl create 명령어로 토큰을 생성해야 한다.

 

이전 < ㅡ > 이후

 

Image Security

파드 정의 파일을 구성할 때, 컨테이너 이미지 이름을 지정한다.

이 때 컨테이너 이미지 이름은 Docker의 이미지 명명 규칙을 따른다.

레지스트리 / 계정 / 이미지, 리포지토리 순으로 지정된다.

레지스트리 : 이미지 저장소

=> 이미지 생성, 업데이트 시 레지스트리로부터 이미지를 가져오게 된다. ex) 도커 허브, GCR

=> 공개되지 않길 원하는 이미지는 private 레지스트리를 사용하면 된다. 여기에 접근하기 위해서는 자격 증명이 필요하다.

 

파드 정의 파일 구성 시, image 필드에 이미지를 지정한다. 이때, private 레지스트리 에 접근하기 위해서는 ImagePullSecrets 필드를 추가하여 Secret 개체를 참조하게 하여 인증을 통과한다.

 

 

반응형