介紹
k8s全稱kubernetes,這個名字大家應該都不陌生,k8s是為容器服務而生的一個可移植容器的編排管理工具,越來越多的公司正在擁抱k8s,并且目前k8s已經主導了雲業務流程,推動了微服務架構等熱門技術的普及和落地,正在如火如荼的發展。伴随着k8s的發展,k8s的安全問題也顯現出來。
k8s環境的安全主要來自3個方向:
1, images 鏡像的安全問題
容器是基于鏡像建構的,如果鏡像本身就是一個惡意鏡像或是一個存在漏洞的鏡像,那麼基于它搭建的容器自然就是不安全的了,故鏡像安全直接決定了容器安全。
2, k8s 的配置和使用問題
Kubernetes 的服務在正常啟動後會開啟兩個端口:8080,6443。兩個端口都是提供 Api Server 服務的,一個可以直接通過 Web 通路,另一個可以通過 kubectl 用戶端進行調用。如果沒有合理的配置驗證和權限,那麼攻擊者就可以通過這兩個接口去擷取容器的權限,甚至通過建立自定義的容器去擷取主控端的權限。etcd是一個高可用的key-value資料庫,它為k8s叢集提供底層資料存儲。一旦etcd被黑客拿下,就意味着整個k8s叢集失陷。etcd最大的安全風險是未授權通路。
3, k8s 自身元件和作業系統及其依賴元件的安全問題
比如, docker-runc CVE-2019-5736 和 containerd-shim CVE-2020-15257容器逃逸
Vmware Harbor是一個用于存儲和分發Docker鏡像的企業級Registry伺服器,通過添加一些企業必需的功能特性,例如安全、辨別和管理等,擴充了開源Docker Distribution。作為一個企業級私有Registry伺服器,Harbor提供了更好的性能和安全。提升使用者使用Registry建構和運作環境傳輸鏡像的效率。Harbor支援安裝在多個Registry節點的鏡像資源複制,鏡像全部儲存在私有Registry中, 確定資料和知識産權在公司内部網絡中管控。另外,Harbor也提供了進階的安全特性,諸如使用者管理,通路控制和活動審計等。
在 Harbor 中,內建了開源項目 Trivy(老版本是Clair)的掃描功能,可從公開的 CVE 字典庫下載下傳漏洞資料。CVE 是 Common Vulnerabilities and Exposures 的縮寫,由一些機構自願參與維護的軟體安全漏洞辨別,記錄已知的漏洞标準描述及相關資訊,公衆可以免費擷取和使用這些資訊。全球共有77個機構參與維護不同軟體的 CVE 庫,例如:VMware 維護着 VMware 産品的 CVE 庫,紅帽維護着Linux 上的 CVE 等等。
下面示範一下 Vmware Harbo + trivy 的安裝:
# cd /etc/yum.repos.d/
# wget http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# yum makecache
# yum install docker-ce -y && systemctl start docker && systemctl enable docker
# vim /etc/docker/daemon.json
{
"exec-opts": ["native.cgroupdriver=systemd"],
"registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"]
}
# systemctl restart docker
# curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
# wget https://github.com/goharbor/harbor/releases/download/v2.2.3/harbor-offline-installer-v2.2.3.tgz
修改 harbor.yml配置檔案,生存環境請用https,這裡僅用于測試
# tar xf harbor-offline-installer-v2.2.3.tgz
# cp harbor.yml.tmpl harbor.yml
# ./prepare
# ./install.sh --with-trivy --with-chartmuseum
安裝過程如圖:
然後,我們把images 推到上面去:
Vmware Harbor 提供了一個API 接口,這樣我們就可以與SOC 內建,檢視images 的安全情況。
/projects/{project_name}/repositories/{repository_name}/artifacts/{reference}/additions/vulnerabilities
curl -X GET "http://172.16.116.5/api/v2.0/projects/library/repositories/fastjson/artifacts/1.2.24/additions/vulnerabilities" -H "accept: application/json" -H "X-Request-Id: 111"
結果如下圖:
當我們發現了大量的安全漏洞怎麼辦? 我們嘗試最小化容器鏡像,将不必要的元件從鏡像中移除可以減少攻擊面、降低安全風險,修正項目的自身的依賴問題。從docker -17.05 開始,docker 引入了多階段建構的概念,它允許使用者在一個 dockerfile 中使用多個 From 語句。每個 From 語句可以指定不同的基礎鏡像并将開啟一個全新的建構流程。您可以選擇性地将前一階段的建構産物複制到另一個階段,進而隻将必要的内容保留在最終的鏡像裡。同時我們選用 alpine 的基礎鏡像,就可以大大減少不必要的依賴。
優化後的 dockerfile 如下:
FROM maven:3.5-jdk-8 AS build
COPY src /usr/src/app/src
COPY pom.xml /usr/src/app
RUN mvn -f /usr/src/app/pom.xml clean package
FROM openjdk:8-jre-alpine
ARG DEPENDENCY=/usr/src/app/target/dependency
COPY --from=build ${DEPENDENCY}/BOOT-INF/lib /app/lib
COPY --from=build ${DEPENDENCY}/META-INF /app/META-INF
COPY --from=build ${DEPENDENCY}/BOOT-INF/classes /app
ENTRYPOINT ["java","-cp","app:app/lib/*","hello_world.Application"]
k8s 基線
網際網路安全中心(CIS)是一個非營利性組織,其制定自己的配置政策基準(即CIS基準),使組織可以改善其安全性和合規性計劃及态勢。 除了針對作業系統、資料庫等,該組織也推出了适用Kubernetes、dockers的Benchmark基準。 kubernetes CIS基準下載下傳位址,如下
https://www.cisecurity.org/benchmark/kubernetes/
檔案内容一共幾大塊
master節點的服務: apiserver,controller manager,scheduler,etcd
node節點的服務: kubelet, proxy
安全控制: rbac, pod policy, network policy
該工具是使用Go語言完成,而測試檔案則相容于YAML格式,其測試結果也能支援JSON格式,友善使用者整合其他的自動化工具。在執行完測試任務後,系統除了告訴開發者Kubernetes未通過哪些測試外,也會給予如何改善的建議,例如移除K8s上某個不安全的配置設定建議,或者限制配置檔案的權限等。下載下傳位址如下
https://github.com/aquasecurity/kube-bench
$ kubectl apply -f job.yaml
job.batch/kube-bench created
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kube-bench-j76s9 0/1 ContainerCreating 0 3s
# Wait for a few seconds for the job to complete
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
kube-bench-j76s9 0/1 Completed 0 11s
# The results are held in the pod's logs
kubectl logs kube-bench-j76s9
[INFO] 1 Master Node Security Configuration
[INFO] 1.1 API Server
kube-hunter是也aquasec的開源工具,它們可以在Kubernetes叢集中尋找安全問題。kube-bench主要用于讓你的實踐符合CIS的标準,而kube-hunter則關注你要暴露的漏洞。它們兩個結合使用,可以為我們提供一個很好的發現安全問題的視角。kube-hunter 可以你的環境内部或外部運作掃描,
pip3 install kube-hunter //py3 環境
k8s runtime 的監控
Falco 由 Sysdig 于 2016 年建立,是第一個作為孵化級項目加入 CNCF 的運作時安全項目。Falco可以對Linux系統調用行為進行監控,提供了lkm 核心子產品驅動和eBPF 驅動。Falco的主要功能如下: 從核心運作時采集Linux系統調用。 提供了一套強大的規則引擎,用于對Linux系統調用行為進行監控。 當系統調用違反規則時,會觸發相應的告警。
安裝文檔位址如下:
https://falco.org/docs/getting-started/installation/
curl -s https://falco.org/repo/falcosecurity-3672BA8F.asc | apt-key add -
echo "deb https://download.falco.org/packages/deb stable main" | tee -a /etc/apt/sources.list.d/falcosecurity.list
apt-get update -y
apt-get -y install linux-headers-$(uname -r)
apt-get install -y falco
rpm --import https://falco.org/repo/falcosecurity-3672BA8F.asc
curl -s -o /etc/yum.repos.d/falcosecurity.repo https://falco.org/repo/falcosecurity-rpm.repo
yum -y install kernel-devel-$(uname -r)
yum -y install falco
Falco規則檔案是包含三種類型元素的YAML檔案:
Rules 、Macros、Lists
Rules就是生成告警的條件以及一下描述性輸出字元串。Macros 是可以在規則或者其他宏中重複使用的規則條件片段。Lists 類似Python 清單,定義了一個變量集合。
Falco 使用了Sysdig, 在rule的 condition裡面,任何 Sysdig 過濾器都可以在 Falco 中使用。
參考如下:
https://github.com/draios/sysdig/wiki/sysdig-user-guide#filtering
這是一個rule的 condition條件示例,在容器内運作 bash shell 時發出警報:
container.id != host and proc.name = bash
第一個子句檢查事件是否發生在容器中(Sysdig 事件有一個container字段,該字段等于"host"事件是否發生在host主機上)。第二個子句檢查程序名稱是否為bash。
舉個完整的列子
- list: my_programs
items: [ls, cat, bash]
- macro: access_file
condition: evt.type=open
- rule: program_accesses_file
desc: track whenever a set of programs opens a file
condition: proc.name in (my_programs) and (access_file)
output: a tracked program opened a file (user=%user.name command=%proc.cmdline file=%fd.name)
priority: INFO
下面,我們修改falco 的配置,/etc/falco/falco.yaml
json_output: true
json_include_output_property: true
http_output:
enabled: true
url: "http://localhost:2801"
啟動falco
systemctl enable falco && systemctl start falco
https://github.com/falcosecurity/falcosidekick.git
falcosidekick 是一個管道工具,接受 Falco的事件并将它們發送到不同的持久化工具中。我們使用falcosidekick把falco post 過來的資料寫入es ,也可以寫入kafka。我們也讀取kafka裡面的東西完成告警, 也可以用 Prometheus 和falco-exporter 完成告警。如下圖。
elasticsearch:
hostport: "http://10.10.116.177:9200"
index: "falco"
type: "event"
minimumpriority: ""
suffix: "daily"
mutualtls: false
checkcert: true
username: ""
password: ""
kafka:
hostport: ""
topic: ""
# minimumpriority: "debug"