[UseCase - 002] AWS EKS Security (Kubernetes on AWS)
Bài đăng này đã không được cập nhật trong 3 năm
Hôm nay chúng ta tiếp tục series AWS Use Case với một chủ đề cũng khá hay liên quan đến Kubernetes AWS mà người ta biết đến nó với cái tên AWS Elastic Kubernetes Service (AWS EKS).
Kubernetes chắc cũng không còn xa lạ với chức năng Container Orchestration - một nền tảng cho phép quản lý, triển khai các ứng dụng dưới dạng container một cách linh hoạt, đảm bảo tính sẵn sàng của dịch vụ.
Với nền tảng K8S tự triển khai, chúng ta có toàn quyền quản trị từ hạ tầng vật lý đến hạ tầng ảo hóa; việc tích hợp với các hệ thống bên ngoài sẽ hoàn toàn phụ thuộc vào các plugin sẵn có hỗ trợ cho nền tảng này.
Tuy nhiên, đối với AWS EKS khách hàng và AWS sẽ chia sẻ trách nhiệm theo Shared Responsibility Model (theo ảnh dưới) và việc tích hợp với các services khác trong hệ sinh thái AWS Cloud là hoàn toàn tự động (CloudWatch, IAM, AutoScaling, SQS, Kinesis...).

Theo đó, AWS EKS sẽ đem lại cho người dùng sự tiện lợi và triển khai nhanh chóng. Khách hàng cũng sẽ phải chịu trách nhiệm bảo mật cho các cụm EKS mà ở đó ứng dụng của khách hàng được triển khai.
Bài viết sẽ gồm 2 phần:
- Tím hiểu tổng quan về Kubernetes (K8S) - nhằm mục đích gợi nhớ.
- Security Best Practice đối với
AWS EKS.
Tìm hiểu tổng quan về Kubernetes
Kiến trúc cơ bản K8S Cluster

Kiến trúc của K8S tương tự như kiến trúc Cloud Platform, thông thường sẽ bao gồm 3 Node Types chính:
- Master Node (Mandatory): Control Plane
- Worker Node (Mandatory): Workload
- Infrastructure Node (Optional): Đây là một dạng node đặc biệt thường có trong nền tảng
OpenShiftphục vụ tách biệt các workload phục vụ infrastructure: Router, Container Registry... Thông thường các workload này sẽ nằm trên Master Node luôn, tuy nhiên với các Cluster siêu to khổng lồ thì chúng sẽ được quy hoạch ra node riêng để dễ dàngmaintain,operation.
Bản thân K8S cũng đã có nền tảng SDN của riêng nó, do đó Networking trong K8S cũng hoàn toàn tự động và tính Availability rất cao.
Kiến trúc AWS EKS
Cách thức triển khai trên AWS có khá nhiều và AWS cũng có những Services hỗ trợ triển khai K8S nhanh nhất có thể. Khách hàng có thể linh hoạt lựa chọn cách triển khai để đảm bảo những yêu cầu về Security, Compliance, Business. Chúng ta sẽ có một số lựa chọn như sau:
- Khách hàng tự cài cắm từ A-->Z trên cụm EC2.
- Sử dụng EKS với lựa chọn AWS quản lý cả
Master NodesvàWorker Nodes - Sử dụng EKS với lựa chọn AWS chỉ quản lý
Master Nodes(còn biết đến với tên gọiSelf-managed Nodes)

