Regula 使用开放策略检查基础设施即代码模板(Terraform、CloudFormation、k8s 清单)以确保 AWS、Azure、Google Cloud 和 Kubernetes 的安全性和合规性,让我们更深入地了解一下如何将 Regula 与 Travis CI 集成。
我们将启动并运行 Regula,我想到了一种方法,就是使用我创建的 mock_key.json
文件,这样你就可以先进行采样,一旦你获得最终的 main.tf
(Terraform),就可以根据需要进行编辑。一旦 Terraform 调用 Regula,Travis 就会接收到 /POST 请求,并查看是否收到了 Regula 的响应。这是一个可用的示例,在我看来,Travis 是最简单的开发工具,可以轻松设置 Regula 并使其具有最长的正常运行时间。
我们可以通过将以下代码放在我们 travis.yml
文件中的 script
钩子中来获取 Terraform
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
sudo apt-get update && sudo apt-get install terraform
在这个仓库中有一个符合规范的 Kubernetes pod,我创建了它,由于我们使用的是 Travis,所以不需要太多,我只是想给你提供最可行的方法。
仓库中有一个完整的 swagger.yaml
文件。
下面的所有 .travis.yml
文件都是由我(Montana Mendy)创建的。以下是关于 .travis.yml
的一些关键要点。
group: edge
branches:
only:
- master
- /^(cherry-pick-)?backport-\d+-to-/
addons:
apt:
packages:
- moreutils
env:
global:
- 'PATH="$HOME/.local/bin:$PATH"'
- REGULA_VERSION=1.6.0
install:
- >-
if [[ "${TRAVIS_COMMIT_MESSAGE}" = *"[Build latest]"* ]]; then export
BUILD_VERSION="$(cat packaging/version | cut -d'-' -f1,2 | sed -e
's/-/./g').latest"; fi;
before_script:
- mkdir "$HOME/.local/bin"
- >-
curl -L
"https://github.com/fugue/regula/releases/download/v${REGULA_VERSION}/regula_${REGULA_VERSION}_Linux_x86_64.tar.gz"
| tar -xvz -C "$HOME/.local/bin"
- 'RANGE1=`echo "$TRAVIS_COMMIT_RANGE" | awk ''{n=split($1,a,".");print a[1]}''`'
script:
- REGULA_OUTPUT="$(mktemp)"
- (regula run -f json || true) | tee "$REGULA_OUTPUT"
- REGULA_RULES_PASSED="$(jq -r '.summary.rule_results.PASS' "$REGULA_OUTPUT")"
- REGULA_RULES_FAILED="$(jq -r '.summary.rule_results.FAIL' "$REGULA_OUTPUT")"
- regula -v
- regula init
- regula run
- regula run --format table
- >-
echo "${REGULA_RULES_PASSED} rules passed, ${REGULA_RULES_FAILED} rules
failed" >&2
- 'if [[ "$REGULA_RULES_FAILED" -gt 0 ]]; then exit 1; fi'
- curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
- sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
- sudo apt-get update && sudo apt-get install terraform
- terraform -v
after_deploy:
- >-
if [ -n "${BUILDER_NAME}" ]; then rm -rf /home/${BUILDER_NAME}/* && echo
"Cleared /home/${BUILDER_NAME} directory" || echo "Failed to clean
/home/${BUILDER_NAME} directory"; fi;
- 'if [ -d "${PACKAGES_DIRECTORY}" ]; then rm -rf "${PACKAGES_DIRECTORY}"; fi;'
- >-
if: "((branch IN (master, develop) && type = push) OR branch =~ /.*env.*/ OR
commit_message =~ /\\[recreate env\\]/) AND commit_message !~ /\\[delete
env\\]/ AND type != cron AND commit_message !~ /\\[execute .*. test\\]/ AND
commit_message !~ /\\[start recreate scheduler\\]/"
我们将更改 PATH
并使用 cURL
来获取最新版本的 Regula,请确保你已经安装了 Regula,请访问 https://regula.dev/。你也可以通过运行以下命令进行检查
regula version
在 CLI 中,但它会输出类似以下内容
如果 regula
命令不起作用,你需要安装 Regula 和二进制文件。请确保你运行以下命令
brew tap fugue/regula
一旦 brew 创建了 fugue/regula
的符号链接,你就可以开始安装过程
brew install regula
如果你想升级 regula,只需运行
brew upgrade regula
你还会注意到我们使用 cURL
通过以下方式获取 Terraform
script:
- curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -
- sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
- sudo apt-get update && sudo apt-get install terraform
- terraform -v
你需要打开 CLI,确保你有一个名为 /infra_tf
的目录,并运行
regula run -f json --include example_custom_rule --include config.rego infra_tf
输出应该是类似以下的内容
{
"controls": [
"CIS-Kubernetes_v1.6.1_5.1.6"
],
"filepath": "pod-compliant.yaml",
"input_type": "k8s",
"provider": "kubernetes",
"resource_id": "Pod.default.hello",
"resource_type": "Pod",
"rule_description": "Service account 'automountServiceAccountToken' should be set to 'false'. Avoid automounting service account tokens. Service account tokens are used to authenticate requests from in-cluster processes to the Kubernetes API server. Many workloads do not need to communicate with the API server and hence should have automountServiceAccountToken set to false.",
"rule_id": "FG_R00484",
"rule_message": "",
"rule_name": "k8s_service_account_tokens",
"rule_result": "PASS",
"rule_severity": "Medium",
"rule_summary": "Service account 'automountServiceAccountToken' should be set to 'false'",
"source_location": [
{
"path": "pod-compliant.yaml",
"line": 1,
"column": 1
}
]
}
"summary": {
"filepaths": [
"pod-compliant.yaml"
],
"rule_results": {
"FAIL": 0,
"PASS": 14,
"WAIVED": 0
},
"severities": {
"Critical": 0,
"High": 0,
"Informational": 0,
"Low": 0,
"Medium": 0,
"Unknown": 0
}
}
根据你设置的策略和强制执行,输出结果可能会有所不同。现在,让我们确保在 Travis CI 中,我们的 pod 是否符合规范。
它们似乎符合规范,现在我们可以继续了!
从 Regula 的角度来看,用法变得相当复杂——我一直在考虑编写一个 bash 脚本,来帮助用户并使其更轻松。
这是我的 集成仓库,与往常一样,我尽量使我的代码尽可能地开源。与往常一样,如果你有任何问题,请发送电子邮件至 [email protected] 寻求帮助。
祝您构建愉快!