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
- Ha még nincs Azure-előfizetése, kezdés előtt hozzon létre egy ingyenes fiókot.
- Mielőtt hozzákezd, győződjön meg arról, hogy az Azure CLI-verzió >=
2.30.0
, vagy telepítse a legújabb verziót. - Egy AKS-fürt, amelyen konfigurálva van a Titkos kulcstár CSI-illesztőprogramja.
- Egy Azure Key Vault-példány.
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
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
Importálja a tanúsítványt a
az keyvault certificate import
paranccsal.az keyvault certificate import --vault-name $AKV_NAME --name $CERT_NAME --file $CERT_NAME.pfx
SecretProviderClass üzembe helyezése
Új névtér exportálása az alábbi paranccsal.
export NAMESPACE=ingress-basic
Hozza létre a névteret a
kubectl create namespace
paranccsal.kubectl create namespace $NAMESPACE
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=secret
a titkos kulcsot és a tanúsítványt az AKV-tól. - Állítsa be
kubernetes.io/tls
atype
szakaszbasecretObjects
.
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
- Mindenképpen használja
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
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.Feljegyzé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
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
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
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
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
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
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
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
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.
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
Jegyezze fel a
tls
korábban létrehozott titkos kódra hivatkozó szakaszt, és alkalmazza a fájlt a fürtre akubectl 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
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. [...]
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> [...]
Azure Kubernetes Service