Titkos kulcstár CSI-illesztőprogram beállítása az NGINX bejövőforgalom-vezérlő TLS-lel való engedélyezéséhez

Ez a cikk végigvezeti egy NGINX bejövőforgalom-vezérlő és egy Azure Kubernetes Service- (AKS-) fürt és egy Azure Key Vault-példány TLS-sel való biztonságossá tételének folyamatán. További információ: TLS a Kubernetesben.

A bejövő TLS-tanúsítványt az alábbi módszerek egyikével importálhatja a fürtbe:

  • Alkalmazás: Az alkalmazás üzembehelyezési jegyzéke deklarálja és csatlakoztatja a szolgáltató kötetét. Csak az alkalmazás üzembe helyezésekor érhető el a fürtben elérhető tanúsítvány. Az alkalmazás eltávolításakor a titkos kód is törlődik. Ez a forgatókönyv megfelel az alkalmazás biztonsági infrastruktúráért és a fürthöz való integrálásáért felelős fejlesztői csapatoknak.
  • Bejövőforgalom-vezérlő: A bejövő üzembe helyezés a szolgáltató kötetének deklarálásához és csatlakoztatásához módosul. A titkos kód importálása a bejövő podok létrehozásakor történik. Az alkalmazás podjai nem férnek hozzá a TLS-tanúsítványhoz. Ez a forgatókönyv olyan forgatókönyvekhez illeszkedik, amelyekben egy csapat (például az INFORMATIKAI) kezeli és létrehozza az infrastruktúra- és hálózati összetevőket (beleértve a HTTPS TLS-tanúsítványokat) és más csapatok kezelik az alkalmazás életciklusát.

Előfeltételek

TLS-tanúsítvány létrehozása

  • Hozzon létre egy TLS-tanúsítványt a következő paranccsal.

    export CERT_NAME=aks-ingress-cert
    openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
        -out aks-ingress-tls.crt \
        -keyout aks-ingress-tls.key \
        -subj "/CN=demo.azure.com/O=aks-ingress-tls"
    

A tanúsítvány importálása az AKV-ba

  1. Exportálja a tanúsítványt egy PFX-fájlba az alábbi paranccsal.

    export AKV_NAME="[YOUR AKV NAME]"
    openssl pkcs12 -export -in aks-ingress-tls.crt -inkey aks-ingress-tls.key  -out $CERT_NAME.pfx
    # skip Password prompt
    
  2. Importálja a tanúsítványt a az keyvault certificate import paranccsal.

    az keyvault certificate import --vault-name $AKV_NAME -n $CERT_NAME -f $CERT_NAME.pfx
    

SecretProviderClass üzembe helyezése

  1. Új névtér exportálása az alábbi paranccsal.

    export NAMESPACE=ingress-basic
    
  2. Hozza létre a névteret a kubectl create namespace paranccsal.

    kubectl create namespace $NAMESPACE
    
  3. Válasszon ki egy metódust a hozzáférési identitás megadásához, és ennek megfelelően konfigurálja a SecretProviderClass YAML-et.

    • Mindenképpen használja objectType=secreta titkos kulcsot és a tanúsítványt az AKV-tól.
    • Állítsa be kubernetes.io/tls a type szakaszba secretObjects .

    Tekintse meg az alábbi példát a SecretProviderClass megjelenésére:

    apiVersion: secrets-store.csi.x-k8s.io/v1
    kind: SecretProviderClass
    metadata:
      name: azure-tls
    spec:
      provider: azure
      secretObjects:                            # secretObjects defines the desired state of synced K8s secret objects
        - secretName: ingress-tls-csi
          type: kubernetes.io/tls
          data: 
            - objectName: $CERT_NAME
              key: tls.key
            - objectName: $CERT_NAME
              key: tls.crt
      parameters:
        usePodIdentity: "false"
        useVMManagedIdentity: "true"
        userAssignedIdentityID: <client id>
        keyvaultName: $AKV_NAME                 # the name of the AKV instance
        objects: |
          array:
            - |
              objectName: $CERT_NAME
              objectType: secret
        tenantId: $TENANT_ID                    # the tenant ID of the AKV instance
    
  4. Alkalmazza a SecretProviderClasst a Kubernetes-fürtre a kubectl apply paranccsal.

    kubectl apply -f secretProviderClass.yaml -n $NAMESPACE
    

