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_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 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_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ệ 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