Cách bảo vệ dịch vụ Kubernetes riêng tư đằng sau đăng nhập GitHub bằng oauth2_proxy
Sự xâm nhập của Kubernetes khiến các dịch vụ web dễ dàng tiếp xúc với internet. Tuy nhiên, khi nói đến các dịch vụ tư nhân, bạn có thể sẽ muốn giới hạn những người có thể truy cập chúng. oauth2_proxy có thể đóng role như một rào cản giữa Internet công cộng và các dịch vụ tư nhân. oauth2_proxy là server và Reverse Proxy cung cấp xác thực bằng cách sử dụng các nhà cung cấp khác nhau, chẳng hạn như GitHub và xác thực user bằng địa chỉ email hoặc các thuộc tính khác của họ.Trong hướng dẫn này, bạn sẽ sử dụng oauth2_proxy với GitHub để bảo vệ các dịch vụ của bạn . Khi bạn hoàn tất, bạn sẽ có một hệ thống ủy quyền giống như trong sơ đồ sau:
Yêu cầu
Để hoàn thành hướng dẫn này, bạn cần :
- Một cụm Kubernetes với hai dịch vụ web đang chạy với sự xâm nhập Nginx và Let's Encrypt. Hướng dẫn này dựa trên Cách cài đặt Nginx Ingress với Cert-Manager trên DigitalOcean Kubernetes . Hãy chắc chắn làm theo nó đến cuối cùng để hoàn thành hướng dẫn này.
 - Một account GitHub .
 - Python được cài đặt trên máy local của bạn. Nếu bạn chưa cài đặt nó, hãy làm theo hướng dẫn cài đặt cho hệ điều hành của bạn .
 
Bước 1 - Cấu hình domain của bạn
 Sau khi làm theo hướng dẫn được liên kết trong phần  Yêu cầu , bạn sẽ có hai dịch vụ web đang chạy trên cụm  của bạn : echo1 và echo2 . Bạn cũng sẽ có một lần nhập bản đồ echo1. your_domain và echo2. your_domain cho các dịch vụ tương ứng của họ.
Trong hướng dẫn này, ta sẽ sử dụng các quy ước sau:
-  Tất cả các dịch vụ tư nhân sẽ thuộc 
.int. your_domaindomain phụ.int. your_domain, nhưservice.int. your_domain. Group các dịch vụ riêng tư theo một domain phụ là lý tưởng vì cookie xác thực sẽ được chia sẻ trên tất cả*.int. your_domaindomain phụ*.int. your_domain. -  Cổng đăng nhập sẽ được cung cấp trên 
auth.int. your_domain. 
 Lưu ý: Đảm bảo thay thế your_domain bằng domain   của bạn  ở bất kỳ nơi nào nó xuất hiện trong hướng dẫn này.
 Để bắt đầu, cập nhật các định nghĩa xâm nhập hiện có để di chuyển echo1 và echo2 dịch vụ theo .int. your_domain . Mở echo_ingress.yaml trong editor  của bạn để bạn có thể thay đổi các domain :
- nano echo_ingress.yaml 
 
Đổi tên tất cả các version  của echo1. your_domain thành echo1.int. your_domain và thay thế tất cả các bản sao của echo2. your_domain với echo2. int.your_domain :
apiVersion: extensions/v1beta1 kind: Ingress metadata:   name: echo-ingress   annotations:       kubernetes.io/ingress.class: nginx     certmanager.k8s.io/cluster-issuer: letsencrypt-prod spec:   tls:   - hosts:     - echo1.int.your_domain     - echo2.int.your_domain     secretName: letsencrypt-prod   rules:   - host: echo1.int.your_domain     http:       paths:       - backend:           serviceName: echo1           servicePort: 80   - host: echo2.int.your_domain     http:       paths:       - backend:           serviceName: echo2           servicePort: 80 Lưu file và áp dụng các thay đổi:
- kubectl apply -f echo_ingress.yaml 
 
Thao tác này cũng sẽ cập nhật certificate  TLS cho các dịch vụ echo2 và echo1 của bạn.
Bây giờ hãy cập nhật cấu hình DNS của bạn để áp dụng thay đổi bạn đã thực hiện. Trước tiên, hãy tra cứu địa chỉ IP của lần nhập Nginx của bạn bằng cách chạy lệnh sau để in chi tiết của nó:
- kubectl get svc --namespace=ingress-nginx 
 
