Thursday, November 21, 2024

Sử dụng Secret mã hoá mật khẩu trong Kubernetes Cluster

-

Trong Kubernetes, Secret là một đối tượng được sử dụng để lưu trữ các thông tin nhạy cảm như mật khẩu, khóa truy cập, chứng chỉ TLS/SSL, token, … Secret được mã hóa và lưu trữ dưới dạng Base64 encoded để bảo vệ các thông tin nhạy cảm trong quá trình lưu trữ hoặc chuyển tải trên mạng.

Các ví dụ về việc sử dụng Secret trong Kubernetes bao gồm:

  • Lưu trữ mật khẩu cho cơ sở dữ liệu: Trong một ứng dụng, thường cần sử dụng cơ sở dữ liệu và cần cung cấp thông tin đăng nhập cho cơ sở dữ liệu đó. Thông tin đăng nhập này có thể được lưu trữ trong một Secret để tránh tiết lộ thông tin nhạy cảm như mật khẩu.
  • Sử dụng chứng chỉ TLS/SSL: Một ứng dụng có thể sử dụng chứng chỉ TLS/SSL để đảm bảo an toàn khi truy cập các dịch vụ bảo mật. Các chứng chỉ này có thể được lưu trữ trong Secret để đảm bảo tính bảo mật.
  • Lưu trữ các thông tin truy cập API: Nếu một ứng dụng cần truy cập vào một API bảo mật, thì thông tin truy cập đến API đó có thể được lưu trữ trong một Secret để đảm bảo an toàn.
  • Lưu trữ token cho truy cập vào các dịch vụ bên ngoài: Nếu một ứng dụng cần truy cập vào các dịch vụ bên ngoài, ví dụ như truy cập vào Amazon S3, Google Cloud Storage, … thì các thông tin truy cập có thể được lưu trữ trong một Secret để đảm bảo an toàn.

Dưới đây là một ví dụ YAML để tạo một Secret cho MySQL trong Kubernetes:

apiVersion: v1
kind: Secret
metadata:
  name: mysql
  namespace: wordpress
  labels:
    app: website-wp
type: Opaque
data:
  db_prefix: LWIgd3BfCg==
  db_name: LWIgd2lraQo=
  db_user: aG9hbmdoZA==
  db_pass: aG9hbmdoZA==
  username: aG9hbmdoZA==
  password: aG9hbmdoZA==

Trong đó:

  • apiVersion: v1: sử dụng phiên bản API Kubernetes v1
  • kind: Secret: định nghĩa loại đối tượng là Secret
  • metadata: chứa thông tin metadata của Secret, bao gồm name (tên của Secret) và các labels, annotations,…
  • type: Opaque: định nghĩa kiểu Secret là Opaque, có nghĩa là Secret không được mã hóa hoặc mã hóa đơn giản (không sử dụng các thuật toán mã hóa mạnh)
  • data: chứa các thông tin được mã hóa của Secret, bao gồm tên người dùng và mật khẩu (trong ví dụ này, username và password đã được mã hóa dưới dạng base64).

Trong thực tế, để sử dụng Secret, bạn có thể tạo một file YAML như trên, sau đó chạy lệnh kubectl apply -f <tên-file-YAML> để tạo Secret trong Kubernetes. Sau đó, bạn có thể sử dụng Secret trong các đối tượng khác như Deployment, Pod, Service,… bằng cách đặt tên Secret trong trường spec.template.spec.containers[].env[].valueFrom.secretKeyRef.name.

Lưu ý, thông tin username và mật khẩu tôi đã mã hoá base64, bạn có thể sử dụng lệnh dưới để mã hoá thông tin nhạy cảm của bạn.

$ echo -n "hoanghd" | base64 
aG9hbmdoZA==

$ echo -n "wiki" | base64
d2lraQ==

$echo -n "wp_" | base64
d3Bf

Và bạn có thể giải mã giá trị đã mã hóa bằng lệnh sau:

$ echo -n "d2lraQ==" | base64 --decode
wiki

Nếu bạn muốn cập nhật giá trị trong Secret, bạn có thể sử dụng lệnh kubectl edit secret <secret-name> để chỉnh sửa các giá trị và lưu thay đổi của bạn.

