Bảo mật người dùng Kubernetes
Trong quản trị Linux, ứng dụng Người dùng, Nhóm và Quyền là một phương pháp đã được thử nghiệm và kiểm tra để cải thiện tình trạng bảo mật cho một số trường hợp sử dụng, tương tự, quản trị Kubernetes áp dụng các khái niệm tương tự bằng cách sử dụng RBAC (Kiểm soát truy cập dựa trên vai trò), Tài khoản dịch vụ, và hơn thế nữa. Ví dụ: khi tương tác với bản cài đặt Kubernetes tiêu chuẩn, hành vi mặc định là dành cho một tệp kubeconfig duy nhất để cung cấp quyền truy cập không giới hạn vào cụm có liên quan. Với tài khoản RBAC và Dịch vụ, các tệp kubeconfig có thể được tạo cho các cá nhân cụ thể trong một tổ chức, chỉ cho họ quyền truy cập vào các phần của cụm mà họ cần.
Trong hướng dẫn này
Mặc dù Linode Kubernetes Engine(LKE) là một Nền tảng được quản lý dưới dạng giải pháp Dịch vụ cung cấp mức bảo mật cơ bản nhưng theo mặc định, nó không xử lý việc tạo vai trò và tài khoản dịch vụ cho bất kỳ người dùng nào được định cấu hình trên LKE. hướng dẫn tạo vai trò và ràng buộc vai trò cho người dùng mẫu trong không gian tên riêng của người dùng mẫu, để người dùng có thể xuất tệp Kubeconfig tùy chỉnh để người dùng xác thực với các quyền hạn chế. Bằng cách này, tất cả người dùng trong một cụm cụ thể sẽ không bị hạn chế. bắt buộc phải có đầy đủ quyền quản trị viên.
Trước khi bạn bắt đầu
Hướng dẫn này giả định rằng bạn có cụm Kubernetes đang hoạt động được triển khai bằng Linode Kubernetes Engine (LKE). Bạn có thể triển khai cụm Kubernetes bằng LKE theo các cách sau:
- Trình quản lý đám mây.
- API của Linode v4.
- Terraform, công cụ cơ sở hạ tầng phổ biến dưới dạng mã (IaC).
Một cụm LKE sẽ được cài đặt Trình quản lý bộ điều khiển đám mây của Linode trong mặt phẳng điều khiển của cụm. Nếu bạn không triển khai cụm Kubernetes của mình bằng LKE và muốn sử dụng Trình quản lý bộ điều khiển đám mây Linode, hãy xem Cài đặt Linode CCM trên Cụm Kubernetes không được quản lý. – Hướng dẫn.
Tạo người dùng mới
Các bước sau đây sẽ cung cấp một phương pháp an toàn để giới hạn quyền truy cập của người dùng vào một cụm. Chứng chỉ SSL sẽ được tạo cho người dùng, được quản trị viên phê duyệt và sau đó áp dụng cho kubeconfig giới hạn để người dùng sử dụng để có quyền truy cập thay vì quyền truy cập chính. tập tin kubeconfig của quản trị viên.
Tạo chứng chỉ và phê duyệt CSR cho người dùng mới
Để người dùng xác thực an toàn với máy chủ Kubernetes, chứng chỉ x.509 sẽ được sử dụng, tương tự như cách áp dụng SSL/TLS trên trình duyệt web. Yêu cầu ký chứng chỉ hoặc CSR, cho phép chứng chỉ .x.509. được phê duyệt và ký để sử dụng với Kubernetes. Để áp dụng chứng chỉ và tạo CSR, có thể làm theo các bước sau:
- Tạo một thư mục mới có nhãn auth để lưu trữ mọi chứng chỉ người dùng mới sẽ được tạo. Điều hướng đến thư mục mới này sau khi tạo.:
mkdir auth
cd auth
- Tạo chứng chỉ mới cho người dùng của bạn:
openssl genrsa -out exampleuser.key 2048
Người dùng văn bản có thể được thay thế bằng tên người dùng bạn chọn.
Tạo tệp yêu cầu ký chứng chỉ mới:
openssl req -new -key exampleuser.key -out exampleuser.csr -subj "/CN=exampleuser"
Sao chép khóa vào thư mục cài đặt kubectl. Đây thường là thư mục mẹ:
- Sử dụng trình soạn thảo văn bản bạn chọn, tạo tệp CSR YAML mới:
sudo nano exampleusercsr.yaml
CSR YAML phải phản ánh nội dung sau. Thay thế chuỗi trong trường yêu cầu bằng chuỗi base64 được tạo cho tệp csr của riêng bạn:
apiVersion: certificates.k8s.io/v1
kind: CertificateSigningRequest
metadata:
name: exampleuser-csr
spec:
groups:
- system:authenticated
request: OGY4d1pQRGlqT21NV2VXCjM4dFdjRmJrQXRyTXJ6YWZnWGRZS1VYb2Z2ZDhLalVPeUJEaFdoWTFJbjZ6NGpEZ2RTbm94K21SdlJxQTFOUEwKN2k0QVd4OFlKcEdVS0Uvb1VKREZDcHVYcE9SZVdUMnY3enhFTzE5QUpRSURBUUFCb0FBd0RRWUpLb1pJaHZjTgpBUUVMQlFBRGdnRUJBRDg5T3JlUC
signerName: kubernetes.io/kube-apiserver-client
usages:
- digital signature
- key encipherment
- client auth
- Tạo yêu cầu ký chứng chỉ:
kubectl create -f exampleusercsr.yaml
- Bạn sẽ thấy đầu ra giống như sau:
certificatesigningrequest.certificates.k8s.io/user1-csr created
- Nếu tại bất kỳ thời điểm nào cần kiểm tra trạng thái của CSR, có thể nhập lệnh sau:
kubectl get csr
Additionally, although CSR's will be automatically deleted after enough time has passed, they can be manually deleted so that a new CSR can be attempted at any time using the following syntax:
kubectl delete csr user1-csr
- Thông qua kubectl, phê duyệt chứng chỉ để sử dụng với cụm Kubernetes của bạn:
kubectl certificate approve user1-csr
Xuất tệp .crt từ API Kubernetes để nhận bản sao chứng chỉ đã ký của bạn và lưu nó vào thư mục /auth/:
kubectl get csr user1-csr -o jsonpath='{.status.certificate}' | base64 --decode > ~/auth/exampleuser.cr
Tạo một tệp kubeconfig giới hạn
Để người dùng bị giới hạn mới có thể tương tác với Kubernetes, họ sẽ cần tệp Kubeconfig của riêng mình không bao gồm quyền quản trị. Các bước sau đây sẽ mô tả cách tạo tệp này.
- Để đảm bảo rằng tệp kubeconfig gốc không bị ghi đè nếu không có bản sao lưu, hãy tạo bản sao lưu ngay bây giờ:
cp kubeconfig.yaml kubeconfigbackup.yaml
Thêm người dùng mới vào tệp kubeconfig.yaml:
apiVersion: v1
clusters:cluster:
certificate-authority-data: oaiedjaoiu9833ed98whfc9h
server: https://def4624b-5fbb-4ac6-ae70-77f28eb131fe.us-east-1.linodelke.net:443
name: lke1111
contexts:context:
cluster: lke1111
namespace: default
user: lke1111-admin
name: lke1111-ctx
current-context: lke1111-ctx
kind: Config
preferences: {}
users:name: exampleuser
user:
client-certificate: exampleuser.crt
client-key: exampleuser.keyname: lke1111-admin
user:
token: OIAWHF09W08R08w4f0hs0efch8q088080HEHSC
Để đảm bảo rằng chỉ người dùng bị giới hạn thứ hai mới có thể truy cập vào cụm với các quyền hạn chế, phải tạo một tệp kubeconfig bổ sung mà không cần kiểm soát quản trị:
cp kubeconfig.yaml exampleuser_kubeconfig.yaml
- Tệp kubeconfig mới chỉ nên bao gồm các tùy chọn cấu hình cho người dùng bị giới hạn. Xóa tất cả các dòng người dùng quản trị của tệp kubeconfig mới, cho đến khi tệp exampleuser_kubeconfig.yaml phản ánh những điều sau:
apiVersion: v1
clusters:cluster:
certificate-authority-data: iuawhefIDWIDHI23EW98HICUH
server: https://def4624b-5fbb-4ac6-ae70-77f28eb131fe.us-east-1.linodelke.net:443
name: lke1111
contexts:context:
cluster: lke1111
user: exampleuser
name: lke1111-ctx
current-context: lke1111-ctx
kind: Config
preferences: {}
users:name: exampleuser
user:
client-certificate: /home/user/auth/exampleuser.crt
client-key: /home/user/auth/exampleuser.key
Để kiểm tra, hãy chuyển ngữ cảnh hiện tại sang tệp kubeconfig mới:
export KUBECONFIG=exampleuser_kubeconfig.yaml
Sau khi xuất, hãy thử liệt kê tất cả các nút trong cụm:
kubectl get nodes
Nếu cấu hình hoạt động, kubeconfig của người dùng mới sẽ khiến yêu cầu không thành công với lỗi sau:
Error from server (Forbidden): nodes is forbidden: User "exampleuser" cannot list resource "nodes" in API group "" at the cluster scope
Dự kiến sẽ xảy ra lỗi vì người dùng hiện không có bất kỳ vai trò hoặc quyền nào được xác định. Theo mặc định, người dùng Kubernetes mới sẽ không thể truy cập bất kỳ tài nguyên nào.
Đặt quyền với RBAC
Quyền có thể được áp dụng cho người dùng mới bằng cách tạo tệp role.yaml và rolebind.yaml. Trong Kubernetes, Vai trò xác định các quyền được cấp cho một nhóm người dùng cụ thể và Vai trò liên kết áp dụng các vai trò cho người dùng cụ thể. , nếu bạn muốn cung cấp cho người dùng exampleuser đã tạo trước đó khả năng tương tác với các nhóm trong không gian tên examplenamespace, thì một cấu hình tốt sẽ như sau:
- Tạo một tệp role.yaml với nội dung sau:
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: example-role
namespace: examplenamespace
rules:
apiGroups: [""]
resources: ["pods"]
verbs: ["get", "watch", "list"]
Ví dụ trên sẽ cho phép bất kỳ người dùng nào có vai trò được chỉ định lấy, xem và liệt kê các tài nguyên trong không gian tên examplenamespace là một mã định danh duy nhất có thể được gọi khi áp dụng liên kết vai trò trong bước tiếp theo.
- Sau khi vai trò được tạo, hãy tạo tệp rolebind.yaml để liên kết vai trò với người dùng của bạn:
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: example-role-binding
namespace: default
subjects:
apiGroup: rbac.authorization.k8s.io
kind: User
name: exampleuser
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: example-role
Áp dụng cả role.yaml và rolebind.yaml để cấp quyền cho người dùng mới:
kubectl apply -f role.yaml
kubectl apply -f rolebinding.yaml
- Để kiểm tra, hãy chuyển kubeconfig và không gian tên đang hoạt động sang không gian tên được tạo cho người dùng mẫu giới hạn:
export KUBECONFIG=exampleuser_kubeconfig.yaml
kubectl config set-context --current --namespace=examplenamespace
Nếu cấu hình hoạt động, bạn sẽ không thấy bất kỳ lỗi nào khi yêu cầu thông tin về các nhóm hoạt động trong không gian tên:
kubectl get pods
Tuy nhiên, nếu người dùng cố gắng lấy thông tin về các nút hoặc bất kỳ yêu cầu nào khác chưa được định cấu hình rõ ràng thì yêu cầu đó sẽ không thành công với lỗi tương tự như sau:
Error from server (Forbidden): nodes is forbidden: User "exampleuser" cannot list resource "nodes" in API group "" at the cluster scope
Nguồn: https://techdocs.akamai.com/cloud-computing/docs/secure-a-cluster-with-user-permissions-and-rbac