博客 / 詳情

返回

極狐GitLab CI x Vault,做好企業密鑰安全合規管理

​“千里之堤,潰於蟻穴”,密鑰管理對於軟件研發全生命週期來講猶如蟻穴之於長堤,密鑰泄漏已經成為導致企業被勒索攻擊的重要因素。安全合規的管理密鑰,除了能夠有效避免企業遭受重大經濟損失,還能夠打造良好的企業安全文化,幫助企業在加速軟件交付的同時保證安全合規。

密鑰管理需要覆蓋軟件研發全生命週期,比如在編碼階段需要避免密鑰硬編碼、在構建階段需要避免密鑰被打印到構建日誌中、在測試階段需要去掃描變更代碼(或歷史中)是否含有密鑰信息等。極狐GitLab 本身具備成熟的密鑰管理功能,比如在 CI/CD Pipeline 階段,可以用 CI 環境變量來存儲密鑰,還可以將密鑰檢測的安全掃描手段嵌入到 CI/CD Pipeline 中,及時發現變更代碼中的密鑰信息,避免外泄。關於極狐GitLab CI 對於密鑰的管理可以查看文章極狐GitLab CI/CD SSHKEY Mask 的幾種方式;關於極狐GitLab 密鑰安全掃描的文章可以查看 1 行代碼開啓「密鑰檢測」,給敏感數據加上防護鎖。

本文將演示極狐GitLab CI 與 Vault 集成來進行密鑰的安全合規管理。

關於 Vault

Vault 是 Hashorp 公司推出的一款開源的、基於身份識別的密鑰和加密管理系統。以 Default deny all 的原則來管理諸如 API key、用户名密碼(password)、訪問令牌(token)及證書(certificates)等密鑰。更多關於 Vault 的內容可以查看 Vault 官網。

極狐GitLab CI 與 Vault 的集成原理

  1. 在 vault 上配置密鑰(UI、CLI、API 均可);
  2. 生成 JWT 以供 CI Job 用;
  3. Runner 和 Hashicorp 連接並用 JWT 做認證;
  4. Vault 對 JWT 進行驗證;
  5. Vault 對於 bound claim 和 對應的 vault policy 進行檢查;
  6. Vault 返回訪問令牌;
  7. Runner 從 Vault 讀取密鑰信息進行使用。

極狐GitLab CI 與 Vault 集成的兩種方式

可以使用 secrets 關鍵字或 CLI 的方式來在極狐GitLab CI 中使用 Vault。

secrets:vault 關鍵字的使用

secrets 是極狐GitLab CI 中用來從外部密鑰管理工具讀取密鑰的關鍵字。可以使用 secrets:vault 從 vault 服務器讀取存儲在裏面的密鑰信息。

比如在 vault 中使用 kv engine (v2)來存儲容器鏡像倉庫的用户名和密碼:

# 寫入用户名和密碼
$ vault kv put jh/docker-registry/credentials username=jh-gitlab password=passw0rd

# 讀取用户名和密碼
vault  read -format=json jh/data/docker-registry/credentials | jq -r '.data.data'
{
  "password": "passw0rd",
  "username": "jh-gitlab"
}

將 vault 相關的環境變量存儲在極狐GitLab CI 變量中:

  • VAULT_SERVER_URL:vault 服務器地址;
  • VAULT_AUTH_ROLE:vault 上創建的 role,用來和對應的 policy 進行綁定,實現存儲密鑰的精細化管控;
  • VAULT_AUTH_PATH:認證方法在 vault auth 中的掛載路徑,默認為 jwt。

.gitlab-ci.yml 文件內容如下:

stages:  
  - vault
  
get_credentials:  
  stage: vault  
  tags:    
    - vault  
  image:     
    name: vault:1.13.3  
  secrets:    
    DATABASE_PASSWORD:      
      vault: docker-registry/credentials/password@jh  
  script:    
    - echo $DATABASE_PASSWORD

查看 CI/CD Pipeline 構建結果:

可以看到極狐GitLab CI 讀取 vault 信息成功,並且將其保存到名為 DATABASE_PASSWORD 的文件裏面,路徑如紅色方框截圖所示。

CLI 方式

通過 CLI 的方式就像本地訪問 valut 一樣,用 vault 的各種命令即可實現對密鑰的增刪改查等操作。依舊以前面寫入的密鑰信息為例來演示 CLI 在極狐GitLab CI 中的使用。

.gitlab-ci.yml 文件內容如下:

get_credentials:  
  stage: vault  
  tags:    
    - vault  
  image: vault:1.13.3  
  script:  
    #  vault 服務器的地址  
    - export VAULT_ADDR=http://163.228.231.126:8200   
    #  vault 認證授權所用的 token
    - export VAULT_TOKEN="$(vault write -field=token auth/jwt/login role=jh jwt=$CI_JOB_JWT)"     
    # 從 vault 讀取密鑰信息  
    - export PASSWORD="$(vault kv get -field=password jh/docker-registry/credentials)"    
    # 打印密鑰信息
    - echo $PASSWORD

查看 CI/CD Pipeline 構建結果:

可以看到極狐GitLab CI 讀取 vault 信息成功。

注意,直接使用 CLI 方式讀取的密鑰信息,可以使用 echo 命令打印出來,需要避免在 CI/CD Pipeline 構建中打印密鑰信息或者採取第一種方式來避免造成密鑰信息在 CI/CD Pipeline 構建過程中的泄漏。

參考:

  1.  極狐GitLab vault 官網文檔
  2.  極狐GitLab 售前解決方案架構師尹學峯編寫的極狐GitLab 與 vault 的詳細配置文檔
user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.