apiVersion: v1
items:
- apiVersion: v1
  data:
    ca.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUMvakNDQWVhZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJek1EVXhNVEUzTVRZek1sb1hEVE16TURVd09ERTNNVFl6TWxvd0ZURVRNQkVHQTFVRQpBeE1LYTNWaVpYSnVaWFJsY3pDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQ2dnRUJBTVR6CkFSTjI0MFVwcjJwTlMrSGZQTkZDRWJFZ3IvYmsxZXBSNFIzb25xMWJBWWp0cVpzYnYrTnhXTGhhb2l4Z1paRngKMDArbkVlWXpRaVBxMmcybVZKUVlrUFN2WFkxbTVaMVZFa0p3UldlOC9uaWY1L08wOVBiUXhrQUtpamhBQVY1ago5Y3g5Z2lYWDcrTmtxanZTYUZsZjJraWJHSExCWFlhWTEzUW8zUlJETVRxeS9sdEVCUERHaUhpYTM0V00yUjMvClRzVXNqT0FYQzAxNDlLeWxIYnNDeW5GYUpWd0huODhzdUdqbTBFYmVXd1p2RFZyM3hmQ2I5L1hPLzNMdEtRUisKSmJqai9YZEUzazlqSlpERjgvWU9xYVRxN1luRFZWK3h1M2s1THM3MmZzUU1BNXhzZTdRenJOMmYxRElCbjFoMwpUUGMzRGtXVVIvN21FNThCaXcwQ0F3RUFBYU5aTUZjd0RnWURWUjBQQVFIL0JBUURBZ0trTUE4R0ExVWRFd0VCCi93UUZNQU1CQWY4d0hRWURWUjBPQkJZRUZNVm44eGpQY2hGZ1RTYkdmTEZwOEZ6QnNqOFlNQlVHQTFVZEVRUU8KTUF5Q0NtdDFZbVZ5Ym1WMFpYTXdEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBRUxFT3Q0bm42L0tHanRqcHp4Qwo4eVFscUsxZXF3cng2VGx0a2d0cTUvR2RRNlBBNkJOelFUUXQ3b2RValJpQU0xMTJVV3U1c1B3OWZrKzFEa3RYCnZibE80bUZnYmVFQ28xT3ZmSWlzcUtFTHBDRHArY2lYUnA5NDgyTFFLSmhrRHJIckNLOUNvTWZCZlpSdEpDaTcKM3d1bjdSVVRpOWpCQ09jTEh2Mys5QVJ2NTlSbXV2TzNvRXZOcVU4K09tdGQvNG5DMWlrb1QvaWdmNHNtcUZhZgpNc2xVcFVDTGFmd2c0cVRyZkppcmdrVGxxdzAvck1iRTcyZUpjR1QzckhTd29UalhBQ1VUeXFadTdONXYxZ2p1Clp4TmN2TXVXU0ZhdDh6bmdGaE9VMzVaa3BYS1lRdVR0REl3WGVDSjRDQ2Zka1grckFIWTJGdlFnQlc5QW5Ka2gKNHdrPQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCg==
    namespace: d2lraS1ob2FuZ2hk
    token: ZXlKaGJHY2lPaUpTVXpJMU5pSXNJbXRwWkNJNklsVmxiRU5KYW5KbVQyWk5VbTEzVW1kclRHdFhiVGd4VUZKTkxYQnZla1E0TmxCT1JFWkZXbVZGVFhjaWZRLmV5SnBjM01pT2lKcmRXSmxjbTVsZEdWekwzTmxjblpwWTJWaFkyTnZkVzUwSWl3aWEzVmlaWEp1WlhSbGN5NXBieTl6WlhKMmFXTmxZV05qYjNWdWRDOXVZVzFsYzNCaFkyVWlPaUozYVd0cExXaHZZVzVuYUdRaUxDSnJkV0psY201bGRHVnpMbWx2TDNObGNuWnBZMlZoWTJOdmRXNTBMM05sWTNKbGRDNXVZVzFsSWpvaVpHVm1ZWFZzZEMxMGIydGxiaTFyWmpnNWJDSXNJbXQxWW1WeWJtVjBaWE11YVc4dmMyVnlkbWxqWldGalkyOTFiblF2YzJWeWRtbGpaUzFoWTJOdmRXNTBMbTVoYldVaU9pSmtaV1poZFd4MElpd2lhM1ZpWlhKdVpYUmxjeTVwYnk5elpYSjJhV05sWVdOamIzVnVkQzl6WlhKMmFXTmxMV0ZqWTI5MWJuUXVkV2xrSWpvaU1ESmpaR1psTXpndFpUa3paUzAwTldJd0xXSTJPVEV0Tm1ZeU9UZzFNR0kzWmpVM0lpd2ljM1ZpSWpvaWMzbHpkR1Z0T25ObGNuWnBZMlZoWTJOdmRXNTBPbmRwYTJrdGFHOWhibWRvWkRwa1pXWmhkV3gwSW4wLm56WjQ5WFIxV3hNRnFheFpsMFo2cU5YX0lYdU1RbV8zd3k1V3ZkQk9EczJaUXV6dkJuNlVoeFB2TmZpOWhxRjVsdTlUUHYzSVJsVE93cTFicmE4dEJIRC04dXlIbV9IX184NzZqbjhfLVFNVE1WRlRDWm5DWFVxWWo2RzMtRC1SRkNDR2d4UExUdHZFdVg0cVZHSGkxWmRKbUdwbzkzbWlXUjA4R0NnUFV3alZOdWJDWnZpYzFQNUlJbTVYMjEzU2lYQW04S3NVM2pSdGpXVUVabjF6VHd6ZzNCbTJtYnpjbWl6R2R1ekhEd1lPUnUwdEhfaG9wTldobjBVQmxGanQwcmY3LU9JMTF0SzY4WFB6cXNlNEhCYjRqU1h0VHgyNjFyTDkxU0NBSXk2WFoxRVliZ1Q5M0JJckJMcnNNcnpEekJwcG5lZU0ya2J4MUpfRTlVN282UQ==
  kind: Secret
  metadata:
    annotations:
      kubernetes.io/service-account.name: default
      kubernetes.io/service-account.uid: 02cdfe38-e93e-45b0-b691-6f29850b7f57
    creationTimestamp: "2023-05-14T12:09:01Z"
    name: default-token-kf89l
    namespace: wiki-hoanghd
    resourceVersion: "795029"
    uid: ad3bbcb5-313a-4049-9dc8-11e4161979b7
  type: kubernetes.io/service-account-token
