Protect Dev Site ของคุณง่ายๆ ด้วย Basic Auth ( Part 1 )

Janevit Dechnumbuncharchai
LifeatRentSpree
Published in
3 min readOct 19, 2021
Photo by Dan Nelson on Unsplash

หลายคนคงเคยประสบปัญหาเรื่องเราจะทำการป้องกัน 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 เลยครับ

--

--