Protect Dev Site ของคุณง่ายๆ ด้วย Basic Auth ( Part 1 )
หลายคนคงเคยประสบปัญหาเรื่องเราจะทำการป้องกัน Development, UAT site อย่างไรโดยส่วนมาก อาจจะได้คำตอบคือ VPN (virtual private network) ซึ่งบางอาจจะ setup ยากและถ้าหากเรามีลูกค้าที่มีความรู้ในด้าน technology ไม่แข็งแรงเราอาจจะต้องเสียเวลา training ในการใช้ VPN อย่างแน่นอน…
วันนี้ผมจึงมาเสนอวิธีการงานในการ setup เพื่อปกป้องเว็บไซต์ Dev, UAT โดยที่ RentSpree เราใช้ kubenetes ในการจัดการ container ต่างๆ
ดังนั้น ตัวอย่าง infrastructure ในวันนี้คือ คือ Kubernetes + Ingress Nginx Controller และใช้ความสามารถของ Ingress Nginx Controller ในการทำ Authentication นั้นคือ Basic Auth
Basic Auth คืออะไร
Basic Auth คือการส่งข้อมูลในรูปแบบของ HTTP Transaction โดยผ่านตัว Header ที่ชื่อว่า Basic access authentication ซึ่งต้องใช้ Username กับ Password ส่งผ่าน Header เพื่อทำการ Authenticate
Basic Auth นั้นทำได้หลายวิธีตั้งแต่
ด้วย Code เช่น https://www.npmjs.com/package/basic-auth
ด้วย nginx เช่น https://docs.nginx.com/nginx/admin-guide/security-controls/configuring-http-basic-authentication/
Setup
เริ่มต้น step ให้เราลง docker ในเครื่องโดยใน version ใหม่ docker จะมีการลง Kubernetes ติดมาด้วย
สังเกตุ ขวาล่างจะเห็นว่าตอนนี้ผมได้รัน docker และ Kubernetes อยู่ทั้งคู่
step ต่อไปเราจะ setup kubectl เมื่อ setup เรียบร้อยให้เราลองเปิด terminal แล้วลองพิม
kubectl version
หากลงได้สำเร็จให้เราเลือก cluster ใน docker เราดังนี้
จากนั้นทดสอบ run command
kubectl cluster-info
หากถูกต้องควรจะได้ค่า ของ cluster local เราออกมาดังภาพ
ต่อมาเราทำการติดตั้ง Ingress Nginx Controller สู่ Kube Cluster ของเรา ด้วยคำสั่ง
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v0.44.0/deploy/static/provider/cloud/deploy.yml
ref.https://kubernetes.github.io/ingress-nginx/deploy/#docker-for-mac
จากนั้นให้เราลองสร้างหน้า Web Hello world ง่ายๆด้วย การสร้างไฟล์ Hello-world.yml
Ref.https://github.com/paulbouwer/hello-kubernetes
และรันคำสั่ง
kubectl apply -f hello-world.yml
เราจะเห็น command run จน complete
service/hello-kubernetes created
deployment.apps/hello-kubernetes created
จากนั้นเราลองสร้าง Ingress สำหรับเข้าถึง Service นี้กัน โดยตั้งชื่อว่า ingress.yml
hello-world.{{your-ip}}.nip.io ใช้หลักการของ https://nip.io/ สามารถตามไปอ่านกันได้เลยครับ
เมื่อสร้างไฟล์เสร็จแล้วเราลอง run command
kubclt apply -f ingress.yml
จากนั้นลอง Access เข้า hello-world.{{your-ip}}.nip.io เราจะเห็นหน้า hello-world ของเราเป็นอันเสร็จในการ setup step แรก
Setup Basic Auth
ให้เรารันคำสั่ง
htpasswd -c auth {{username}}kubectl create secret generic basic-auth --from-file=authkubectl get secret basic-auth -o yml
เราจะเห็นไฟล์ secret จากคำสั่ง kubectl get secret basic-auth -o yml
apiVersion: v1
data:
auth: Zm9vOiRhcHIxJGR5djYyRkVmJGQuVjBTSFZCdFV0NGNWQVc0aVFqbzEK
kind: Secret
metadata:
creationTimestamp: "2021-03-05T06:02:45Z"
managedFields:
- apiVersion: v1
fieldsType: FieldsV1
fieldsV1:
f:data:
.: {}
f:auth: {}
f:type: {}
manager: kubectl
operation: Update
time: "2021-03-05T06:02:45Z"
name: basic-auth
namespace: default
resourceVersion: "335994"
selfLink: /api/v1/namespaces/default/secrets/basic-auth
uid: a7f31c33-16f0-4ec5-a675-d9837357ddc0
type: Opaque
จากนั้น เพิ่มคำสั่งดังนี้เข้าไปใน Annotation ของ Ingress.yml
nginx.ingress.kubernetes.io/auth-type: basic nginx.ingress.kubernetes.io/auth-secret: basic-auth nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required'
และไฟล์ ingress.yml จะมีหน้าตาดังนี้
apiVersion: extensions/v1beta1kind: Ingressmetadata:name: minimal-ingressannotations:kubernetes.io/ingress.class: nginxnginx.ingress.kubernetes.io/affinity: cookie
nginx.ingress.kubernetes.io/auth-type: basic nginx.ingress.kubernetes.io/auth-secret: basic-auth nginx.ingress.kubernetes.io/auth-realm: 'Authentication Required'spec:rules:- host: hello-world.192.168.101.240.nip.iohttp:paths:- path: /backend:serviceName: hello-kubernetesservicePort: 80
จากนั้น run คำสั่ง
kubctl apply -f ingress.yml
จากนั้น access เข้า hello-world.{{your-ip}}.nip.io เราจะเห็น Basic auth ของเราแล้ว
และแล้ว Basic Auth ของเราก็สำเร็จ!! ง่ายดายมากเลยใช่มั้ยครับ
สรุป
เป็นยังไงบ้างครับ ง่ายมากเลยใช่มั้ยครับในการทำ Basic Auth ในการป้องกัน website ของเรากันแล้ว แต่เราสามารถ Setup ให้ Nginx Controller ของเรา authenticate ด้วย Oauth เจ้าอื่นๆ ได้อีกเช่นกันนะครับเช่น Google SSO, Facebook SSO หรือ Auth0 และอย่างเคยครับวิธีการนั้นง่ายแสนง่ายเหมือนเดิมครับ รอติดตามได้ใน Part2 เลยครับ