SUPER-G.EEK.JP

twitter: @hum_op_dev
github: ophum

k8s ingress-nginxのClient証明書認証を試す

目次

k8s ingress-nginx の Client 証明書認証を試す

kind で k8s を構築する

 1hum@ryzen5pc:~$ kind create cluster
 2Creating cluster "kind" ...
 3 ✓ Ensuring node image (kindest/node:v1.30.0) 🖼
 4 ✓ Preparing nodes 📦
 5 ✓ Writing configuration 📜
 6 ✓ Starting control-plane 🕹️
 7 ✓ Installing CNI 🔌
 8 ✓ Installing StorageClass 💾
 9Set kubectl context to "kind-kind"
10You can now use your cluster with:
11
12kubectl cluster-info --context kind-kind
13
14Not sure what to do next? 😅  Check out https://kind.sigs.k8s.io/docs/user/quick-start/

ingress-nginx をデプロイ

https://kubernetes.github.io/ingress-nginx/deploy/#quick-start

 1hum@ryzen5pc:~$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.13.3/deploy/static/provider/cloud/deploy.yaml
 2namespace/ingress-nginx created
 3serviceaccount/ingress-nginx created
 4serviceaccount/ingress-nginx-admission created
 5role.rbac.authorization.k8s.io/ingress-nginx created
 6role.rbac.authorization.k8s.io/ingress-nginx-admission created
 7clusterrole.rbac.authorization.k8s.io/ingress-nginx created
 8clusterrole.rbac.authorization.k8s.io/ingress-nginx-admission created
 9rolebinding.rbac.authorization.k8s.io/ingress-nginx created
10rolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
11clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx created
12clusterrolebinding.rbac.authorization.k8s.io/ingress-nginx-admission created
13configmap/ingress-nginx-controller created
14service/ingress-nginx-controller created
15service/ingress-nginx-controller-admission created
16deployment.apps/ingress-nginx-controller created
17job.batch/ingress-nginx-admission-create created
18job.batch/ingress-nginx-admission-patch created
19ingressclass.networking.k8s.io/nginx created
20validatingwebhookconfiguration.admissionregistration.k8s.io/ingress-nginx-admission created

証明書を作成する

認証局にはさくらのクラウドのマネージド PKI を利用しました。

サーバー証明書を作成する

秘密鍵と公開鍵を生成します。公開鍵を利用してマネージド PKI で証明書を発行します。

openssl genrsa > server-key.pem
openssl rsa -pubout -in server-key.pem server-pub.pem

証明書をコピーし server-cert.pem として保存しておきます。

クライアント証明作成する

クライアント証明書はメールを利用してマネージド PKI で証明書を発行します。

以下のようなメールが届くので、鍵の生成・証明書の発行を行います。(鍵の生成はブラウザで行われる) 完了すると pkcs.p12 というファイルをダウンロードできます。

pkcs.p12 をダブルクリックしインポートしておきます。

ingress とアプリケーション(nginx)をデプロイする

CA 証明書の Secret を作成する(マネージド PKI の認証局の証明書)

1hum@ryzen5pc:~/nginx-ingress-client-cert-auth-test$ kubectl create secret generic ca-secret --from-file=ca.crt=cert.pem
2secret/ca-secret created

tls 用の Secret を作成する

1hum@ryzen5pc:~/nginx-ingress-client-cert-auth-test$ kubectl create secret generic tls-secret --from-
2file=tls.crt=server-cert.pem --from-file=tls.key=server-key.pem
3secret/tls-secret created

Ingress/Deployment/Service を作成する

 1apiVersion: networking.k8s.io/v1
 2kind: Ingress
 3metadata:
 4  annotations:
 5    nginx.ingress.kubernetes.io/auth-tls-verify-client: "on"
 6    nginx.ingress.kubernetes.io/auth-tls-secret: "default/ca-secret"
 7    nginx.ingress.kubernetes.io/auth-tls-verify-depth: "1"
 8    nginx.ingress.kubernetes.io/auth-tls-pass-certificate-to-upstream: "true"
 9  name: nginx-test
10  namespace: default
11spec:
12  ingressClassName: nginx
13  rules:
14    - host: example.com
15      http:
16        paths:
17          - path: /
18            pathType: Prefix
19            backend:
20              service:
21                name: nginx-svc
22                port:
23                  number: 80
24  tls:
25    - hosts:
26        - example.com
27      secretName: tls-secret
28---
29apiVersion: apps/v1
30kind: Deployment
31metadata:
32  name: nginx-test
33spec:
34  replicas: 1
35  selector:
36    matchLabels:
37      app: nginx-test
38  template:
39    metadata:
40      labels:
41        app: nginx-test
42    spec:
43      containers:
44        - name: nginx
45          image: nginx
46          ports:
47            - containerPort: 80
48---
49apiVersion: v1
50kind: Service
51metadata:
52  name: nginx-svc
53spec:
54  selector:
55    app: nginx-test
56  ports:
57    - protocol: TCP
58      port: 80
59      targetPort: 80
1hum@ryzen5pc:~/nginx-ingress-client-cert-auth-test$ vim deploy.yaml
2hum@ryzen5pc:~/nginx-ingress-client-cert-auth-test$ kubectl apply -f deploy.yaml
3ingress.networking.k8s.io/nginx-test created
4deployment.apps/nginx-test created
5service/nginx-svc created
1hum@ryzen5pc:~/nginx-ingress-client-cert-auth-test$ kubectl get pods
2NAME                          READY   STATUS    RESTARTS   AGE
3nginx-test-66b9959c76-rvr6n   1/1     Running   0          14s
hum@ryzen5pc:~/nginx-ingress-client-cert-auth-test$ kubectl port-forward -n ingress-nginx svc/ingress-nginx-controller 8080:80
Forwarding from 127.0.0.1:8080 -> 80
Forwarding from [::1]:8080 -> 80

サイトにアクセスしてみる

クライアント証明書を求められる。インポートしたクライアント証明書を選択することでアクセスできる。

証明書を送信しない場合、400 エラーになる。

証明書を送信することでサイトにアクセスすることができた。