- apiVersion: v1
  data:
    db_name: d2lraQ==
    db_pass: aG9hbmdoZA==
    db_prefix: d3Bf
    db_user: aG9hbmdoZA==
    password: aG9hbmdoZA==
    username: aG9hbmdoZA==
  kind: Secret
  metadata:
    annotations:
      kubectl.kubernetes.io/last-applied-configuration: |
        {"apiVersion":"v1","data":{"db_name":"d2lraQ==","db_pass":"aG9hbmdoZA==","db_prefix":"d3Bf","db_user":"aG9hbmdoZA==","password":"aG9hbmdoZA==","username":"aG9hbmdoZA=="},"kind":"Secret","metadata":{"annotations":{},"labels":{"app":"website-wp"},"name":"mysql","namespace":"wiki-hoanghd"},"type":"Opaque"}
    creationTimestamp: "2023-05-14T12:09:01Z"
    labels:
      app: website-wp
    name: mysql
    namespace: wiki-hoanghd
    resourceVersion: "795027"
    uid: 1810d03c-061c-4b9f-8d1a-bb52bad6383e
  type: Opaque
kind: List
metadata: {}

Bạn có thể nhìn thấy các thông tin cần lưu ý như dưới. Bạn có thể thay đổi chúng và lưu lại, thông tin sẽ được cập nhật.

db_name: d2lraQ==
db_pass: aG9hbmdoZA==
db_prefix: d3Bf
db_user: aG9hbmdoZA==
password: aG9hbmdoZA==
username: aG9hbmdoZA==