Bạn sẽ thấy địa chỉ IP trong EXTERNAL-IP trong  kết quả :
OutputNAME            TYPE           CLUSTER-IP      EXTERNAL-IP       PORT(S)                      AGE ingress-nginx   LoadBalancer   10.245.247.67   203.0.113.0   80:32486/TCP,443:32096/TCP   20h Sao chép địa chỉ IP bên ngoài vào  clipboard  của bạn. Duyệt đến dịch vụ quản lý DNS của bạn và tìm các bản ghi A cho echo1-2. your_domain để trỏ đến địa chỉ IP bên ngoài đó. Nếu bạn đang sử dụng DigitalOcean để quản lý bản ghi DNS  của bạn , hãy xem Cách quản lý bản ghi DNS để biết hướng dẫn.
 Xóa các bản ghi cho echo1 và echo2 . Thêm bản ghi A mới cho tên  server  *.int. your_domain và trỏ nó đến địa chỉ IP bên ngoài của lần nhập.
 Bây giờ bất kỳ yêu cầu nào đối với bất kỳ domain  phụ nào dưới *.int. your_domain sẽ được chuyển đến đường dẫn Nginx, vì vậy bạn có thể sử dụng các domain  phụ này trong cụm  của bạn .
Tiếp theo, bạn sẽ cấu hình GitHub làm nhà cung cấp dịch vụ đăng nhập của bạn .
Bước 2 - Tạo ứng dụng GitHub OAuth
oauth2_proxy hỗ trợ các nhà cung cấp đăng nhập khác nhau. Trong hướng dẫn này, bạn sẽ sử dụng nhà cung cấp GitHub. Để bắt đầu, hãy tạo Ứng dụng GitHub OAuth mới.
Trong tab Ứng dụng OAuth của trang Cài đặt dành cho nhà phát triển trong account của bạn, nhấp vào nút Ứng dụng OAuth mới .
 Các trường Tên ứng dụng và URL Trang chủ có thể là  bạn muốn . Trong trường URL gọi lại Ủy quyền , hãy nhập https://auth.int. your_domain /oauth2/callback .
Sau khi đăng ký ứng dụng, bạn sẽ nhận được Mã khách hàng và Bí mật. Lưu ý cả hai vì bạn cần chúng trong bước tiếp theo.
Đến đây bạn đã tạo ứng dụng GitHub OAuth, bạn có thể cài đặt và cấu hình oauth2_proxy.
Bước 3 - Cài đặt Cổng thông tin đăng nhập
Bạn sẽ sử dụng Helm để cài đặt proxy oauth2 vào cụm. Đầu tiên, bạn sẽ tạo một bí mật Kubernetes để giữ ID khách hàng và Bí mật của ứng dụng GitHub, cũng như bí mật mã hóa cho cookie trình duyệt được đặt bởi proxy oauth2 .
Chạy lệnh sau để tạo bí mật cookie an toàn:
- python -c 'import os,base64; print base64.b64encode(os.urandom(16))' 
 
Sao chép kết quả vào clipboard của bạn
Sau đó, tạo bí mật Kubernetes, thay thế các giá trị được đánh dấu cho bí mật cookie, ID ứng dụng client GitHub và khóa bí mật GitHub của bạn:
- kubectl -n default create secret generic oauth2-proxy-creds \ 
 - --from-literal=cookie-secret=YOUR_COOKIE_SECRET \ 
 - --from-literal=client-id=YOUR_GITHUB_CLIENT_ID \ 
 - --from-literal=client-secret=YOUR_GITHUB_SECRET 
 
Bạn sẽ thấy kết quả sau:
Outputsecret/oauth2-proxy-creds created Tiếp theo, tạo một file  mới có tên oauth2-proxy-config.yaml sẽ chứa cấu hình cho oauth2_proxy :
- nano oauth2-proxy-config.yaml 
 
