+3

External Secret - Quản lý và lưu trữ secret trong môi trường Kubernetes

Công cụ External Secrets là gì?

image.png

External Secret là công cụ cho phép tích hợp cụm Kubernetes cluster của bạn với các hệ thống lưu trữ Secrets bên thứ 3 như: AWS Secrets Manager, Vault, Google Secrets Manager, Azure Key Vault,... để có thể đồng bộ những dữ liệu bạn đã lưu trữ trên các nền tảng này về cụm cluster.

Cách thức hoạt động

Để sử dụng công cụ này bạn cần cài đặt nó vào trong cluster của bạn thông qua Helm với câu lệnh sau:

helm repo add external-secrets https://charts.external-secrets.io

helm install external-secrets \
   external-secrets/external-secrets \
    -n external-secrets \
    --create-namespace

Đầy đủ hơn tham khảo ở: https://external-secrets.io/latest/introduction/getting-started/

image.png

External Secret hoạt động trong cluster với vai trò là 1 Operator. Mặc định 3 pods với các chức năng riêng biệt sẽ được tạo ở namespace external-secrets nhằm mục đích thực hiện thêm/xóa/sửa/đồng bộ secrets giữa bên thứ 3 và secret trong cluster.

Mô hình hoạt động của External-Secret:

image.png

Thông qua các Custom Resource Define (CRD) ta sẽ định nghĩa các thông tin giúp công cụ này gọi qua các bên thứ 3 định kỳ để lấy dữ liệu về và tạo resource secret tương ứng trong cụm cluster.

image.png

Đa số các trường hợp khi làm việc với External Secret ta chỉ cần quan tâm đến CRD là SecretStore và ExternalSecret.

  • SecretStore: đóng vai trò lưu trữ thông tin xác thực và định nghĩa API sẽ tương tác với các bên thứ 3 (AWS Secret manager,...)
  • ExternalSecret: đóng vài trò mapping dữ liệu được lưu từ bên thứ 3 và dữ liệu được lưu trong Kubernetes. Trong resource này ta có thể định nghĩa các cách thức để rewrite lại dữ liệu,...

That's it! Vậy công cụ này có những ưu điểm gì mà nó được sinh ra.

Ưu điểm

  • Hỗ trợ việc lấy secret từ nhiều nguồn / nhà cung cấp khác nhau về một cách dễ dàng. Ngày trước để lấy được cấu hình về mount vô trong application container thì ta thường sẽ phải dùng initcontainer hoặc sidecar, theo mình thấy cách này có phần phức tạp và tốn tài nguyên hơn.
  • Tự động cập nhật secret ở trên cụm cluster khi có thay đổi. Nếu các bạn đã đọc bài Tự động cập nhật ứng dụng khi thay đổi Secret, Configmap trên Kubernetes với Reloader của mình thì hoàn toàn chúng ta có thể tạo ra một luồng tự động cập nhật ứng dụng chạy trên K8s khi secret hay cấu hình có sự thay đổi.
  • Đồng bộ 2 chiều giữa secret trên cluster và dữ liệu được lưu trữ bên thứ 3.
  • Bảo mật hơn trong một số trường hợp
  • ...

Thực hành với AWS Secrets Manager

Trong bài này mình sẽ hướng dẫn cách thức lấy secret được lưu trữ trên AWS Secret Manager (một trong các nơi được sử dụng để lưu trữ Secret nhiều nhất hiện nay) và tự động tạo/đồng bộ với secret ở trong cụm K8s.

Mình mặc định các bạn đã cài External Secret Operator bằng câu lệnh Helm mình đã để ở trên.

Bước 1: Tạo Access Key trên AWS và lưu trữ vào trong cluster.

Access key này sẽ được lưu trữ trong K8s phục vụ cho External Secret Operator thực hiện xác thực với dịch vụ của AWS để lấy dữ liệu về.

Để tạo Access Key bạn truy cập vào dịch vụ IAM trên AWS => Users => Chọn user phù hợp có đủ quyền GET/LIST trong dịch vụ Secret manager

image.png

