Thứ sáu, 11/10/2019 | 00:00 GMT+7

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:

Sơ đồ kết quả cuối của stream  yêu cầu

Yêu cầu

Để hoàn thành hướng dẫn này, bạn cầ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 : echo1echo2 . Bạn cũng sẽ có một lần nhập bản đồ echo1. your_domainecho2. 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_domain domain 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_domain domain 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 echo1echo2 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 :

echo_ingress.yaml
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ụ echo2echo1 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ả :

Output
NAME 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 echo1echo2 . 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ụngURL 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:

Output
secret/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 :

oauth2-proxy-config.yaml
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:

  1. Hướng dẫn oauth2_proxy sử dụng bí mật bạn đã tạo.
  2. Đặt domain và loại nhà cung cấp.
  3. Đặ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ư.
  4. Cấu hình đường nhập sẽ phục vụ cổng đăng nhập trên auth.int. your_domain vớ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ệ echo1echo2 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:

echo_ingress.yaml
   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 đồ Helmtài liệu của oauth2_proxy .


Tags:

Các tin liên quan