Amazon EKS authenticate by Google accounts

Amazon EKS authenticate by Google accounts
Image Source

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:

  1. Vào console google https://console.cloud.google.com/
  2. Tạo project thông qua New Project
    • Project Name: Tên của project
  3. 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ó:
        • email
        • profile
        • openid
  4. Vào tab Credentials
    • Chọn Create Credentials
    • Chọn Oauth Client ID
    • Chọn Web Application
    • Chọn tạo ứng dụng
  5. Lấy Oauth client bao gồm:
    1. Client ID
    2. 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

  1. Vào trang quản lý EKS tại https://console.aws.amazon.com/eks/home#/clusters
  2. Chọn cluster của bạn
  3. Chọn tab Configuration, và chọn tab Authentication
  4. Trong trang OIDC Identity Providers, chọn Associate Identity Provider
  5. 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ỉ định system: 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

Thông qua eksctl

  1. 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*
    
  2. 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

Tài liệu tham khảo