天天看點

K8S安全建設經驗試分享

作者:散文随風想

介紹

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           
K8S安全建設經驗試分享

修改 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 
           

安裝過程如圖:

K8S安全建設經驗試分享
K8S安全建設經驗試分享

然後,我們把images 推到上面去:

K8S安全建設經驗試分享
K8S安全建設經驗試分享

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"           

結果如下圖:

K8S安全建設經驗試分享

當我們發現了大量的安全漏洞怎麼辦? 我們嘗試最小化容器鏡像,将不必要的元件從鏡像中移除可以減少攻擊面、降低安全風險,修正項目的自身的依賴問題。從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           
K8S安全建設經驗試分享
K8S安全建設經驗試分享

kube-hunter是也aquasec的開源工具,它們可以在Kubernetes叢集中尋找安全問題。kube-bench主要用于讓你的實踐符合CIS的标準,而kube-hunter則關注你要暴露的漏洞。它們兩個結合使用,可以為我們提供一個很好的發現安全問題的視角。kube-hunter 可以你的環境内部或外部運作掃描,

pip3 install kube-hunter    //py3 環境           
K8S安全建設經驗試分享

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           
K8S安全建設經驗試分享

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" 
           
K8S安全建設經驗試分享

繼續閱讀