Travis CI 和 Regula

分享此内容
分享此内容

Regula 使用开放策略检查基础设施即代码模板(Terraform、CloudFormation、k8s 清单)以确保 AWS、Azure、Google Cloud 和 Kubernetes 的安全性和合规性,让我们更深入地了解一下如何将 Regula 与 Travis CI 集成。

Regula + Travis CI

我们将启动并运行 Regula,我想到了一种方法,就是使用我创建的 mock_key.json 文件,这样你就可以先进行采样,一旦你获得最终的 main.tf (Terraform),就可以根据需要进行编辑。一旦 Terraform 调用 Regula,Travis 就会接收到 /POST 请求,并查看是否收到了 Regula 的响应。这是一个可用的示例,在我看来,Travis 是最简单的开发工具,可以轻松设置 Regula 并使其具有最长的正常运行时间。

Terraform

我们可以通过将以下代码放在我们 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

在这个仓库中有一个符合规范的 Kubernetes pod,我创建了它,由于我们使用的是 Travis,所以不需要太多,我只是想给你提供最可行的方法。

Swagger

仓库中有一个完整的 swagger.yaml 文件。

Travis CI

下面的所有 .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

使用配置文件运行 Regula

你需要打开 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] 寻求帮助。

祝您构建愉快!

© Copyright 2024, 保留所有权利
© Copyright 2024, 保留所有权利
© Copyright 2024, 保留所有权利