글을 쓰기 앞서 이 책을 참조하였습니다.
쿠버네티스 인증에는 어떤 것들이 있나요?
- Service Account 오브젝트를 통한 인증
- Open ID Connect (OAuth) 와 같은 third party 를 통한 인증
- Certificates (인증서)를 통한 인증 등이 있습니다.
쿠버네티스 사용 시 인증이 왜 필요한가요?
운영중인 서비스에 대한 보안 강화 및 기밀 정보 보호의 목적 뿐만 아니라,
사내 조직 간의 쿠버네티스 동시다발적 제어 및 접근에 있어서
RBAC (Role Based Access Control) 역할에 따른 최소 권한 할당에 있어서 중요한 역할을 합니다.
쿠버네티스의 인증과정은 어떻게 이루어지나요?
일반적으로 위와 같은 과정으로 Kubernetes API Server 에서 인증이 진행됩니다.
- Kubectl 명령어를 통해 Kube-API Server에 HTTP Handler 에 요청을 전송
- API Server 는 해당 클라이언트가 쿠버네티스의 사용자가 맞는지 확인
- API Server 는 해당 클라이언트가 요청한 기능을 실행할 권한이 있는지 확인
- 관리자의 정책에 따라 Admission Control 을 수행합니다.
API Server 가 인증을 어떻게 하나요?
앞서 설명했다시피 Service Account, third party , Certificates 와 같은 방법들이 있습니다.
우선 Service Account 오브젝트를 활용하여 인증하는 방법을 설명하겠습니다.
Service Account (SA) 는 체계적으로 권한을 관리하기 위한 쿠버네티스 오브젝트입니다.
k create sa [Service Account Name] -n [ namespace ]
위와 같이 SA 생성이 가능하며, 다음과 같이 활용할 수 있습니다.
그러나, SA 오브젝트만 있어서는 인증이 불가능하며, SA 에 직접 접근 대상, 접근 권한, 권한 주체를 설정해주어야 합니다.
Role 이라는 오브젝트로 아래와 같이 rule 을 적용하여 SA에 RoleBinding 을 통해 Role 을 할당해 주어야 합니다.
또, Namespace 에 속한 리소스들을 대상으로 다루는 Role 과 Cluster 전체 리소스들을 다루는 Cluster Role 이 있습니다.
그러면, Kubectl 을 통해서만 SA 를 활용할 수 있나요?
Application 에서 또한 HTTP API 를 통해 API Server에 요청이 가능합니다.
우선, HTTP API 요청을 위한 API Server Endpoint 로 다음과 같습니다.
기본적으로 API Server 는 HTTPS 요청만을 처리하기 때문에, 인증에 대한 자격증명이 필요합니다.
SA 오브젝트를 생성ㅇ하면 해당 SA에 대응하는 Secret 이 자동으로 생성됩니다.
해당 Secret 에는 ca.crt , token , namespace 가 base64 로 인코딩되어 저장되어 있습니다.
이에 Application 에서는 Token 정보를 읽어 API Server 에 JWT 인증을 시도합니다.
이후, 기존 SA 정보를 바탕으로 인증 및 인가 과정을 처리하게 됩니다.
그리고, API Server 의 몇몇 특정 경로들은 접근 제한이 되어있으나, Cluster Role 을 통해 아래와 같이 설정하여 접근이 가능합니다.
마지막으로, 다음과 같이 SDK 를 통한 SA 인증이 가능합니다.
1. SA 를 생성 한 후 Role 과 Role Binding 을 적용해줍니다.
2. 대상 Pod 에 SA 이름을 명시합니다.
3. 해당 Pod 의 Container 에 자동으로 Secret 정보가 마운트됩니다.
4. Token 정보를 읽어 기존 default namespace 의 kubernetes 서비스를 통해 API Server 에 인증을 시도합니다.
RBAC 이 왜 중요한건가요?
추후 작성 예정
Admission Controller 가 뭔가요?
추후 작성 예정
OIDC 나 Certificates 를 통한 인증은 어떻게 하나요??
새로운 글로 작성 예정