什么是 kubeconfig 文件?
kubeconfig 文件是 Kubernetes 的配置文件,用于存储集群的访问凭证、API Server 的地址和认证信息,允许用户和 kubectl 等工具与 Kubernetes 集群进行交互。它通常包含多个集群的配置,支持通过上下文(context)切换不同的集群、用户和命名空间。kubeconfig 文件的典型路径是 ~/.kube/config,但也可以通过 KUBECONFIG 环境变量指定其他路径。
组成部分
- clusters: 存储 Kubernetes 集群的信息,包括集群的 API 服务器地址和 CA 证书。
- users: 存储与集群进行交互的用户信息,包括认证凭证(如用户名、密码、Bearer token 或证书)。
- contexts: 定义了一个上下文,关联了特定的集群、用户和命名空间,用户通过上下文来决定连接哪个集群。
- current-context: 指定当前使用的上下文。
泄露风险
如果 kubeconfig 文件被泄露,攻击者可以使用其中的信息访问 Kubernetes 集群。具体风险包括:
- 非法访问集群:攻击者可以用泄露的 kubeconfig 文件直接连接到集群,执行任意操作,甚至获取敏感数据。
- 数据泄露:集群中可能存储了大量敏感数据(如私密配置、数据库凭证等),攻击者一旦访问成功,可能会窃取数据。
- 权限滥用:如果文件中包含管理员权限,攻击者可以完全控制集群,修改配置,甚至删除资源。
常见的泄露途径
1. 版本控制系统(VCS)
- 错误提交:开发人员不小心将
kubeconfig
文件提交到 GitHub、GitLab 或其他公共代码库。 - 未配置
.gitignore
:如果没有正确设置.gitignore
文件,kubeconfig
文件可能会被误提交到版本控制系统,导致泄露。 - 历史记录泄露:即使文件已删除或更改,如果历史提交记录中包含了该文件,它仍然可以通过版本控制系统恢复。
2. 不当的文件权限
- 操作系统权限配置不当:如果
kubeconfig
文件的权限过于宽松(如 777),非授权用户或程序也可以访问该文件。 - 误共享文件:将
kubeconfig
文件存储在共享文件夹或公共目录中,导致文件被其他用户访问。
3. 开发环境泄露
- 不安全的开发机器:如果开发人员在未加密的本地计算机上存储
kubeconfig
文件且机器遭到入侵,攻击者可以获取该文件。 - 共享开发环境:如果开发环境被多个开发人员共享,并且没有进行严格的访问控制,
kubeconfig
文件也可能被其他人访问。
4. 云平台配置错误
- 不当的 IAM 配置:如果将 Kubernetes 集群的凭证(如 token 或证书)存储在云提供商的存储中(例如 AWS S3、Google Cloud Storage),并且存储桶或对象没有正确的访问控制策略,可能导致凭证被泄露。
- 错误配置的 API 访问:如果云平台上设置的 Kubernetes 访问控制策略不严格,恶意用户可能通过漏洞获得凭证。
5. 容器镜像
- 凭证硬编码在镜像中:某些开发人员可能会将凭证硬编码到应用程序中或将
kubeconfig
文件放入容器镜像中,从而使凭证在镜像被拉取时泄露。 - 容器共享:在多个容器之间不当共享 Kubernetes 凭证可能会导致泄露。
6. 日志文件泄露
- 错误的日志记录:应用程序或集群的日志文件中可能意外记录了
kubeconfig
文件的内容或认证信息(如 token、证书等)。 - 日志文件权限不足:如果日志文件的权限过于宽松,攻击者可能从日志文件中提取出凭证信息。
7. 社交工程与钓鱼攻击
- 钓鱼邮件:攻击者通过钓鱼邮件或社交工程手段,诱使用户将
kubeconfig
文件上传到不安全的地方或通过不安全的方式发送。 - 假冒网站:攻击者可能创建假冒的 Kubernetes 登录页面或API接口,诱使用户上传
kubeconfig
文件,进而窃取凭证。
8. 不当的文件备份和迁移
- 备份未加密:如果
kubeconfig
文件被备份但没有进行加密,备份文件可能成为泄露途径。 - 无安全传输:在迁移或传输
kubeconfig
文件时,使用不安全的方式(如 FTP 或未加密的 HTTP)可能导致文件在传输过程中被窃取。
9. 恶意软件与病毒
- 木马或恶意软件:攻击者可能通过恶意软件或病毒窃取本地文件,包括
kubeconfig
文件。这些恶意软件可能会扫描本地文件系统并自动上传敏感文件。 - 键盘记录器:如果计算机感染了键盘记录器,攻击者可以捕捉到用户输入的凭证。
10. 不当的第三方工具或插件
- 不信任的工具:一些第三方工具、插件或应用程序可能会不安全地处理或存储 Kubernetes 凭证。如果这些工具存在漏洞或不安全的设计,它们可能会导致
kubeconfig
文件的泄露。 - 公开共享的 API:通过某些 API 或工具访问 Kubernetes 集群时,如果没有加密传输或者 API 配置不当,可能导致凭证泄露。
11. 共享或过期的凭证
- 与他人共享凭证:如果管理员或开发人员将
kubeconfig
文件共享给他人,但没有撤销过期或不再使用的凭证,也可能导致凭证泄露。 - 公共访问控制:某些情况下,
kubeconfig
文件可能与其他用户共享或传递,而没有采取适当的访问控制。
利用方式
攻击者获取到config文件后,如何利用?
1. kubectl 官方客户端连接工具
安装工具 | Kubernetes
我这里使用scoop安装kubectl工具
#获取node信息
kubectl -s https://192.168.48.142:6443 --kubeconfig=config --insecure-skip-tls-verify get node#获取pod信息
kubectl -s https://192.168.48.142:6443 --kubeconfig=config --insecure-skip-tls-verify get pod#创建恶意pod
kubectl -s https://192.168.48.142:6443 --kubeconfig=config --insecure-skip-tls-verify create -f 1.yaml
2. dashboard 登录
使用Kubeconfig方式进行登录,选择获取到的config文件
登录成功,创建恶意pod
如何防范
为了防止 Kubernetes kubeconfig
文件泄露,需要采取一系列的安全措施来保护该文件及其内容。以下是一些有效的防护措施:
1. 限制文件访问权限
文件权限设置:确保 kubeconfig
文件只能由授权用户访问,使用操作系统的文件权限控制功能,限制文件的读写权限。
设置文件权限为 600(仅允许文件所有者读写):
chmod 600 ~/.kube/config
目录权限:确保 .kube
目录的权限足够严格,防止其他用户查看文件:
chmod 700 ~/.kube
2. 避免加入版本控制系统
使用 .gitignore
:确保 kubeconfig
文件和其他敏感配置文件不被意外提交到 Git 仓库。将 .kube/
目录添加到 .gitignore
文件中,防止泄露:
echo ".kube/" >> .gitignore
3. 使用环境变量指定路径
限制文件位置:通过设置 KUBECONFIG
环境变量指定 kubeconfig
文件的路径,这样可以将敏感配置文件存放在更安全的位置,而不是默认的 ~/.kube/config
。
export KUBECONFIG=/path/to/secure/config
限制环境变量访问:确保只有授权的进程和用户能够访问 KUBECONFIG
环境变量。避免通过共享的环境或配置文件暴露该变量。
4. 使用安全的身份验证和认证方式
避免存储敏感凭证:避免将 API Token 或证书等敏感凭证直接存储在 kubeconfig
文件中。可以使用外部的认证机制(如 OAuth2、AWS IAM、Azure AD)来替代硬编码凭证。
使用短期证书或 Token:如果必须使用 Token 或证书,尽量使用短期有效的证书或 Token,并定期轮换它们。
启用多因素认证:尽量启用多因素认证(MFA),增加一个额外的安全层,减少凭证泄露的风险。
5. 限制访问控制
最小权限原则:为用户和服务帐户分配最小权限,确保即使 kubeconfig
文件泄露,攻击者获得的权限也受到限制。使用 RBAC(Role-Based Access Control)确保用户只能访问他们需要的资源。
限制 API 服务器访问:通过防火墙、IP 白名单或 VPN 等方式,限制对 Kubernetes API Server 的访问,避免外部未经授权的访问。
6. 审计和监控
启用审计日志:启用 Kubernetes 审计日志,以便在发生敏感操作时能够及时发现。这样可以追踪任何滥用 kubeconfig
文件的行为。
监控配置文件访问:监控 kubeconfig
文件的访问和修改操作,任何未经授权的访问都能被迅速识别并响应。
7. 定期审计和更新 kubeconfig
文件
定期更换凭证:定期更换 kubeconfig
文件中的 Token、证书和凭证,减少凭证泄露后的潜在风险。
清理无用的 kubeconfig
文件:确保只有必要的用户或机器持有 kubeconfig
文件,对于不再使用的配置文件及时删除。
8. 加密存储
加密文件存储:如果需要在磁盘上存储 kubeconfig
文件,可以考虑使用加密文件系统或工具,如 LUKS(Linux Unified Key Setup)来加密磁盘分区,确保即使文件被窃取,也无法被轻易解密。
9. 在容器和云环境中使用 IAM/Service Account
容器化部署:如果在容器环境中部署 Kubernetes 客户端,避免将 kubeconfig
文件直接嵌入容器镜像。使用基于环境变量或 Kubernetes Secrets 等方式管理凭证。
云平台 IAM:在云平台(如 AWS、Azure、GCP)中,利用 IAM(Identity and Access Management)来管理访问,而不是依赖本地的 kubeconfig
文件。例如,AWS 可以使用 eks
配置文件或 IAM 角色来访问 Kubernetes。
总结
kubeconfig
文件是 Kubernetes 集群访问的关键凭证,泄露可能导致严重的安全后果。通过限制文件访问、避免上传至版本控制系统、使用更安全的认证方式、启用审计和监控等措施,可以大大降低 kubeconfig
文件泄露的风险,保护 Kubernetes 集群免受攻击。