A bejövőforgalom-vezérlő üzembe helyezése

A hivatalos bejövőforgalom-diagram adattárának hozzáadása

  • Adja hozzá a hivatalos bejövő diagram adattárát az alábbi helm parancsokkal.

    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    helm repo update
    

Az NGINX bejövő forgalom konfigurálása és üzembe helyezése

A forgatókönyvtől függően dönthet úgy, hogy a tanúsítványt az alkalmazáshoz vagy a bejövőforgalom-vezérlőhöz köti. Kövesse az alábbi utasításokat a kiválasztásnak megfelelően:

Tanúsítvány kötése az alkalmazáshoz

  • Kösse a tanúsítványt az alkalmazáshoz a helm install paranccsal. Az alkalmazás üzembe helyezése a Titkos kulcstár CSI-illesztőprogram Azure Key Vault-szolgáltatójára hivatkozik.

    helm install ingress-nginx/ingress-nginx --generate-name \
        --namespace $NAMESPACE \
        --set controller.replicaCount=2 \
        --set controller.nodeSelector."kubernetes\.io/os"=linux \
        --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz \
        --set defaultBackend.nodeSelector."kubernetes\.io/os"=linux
    

Tanúsítvány kötése bejövőforgalom-vezérlőhöz

  1. Kösse a tanúsítványt a bejövőforgalom-vezérlőhöz a helm install paranccsal. A bejövőforgalom-vezérlő üzembe helyezése a Titkos kulcstár CSI-illesztőprogram Azure Key Vault-szolgáltatójára hivatkozik.

    Megjegyzés:

    • Ha nem használja a Microsoft Entra pod által felügyelt identitást a hozzáférési módszerként, távolítsa el a sort a következővel --set controller.podLabels.aadpodidbinding=$AAD_POD_IDENTITY_NAME : .

    • Emellett a SecretProviderClass podhoz kötése szükséges ahhoz, hogy a Titkos kulcstár CSI-illesztőprogramja csatlakoztatja és létrehozza a Kubernetes-titkos kulcsot. Lásd: Csatlakoztatott tartalom szinkronizálása Kubernetes-titkos kóddal.

    helm install ingress-nginx/ingress-nginx --generate-name \
        --namespace $NAMESPACE \
        --set controller.replicaCount=2 \
        --set controller.nodeSelector."kubernetes\.io/os"=linux \
        --set defaultBackend.nodeSelector."kubernetes\.io/os"=linux \
        --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz \
        --set controller.podLabels.aadpodidbinding=$AAD_POD_IDENTITY_NAME \
        -f - <<EOF
    controller:
      extraVolumes:
          - name: secrets-store-inline
            csi:
              driver: secrets-store.csi.k8s.io
              readOnly: true
              volumeAttributes:
                secretProviderClass: "azure-tls"
      extraVolumeMounts:
          - name: secrets-store-inline
            mountPath: "/mnt/secrets-store"
            readOnly: true
    EOF
    
  2. Ellenőrizze, hogy a Kubernetes-titkos kód létre lett-e hozva a kubectl get secret paranccsal.

    kubectl get secret -n $NAMESPACE
    
    NAME                                             TYPE                                  DATA   AGE
    ingress-tls-csi                                  kubernetes.io/tls                     2      1m34s
    

Az alkalmazás üzembe helyezése

Az utasítások a forgatókönyvtől függően kissé módosulnak. Kövesse a kiválasztott forgatókönyvnek megfelelő utasításokat.