Các giá trị bạn sẽ đặt trong file này sẽ overrides các giá trị mặc định của biểu đồ Helm. Thêm mã sau vào file :
config:   existingSecret: oauth2-proxy-creds  extraArgs:   whitelist-domain: .int.your_domain   cookie-domain: .int.your_domain   provider: github  authenticatedEmailsFile:   enabled: true   restricted_access: |-     allowed@user1.com     allowed@user2.com  ingress:   enabled: true   path: /   hosts:     - auth.int.your_domain   annotations:     kubernetes.io/ingress.class: nginx     certmanager.k8s.io/cluster-issuer: letsencrypt-prod   tls:     - secretName: oauth2-proxy-https-cert       hosts:         - auth.int.your_domain Mã này thực hiện như sau:
- Hướng dẫn oauth2_proxy sử dụng bí mật bạn đã tạo.
 - Đặt domain và loại nhà cung cấp.
 - Đặt danh sách các địa chỉ email được phép. Nếu account GitHub được liên kết với một trong những địa chỉ email này, account đó sẽ được phép truy cập vào các dịch vụ riêng tư.
 -   Cấu hình  đường nhập sẽ phục vụ cổng đăng nhập trên 
auth.int. your_domainvới certificate TLS từ Let's Encrypt. 
  Đến đây bạn  đã có file  bí mật và cấu hình sẵn sàng, bạn có thể cài đặt oauth2_proxy . Chạy lệnh sau:
- helm repo update \ 
 - && helm upgrade oauth2-proxy --install stable/oauth2-proxy \ 
 - --reuse-values \ 
 - --values oauth2-proxy-config.yaml 
 
Có thể mất vài phút để certificate Let's Encrypt được cấp và cài đặt.
 Để kiểm tra việc triển khai có thành công hay không, hãy duyệt đến https://auth.int. your_domain . Bạn sẽ thấy một trang nhắc bạn đăng nhập bằng GitHub.
Với oauth2_proxy được cài đặt và chạy, tất cả những gì còn lại là yêu cầu xác thực dịch vụ của bạn.
Bước 4 - Bảo vệ các dịch vụ riêng tư
Để bảo vệ một dịch vụ, hãy cấu hình sự xâm nhập Nginx của nó để thực thi xác thực qua oauth2_proxy. Nginx và nginx-ingress hỗ trợ cấu hình này nguyên bản, vì vậy bạn chỉ cần thêm một vài chú thích vào định nghĩa nhập.
 Hãy bảo vệ echo1 và echo2 dịch vụ mà bạn  cài đặt  trong  yêu cầu  hướng dẫn. Mở echo_ingress.yaml trong  editor :
- nano echo_ingress.yaml 
 
Thêm hai chú thích bổ sung này vào file để yêu cầu xác thực:
   annotations:      kubernetes.io/ingress.class: nginx      certmanager.k8s.io/cluster-issuer: letsencrypt-prod      nginx.ingress.kubernetes.io/auth-url: "https://auth.int.your_domain/oauth2/auth"      nginx.ingress.kubernetes.io/auth-signin: "https://auth.int.your_domain/oauth2/start?rd=https%3A%2F%2F$host$request_uri" Lưu file và áp dụng các thay đổi:
- kubectl apply -f echo_ingress.yaml 
 
Bây giờ khi bạn duyệt đến https://echo1.int. your_domain ,  bạn cần  đăng nhập bằng GitHub để truy cập vào nó. Sau khi đăng nhập bằng account  hợp lệ, bạn sẽ được chuyển hướng trở lại dịch vụ echo1 . Điều này cũng đúng với echo2 .
Kết luận
Trong hướng dẫn này, bạn cài đặt oauth2_proxy trên cụm Kubernetes của bạn và bảo vệ dịch vụ riêng tư sau đăng nhập GitHub. Đối với bất kỳ dịch vụ nào khác mà bạn cần bảo vệ, chỉ cần thực hiện theo các hướng dẫn được nêu trong Bước 4.
oauth2_proxy hỗ trợ nhiều nhà cung cấp khác nhau ngoài GitHub. Để tìm hiểu thêm về các nhà cung cấp khác nhau, hãy xem tài liệu chính thức .
Ngoài ra, có nhiều thông số cấu hình mà bạn có thể cần phải điều chỉnh, mặc dù các thông số mặc định sẽ phù hợp với hầu hết các nhu cầu. Để biết danh sách các tham số, hãy xem tài liệu của biểu đồ Helm và tài liệu của oauth2_proxy .
Các tin liên quan

