Amazon EKS authenticate by Google accounts
Giới thiệu
Kubernetes (k8s) là một hệ thống mã nguồn mở giúp quản lý và triển khai các containerized applications trên môi trường phân tán phổ biến nhất hiện nay. AWS hiện đang hỗ trợ người dùng quản lý hệ thống Kubernetes dưới dạng một dịch có tên là Elastic Kubernetes Service - EKS.
Bài viết này sẽ hướng dẫn cách xác thực với EKS thông qua Google Accounts, mang lại tính linh hoạt trong việc quản lý cụm EKS.
*Chú ý: Bài viết này tập trung vào việc hướng dẫn người dùng triển khai xác thực trên EKS thông qua Google Accounts và giả định rằng mọi người đều đã làm việc với EKS và Google Accounts rồi.
Đặt vấn đề
Đối với các doanh nghiệp hay cá nhân đang vận hành hệ thống trên các cụm EKS, việc quản lý cụm yêu cầu người dùng phải xác thực thông qua AWS
, về cơ bản quản trị viên, người dùng hệ thống (cụm) EKS đều phải có tài khoản trên AWS khi muốn tương tác với cụm. Trong khi đó việc quản lý tài khoản nhân viên trong doanh nghiệp sẽ được quản lý thông qua các bên/dịch vụ khác như Google (thông qua Gsuite chẳng hạn). Nên nếu tích hợp được khâu xác thực của EKS với các công cụ quản lý tài khoản chung thì sẽ giúp ích rất nhiều cho doanh nghiệp.
Hướng giải quyết
Thật may, EKS (Kubernetes) có hỗ trợ một giao thức xác thực có tên là Open ID Connect (OIDC) và Google cũng đang hỗ trợ và triển khai giao thức này. Từ đây mở ra con đường để có thể triển khai việc quản lý cụm EKS thông qua Google Accounts.
OIDC là gì
Đầu tiên chúng ta cùng tìm hiểu sơ qua về OIDC, vậy OIDC là gì?
OIDC là viết tắt của "OpenID Connect" một giao thức xác thực được xây dựng trên OAuth 2.0. OIDC cung cấp một cách tiêu chuẩn để xác thực và quản lý danh tính người dùng trên internet. Giao thức này chủ yếu được sử dụng trong việc xác thực người dùng khi họ truy cập các ứng dụng web, ứng dụng di động và các dịch vụ trực tuyến khác.
Chuẩn bị môi trường
- Đã triển khai EKS cluster trên tài khoảng AWS
- Có account Google và có thể vào được trang quản lý (console)
- Đã cài đặt các công cụ eksctl, kubectl
Phía trên là những công cụ cần thiết để hỗ trợ việc triển khai xác thực với EKS thông qua Google Accounts, còn bây giờ chúng ta sẽ đi vào quá trình cấu hình cho từng thành phần.
Cấu hình cho Google
Để có thể tích hợp việc xác thực của Google vào cụm EKS, chúng ta cần phải tạo một Credentials cho OAuth trong Google, phía dưới là các bước cần thực hiện để tạo ứng dụng:
- Vào console google https://console.cloud.google.com/
- Tạo project thông qua New Project
- Project Name: Tên của project
- Vào tab
Oauth Consent Screen
- Điền thông tin về application và email của developer
- Thêm scope vào consent screen
- Scope cần có:
- profile
- openid
- Scope cần có:
- Vào tab Credentials
- Chọn Create Credentials
- Chọn Oauth Client ID
- Chọn Web Application
- Nhập tên ứng dụng
- Thêm URI
http://localhost:8000
tại Authorized redirect URIs
- Chọn tạo ứng dụng
- Lấy Oauth client bao gồm:
- Client ID
- Client secret
Cấu hình cho EKS
*Bài viết này sẽ không đi qua việc hướng dẫn tạo cụm EKS, tuy nhiên bạn có thể dễ dàng tạo cho mình một cluster EKS thông qua console hoặc eksctl.
Đối với EKS, chúng ta cần phải cấu hình liên kết OIDC identity providers (ở đây là Google) vào cụm EKS, để cho cụm EKS biết rằng có thể tin tưởng thực hiện các phương pháp trao đổi thông tin về danh tính người dùng trên cụm.
Thông qua AWS Management Console
- Vào trang quản lý EKS tại https://console.aws.amazon.com/eks/home#/clusters
- Chọn cluster của bạn
- Chọn tab Configuration, và chọn tab Authentication
- Trong trang OIDC Identity Providers, chọn Associate Identity Provider
- Tại trang Associate OIDC Identity Provider, nhập và chọn theo các lựa chọn sau:
- Name: nhập unique name của OIDC provider
- Issue URL: nhập URL của provider, URL này cần phải vào được thông qua internet
- Client ID: nhập OIDC identity provider's client ID (còn gọi là audience)
- Username claim: nhập claim được dùng để làm username
- Group claim: nhập claim được dùng để làm group
- (Optional) Chọn Advanced options, nhập hoặc chọn các thông tin sau:
- Username prefix: nhập một chuỗi, chuỗi này được sử dụng để thêm vào đầu username claims ở phía trên để tránh việc trùng lặp giữa các username đã tồn tại. Nếu không cung cấp value này và username không phải email thì mặc định prefix sẽ là Issuer URL. Bạn cũng có thể sử dụng giá trị
-
để tắt tính năng prefix này. Và không được chỉ địnhsystem:
hay bất kỳ chuỗi nào được tạo từ nó để làm username prefix - Group prefix: Nhập một chuỗi, chuỗi này được sử dụng để thêm vào đầu group claims ở phía trên.
- Required claims: chọn thêm những claims cần được lấy ra từ id token
- Username prefix: nhập một chuỗi, chuỗi này được sử dụng để thêm vào đầu username claims ở phía trên để tránh việc trùng lặp giữa các username đã tồn tại. Nếu không cung cấp value này và username không phải email thì mặc định prefix sẽ là Issuer URL. Bạn cũng có thể sử dụng giá trị
Thông qua eksctl
-
Tạo file có tên là
associate-identity-provider.yaml
với nội dung sau. Replace các*example value*
với giá trị của bạn--- apiVersion: eksctl.io/v1alpha5 kind: ClusterConfig metadata: name: *my-cluster* region: *your-region-code* identityProviders: - name: *my-provider* type: oidc issuerUrl: *https://example.com* clientId: *kubernetes* usernameClaim: *email* usernamePrefix: oidc: groupsClaim: *my-claim* groupsPrefix: oidc: requiredClaims: string: *string* tags: env: *dev*
-
Tạo provider:
eksctl associate identityprovider -f associate-identity-provider.yaml
Sau khi thực hiện các bước trên, EKS đã có thể liên kết với Google thông qua giao thức OIDC, việc của chúng ta còn lại là cần phải cấu hình để có giao diện đăng nhập với Google mà thôi.
Cài đặt kubelogin
kubelogin là một plugin của kubectl, plugin này hỗ trợ chúng ta trong khâu login với Google. Phía dưới là các câu lệnh để cài đặt kubelogin, hoặc bạn có thể xem thêm ở github.
# Homebrew (macOS and Linux)
brew install int128/kubelogin/kubelogin
# Krew (macOS, Linux, Windows and ARM)
kubectl krew install oidc-login
# Chocolatey (Windows)
choco install kubelogin
Authenticate với EKS
Sau các bước cài đặt ở trên, cuối cùng chúng ta có thể login được rồi!!!
Nếu cài đặt của chúng ta là chính xác, sau khi thực hiện câu lệnh sau thì sẽ có 1 browser tự động bật lên và dẫn đến trang đăng nhập của Google.
$ kubectl oidc-login setup \
--oidc-issuer-url https://accounts.google.com \
--oidc-client-id=858670347920-xxxxxxxxxxx.apps.googleusercontent.com \
--oidc-client-secret=GOCSPX-xxxxxxxxxxx \
--oidc-extra-scope=email \
--oidc-extra-scope=profile
Sau khi login thành công, thông tin xác minh của bạn sẽ được hiển thị giống phía dưới:
{
"iss": "https://accounts.google.com",
"azp": "858670347920-xxxxxxxxxxx.apps.googleusercontent.com",
"aud": "858670347920-xxxxxxxxxxx.apps.googleusercontent.com",
"sub": "106150655626797293240",
"hd": "beeketing.net",
"email": "namnguyen1@beeketing.net",
"email_verified": true,
"at_hash": "KcKxEFodvK9Srkk7401q7Q",
"nonce": "XLlgS7O8Fgekbj8mF6f8PS4gKyqExKpoygAnuR-w5Dc",
"name": "Nam Nguyen The",
"picture": "https://lh3.googleusercontent.com/a/ACg8ocJBZcSCxEI6BeijAG44YG3JcTZmBkvhD8H5tLL30vRK=s96-c",
"given_name": "Nam",
"family_name": "Nguyen The",
"locale": "en",
"iat": 1706784878,
"exp": 1706788478
}
Tiếp theo là tạo config cho user OIDC trong kubeconfig thông qua câu lệnh sau:
kubectl config set-credentials oidc \
--exec-api-version=client.authentication.k8s.io/v1beta1 \
--exec-command=kubectl \
--exec-arg=oidc-login \
--exec-arg=get-token \
--exec-arg=--oidc-issuer-url=https://accounts.google.com \
--exec-arg=--oidc-client-id=858670347920-xxxxxxxxxxx.apps.googleusercontent.com \
--exec-arg=--oidc-client-secret=GOCSPX-xxxxxxxxxxx \
--exec-arg=--oidc-extra-scope=email \
--exec-arg=--oidc-extra-scope=profile
Thử thực hiện câu lệnh lấy danh sách nodes
với user oidc này xem sao:
$ kubectl --user=oidc get nodes
Oh, có vẻ có lỗi xảy ra, câu lệnh sau khi thực hiện không lấy được danh sách nodes mà chỉ trả về lỗi:
Error from server (Forbidden): nodes is forbidden: User "namnguyen1@beeketing.net" cannot list resource "nodes" in API group "" at the cluster scope
Đừng lo lắng, chúng ta sẽ đi tìm hiểu về lỗi này ngay bây giờ đây.
Phân quyền trong EKS
Sau các bước trên chúng ta đã có thể xác thực với EKS thông qua Google, bằng chứng ở đây là EKS đã trả về lỗi với user định danh là email của chúng ta: namnguyen1@beeketing.net
tiếp theo việc chúng ta cần làm là phải cấu hình thêm permission hay phân quyền cho user sau khi được xác thực bởi Google được thực hiện các hành động trên cụm EKS
$ kubectl create clusterrolebinding oidc-cluster-admin --clusterrole=cluster-admin --user='namnguyen1@beeketing.net'
Cùng thử lại command trên xem sao, và chúng ta đã lấy được thông tin các nodes trong cụm EKS thông qua token việc login bằng account Google
$ kubectl --user=oidc get nodes
NAME STATUS ROLES AGE VERSION
ip-10-30-1-230.ap-southeast-1.compute.internal Ready <none> 10m v1.24.7-eks-fb459a0
ip-10-30-12-56.ap-southeast-1.compute.internal Ready <none> 15m v1.24.7-eks-fb459a0
Từ đây bạn cũng có thể chia sẻ cấu hình oidc này cho members khác, và họ cũng sẽ có thể authenticate với EKS thông qua account Google của họ.
Tổng kết
Việc tích hợp Google vào khâu xác thực EKS hay bất kỳ ứng dụng nào đem lại sự linh hoạt trong khâu quản lý, giúp tiết kiệm thời gian và công sức trong việc vận hành cụm, đặc biệt là với quy mô nhân sự lớn. Tuy nhiên trong thực tế việc tích hợp OIDC với trực tiếp Google là tương đối hiếm, bởi vì những claims