译者 | 李睿
审校 | 孙淑娟
一般来说,企业都希望在人力、基础设施、流程等各个层面提高生产力。通常情况下,生产力是由增加自动化流程来推动和提高生产速度。这种自动化需要对历史上使用的概念进行演变、调整甚至完全转变。这其中包括安全策略的实施和控制。
事实上,自从基于敏捷性和灵活性的新工作方法(例如DevOps)出现以来,一些安全概念不得不适应基础设施组件的开发和管理步伐。如今,最佳安全实践之一是在集成链中尽早移动这些控制点,以便尽快检测到任何值得关注的异常情况。
为什么需要左移安全性?
“左移”这一术语是由DevSecOps方法引入的,旨在加强开发、安全、运营团队之间的协作。其思想是通过将安全性和测试过程移到软件开发生命周期(SDLC)的传统线性表示的左侧,从开发周期的开始就要保证应用程序的安全性。
多年来,这种方法被公认为是最佳的开发实践,并且自从DevOps方法出现以来,由于其使用和配置的简单性以及在复杂项目(例如基础设施)上的团队协作方面的惊人优势而被广泛使用Terraform、Ansible或Kubernetes进行管理。
左移安全性:入门的最佳实践
在YAML定义文件开发级别以及在其内容和配置级别强制使用标准有助于它们的阅读、采用和维护——这是当今任何项目都应该寻求实现的三个概念。
将安全性左移的目的是设计具有集成安全最佳实践的软件,并在开发过程中尽早检测和解决潜在的安全问题和漏洞。这使得解决安全问题变得更容易、更快、更实惠。
如何左移
预提交(Pre-commit)是一个开源命令行工具,它是工具集的一部分,用于通过在每次提交后添加自动控制点来转移某些安全方面。
这使得在集成管道中尽早检测和控制任何异常,并在其投入生产之前进行纠正成为可能。
为此,需要三个实施步骤:
- 必须在机器上安装预提交。
- 必须在Git项目的根目录下创建一个名为“.pre-commit-config.yaml”的配置文件,并使用钩子(Hooks)进行配置。
- Git项目需要在本地配置,以便在每次提交时自动执行命令。
重要注意事项
人们可能在以上内容已经了解到,预提交(Pre-commit)命令和Git项目必须在本地配置为自动运行。这并不是可以从远程源控制器强制执行的配置。这需要在启动阶段进行项目配置步骤,以确保其应用。因此,需要文件来传播信息并确保其采用。
然而根据场景,可以通过开发环境配置脚本(在本例中为所有团队成员的笔记本电脑)来自动化其使用,甚至可以创建、共享和鼓励团队使用公共容器镜像必要的开发工具。这种做法有很多优点——特别是在新人的入职方面,因为它最大限度地减少了配置开发环境所需的操作。
但是,如果这不适用或看起来太复杂,则始终可以将这些控件进一步向下移动到集成链中,从而在部署之前自动使用它们。
可以使用哪些Hooks来控制Kubernetes资源?
以下列出了一组免费的Hooks,可以通过Pre-commit轻松安装和使用。这个列表显然可以根据场景由其他Hooks补充。为了便于阅读,可以将列表缩减为Kubernetes生态系统。
以下是用于在集成管道中尽快检查Kubernetes资源的开发和维护的预提交(Pre-commit)扩展列表:
- Check-merge-conflict:在提交任何内容之前检查合并冲突。
- 拖尾空白:以清除无用空白中的代码。
- Checkov:根据最佳开发实践和自定义规则检查Kubernetes定义文件的合规性。
- K8svalidate:根据使用的Kubernetes版本检查Kubernetes定义文件的合规性。
- Detect-secrets:可检测任何敏感数据,并避免将其存储在代码中。
大多数这些Hooks也适用于其他场景。根据项目的性质,可以添加其他几个Hooks来控制文件的格式及其内容。但是,需要保留一份简短的清单,以尽量减少这些对其工作效率的影响。
以下是一个Pre-commit配置文件,用于在Kubernetes项目中快速测试这些Hooks:
YAML
1 ---
2 repos:
3 - repo: https://github.com/adrienverge/yamllint.git
4 rev: v1.17.0
5 hooks:
6 - id: yamllint
7 args: [-c=.yamllint]
8 - repo: https://github.com/pre-commit/pre-commit-hooks
9 rev: v4.1.0
10 hooks:
11 - id: check-merge-conflict
12 - id: trailing-whitespace
13 - id: check-added-large-files
14 - id: end-of-file-fixer
15 - repo: https://github.com/bridgecrewio/checkov.git
16 rev: 2.0.975
17 hooks:
18 - id: checkov
19 args: [-d .]
20 - repo: https://github.com/Agilicus/pre-commit-hook-k8svalidate.git
21 rev: v0.0.8
22 hooks:
23 - id: k8svalidate
24 files: .yaml$
25 - repo: https://github.com/Yelp/detect-secrets
26 rev: v1.2.0
27 hooks:
28 - id: detect-secrets
复制此文件的内容,并将其粘贴到项目根文件夹中名为“.pre-commit-config.yaml”的文件中。然后运行pre-commit命令得到结果。
成功的预提交Hooks示例
下一步是什么?
本文列出了一组每天对管理一个或多个Kubernetes集群的人们有用的预提交Hooks。当然,还有很多其他的Hook以适应不同的环境。例如,DevOps工程师会对控制Prometheus配置甚至格式化规则或Vagrant文件控制等的扩展感兴趣。
而如今有必要衡量这些Hooks的积累对人们的生产力及其收益的影响。
原文标题:Pre-Commit Hooks DevOps Engineer Should Know To Control Kubernetes,作者:Nicolas Giron