AWS Security Best Practices
Gọi là Best Practices cho sang thế thôi, tuy nhiên mỗi tổ chức tùy theo nhu cầu cũng như hoàn cảnh thì việc cân bằng giữa Security, Operation, Business Requirement là thực sự cần thiết. Khi đó, tự mỗi tổ chức sẽ có Best Practice của riêng mình.
Việc chuyển dịch lên Cloud sẽ hướng đến 2 mục tiêu:
- Cắt giảm độ phức tạp của công tác vận hành.
- Cắt giảm chi phí Capex/Opex
Khi mà Security ảnh hưởng đến 2 vấn đề này thì Security chưa chắc đã tồn tại được =)).
Phân chia trách nhiệm security giữa AWS và Customer
-
Trách nhiệm AWS:
- Chịu trách nhiệm bảo mật cho
Control Plane:Master Nodesvàetcddatabase (etcdlà nơi lưu trữ toàn bộSecretphục vụ cho container).
- Chịu trách nhiệm bảo mật cho
-
Trách nhiệm của Customer:
- Worker Nodes Security:
- Node's OS (Patching, Update)
- Hardening Configuration OS
- Network Security: IN/OUT Worker Nodes (NACL, SecurityGroup)
- Container Security (Pod Security - đơn vị nhỏ nhất trong K8S là Pod nên tôi gọi là Pod thực chất nó cũng là Container thôi): Phần này tôi chỉ đưa ra ở đây thôi, còn phần này là một bầu trời rộng lớn trình bày thêm vào bài này miên man lắm =))
- Data Security.
- Access Control
- Monitoring and Analysis
- Worker Nodes Security:
Giờ chúng ta sẽ đi từng phần để xem có thể làm được gì để bảo mật cho EKS Cluster. Thực ra, nếu viết dưới dạng Checklist thì sẽ dễ mường tượng hơn nhưng viết bài mà phệt mỗi cái Checklist vào đây thấy cũng kỳ.
Ngoài ra, tôi cũng sẽ bỏ qua phần Container Security nhé! Lý do thì tôi đã nói ở trên rồi =))
Access Control - IAM (Identity and Access Management)
Đối với các tổ chức sử dụng AWS thì IAM không xa lạ, việc phân quyền truy cập AWS Services cũng hoàn toàn dựa vào IAM.
- IAM có thể
federatedvới 3rd IdP (Identity Provider) như Azure AD, AD... cung cấp nền tảng IAM liền mạch vớiSource of Trustduy nhất. - IAM có nhiều dạng Policy cho phép quản lý linh hoạt truy cập vào service/data.
EKS cung sẽ tận dụng IAM để thực hiện phân quyền Role-based Access Control dựa vào IAM Role. Chúng ta sẽ có một số ý ở phần này như sau:
- Nếu cần cấp quyền cho User riêng lẻ, hãy sử dụng
aws-auth ConfigMapđể map User vớiK8S RBAC Rolecụ thể. - Nếu số lượng User cần cấp quyền lớn, hãy sử dụng
aws-auth ConfigMapđể map IAM Role vớiK8S RBAC Rolecụ thể. IAM Role sẽ liên kết trực tiếp vớiUser Group. - Định nghĩa rõ
User GroupvàIAM Roleduy nhất trước khi tạoEKS Clusterphục vụAudit. - Sử dụng
IAM RoleschoService Accounts-Service Accountsphục vụ truy cập vào cácAWS Services(S3, SQS, DynamoDB....)
--> Tất cả các task này nên được định nghĩa rõ thành baseline và chuyển hóa thành AWS Cloudformation Template.
Access Control - EKS API (EKS Cluster Endpoint)
Khi EKS Cluster được provision thì mặc định EKS API là Public. Theo đó, bản ghi DNS sẽ được khai báo tự động trên public hosted zone ở AWS Route 53.
Chúng ta sẽ phải làm những việc sau:
- Cấu hình
EKS APIsangprivate modesử dụngVPC Endpoint. Lúc này bản ghi DNS public sẽ bị xóa và khai báo bản ghi DNS mới trênprivate hosted zonetạiAWS Route 53. Theo đó,EKS APIcó thể được truy cập từ:- Connected Network
- Bastion Host
- Cloud9 IDE (phục vụ debug)
- Chỉ cho phép truy cập
EKS APItừBastion host(là một EC2 nằm trong VPC) và việc kiểm soát truy cập vàoBastion hostsẽ sử dụngAWS System Manager Session Manager. Về lý tưởng, việc truy cậpEKS APIchỉ cho phép CI/CD Tools truy cập do đó việc truy cập thủ công là không cần thiết và ít khi sử dụng --> việc chặn truy cập từ Workstation/Device của người dùng là cần thiết. - Disable toàn bộ
Anonymous User, theo đó sẽ có User/Group dạng Anonymous được tạo ra khiEKS Clusterđượcprovisioning:- system:anonymous (User)
- system:unauthenticated (Group)
NOTES: Với trường hợp cần thiết phải public
EKS APIthì hãy giới hạn IP Public có thể truy cập. Có thể kết hợp cảprivate modevàpublic modevà giới hạn IP Public có thể truy cập.
Network Security
Đối với lớp Network chúng ta nên kiểm soát những phần sau:
- Sử dụng ALB cho
Pod Servicesvà thiết lậpSecurity Groupcho ALB. - Sử dụng
Security Groupđể kiểm soát:- Lưu lượng giữa
Control PlanevàData Plane(Worker Nodes). - Lưu lượng giữa
Worker NodesvàVPC Resourceskhác vàExternal IP.
- Lưu lượng giữa
- Kiểm soát lưu lượng nội tại
EKS Cluster. Theo đó, nếuEKS Clusterđược sử dụng cho nhiềuProjectchúng ta cần:- Giới hạn truy cập giữa các Project bằng cách sử dụng
NetworkPoliciesEKS Native. - Thiết lập
EgressIPcho từngProjectphục vụ kiểm soát một cách chính xácOutbound Connectioncủa từngProject(mặc định tất cả Project sẽ sử dụng chungEgressIP). - (Nếu có thể) Giới hạn truy cập giữa các Pod trong một Project bằng cách sử dụng
NetworkPoliciesEKS Native. (lựa chọn này sẽ tăng tải cho vận hành nên thường sẽ không sử dụng)
- Giới hạn truy cập giữa các Project bằng cách sử dụng
Worker Nodes Security (Data Plane Security)
Đối với Worker Nodes chúng ta sẽ có một số điểm chú ý sau:
- AMI Hardening/Update tùy thuộc vào OS Distro sử dụng.
- Enable
node restriction admission controllercho phép thiết lậpbaselinechoclustervà ngăn chặn việc chỉnh sửa các thông số này. - Kiểm soát truy cập SSH bằng
AWS System Manager Session Manager, khuyến nghị nên sử dụngBastion Hostcho các kết nối quản trị. - Liên tục
scan vulnerabilitiesphục vụ vá lỗi bảo mật, có thể sử dụngAWS native ServicenhưAmazon Inspector.
Data Security
Đối với bảo mật dữ liệu, chúng ta sẽ có 2 phần:
- Data at rest: mã hóa toàn bộ dữ liệu được lưu trữ trong EBS, EFS, S3, SQS... bằng cách sử dụng
AWS KMS. - Secret Management:
etcd databaselưu trữ toàn bộsecretmàpodsử dụng, điểm yếu làetcdlưu trữ secret dưới dạng base64 và có thể dễ dàng truy cập.- Sử dụng
AWS Secret Managerhoặc3rd Vaultđể lưu trữSecret. - Mount secret vào
EKS Podsdưới dạng file hoặcenvironment variable(ENV). - Định kỳ
rotate secretnếu có thể.
- Sử dụng
Security Monitoring and Analysis
Chúng ta có một số AWS Native Services phục vụ logging, monitoring sau:
- Enable
GuardDutyphục vụ monitorKubernetes audit logs, cho phép phát hiện hành vi bất thường của user và application. - Ngoài lựa chọn
GuardDuty, chúng ta còn có thể sử dụngEKS Audit Policyđể đẩyAudit logsđếnCloudwatchcho phép tích hợp với cácAWS Servicekhác phục vụautomation,alerting,backup logs,internal audit...
Pod Security
Như đã nói ở trên, phần này là một khía cạnh khá rộng nhưng cũng sẽ ảnh hưởng rất lớn đến EKS Security. Nó sẽ bao gồm những phần sau (người đọc có thể tự tìm hiểu thêm):
- Sử dụng
Security Groupphục vụ giới hạn truy cập IN/OUT (như đã nói ở mụcNetwork Security). - Sử dụng
PodSecurityPolicyđể xây dựngsecurity baselinecho Pods, theo đó phải đảm bảo đủ cácsecurity baselineđã định nghĩa thì Pods mới được khởi tạo. Tuy nhiên,PodSecurityPolicy(PSPs) không còn được sủ dụng từ phiên bản Kubernetes version 1.21. Chúng ta có thể thay thế bằng các phương án sau:- Policy-as-code (PAC) và
admission controllersvới các giải pháp 3rd: Open Policy Agent (OPA), Kyverno... - Pod Security Standards (PSS) - Pod Security Admission (PSA): tính năng
built-incủa Kubernetes.
- Policy-as-code (PAC) và
Container Security: Phần này khá rộng nên tôi sẽ không đi chi tiết mà chỉ đưa ra các hạng mục cần thực hiện- Secure Supply Chain (CI/CD Pipeline & DevSecOps)
- Secure Container Registry
- Secure Container Runtime
- Secure Infrastructure (Host Security)
- Secure Data
- Secure Workload (Running Containers)
Apendix: Deployment Method & Tools
Hiện tại có khá nhiều giải pháp thương mại với rất nhiều tính năng cho phép bảo mật Container Platform nói chung và Kubernetes nói riêng.
Với các nền tảng Security truyền thống cho Server/VM, thường có 2 dạng triển khai:
- Agentless
- Agent-based
Với Container Platform chúng ta cũng có thể triển khai theo 2 dạng trên. Tuy nhiên, agent-based sẽ không được ưu tiên vì một số lý do:
- Tăng dung lượng
Container Imageskéo theo đó tăng thêmcontainer overheadvà có thể sẽ làm giảm hiệu năngcontainer, qua đó phá vỡ quan điểm thiết kế và mục tiêu củacontainer. - Tăng độ phức tạp cho
CI/CD Pipeline, đặc biệt là với các ứng dụng release hàng trăm lần mỗi ngày. Agent-basedthường dựa vàoAssetIDđể giám sát và thực hiện các tác vụ liên quan, tuy nhiêncontainerliên tục thay đổi, liên tục triển khai dẫn đếnAssetIDthay đổi liên tục làm choagent-basedkhông còn phù hợp nữa.
Với agentless, chúng ta có thể triển khai bằng cách cài đặt agent trực tiếp lên Worker Nodes (Host) và tương tác trực tiếp với Container Runtime (containerd, dockerd, CRI-O, Mirantis...). Theo đó, agent ở mức Host có thể:
- Hoạt động như IDS/IPS giám sát lưu lượng IN/OUT Container.
Container Inventory Management
Một số giải pháp khá hiệu quả cho phần này bao gồm:
Bạn đọc có thể tự tìm hiểu thêm nhé!
Phần này kết thúc ở đây! Rất hi vọng có thể nhận được các comment đóng góp để bài viết được hoàn thiện hơn. Xin chân thành cảm ơn!
All rights reserved