Az alkalmazás üzembe helyezése egy alkalmazáshivatkozás használatával

  1. Hozzon létre egy fájlt aks-helloworld-one.yaml az alábbi tartalommal.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: aks-helloworld-one  
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: aks-helloworld-one
      template:
        metadata:
          labels:
            app: aks-helloworld-one
        spec:
          containers:
          - name: aks-helloworld-one
            image: mcr.microsoft.com/azuredocs/aks-helloworld:v1
            ports:
            - containerPort: 80
            env:
            - name: TITLE
              value: "Welcome to Azure Kubernetes Service (AKS)"
            volumeMounts:
            - name: secrets-store-inline
              mountPath: "/mnt/secrets-store"
              readOnly: true
          volumes:
          - name: secrets-store-inline
            csi:
              driver: secrets-store.csi.k8s.io
              readOnly: true
              volumeAttributes:
                secretProviderClass: "azure-tls"
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: aks-helloworld-one  
    spec:
      type: ClusterIP
      ports:
      - port: 80
      selector:
        app: aks-helloworld-one
    
  2. Hozzon létre egy fájlt aks-helloworld-two.yaml az alábbi tartalommal.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: aks-helloworld-two  
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: aks-helloworld-two
      template:
        metadata:
          labels:
            app: aks-helloworld-two
        spec:
          containers:
          - name: aks-helloworld-two
            image: mcr.microsoft.com/azuredocs/aks-helloworld:v1
            ports:
            - containerPort: 80
            env:
            - name: TITLE
              value: "AKS Ingress Demo"
            volumeMounts:
            - name: secrets-store-inline
              mountPath: "/mnt/secrets-store"
              readOnly: true
          volumes:
          - name: secrets-store-inline
            csi:
              driver: secrets-store.csi.k8s.io
              readOnly: true
              volumeAttributes:
                secretProviderClass: "azure-tls"
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: aks-helloworld-two
    spec:
      type: ClusterIP
      ports:
      - port: 80
      selector:
        app: aks-helloworld-two
    
  3. Alkalmazza a YAML-fájlokat a fürtre a kubectl apply parancs használatával.

    kubectl apply -f aks-helloworld-one.yaml -n $NAMESPACE
    kubectl apply -f aks-helloworld-two.yaml -n $NAMESPACE
    
  4. Ellenőrizze, hogy a Kubernetes-titkos kód létre lett-e hozva a kubectl get secret paranccsal.

    kubectl get secret -n $NAMESPACE
    
    NAME                                             TYPE                                  DATA   AGE
    ingress-tls-csi                                  kubernetes.io/tls                     2      1m34s
    

Az alkalmazás üzembe helyezése bejövőforgalom-vezérlő referenciával

  1. Hozzon létre egy fájlt aks-helloworld-one.yaml az alábbi tartalommal.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: aks-helloworld-one  
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: aks-helloworld-one
      template:
        metadata:
          labels:
            app: aks-helloworld-one
        spec:
          containers:
          - name: aks-helloworld-one
            image: mcr.microsoft.com/azuredocs/aks-helloworld:v1
            ports:
            - containerPort: 80
            env:
            - name: TITLE
              value: "Welcome to Azure Kubernetes Service (AKS)"
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: aks-helloworld-one
    spec:
      type: ClusterIP
      ports:
      - port: 80
      selector:
        app: aks-helloworld-one
    
  2. Hozzon létre egy fájlt aks-helloworld-two.yaml az alábbi tartalommal.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: aks-helloworld-two  
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: aks-helloworld-two
      template:
        metadata:
          labels:
            app: aks-helloworld-two
        spec:
          containers:
          - name: aks-helloworld-two
            image: mcr.microsoft.com/azuredocs/aks-helloworld:v1
            ports:
            - containerPort: 80
            env:
            - name: TITLE
              value: "AKS Ingress Demo"
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: aks-helloworld-two  
    spec:
      type: ClusterIP
      ports:
      - port: 80
      selector:
        app: aks-helloworld-two
    
  3. Alkalmazza a YAML-fájlokat a fürtre a kubectl apply parancs használatával.

    kubectl apply -f aks-helloworld-one.yaml -n $NAMESPACE
    kubectl apply -f aks-helloworld-two.yaml -n $NAMESPACE
    

A titkos kódra hivatkozó bejövő erőforrás üzembe helyezése