Chọn Security Credentials => Tại mục Access Key tạo thêm 1 key mới

image.png

Ví dụ key bạn có nội dung:

access-key: AKIAT2JIMCJN33OMMXUI
secret-access-key: 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

Ta tiếp tục tạo 1 resource secret mới tên awssm-secret trong k8s để phục vụ cho External-Secret xác thực với câu lệnh:

kubectl create secret generic awssm-secret \
    --from-literal=access-key=AKIAT2JIMCJN33OMMXUI \
    --from-literal=secret-access-key=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

Bước 2: Tạo 1 key mới trên AWS Secret manager

Truy cập dịch vụ Secret manager và tạo 1 secret mới tên external-secret-test có 3 vaules như sau:

image.png

Bước 3: Tạo các CRD để đồng bộ dữ liệu từ AWS về

Trước hết ta cần tạo CRD SecretStore có nội dung như sau:

apiVersion: external-secrets.io/v1beta1
kind: SecretStore
metadata:
  name: aws-secretsmanager
spec:
  provider:
    aws:
      service: SecretsManager
      # define a specific role to limit access to certain secrets.
      # role is a optional field that can be omitted for test purposes
      # role: arn:aws:iam::123456789012:role/external-secrets
      region: us-east-1
      auth:
        secretRef:
          accessKeyIDSecretRef:
            name: awssm-secret
            key: access-key
          secretAccessKeySecretRef:
            name: awssm-secret
            key: secret-access-key
  • provider định nghĩa bên thứ 3 sử dụng là gì
  • service Định nghĩa dịch vụ sử dụng ở bên thứ 3. Đối với AWS ngoài Secret Manager ta còn có thể lấy dữ liệu từ Parameter Store.
  • region: Định nghĩa region của dịch vụ
  • auth: Định nghĩa cách thức xác thực với provider. Ở đây chúng ta sử dụng Access Key đã tạo vào lưu trữ vào secret ở bước 1

Tiếp theo ta sẽ tạo CRD ExternalSecret có nội dung như sau:

apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
  name: external-secret
spec:
  refreshInterval: 1m
  secretStoreRef:
    name: aws-secretsmanager
    kind: SecretStore
  target:
    name: local-secret-name
    creationPolicy: Owner
  dataFrom:
  - extract:
      key: external-secret-test
  • kind: ExternalSecret CRD này có nhiệm vụ tạo ra secret tương ứng trong namespace và quản lý secret này, cập nhật khi có thay đổi từ bên thứ 3
  • refreshInterval: Định nghĩa khoảng thời gian tự động đồng bộ lại.
  • secretStoreRef: Định nghĩa resource sử dụng để authen với AWS Secret Manager.
  • target: Định nghĩa tên và policy secret sẽ được tạo và quản lý bởi ExternalSecret này.
  • dataFrom: Định nghĩa trên key secret được lưu trữ trên AWS Secret Manager.

Sau khi tạo xong 2 resource trên ta thử describe ra và get secret thì sẽ thấy ExternalSecret hiển thị đã Synced và secret đã được tạo như hình là thành công rồi 😁😁😁

image.png

Tiến hành describe tiếp secret ta thấy đã có đủ cả 3 key mà ta đã tạo trên AWS Secret manager

image.png

Ngoài ra các bạn có thể thử nghiệm thêm tạo thêm key trên AWS để xem công cụ External Secret này có đồng bộ về được không nhé!

Trong bài viết này mình chỉ nêu ra một case cơ bản và đơn giản nhất khi sử dụng công cụ này thôi, nếu bạn muốn tìm hiểu thêm 1 số những tính năng nâng cao thì hãy tìm đọc tiếp document offical nhé! https://external-secrets.io/latest

Kết

Hy vọng bài viết đã giúp cho bạn thêm 1 chút kiến thức về công cụ đang được sử dụng khá nhiều hiện nay này. Nếu thấy bài viết hay và hữu ích hãy cho mình 1 Upvote và Follow để xem thêm nhiều bài viết liên quan đến chủ đề Devops/SRE nữa nhé.

Chúc các bạn một ngày tốt lành!


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.