21、DevOps 流程中的安全保障:AzSK 与 Vault 的应用

DevOps 流程中的安全保障:AzSK 与 Vault 的应用

1. AzSK 集成至 Azure Pipelines

在 DevOps 实践里,把安全融入流程至关重要。运用 AzSK 本地检查 Azure 基础设施的安全性,已让安全集成有了显著提升。然而,若想实现持续检查且避免手动操作,就得把 AzSK 执行集成到 CI/CD 管道中。AzSK 能很好地与微软的 DevOps 工具 Azure Pipelines 集成,以下是在 CI/CD 管道中使用 AzSK 的步骤:
1. 安装扩展 :从 Visual Studio 市场(https://marketplace.visualstudio.com/items?itemName=azsdktm.AzSDK-task)为 Azure DevOps 组织安装 Secure DevOps Kit (AzSK) CICD Extensions for Azure 扩展。
2. 添加任务 :在发布定义中,添加目录里的 AzSK 安全验证测试任务。
3. 配置任务参数
- 选择执行 PowerShell 所需的 Azure 订阅。
- 在“Select Parameter Set”属性中,从下拉列表选择“ResourceGroupName”值。
- 输入包含资源的资源组名称。
- 输入待检查资源所在的订阅 ID。
4. 保存并触发发布 :保存发布定义,创建新发布来触发它。
5. 查看结果 :执行结束时,若 AzSK 检测到扫描的 Azure 资源存在安全问题,发布将失败,并在日志中显示不同问题。
6. 下载日志 :点击“Download all logs”按钮下载发布执行日志,在下载的 ZIP 文件中可获取 AzSK 生成的 CSV 报告。

更多关于 AzSK 集成到管道的信息,可查看文档:https://azsk.azurewebsites.net/03-Security-In-CICD/Readme.html。

2. HashiCorp’s Vault 保护数据

在信息系统安全领域,保护系统不同组件间的敏感数据是关键话题。需保护的敏感数据包括服务器访问密码、数据库连接、API 认证令牌和应用用户账户等。很多安全攻击源于这类数据在应用源代码或保护欠佳的本地工作站文件中被解密。以下是一些可用于保护敏感数据的工具和服务:
| 类型 | 工具/服务 | 链接 |
| ---- | ---- | ---- |
| 工具 | KeyPass | https://keepass.info/ |
| 工具 | LastPass | https://www.lastpass.com/ |
| 工具 | Ansible Vault | - |
| 工具 | HashiCorp’s Vault | - |
| 云服务 | Azure Key Vault | https://azure.microsoft.com/en-us/services/key-vault/ |
| 云服务 | KMS for Google Cloud | https://cloud.google.com/kms/ |
| 云服务 | AWS Secrets Manager for AWS | https://aws.amazon.com/secrets-manager/?nc1=h_ls |

这里重点介绍 HashiCorp 的 Vault,它免费开源,可安装在任何操作系统和 Kubernetes 上,主要特性和优势如下:
- 支持存储静态和动态秘密。
- 具备秘密轮换和撤销系统。
- 无需存储数据即可加密和解密。
- 拥有用于管理秘密的 Web 界面。
- 能与多种认证系统集成。
- 所有秘密存储在单一集中化工具中。
- 可通过主流云提供商、Kubernetes 甚至内部数据中心访问,实现架构独立。

更多 Vault 特性信息,可查看产品页面:https://www.vaultproject.io/docs/what-is-vault/index.html。

3. 本地安装 Vault

若决定使用 Vault,要明白它负责保护敏感基础设施和应用数据。在生产环境安装前,需了解其概念和不同架构拓扑,可参考文档:https://learn.hashicorp.com/vault/operations/ops-reference-architecture。这里主要介绍开发模式下的安装和使用,即把 Vault 安装在本地工作站用于测试和开发。

Vault 可手动或通过脚本安装:
- 手动安装
1. 访问下载页面:https://www.vaultproject.io/downloads.html。
2. 下载适合操作系统的包到指定文件夹。
3. 解压包,更新 PATH 环境变量,添加该文件夹路径。
- 脚本安装
- Linux :在终端运行以下脚本:

VAULT_VERSION="1.2.1"
curl --silent --remote-name https://releases.hashicorp.com/vault/${VAULT_VERSION}/vault_${VAULT_VERSION}_linux_amd64.zip
unzip vault_${VAULT_VERSION}_linux_amd64.zip
sudo mv vault /usr/local/bin/

此脚本的操作步骤如下:
1. 初始化包含要下载的 Vault 版本的变量。
2. 使用 curl 下载 Vault,curl 可从 https://curl.haxx.se/ 下载。
3. 解压包。
4. 将 vault 二进制文件复制到 /usr/local/bin 文件夹(该文件夹已在 PATH 环境变量中)。脚本也可在 https://github.com/PacktPublishing/Learning_DevOps/blob/master/CHAP12/vault/install_vault.sh 查看。
- Windows :使用 Chocolatey(https://chocolatey.org/),在终端执行命令:

choco install vault -y

此外,HashiCorp 还提供在不同云提供商创建完整 Vault 基础设施的 Terraform 代码:
- Azure:https://github.com/hashicorp/terraform-azurerm-vault
- AWS:https://github.com/hashicorp/terraform-aws-vault
- Google Cloud Platform (GCP):https://github.com/hashicorp/terraform-google-vault

安装完成后,可在终端运行 vault --version 命令测试安装,也可执行 vault --help 命令查看可用命令列表。

4. 启动 Vault 服务器

Vault 是客户端 - 服务器工具,包含开发者用于应用的客户端组件和负责保护远程后端数据的服务器组件。Vault 支持众多后端,列表见:https://www.vaultproject.io/docs/configuration/storage/index.html。

本地安装 Vault 后,仅能访问客户端部分,要使用 Vault 需启动服务器组件。在开发模式下启动 Vault 服务器组件,在第二个终端执行命令:

vault server -dev

该命令以最小配置启动并配置 Vault 服务器,包含认证令牌和名为“in - memory”的默认后端,会将所有秘密数据存储在服务器内存中。需注意,此终端必须保持打开以维持 Vault 服务器运行。由于处于开发模式且后端存储在内存中,一旦 Vault 服务器停止,所有秘密数据将从内存删除。

接着,在另一个终端执行以下命令导出 VAULT_ADDR 环境变量:

export VAULT_ADDR='http://127.0.0.1:8200'

最后,执行 vault status 命令检查 Vault 服务器执行状态。

更多开发模式下启动 Vault 服务器的信息,可查看文档:https://www.vaultproject.io/docs/concepts/dev-server.html。

5. 在 Vault 中写入秘密

要保护应用或基础设施资源使用的敏感数据,第一步是将其存储在公司选定的秘密数据管理器中。在 Vault 中写入数据可在终端执行以下命令:

vault kv put secret/vmadmin vmpassword=admin123*

此命令使用“put”操作,在“secret/”路径内存中创建一个名为“vmadmin”的键值类型新秘密数据,这里指 VM 的管理员账户。

在 Vault 中,所有受保护数据存储在对应组织位置的路径中,默认路径是“secret/”,也可创建自定义路径以更好管理秘密权限和按域、主题或应用进行组织。

还可向已创建的秘密数据添加新秘密,例如添加 VM 的登录管理员信息,执行命令:

vault kv put secret/vmadmin vmpassword=admin123* vmadmin=bookadmin

更多关于“kv put”命令的信息,可查看文档:https://www.vaultproject.io/docs/commands/kv/put.html。

6. 从 Vault 读取秘密

在 Vault 中创建秘密后,需读取它们用于应用或基础设施脚本。在终端执行以下命令读取存储在 Vault 中的键:

vault kv get secret/vmadmin

此命令使用“kv”操作和“get”运算符,通过参数指定键的完整路径以获取受保护值。执行该命令的输出会显示秘密的版本号,因执行了两次“kv put”命令,版本号会递增。若要访问早期版本存储的数据,可在命令中指定所需版本号,如:

vault kv get -version=1 secret/vmadmin

更多关于“kv get”命令的信息,可查看文档:https://www.vaultproject.io/docs/commands/kv/get.html。

7. 使用 Vault UI 网页界面

除客户端工具,Vault 还有 UI 网页界面,能更直观地管理秘密。打开并使用 Vault 网页界面查看客户端工具创建的秘密,步骤如下:
1. 在浏览器输入服务器启动时提供的 URL,即 http://127.0.0.1:8200/ui ,这是本地 Vault 的默认 URL。
2. 在认证表单中,输入终端中“root token”信息里提供的令牌。
3. 点击“Sign In”按钮进行认证。
4. 界面主页显示包含存储秘密的秘密路径列表(称为 Secrets Engines)。
5. 点击每个秘密引擎,可查看保存的秘密列表。
6. 点击特定秘密,可访问受保护的数据列表,还能查看每个键的明文值,通过“History”下拉菜单选择所需版本可显示秘密内容的历史记录。

更多关于此网页界面的信息,可阅读文章:https://www.hashicorp.com/resources/vault-oss-ui-introduction。

8. 在 Terraform 中获取 Vault 秘密

保护 Terraform 代码中的基础设施配置信息很重要,一种方法是将敏感数据存储在 Vault 等秘密管理器中,再用 Terraform 动态恢复。以下是从 Vault 检索要配置的 VM 密码的 Terraform 代码示例,由三个块组成:
1. 配置 Vault 提供者

provider "vault" {
    address = "http://127.0.0.1:8200" # Local Vault Url
}

此块配置 Vault 服务器 URL,令牌认证将在运行 Terraform 时使用环境变量。更多关于 Terraform Vault 提供者及其配置的信息,可查看文档:https://www.terraform.io/docs/providers/vault/index.html。
2. 添加数据块

data "vault_generic_secret" "vmadmin_account" {
    path = "secret/vmadmin"
}

此数据块用于从 Vault 服务器检索秘密,要求 Terraform 检索之前创建的“secret/vmadmin”路径中的秘密。更多关于“vault_generic_secret”数据及其配置的信息,可查看文档:https://www.terraform.io/docs/providers/vault/d/generic_secret.html。
3. 添加输出块

output "vmpassword" {
    value = "${data.vault_generic_secret.vmadmin_account.data["vmpassword"]}"
    sensitive = true
}

此块展示了对秘密的利用,表达式 data.vault_generic_secret.vmadmin_account.data["vmpassword"] 用于获取前面数据块返回的秘密。该输出被视为敏感信息,Terraform 执行时不会以明文显示其值。完整源代码可查看:https://github.com/PacktPublishing/Learning_DevOps/blob/master/CHAP12/vault/terraform_usevault/main.tf。

执行 Terraform 代码的步骤如下:
1. 导出环境变量 :在包含 Terraform 代码的文件夹的终端中,导出 VAULT_TOKEN 环境变量,值为 Vault 令牌。在开发模式下,此令牌在 Vault 服务器启动时提供,如在 Linux 系统上执行:

export VAULT_TOKEN=xxxxxxxxxxxx
  1. 执行 Terraform 命令
terraform init
terraform plan
terraform apply
- `terraform init` 命令初始化上下文并下载所有必要的提供者。
- `terraform plan` 命令显示 Terraform 将应用的所有更改预览。
- `terraform apply` 命令对基础设施应用所有更改并显示输出值。
  1. 以 JSON 格式显示输出
terraform output -json

通过以上步骤,可在 DevOps 流程中有效集成 AzSK 和 Vault,提升系统的安全性和稳定性。

graph LR
    A[开始] --> B[集成 AzSK 到 Azure Pipelines]
    B --> C[安装扩展]
    C --> D[添加任务]
    D --> E[配置参数]
    E --> F[保存并触发发布]
    F --> G[查看结果]
    G --> H[下载日志]
    H --> I[使用 HashiCorp's Vault]
    I --> J[本地安装 Vault]
    J --> K[手动安装]
    J --> L[脚本安装]
    K --> M[访问下载页]
    K --> N[下载包]
    K --> O[解压并更新 PATH]
    L --> P[Linux 脚本安装]
    L --> Q[Windows 脚本安装]
    P --> R[初始化变量]
    P --> S[下载 Vault]
    P --> T[解压包]
    P --> U[复制二进制文件]
    Q --> V[使用 Chocolatey 安装]
    J --> W[启动 Vault 服务器]
    W --> X[开发模式启动]
    X --> Y[导出环境变量]
    Y --> Z[检查状态]
    Z --> AA[写入秘密到 Vault]
    AA --> AB[执行 put 命令]
    AA --> AC[添加新秘密]
    AC --> AD[执行新 put 命令]
    AB --> AE[读取秘密]
    AE --> AF[执行 get 命令]
    AF --> AG[指定版本读取]
    AE --> AH[使用 Vault UI 网页界面]
    AH --> AI[输入 URL]
    AI --> AJ[输入令牌]
    AJ --> AK[点击登录]
    AK --> AL[查看秘密列表]
    AL --> AM[查看特定秘密]
    AM --> AN[查看历史记录]
    AE --> AO[在 Terraform 中获取 Vault 秘密]
    AO --> AP[配置提供者]
    AP --> AQ[添加数据块]
    AQ --> AR[添加输出块]
    AR --> AS[执行 Terraform 代码]
    AS --> AT[导出环境变量]
    AT --> AU[执行命令]
    AU --> AV[以 JSON 显示输出]
    AV --> AW[结束]

通过该流程图,能清晰看到从集成 AzSK 到使用 Vault 并在 Terraform 中获取秘密的整个流程,有助于更好地理解和实施 DevOps 流程中的安全措施。

DevOps 流程中的安全保障:AzSK 与 Vault 的应用

8. 在 Terraform 中获取 Vault 秘密(续)

在 Terraform 里获取 Vault 秘密的操作,是保障基础设施配置信息安全的关键一环。前面已经给出了 Terraform 代码示例及执行步骤,下面详细阐述各步骤的意义和作用。

首先是配置 Vault 提供者的代码块:

provider "vault" {
    address = "http://127.0.0.1:8200" # Local Vault Url
}

此代码块的核心作用是告知 Terraform 要连接的 Vault 服务器地址。在实际应用中,若 Vault 服务器部署在其他位置,需相应修改 address 的值。而对于令牌认证,使用环境变量的方式能增强安全性,避免在代码中硬编码敏感信息。

接着是添加数据块的代码:

data "vault_generic_secret" "vmadmin_account" {
    path = "secret/vmadmin"
}

该数据块的功能是从 Vault 服务器中读取指定路径的秘密数据。 path 参数明确了要读取的秘密所在的路径,在这个例子中是 secret/vmadmin 。Terraform 会依据此路径去 Vault 中查找并获取相应的秘密数据。

最后是输出块的代码:

output "vmpassword" {
    value = "${data.vault_generic_secret.vmadmin_account.data["vmpassword"]}"
    sensitive = true
}

这个输出块将从 Vault 中获取的秘密数据以输出的形式呈现。 value 属性通过引用前面数据块获取的结果,提取出 vmpassword 的值。 sensitive = true 这一设置非常重要,它能确保在 Terraform 执行过程中,该输出值不会以明文形式显示,从而保护敏感信息不被泄露。

执行 Terraform 代码时,各命令也有其特定的功能:
- terraform init :此命令用于初始化 Terraform 项目,它会自动下载并安装所需的提供者插件,为后续操作做好准备。
- terraform plan :该命令会对 Terraform 代码进行分析,模拟将要执行的操作,并展示出所有即将应用的更改,方便用户在正式执行前进行预览和确认。
- terraform apply :执行此命令后,Terraform 会根据代码中的定义,对基础设施进行实际的更改操作,并将输出值显示出来。
- terraform output -json :以 JSON 格式输出 Terraform 的结果,便于其他程序或系统进行解析和处理。

9. 安全工具对比

为了更清晰地了解不同安全工具的特点,下面对前面提到的部分工具进行对比:
| 工具 | 特点 | 适用场景 |
| ---- | ---- | ---- |
| AzSK | 与 Azure Pipelines 集成良好,可实现 Azure 基础设施安全的持续检查 | 主要用于 Azure 环境下的 DevOps 流程 |
| HashiCorp’s Vault | 免费开源,支持多种操作系统和 Kubernetes,能存储静态和动态秘密,具备轮换和撤销机制 | 适用于各种环境下的敏感数据保护 |
| KeyPass | 开源密码管理器,可本地使用 | 个人或小型团队的密码管理 |
| LastPass | 基于云的密码管理服务,提供多平台支持 | 个人或企业用户的密码管理 |

通过这个表格,可以根据不同的需求和场景,选择最适合的安全工具。

10. 安全实践建议

在 DevOps 流程中,为了更好地利用 AzSK 和 Vault 提升系统安全性,可遵循以下建议:
1. 定期检查 :使用 AzSK 定期对 Azure 基础设施进行安全检查,及时发现并修复潜在的安全漏洞。
2. 合理使用 Vault 路径 :在 Vault 中创建自定义路径,根据不同的域、主题或应用对秘密进行分类管理,提高管理效率和安全性。
3. 定期轮换秘密 :利用 Vault 的秘密轮换功能,定期更新敏感数据,降低因数据泄露带来的风险。
4. 监控和审计 :对 AzSK 和 Vault 的操作进行监控和审计,记录所有的访问和更改信息,以便在出现问题时进行追溯和分析。

11. 总结

在 DevOps 流程中,安全是至关重要的一环。AzSK 和 HashiCorp’s Vault 作为两款优秀的安全工具,分别在 Azure 基础设施安全检查和敏感数据保护方面发挥着重要作用。通过将 AzSK 集成到 Azure Pipelines 中,能够实现安全的持续检查;而 Vault 则提供了强大的秘密管理功能,可有效保护各种敏感信息。

在实际应用中,要根据具体的需求和场景,合理选择和使用这两款工具。同时,遵循安全实践建议,不断优化安全策略,才能确保系统的安全性和稳定性,为业务的顺利开展提供有力保障。

graph LR
    A[安全工具选择] --> B{环境类型}
    B --> |Azure| C[AzSK]
    B --> |其他| D[HashiCorp's Vault]
    C --> E[集成到 Azure Pipelines]
    E --> F[持续检查]
    D --> G[安装和配置]
    G --> H[存储秘密]
    H --> I[轮换和撤销]
    F --> J[发现漏洞]
    J --> K[修复问题]
    I --> L[降低风险]
    L --> M[保障系统安全]
    K --> M

这个流程图展示了根据不同环境选择安全工具,并通过相应的操作保障系统安全的过程。它进一步强调了 AzSK 和 Vault 在 DevOps 安全流程中的重要性和作用。通过合理运用这些工具和方法,能够构建一个更加安全可靠的 DevOps 环境。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值