freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

K8S安全建设经验试分享
2021-08-19 11:29:27

介绍

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

agent

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

安装过程如图:

agent

agent

然后,我们把images 推到上面去:

agent

agent

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"

结果如下图:

agent

当我们发现了大量的安全漏洞怎么办? 我们尝试最小化容器镜像,将不必要的组件从镜像中移除可以减少攻击面、降低安全风险,修正项目的自身的依赖问题。从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

agent

agent

kube-hunter是也aquasec的开源工具,它们可以在Kubernetes集群中寻找安全问题。kube-bench主要用于让你的实践符合CIS的标准,而kube-hunter则关注你要暴露的漏洞。它们两个结合使用,可以为我们提供一个很好的发现安全问题的视角。kube-hunter 可以你的环境内部或外部运行扫描,

pip3 install kube-hunter    //py3 环境

agent

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

agent

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" 

agent

# 渗透测试 # 黑客 # web安全 # 系统安全 # 网络安全技术
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者