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 エラーになる。
証明書を送信することでサイトにアクセスすることができた。