kubernets安全加固

Erda 底层基于Kubernetes,Kubernetes提供了许多可以极大地提高应用程序安全性的选项,配置它们要求您熟悉Kubernetes以及其部署的安全要求。本文具体介绍了Kubernetes服务的安全加固方案,帮助您部署安全的Kubernetes应用。

限制对Kubernetes节点的直接访问

应该限制SSH登录或SSH Key免登录Kubernetes节点,减少对主机资源未授权的访问。应该要求用户使用kubectl exec命令,此命令能够在不访问主机的情况下直接访问容器环境。Erda 提供了节点控制台功能可以实现白屏化对节点的操作。

关闭非安全端口

Erda 内部对Kubernetes的访问均使用安全端口以及Service Account,同时做了如下的加固措施:

  • 默认端口6443,修改标识—secure-port
  • 默认IP是首个非本地主机的网络接口,修改标识—bind-address HTTPS服务
  • 置证书和密钥的标识,–tls-cert-file,–tls-private-key-file
  • 基于安全考虑,会移除只读端口,使用Service Account代替

将安全环境应用到您的Pods和容器中

当设计您的容器和pods时,确保为您的pods、容器和存储卷配置安全环境。安全环境是定义在yaml文件中的一项属性。它控制分配给pod/容器/存储卷的安全参数。一些重要的参数有:

安全环境设置项描述
SecurityContext > runAsNonRoot容器应该以非root用户运行
SecurityContext > Capabilities控制分配给容器的Linux能力
SecurityContext > readOnlyRootFilesystem控制容器对root文件系统是否只读
PodSecurityContext > runAsNonRoot防止root用户作为pod的一部分运行容器

以下是一个具有安全环境参数的pod定义示例:

  1. apiVersion: v1
  2. kind: Pod
  3. metadata:
  4. name: hello-world
  5. spec:
  6. containers:
  7. # specification of the pod’s containers
  8. # ...
  9. securityContext:
  10. readOnlyRootFilesystem: true
  11. runAsNonRoot: true

确保镜像没有安全漏洞

在运维过程中,要不断执行持续安全漏洞扫描(Continuous Security Vulnerability Scanning),因为容器中可能存在包含已知漏洞(CVE)的过时包。新的漏洞每天都会出现,所以这不是一个一次性的工作,对镜像进行持续的安全评估是至关重要的。

定期对环境进行安全更新,一旦发现运行中容器的漏洞,您应该及时更新镜像并重新部署容器。尽量避免直接更新(例如,apt-update)到正在运行的容器,因为这样打破了镜像与容器的对应关系。

使用Kubernetes滚动升级功能可以方便地升级容器( Erda 支持应用的蓝绿升级),该功能允许将镜像升级到最新版本来逐步更新正在运行的容器。

日志记录

Kubernetes 提供基于集群的日志,允许将容器活动日志记录到一个日志中心。当集群被创建时,每个容器的标准输出和标准错误都可以通过运行在每个节点上的 filebeat 组件记录到 Cassandra 或 Elasticsearch 中,然后可以在 Erda 界面上进行白屏化查看。