Tiếp theo có thể gắn Secret này cho deployment để triển khai.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: website-mysql
  namespace: wordpress
  labels:
    app: website-mysql
spec:
  selector:
    matchLabels:
      app: website-mysql
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: website-mysql
    spec:
      containers:
      - image: mysql:5.6
        name: mysql
        env:
        - name: MYSQL_ROOT_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql
              key: password
        - name: MYSQL_DATABASE
          valueFrom:
            secretKeyRef:
              name: mysql
              key: db_name
        - name: MYSQL_USER
          valueFrom:
            secretKeyRef:
              name: mysql
              key: db_user
        - name: MYSQL_PASSWORD
          valueFrom:
            secretKeyRef:
              name: mysql
              key: db_pass
        ports:
        - containerPort: 3306
          name: mysql
        volumeMounts:
        - name: mysql
          mountPath: /var/lib/mysql
      volumes:
      - name: mysql
        persistentVolumeClaim:
          claimName: website-mysql-pvc

Bạn có thể kiểm tra thông tin secret đã được tạo thành công thhay chưa bằng lệnh kubectl get secret -n <namespace>.

$ kubectl get secret -n wiki-hoanghd
NAME                  TYPE                                  DATA   AGE
default-token-kf89l   kubernetes.io/service-account-token   3      50s
mysql                 Opaque                                6      50s

Xem thông tin chi tiết bằng lệnh kubectl describe secret -n <namespace>.

$ kubectl describe secret -n wiki-hoanghd
Name:         default-token-kf89l
Namespace:    wiki-hoanghd
Labels:       <none>
Annotations:  kubernetes.io/service-account.name: default
              kubernetes.io/service-account.uid: 02cdfe38-e93e-45b0-b691-6f29850b7f57

Type:  kubernetes.io/service-account-token

Data
====
token:      eyJhbGciOiJSUzI1NiIsImtpZCI6IlVlbENJanJmT2ZNUm13UmdrTGtXbTgxUFJNLXBvekQ4NlBOREZFWmVFTXcifQ.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9uYW1lc3BhY2UiOiJ3aWtpLWhvYW5naGQiLCJrdWJlcm5ldGVzLmlvL3NlcnZpY2VhY2NvdW50L3NlY3JldC5uYW1lIjoiZGVmYXVsdC10b2tlbi1rZjg5bCIsImt1YmVybmV0ZXMuaW8vc2VydmljZWFjY291bnQvc2VydmljZS1hY2NvdW50Lm5hbWUiOiJkZWZhdWx0Iiwia3ViZXJuZXRlcy5pby9zZXJ2aWNlYWNjb3VudC9zZXJ2aWNlLWFjY291bnQudWlkIjoiMDJjZGZlMzgtZTkzZS00NWIwLWI2OTEtNmYyOTg1MGI3ZjU3Iiwic3ViIjoic3lzdGVtOnNlcnZpY2VhY2NvdW50Ondpa2ktaG9hbmdoZDpkZWZhdWx0In0.nzZ49XR1WxMFqaxZl0Z6qNX_IXuMQm_3wy5WvdBODs2ZQuzvBn6UhxPvNfi9hqF5lu9TPv3IRlTOwq1bra8tBHD-8uyHm_H__876jn8_-QMTMVFTCZnCXUqYj6G3-D-RFCCGgxPLTtvEuX4qVGHi1ZdJmGpo93miWR08GCgPUwjVNubCZvic1P5IIm5X213SiXAm8KsU3jRtjWUEZn1zTwzg3Bm2mbzcmizGduzHDwYORu0tH_hopNWhn0UBlFjt0rf7-OI11tK68XPzqse4HBb4jSXtTx261rL91SCAIy6XZ1EYbgT93BIrBLrsMrzDzBppneeM2kbx1J_E9U7o6Q
ca.crt:     1099 bytes
namespace:  12 bytes


Name:         mysql
Namespace:    wiki-hoanghd
Labels:       app=website-wp
Annotations:  <none>

Type:  Opaque

Data
====
db_prefix:  3 bytes
db_user:    7 bytes
password:   7 bytes
username:   7 bytes
db_name:    4 bytes
db_pass:    7 bytes

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories