Cài đặt và Test Falco cho Phát hiện Mối đe dọa Runtime
Chúng ta sẽ tập trung trước tiên vào phần bảo mật runtime. Nhiệm vụ của chúng ta là phát hiện và cảnh báo về hoạt động đáng ngờ trong các container đang chạy theo thời gian thực.
Công cụ của chúng ta cho việc này là Falco, tiêu chuẩn open-source CNCF cho phát hiện mối đe dọa runtime cloud-native. Nó hoạt động như một camera bảo mật theo dõi system call và cảnh báo bạn khi container làm điều gì đó không nên làm.
Cài đặt Falco sử dụng Helm
Giống như với Kyverno, Helm là cách đơn giản nhất để deploy Falco và các thành phần của nó.
Mở terminal và đảm bảo bạn đã kết nối với EKS cluster.
Thêm Falco Security Helm repository:
helm repo add falcosecurity https://falcosecurity.github.io/chartsCập nhật Helm repository:
helm repo updateCài đặt Falco vào namespace
falcoriêng. Falco hoạt động bằng cách deploy DaemonSet, có nghĩa là nó sẽ chạy một Falco pod trên mỗi worker node để giám sát tất cả hoạt động trên node đó.helm install --replace falco --namespace falco --create-namespace --set tty=true falcosecurity/falcoXác minh cài đặt. Có thể mất một hoặc hai phút để pod khởi động.
kubectl get pods -n falco
Quan sát Log của Falco
Hành vi mặc định của Falco là xuất cảnh báo vào log. Hãy xem chúng để thấy hoạt động bình thường trông như thế nào và chuẩn bị để xem cảnh báo.
- Tail log từ tất cả Falco pod. Flag
-fsẽ “follow” log, streaming chúng đến terminal theo thời gian thực.
kubectl logs -n falco -l app.kubernetes.io/name=falco -fKích hoạt Cảnh báo Bảo mật
Bây giờ chúng ta sẽ mô phỏng pattern tấn công phổ biến: kẻ tấn công có quyền truy cập vào container đang chạy và cố gắng leo thang đặc quyền hoặc cài đặt công cụ độc hại bằng cách spawn shell.
Mở cửa sổ terminal hoặc tab MỚI. Đừng đóng cái đang tail Falco log.
Tìm một trong những application pod đang chạy:
kubectl get pods -l app=workshop-appCopy tên đầy đủ của một pod (ví dụ:
workshop-app-5f4b6c8b9d-abcde).“Shell” vào container đang chạy. Lệnh exec này cung cấp cho bạn interactive shell bên trong container.
kubectl exec -it <your-app-pod-name> -- /bin/shTerminal prompt sẽ thay đổi, chỉ ra rằng bạn hiện đang ở bên trong container (ví dụ:
$hoặc#).
Chứng kiến Phát hiện Thời gian Thực
Ngay lập tức chuyển lại cửa sổ terminal đầu tiên (cái có Falco log).
Trong vài giây sau khi thực thi lệnh exec, bạn sẽ thấy log entry mới định dạng JSON từ Falco. Nó sẽ trông tương tự như thế này:
08:29:42.827362021: Notice A shell was spawned in a container with an attached terminal | evt_type=execve user=appuser user_uid=1001 user_loginuid=-1 process=sh proc_exepath=/usr/bin/dash parent=containerd-shim command=sh terminal=34816 exe_flags=EXE_LOWER_LAYER container_id=c2d197da82de container_name=workshop-app container_image_repository=593793056386.dkr.ecr.us-east-2.amazonaws.com/workshop-app container_image_tag=9fb43f1fb58cae94f85f5a8ba31c105b43b26068 k8s_pod_name=workshop-app-77d986f5b6-76tvd k8s_ns_name=defaultThông tin
“Notice”: Đây là mức độ nghiêm trọng mặc định cho rule này.
Bây giờ, hãy kích hoạt cảnh báo nghiêm trọng hơn.
Quay lại terminal nơi bạn đang ở bên trong container.
Thoát container.
exitTạm thời xóa Kyverno
require-non-root-userpolicy.kubectl delete clusterpolicy require-non-root-userHãy tạo
nginxdeployment:kubectl create deployment nginx --image=nginxThực thi lệnh sẽ kích hoạt rule:
kubectl exec -it $(kubectl get pods --selector=app=nginx -o name) -- cat /etc/shadowChuyển lại Falco log. Bạn sẽ thấy cảnh báo khác, nghiêm trọng hơn:
Bạn sẽ thấy log cho tất cả Falco pod được deploy trên hệ thống. Falco pod tương ứng với node mà
nginxdeployment đang chạy đã phát hiện sự kiện, và bạn sẽ có thể đọc dòng như:08:58:14.478370676: Warning Sensitive file opened for reading by non-trusted program | file=/etc/shadow gparent=systemd ggparent=<NA> gggparent=<NA> evt_type=openat user=root user_uid=0 user_loginuid=-1 process=cat proc_exepath=/usr/bin/cat parent=containerd-shim command=cat /etc/shadow terminal=34816 container_id=4c908449279e container_name=nginx container_image_repository=docker.io/library/nginx container_image_tag=latest k8s_pod_name=nginx-5869d7778c-kfdjf k8s_ns_name=defaultDọn dẹp và roll back: Bạn có thể dừng tail Falco log bằng cách nhấn
Ctrl+Ctrong cửa sổ đó. Bạn cũng nên re-apply Kyvernorequire-non-root-userpolicy.kubectl delete deployment nginx kubectl apply -f k8s/policy-require-non-root.yaml