DevSecOps:如何使用 Ansible Vault 在 GitLab CI/CD 中安全管理秘密資訊
前言
以下是關於如何在 **GitLab CI/CD** 中使用 **Ansible Vault** 建立安全的 CI/CD 管道的詳細步驟。這將指導你從加密秘密資訊開始,到設置管道進行部署的完整過程。
準備
1. GitLab 帳戶:確保已擁有一個 GitLab 帳戶並且已經設置好一個 repository。
2. 本地安裝 Ansible:需要在本地安裝 Ansible 來加密/解密秘密文件。
第一步:設置 Ansible 並創建加密的文件
1. 安裝 Ansible:
首先,確保已在本地機器上安裝了 Ansible。在 Ubuntu 上運行以下命令來安裝它:
```bash
sudo apt-get install ansible
```
如果使用其他操作系統,請參考官方的 [Ansible 安裝指南](https://docs.ansible.com/ansible/latest/installation_guide/index.html)。
2. 創建一個秘密文件:
在本地的工作目錄中,創建一個包含敏感資訊的 YAML 文件,例如:
```yaml
# secret_vars.yml
db_username: myuser
db_password: supersecurepassword
api_key: someAPIkey12345
```
3. 使用 Ansible Vault 加密文件:
運行以下命令來加密 `secret_vars.yml` 文件:
```bash
ansible-vault encrypt secret_vars.yml
```
系統會提示你輸入一個密碼。記住這個密碼,因為你需要在 GitLab Pipeline 中使用它。
你會看到 `secret_vars.yml` 文件已經被加密,內容看起來像這樣:
```yaml
$ANSIBLE_VAULT;1.1;AES256
66333639383962613962306165613635393730333037643734653938326664333530663562363463
3662633637643437626665313031366232303064643531310a353263613565396131366466633862
39666539616339386264303334653235656533613462366666623137616131303430363366393365
```
4. 將加密文件提交到 Git:
將加密後的 `secret_vars.yml` 文件提交到 GitLab repository 中:
```bash
git add secret_vars.yml
git commit -m "Add encrypted secrets"
git push
```
第二步:在 GitLab 中存儲 Ansible Vault 密碼
1. 到 GitLab Settings 頁面:
- 打開你的 GitLab repository。
- 點擊 Settings > CI/CD > Variables。
2. 添加一個新的 CI/CD 變數:
- 添加一個名為 `ANSIBLE_VAULT_PASSWORD` 的變數,值設置為你用來加密 `secret_vars.yml` 的密碼。
- 確保此變數被設置為 **Protected**(受保護的)和 **Masked**(遮蔽的)以確保安全性。
第三步:創建 `.gitlab-ci.yml` Pipeline 文件
現在你將創建一個 GitLab CI Pipeline 配置文件(`.gitlab-ci.yml`),用來在 CI/CD 過程中自動解密和使用秘密文件。
1. 建立 `.gitlab-ci.yml` 文件:
在你的工作目錄下創建 `.gitlab-ci.yml` 文件,如果還沒有的話。
2. 定義 Pipeline:
在 `.gitlab-ci.yml` 文件中定義兩個階段:`decrypt`(解密)和 `deploy`(部署)。`decrypt` 階段負責解密秘密文件,而 `deploy` 階段執行部署。
3. 示例 `.gitlab-ci.yml` 文件:
```yaml
stages:
- decrypt
- deploy
# 使用 Ansible Vault 解密 secret_vars.yml 文件
decrypt_secrets:
stage: decrypt
image: python:3.9 # 使用帶有 Python 的 Container Image,可以通過 pip 安裝 Ansible
before_script:
- pip install ansible # 在 GitLab runner 中安裝 Ansible
script:
# 將 Ansible Vault 密碼寫入臨時文件
- echo "$ANSIBLE_VAULT_PASSWORD" > vault_pass.txt
# 使用該密碼解密文件
- ansible-vault decrypt secret_vars.yml --vault-password-file vault_pass.txt
artifacts:
# 保存解密後的文件,以便在部署階段使用
paths:
- secret_vars.yml
# 使用解密的秘密文件進行部署
deploy:
stage: deploy
script:
# 使用解密後的秘密文件執行 Ansible playbook
- ansible-playbook deploy.yml --extra-vars="@secret_vars.yml"
```
第四步:建立一個簡單的 Ansible Playbook
如果你還沒有 Ansible playbook,用於部署的 playbook,可以建立一個簡單的。例如:
```yaml
# deploy.yml
---
- hosts: localhost
tasks:
- name: Display the API Key
debug:
msg: "The API Key is {{ api_key }}"
- name: Deploy database with the decrypted credentials
debug:
msg: "Deploying database with user {{ db_username }} and password {{ db_password }}"
```
這個簡單的 playbook 會讀取 `secret_vars.yml` 文件中的變數 `api_key`、`db_username` 和 `db_password`。
第五步:將所有文件推送到 GitLab
1. 提交更改:
將 `.gitlab-ci.yml` 文件和 playbook 添加並提交到代碼庫:
```bash
git add .gitlab-ci.yml deploy.yml
git commit -m "Add GitLab CI pipeline and playbook"
git push
```
2. 觸發 Pipeline:
一旦推送了變更,GitLab 將自動根據 `.gitlab-ci.yml` 配置觸發 Pipeline 執行。
第六步:驗證管道執行
1. 檢查 Pipeline 執行狀態:
- 打開你的 GitLab 項目。
- 點擊 CI/CD > Pipelines 查看正在運行的 pipeline 狀態。
- 如果一切正常,應該能看到 pipeline 依次完成 `decrypt` 和 `deploy` 階段。
2. 檢查生成的工件和日誌:
- 解密後的 `secret_vars.yml` 文件會作為工件保存在 `decrypt_secrets` 階段後。
- `deploy` 階段會使用解密後的秘密文件執行部署。
第七步:安全考量
1. 使用受保護的分支:
確保 Pipeline 僅在受保護的分支上運行,防止未經授權的用戶訪問機敏資料。
2. 定期更換 Vault 密碼:
定期更換 `ANSIBLE_VAULT_PASSWORD` 所使用的密碼,以保持安全性。
3. 檢查日誌:
確保沒有敏感資訊在 pipeline日誌中顯示(GitLab 會自動遮蔽變數)。
結論
通過這個設置,創建了一個安全的 GitLab CI/CD Pipeline,該 pipeline:
- 使用 Ansible Vault 來加密秘密信息。
- 在 CI/CD Pipeline 執行過程中解密秘密。
- 使用解密後的秘密來部署應用程序。
這種方法確保了敏感數據在 repository 中保持加密,並且只在需要時進行解密來執行部署。
留言
張貼留言