Most már üzembe helyezhetünk egy Kubernetes bejövő erőforrást, amely a titkos kódra hivatkozik.

  1. Hozzon létre egy fájlnevet hello-world-ingress.yaml a következő tartalommal.

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: ingress-tls
      annotations:
        nginx.ingress.kubernetes.io/rewrite-target: /$2
    spec:
      ingressClassName: nginx
      tls:
      - hosts:
        - demo.azure.com
        secretName: ingress-tls-csi
      rules:
      - host: demo.azure.com
        http:
          paths:
          - path: /hello-world-one(/|$)(.*)
            pathType: Prefix
            backend:
              service:
                name: aks-helloworld-one
                port:
                  number: 80
          - path: /hello-world-two(/|$)(.*)
            pathType: Prefix      
            backend:
              service:
                name: aks-helloworld-two
                port:
                  number: 80
          - path: /(.*)
            pathType: Prefix      
            backend:
              service:
                name: aks-helloworld-one
                port:
                  number: 80
    
  2. Jegyezze fel a tls korábban létrehozott titkos kódra hivatkozó szakaszt, és alkalmazza a fájlt a fürtre a kubectl apply parancs használatával.

    kubectl apply -f hello-world-ingress.yaml -n $NAMESPACE
    

A bejövőforgalom-vezérlő külső IP-címének beszerzése

  • Kérje le a bejövőforgalom-vezérlő külső IP-címét a kubectl get service parancs használatával.

    kubectl get service --namespace $NAMESPACE --selector app.kubernetes.io/name=ingress-nginx
    
    NAME                                       TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)                      AGE
    nginx-ingress-1588032400-controller        LoadBalancer   10.0.255.157   EXTERNAL_IP      80:31293/TCP,443:31265/TCP   19m
    nginx-ingress-1588032400-default-backend   ClusterIP      10.0.223.214   <none>           80/TCP                       19m
    

A TLS-lel védett bejövő forgalom tesztelése

  1. Ellenőrizze, hogy a bejövő forgalom megfelelően van-e konfigurálva a TLS-sel az alábbi curl paranccsal. Győződjön meg arról, hogy az előző lépésben használt külső IP-címet használja.

    curl -v -k --resolve demo.azure.com:443:EXTERNAL_IP https://demo.azure.com
    

    Mivel egy másik elérési út nem lett megadva a címmel, a bejövőforgalom-vezérlő alapértelmezés szerint az / útvonalra mutat. Az első demóalkalmazás a következő sűrített példakimenetben látható:

    [...]
    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <link rel="stylesheet" type="text/css" href="/static/default.css">
        <title>Welcome to Azure Kubernetes Service (AKS)</title>
    [...]
    

    A parancs -v paramétere curl részletes információkat ad ki, beleértve a kapott TLS-tanúsítványt is. A curl-kimenet felénél ellenőrizheti, hogy a saját TLS-tanúsítványát használta-e. A -k paraméter továbbra is betölti az oldalt, annak ellenére, hogy önaláírt tanúsítványt használunk. A következő példa a kiállítót mutatja be: CN=demo.azure.com; O=aks-ingress-tls tanúsítványt használtunk:

    [...]
     * Server certificate:
     *  subject: CN=demo.azure.com; O=aks-ingress-tls
     *  start date: Oct 22 22:13:54 2021 GMT
     *  expire date: Oct 22 22:13:54 2022 GMT
     *  issuer: CN=demo.azure.com; O=aks-ingress-tls
     *  SSL certificate verify result: self signed certificate (18), continuing anyway.
    [...]
    
  2. Adja hozzá a /hello-world-two elérési utat a címhez, például https://demo.azure.com/hello-world-two, és ellenőrizze, hogy a második demóalkalmazás megfelelően van-e konfigurálva.

    curl -v -k --resolve demo.azure.com:443:EXTERNAL_IP https://demo.azure.com/hello-world-two
    

    A második, egyéni címmel rendelkező bemutató alkalmazás lesz visszaadva, ahogy az a következő sűrített példakimenetben is látható:

    [...]
    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <link rel="stylesheet" type="text/css" href="/static/default.css">
        <title>AKS Ingress Demo</title>
    [...]