保护 Continuous Delivery 中的数据
IBM Cloud® Continuous Delivery 在安全的高可用性环境中托管数据库:
- 数据在静态(GPFS、LUKS 和内置磁盘)和传输过程( HTTPS 和 SSH)中使用 Continuous Delivery 服务或其依赖的服务和基础设施内部的加密密钥进行加密。
- 个人数据只能在专业套餐 中使用 IBM® Key Protect for IBM Cloud® 服务实例或 IBM Cloud® Hyper Protect Crypto Services 服务实例中的根密钥进行加密。
- 客户机和系统凭证存储在加密的磁盘中。
- 工具集成和 Delivery Pipeline 属性值的配置数据可能包含敏感信息。 此数据通过使用 Continuous Delivery 服务内部的加密密钥进行加密,因为它存储在服务内部的数据库中。
- 针对高可用性配置应用程序和数据。
- 仅限那些需要使用数据来支持和维护服务的用户才能访问数据。
保护 Continuous Delivery 中的敏感数据
Continuous Delivery 服务会先加密客户拥有的敏感数据,然后再将其存储在服务内部使用的数据库中。 敏感数据包括第三方工具集成配置数据和 Delivery Pipeline 属性值。 通过使用 Continuous Delivery 服务内部的加密密钥或使用 IBM® Key Protect for IBM Cloud® 服务或 IBM Cloud® Hyper Protect Crypto Services 服务实例中指定的根密钥中的加密密钥来加密数据。
DevOps 流程通常需要各种类型的凭证(例如,用户名和密码、API 密钥、服务密钥和 SSH 密钥)来与其他系统进行交互,以构建、测试和部署应用程序。 您负责确保这些凭证不会无意中与凭证目标受众之外的人员共享。 恶意参与者对这些凭证的访问可能会中断您的 IT 运营,导致意外的成本,或者使用您的资源来启动攻击。 IBM 不负责保护和维护您的凭证的安全性。
要使凭证保持安全,请确保遵循以下指导信息:
- 不要将凭证存储在 Git 存储库中。 根据存储库设置,存储库中的文件可能对组织的其他成员、其他 IBM Cloud 用户或公用因特网可视。
- 不要在 Delivery Pipeline 定义中包含用户凭证,因为它们可能对其他用户可视。 具体来说,不要将用户凭证放置在 Delivery Pipeline 经典作业定义脚本、Delivery Pipeline Tekton yaml 文件或由 Delivery Pipeline 启动的脚本中。
- 不要在运行管道时创建的日志文件中发布用户凭证,因为这些文件可能会共享。
- 请勿在对 Continuous Delivery API 的调用中以纯文本形式指定凭证,例如,在配置 工具集成,Tekton 管道环境属性或 Tekton 管道触发器属性时。
- 请勿在调用 POST /toolchains/{toolchain_id}/events API 时包含凭证,个人标识信息或其他敏感信息。 API 将包含您指定的数据的事件发送到集成到工具链中的 Event Notifications 实例。Event Notifications 随后会将事件转发到已配置的目标,例如电子邮件,SMS 和 Slack。
- 请勿在 Terraform 配置文件中以纯文本形式指定凭证,例如在定义工具集成资源,Tekton 管道环境属性资源或 Tekton 管道触发器属性资源时。 而是在私钥存储服务中管理凭证,并通过 API 调用和 Terraform 配置中的引用来指定这些凭证。 有关通过引用管理私钥的更多信息,请参阅 使用私钥引用保护凭证。
IBM Cloud 提供了可用于安全密钥存储和私钥的多个选项。
- 经典管道安全环境属性
- Tekton 管道安全环境属性
- IBM® Key Protect for IBM Cloud®
- IBM Cloud® Hyper Protect Crypto Services
- HashiCorp 保险库文件
有关安全 DevOps 最佳实践的更多信息,请参阅 DevOps 安全性。
使用私钥引用保护凭证
使用 Continuous Delivery 工具链和交付管道 (例如密码,API 密钥,证书或其他令牌) 时可以配置的许多属性都分类为私钥或凭证。 要设置安全属性的值,可以使用纯文本或私钥引用。 使用私钥引用是设置安全属性值的建议方法。
使用 纯文本 私钥值设置安全属性时,Continuous Delivery 会主动加密并在内部存储该值。 虽然值在 Continuous Delivery 服务中保持安全,但该服务无法保护客户端上的值。 通过在浏览器中使用控制台,通过调用 API 或配置 Terraform 资源来设置安全属性时,可能会在本地系统上公开纯文本私钥。 纯文本秘密也更难轮换。 当必须轮换密钥 (例如 API 密钥) 时,还必须查找并更新所有具有密钥值的安全属性。
使用 私钥引用 值设置安全属性时,该值是一个特殊格式的字符串,用于引用私钥存储服务 (例如 IBM® Key Protect for IBM Cloud®,IBM Cloud® Secrets Manager 或 HashiCorp Vault) 中管理的私钥的位置或地址。 虽然 Continuous Delivery 主动在内部加密和存储私钥引用值,但私钥值不会在客户端上公开。 当 Continuous Delivery 必须检索私钥以代表您执行处理时,它将在内部从引用的私钥存储中检索值。 私钥引用也对旋转具有弹性。 通常,当私钥在私钥存储库中旋转时,该私钥的位置或地址保持不变。 仅更改私钥值本身。
支持两种类型的私钥引用: 按名称或按 云资源名称(CRN)。 目前,只有 Secrets Manager 工具集成支持通过 CRN 引用私钥。 此格式允许更大的灵活性,因为如果存在正确的 授权,那么您可以在其他帐户中引用 Secrets Manager 实例中的私钥。
确保在工具链的作用域内指定私钥引用时考虑以下先决条件:
- 必须将密钥库作为工具集成添加到工具链。 有关密钥库工具集成的更多信息,请参阅 配置 Key Protect,配置 Secrets Manager 和 配置 HashiCorp 保险库文件。
- 必须配置 IAM 服务到服务授权策略,以允许源工具链从目标私钥存储中检索私钥。 有关服务到服务授权的更多信息,请参阅 使用授权在服务之间授予访问权。
在控制台外部工作 (例如,使用 API 或 Terraform) 时,请按名称对私钥引用使用以下格式:
{vault::SECRET_STORE_INTEGRATION_NAME.SECRET_NAME}
当您引用 Key Protect中包含的私钥时。{vault::SECRET_STORE_INTEGRATION_NAME.SECRET_GROUP_NAME.SECRET_NAME}
当您引用 Secrets Manager中包含的私钥时。{vault::SECRET_STORE_INTEGRATION_NAME.SECRET_NAME.FIELD_NAME}
当您引用 Vault 中包含的机密时。HashiCorp
秘密价值
ref://secrets-manager.REGION.RESOURCE-GROUP.SECRETS-MANAGER-INSTANCE-NAME1/SECRETS-GROUP-NAME/SECRET-NAME
当您引用 Key Protect中包含的私钥时。ref://secrets-manager.eu-de.EU-RG.SM-1/default/api-key
当您引用 Secrets Manager中包含的私钥时。
例如,如果秘密是密钥值,则可以选择密钥:
ref://secrets-manager.eu-gb.Default.Secrets%20Manager-zc/Default/mk-kv-pair?key=ibmcloud-api-key
其中:
SECRETS-MANAGER-INSTANCE-NAME1
是工具链中私钥存储集成的名称,而不是 私钥存储服务实例的名称。SECRET_GROUP_NAME
是包含 Secrets Manager中的私钥的组的名称。SECRET_NAME
是秘密存储中的秘密名称。KEY_NAME
是键值秘钥中的键名。
要使用 CRN 私钥引用,请直接从 Secrets Manager UI 获取私钥 CRN,或者使用 CLI,API 或 SDK 以编程方式获取私钥 CRN。
使用控制台指定私钥引用
使用控制台时,将使用密钥图标对分类为安全的工具集成配置属性和 Delivery Pipeline 属性的字段进行注释。 单击此图标以打开一个对话框,您可以从该对话框中选择私钥存储和私钥。 或者,对于由 CRN 引用的私钥,请将 CRN 值直接粘贴到属性中。
使用 API 指定私钥引用
您可以在需要 IAM 不记名令牌的 API 调用中使用具有私钥引用值的安全属性。 或者,如果您正在使用 SDK,请 获取 IAM API 密钥,并使用环境变量设置客户机选项。
export CD_TOOLCHAIN_AUTH_TYPE=iam && \
export CD_TOOLCHAIN_APIKEY={iam_api_key} && \
export CD_TOOLCHAIN_URL=https://api.us-south.devops.cloud.ibm.com/toolchain/v2
按名称使用私钥引用
以下示例演示如何按名称私钥使用私钥引用。 它说明了如何创建与存储在 Key Protect实例中的 API 令牌 (Slack Webhook) 的 Slack 工具集成。 此示例假定工具链已包含 Key Protect 工具集成,并且存在从源工具链到目标 Key Protect 服务实例的 IAM 服务到服务授权策略。
curl -X POST \
https://api.us-south.devops.cloud.ibm.com/toolchain/v2/toolchains/01234567-89ab-cdef-0123-456789abcdef/tools \
-H "Authorization: Bearer $TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"tool_type_id": "slack",
"parameters": {
"api_token": "{vault::my-kms-tool-integration.my-slack-webhook}",
"channel_name": "my_slack_channel_name",
"team_url": "my_slack_team_name"
}
}'
const CdToolchainV2 = require('@ibm-cloud/continuous-delivery/cd-toolchain/v2');
...
(async () => {
const toolchainService = CdToolchainV2.newInstance();
const slackParameters = {
api_token: "{vault::my-kms-tool-integration.my-slack-webhook}",
channel_name: "my_slack_channel_name",
team_url: "my_slack_team_name"
};
const toolPrototypeModel = {
toolchainId: "01234567-89ab-cdef-0123-456789abcdef",
toolTypeId: "slack",
parameters: slackParameters
};
const slackTool = await toolchainService.createTool(toolPrototypeModel);
})();
import (
"github.com/IBM/continuous-delivery-go-sdk/cdtoolchainv2"
)
...
toolchainClientOptions := &cdtoolchainv2.CdToolchainV2Options{}
toolchainClient, err := cdtoolchainv2.NewCdToolchainV2UsingExternalConfig(toolchainClientOptions)
slackParameters := map[string]interface{}{
"api_token": "{vault::my-kms-tool-integration.my-slack-webhook}",
"channel_name": "my_slack_channel_name",
"team_url": "my_slack_team_name",
}
createToolOptions := toolchainClient.NewCreateToolOptions("01234567-89ab-cdef-0123-456789abcdef", "slack")
createToolOptions.SetParameters(slackParameters)
slackTool, response, err := toolchainClient.CreateTool(createToolOptions)
from ibm_continuous_delivery.cd_toolchain_v2 import CdToolchainV2
...
toolchain_service = CdToolchainV2.new_instance()
slack_parameters = {
"api_token": "{vault::my-kms-tool-integration.my-slack-webhook}",
"channel_name": "my_slack_channel_name",
"team_url": "my_slack_team_name"
}
slack_tool = toolchain_service.create_tool(
toolchain_id = "01234567-89ab-cdef-0123-456789abcdef",
tool_type_id = "slack",
parameters = slack_parameters
)
import com.ibm.cloud.continuous_delivery.cd_toolchain.v2.CdToolchain;
import com.ibm.cloud.continuous_delivery.cd_toolchain.v2.model.*;
...
CdToolchain toolchainService = CdToolchain.newInstance();
HashMap<String, Object> slackParameters = new HashMap<>();
slackParameters.put("api_token", "{vault::my-kms-tool-integration.my-slack-webhook}");
slackParameters.put("channel_name", "my_slack_channel_name");
slackParameters.put("team_url", "my_slack_team_name");
CreateToolOptions createSlackToolOptions = new CreateToolOptions.Builder()
.parameters(slackParameters)
.toolchainId({toolchain_id})
.toolTypeId("slack")
.build();
Response<ToolchainToolPost> response = toolchainService.createTool(createSlackToolOptions).execute();
ToolchainToolPost slackTool = response.getResult();
下表列出并描述了先前示例中使用的每个私钥引用值。
值 | 描述 |
---|---|
my-kms-tool-integration |
工具链中 Key Protect 工具集成的名称。 它不是 Key Protect 服务实例的名称。 |
my-slack-webhook |
在 Key Protect 服务实例中管理的标准密钥的名称。 |
使用 CRN 的私钥引用
以下示例演示了如何使用由 CRN 私钥引用的私钥。 它说明了如何创建与存储在 Secrets Manager实例中的 API 令牌 (Slack Webhook) 的 Slack 工具集成。 此示例假定工具链已包含 Secrets Manager 工具集成,并且存在从源工具链到目标 Secrets Manager 服务实例的 IAM 服务到服务授权策略。
curl -X POST \
https://api.us-south.devops.cloud.ibm.com/toolchain/v2/toolchains/01234567-89ab-cdef-0123-456789abcdef/tools \
-H "Authorization: Bearer $TOKEN" \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"tool_type_id": "slack",
"parameters": {
"api_token": "crn:v1:bluemix:public:secrets-manager:us-south:a/9bb43e401a7a87d15145da761da98571:604de62c-c04f-3f5e-b7e8-4acafe0ecde7:secret:5ec17023-b631-fbcb-ef9c-4f2eb01f1dda",
"channel_name": "my_slack_channel_name",
"team_url": "my_slack_team_name"
}
}'
const CdToolchainV2 = require('@ibm-cloud/continuous-delivery/cd-toolchain/v2');
...
(async () => {
const toolchainService = CdToolchainV2.newInstance();
const slackParameters = {
api_token: "crn:v1:bluemix:public:secrets-manager:us-south:a/9bb43e401a7a87d15145da761da98571:604de62c-c04f-3f5e-b7e8-4acafe0ecde7:secret:5ec17023-b631-fbcb-ef9c-4f2eb01f1dda",
channel_name: "my_slack_channel_name",
team_url: "my_slack_team_name"
};
const toolPrototypeModel = {
toolchainId: "01234567-89ab-cdef-0123-456789abcdef",
toolTypeId: "slack",
parameters: slackParameters
};
const slackTool = await toolchainService.createTool(toolPrototypeModel);
})();
import (
"github.com/IBM/continuous-delivery-go-sdk/cdtoolchainv2"
)
...
toolchainClientOptions := &cdtoolchainv2.CdToolchainV2Options{}
toolchainClient, err := cdtoolchainv2.NewCdToolchainV2UsingExternalConfig(toolchainClientOptions)
slackParameters := map[string]interface{}{
"api_token": "crn:v1:bluemix:public:secrets-manager:us-south:a/9bb43e401a7a87d15145da761da98571:604de62c-c04f-3f5e-b7e8-4acafe0ecde7:secret:5ec17023-b631-fbcb-ef9c-4f2eb01f1dda",
"channel_name": "my_slack_channel_name",
"team_url": "my_slack_team_name",
}
createToolOptions := toolchainClient.NewCreateToolOptions("01234567-89ab-cdef-0123-456789abcdef", "slack")
createToolOptions.SetParameters(slackParameters)
slackTool, response, err := toolchainClient.CreateTool(createToolOptions)
from ibm_continuous_delivery.cd_toolchain_v2 import CdToolchainV2
...
toolchain_service = CdToolchainV2.new_instance()
slack_parameters = {
"api_token": "crn:v1:bluemix:public:secrets-manager:us-south:a/9bb43e401a7a87d15145da761da98571:604de62c-c04f-3f5e-b7e8-4acafe0ecde7:secret:5ec17023-b631-fbcb-ef9c-4f2eb01f1dda",
"channel_name": "my_slack_channel_name",
"team_url": "my_slack_team_name"
}
slack_tool = toolchain_service.create_tool(
toolchain_id = "01234567-89ab-cdef-0123-456789abcdef",
tool_type_id = "slack",
parameters = slack_parameters
)
import com.ibm.cloud.continuous_delivery.cd_toolchain.v2.CdToolchain;
import com.ibm.cloud.continuous_delivery.cd_toolchain.v2.model.*;
...
CdToolchain toolchainService = CdToolchain.newInstance();
HashMap<String, Object> slackParameters = new HashMap<>();
slackParameters.put("api_token", "crn:v1:bluemix:public:secrets-manager:us-south:a/9bb43e401a7a87d15145da761da98571:604de62c-c04f-3f5e-b7e8-4acafe0ecde7:secret:5ec17023-b631-fbcb-ef9c-4f2eb01f1dda");
slackParameters.put("channel_name", "my_slack_channel_name");
slackParameters.put("team_url", "my_slack_team_name");
CreateToolOptions createSlackToolOptions = new CreateToolOptions.Builder()
.parameters(slackParameters)
.toolchainId({toolchain_id})
.toolTypeId("slack")
.build();
Response<ToolchainToolPost> response = toolchainService.createTool(createSlackToolOptions).execute();
ToolchainToolPost slackTool = response.getResult();
使用 Terraform 指定私钥引用
您可以在 Terraform 中使用具有私钥引用值的安全属性。
按名称使用私钥引用
以下示例显示 Key Protect 服务实例,标准密钥 (Slack Webhook),工具链,IAM 服务到服务授权策略,Key Protect 工具集成以及按名称引用 Webhook 私钥的 Slack 工具集成的完整资源集。
此示例还包含 ibm_kms_key
标准密钥资源,其中 payload
设置为 base64-encoded Slack Webhook 私钥。 它显示了密钥的名称与 Slack 工具集成资源中私钥引用的值之间的关系。 在实践中,更安全的做法是从单独的 Terraform 项目或其他过程中提前创建标准密钥,只有有限的授权人员才能访问该项目。
variable "slack_webhook" {}
variable "slack_channel" {}
variable "slack_team" {}
data "ibm_resource_group" "rg" {
name = "default"
}
resource "ibm_resource_instance" "kms" {
name = "my-kms-service-instance"
service = "kms"
plan = "tiered-pricing"
location = "us-south"
resource_group_id = data.ibm_resource_group.rg.id
}
resource "ibm_kms_key" "key" {
instance_id = ibm_resource_instance.kms.guid
key_name = "my-slack-webhook"
standard_key = true
payload = base64encode(var.slack_webhook)
}
resource "ibm_cd_toolchain" "toolchain" {
name = "tf-toolchain-secret-refs"
resource_group_id = data.ibm_resource_group.rg.id
}
resource "ibm_iam_authorization_policy" "s2s" {
source_service_name = "toolchain"
source_resource_instance_id = ibm_cd_toolchain.toolchain.id
target_service_name = "kms"
target_resource_instance_id = ibm_resource_instance.kms.guid
roles = ["Viewer", "ReaderPlus"]
}
resource "ibm_cd_toolchain_tool_keyprotect" "integration" {
toolchain_id = ibm_cd_toolchain.toolchain.id
parameters {
name = "my-kms-tool-integration"
region = var.region
resource_group = data.ibm_resource_group.rg.name
instance_name = ibm_resource_instance.kms.name
}
depends_on = [
ibm_iam_authorization_policy.s2s
]
}
resource "ibm_cd_toolchain_tool_slack" "integration" {
toolchain_id = ibm_cd_toolchain.toolchain.id
parameters {
webhook = "{vault::my-kms-tool-integration.my-slack-webhook}"
channel_name = var.slack_channel
team_name = var.slack_team
}
depends_on = [
ibm_cd_toolchain_tool_keyprotect.integration
ibm_kms_key.key
]
}
下表列出并描述了上一个示例中使用的每个私钥引用值。
值 | 描述 |
---|---|
my-kms-tool-integration |
工具链中 Key Protect 工具集成的名称。 它不是 Key Protect 服务实例的名称。 |
my-slack-webhook |
在 Key Protect 服务实例中管理的标准密钥的名称。 |
使用 CRN 的私钥引用
以下示例假定存在 Secrets Manager 实例。 它显示任意私钥 (Slack Webhook),工具链,IAM 服务到服务授权策略,Secrets Manager 工具集成以及通过 CRN 引用 Webhook 私钥的 Slack 工具集成的资源。
此示例包含具有设置为 Slack Webhook 私钥的 payload
的 ibm_sm_arbitrary_secret
密钥资源。 它说明了如何使用密钥资源中的 CRN 作为 Slack 工具集成资源中私钥引用的值。 在实践中,更安全的做法是从单独的 Terraform 项目或其他过程中提前创建标准密钥,只有有限的授权人员才能访问该项目。
variable "slack_webhook" {}
variable "slack_channel" {}
variable "slack_team" {}
variable "secrets_manager_name" {}
data "ibm_resource_group" "rg" {
name = "default"
}
data ibm_resource_instance "sm" {
name = var.secrets_manager_name
}
resource "ibm_sm_arbitrary_secret" "key" {
instance_id = data.ibm_resource_instance.sm.guid
region = data.ibm_resource_instance.sm.location
secret_group_id = "default"
name = "my-slack-webhook"
payload = "var.slack_webhook"
}
resource "ibm_cd_toolchain" "toolchain" {
name = "tf-toolchain-secret-refs"
resource_group_id = data.ibm_resource_group.rg.id
}
resource "ibm_iam_authorization_policy" "s2s" {
source_service_name = "toolchain"
source_resource_instance_id = ibm_cd_toolchain.toolchain.id
target_service_name = "secrets-manager"
target_resource_instance_id = data.ibm_resource_instance.sm.guid
roles = ["Viewer", "SecretsReader"]
}
resource "ibm_cd_toolchain_tool_secretsmanager" "integration" {
toolchain_id = ibm_cd_toolchain.toolchain.id
parameters {
name = "my-sm-tool-integration"
instance_id_type = "instance-crn"
instance_crn = data.ibm_resource_instance.sm.resource_crn
}
depends_on = [
ibm_iam_authorization_policy.s2s
]
}
resource "ibm_cd_toolchain_tool_slack" "integration" {
toolchain_id = ibm_cd_toolchain.toolchain.id
parameters {
webhook = ibm_sm_arbitrary_secret.key.crn
channel_name = var.slack_channel
team_name = var.slack_team
}
depends_on = [
ibm_cd_toolchain_tool_secretsmanager.integration
]
}
使用客户管理的密钥保护数据
缺省情况下,Continuous Delivery 会使用 Continuous Delivery 服务内部的密钥来加密数据。 为提高安全性和控制能力,您可以配置 Continuous Delivery 以使用您管理的密钥对数据进行加密。 此选项仅在 Professional 套餐下可用,并且仅在您供应 Continuous Delivery 服务实例时可用。 如果选择您自己的密钥管理服务 (例如 Key Protect 或 IBM Cloud® Hyper Protect Crypto Services),那么将使用您自己的密钥而不是 Continuous Delivery 服务内部的加密密钥来加密以下值。
组件 | 值 |
---|---|
工具链 | 属性和参数 |
管道 |
|
集成 |
|
IBM Cloud® DevOps Insights | 测试记录中的附件 |
以下组件仅使用提供者管理的加密密钥来加密个人数据。
组件 | 值 |
---|---|
Git Repos and Issue Tracking |
|
有关创建使用客户密钥加密数据的 Continuous Delivery 服务实例的更多信息,请参阅 创建 Continuous Delivery 服务实例。
使用第三方工具集成时保护数据
为工具链配置工具集成时,将显式启用 Continuous Delivery 服务与工具集成之间的数据共享。 共享数据的类型以及数据是发送到工具,从工具接收还是同时发送,根据工具集成的类型而有所不同。
在配置工具集成之前,请确保了解共享的数据。 如果使用您认为敏感的受监管数据或数据,请确保第三方工具使用情况以及可能与其共享的任何数据不会影响资源的机密性,完整性或可用性,或者违反监管控制。
要了解有关工具集成的更多信息,请参阅 配置工具集成。
使用 Git Repos and Issue Tracking 时保护数据
Git Repos and Issue Tracking 是 Continuous Delivery 服务的 IBM托管的组件。 您提供给 Git Repos and Issue Tracking的所有数据 (包括但不限于源文件,问题,拉取请求和项目配置属性) 都在 Continuous Delivery中进行安全管理。 但是,Git Repos and Issue Tracking 支持用于向用户和第三方导出,发送或以其他方式共享数据的各种机制。
Git Repos and Issue Tracking 共享信息的能力是许多社交编码平台的典型能力。 但是,此类共享可能与适用于您业务的监管控制相冲突。 在 Git Repos and Issue Tracking中创建项目后,但在将任何文件,问题,记录或其他数据委托给项目之前,请查看项目设置并更改您认为保护数据所需的任何设置。 要复审的设置包括可视性级别,电子邮件通知,集成,Web 挂钩,访问令牌,部署令牌和部署密钥。
项目可视性级别
Git Repos and Issue Tracking 项目可以具有下列其中一个可视性级别 :private,internal 或 public。
- 专用项目仅对项目成员可见。 此设置是新项目的缺省可视性级别,并且是数据的最安全可视性级别。
- 内部项目对登录到 IBM Cloud的所有用户可见。
- 任何人都可以看到公共项目。
要将项目访问权仅限于项目成员,请完成以下步骤:
- 从项目侧边栏中,单击 设置 > 常规。
- 在“常规设置”页面上,单击 可视性 > 项目功能部件 > 许可权。
- 找到“项目可视性”设置。
- 如果尚未选择,请选择 “私人”。
- 单击保存更改。
项目成员资格
Git Repos and Issue Tracking 是云托管的社交编码环境,可供所有 Continuous Delivery 用户使用。 如果您是 Git Repos and Issue Tracking 项目维护者或所有者,那么可以邀请任何用户和组成员加入该项目。IBM Cloud 对您可以邀请到项目的人员没有任何限制。 因为您可以邀请任何人加入 GitLab 项目,所以请注意只邀请那些属于您公司或组织的用户或组,除非您明确打算不这样做。
有关管理 GitLab 项目成员的更多信息,请参阅 项目成员。
项目电子邮件设置
缺省情况下,Git Repos and Issue Tracking 通过电子邮件通知项目成员有关项目活动的信息。 这些电子邮件通常包含用户提供给 Git Repos and Issue Tracking 的客户拥有的数据。 例如,如果用户向问题发布注释,那么 Git Repos and Issue Tracking 会向所有订户发送一封电子邮件,其中包含诸如注释副本,发布注释的用户以及发布注释的时间等信息。 要关闭项目的所有电子邮件通知,请完成以下步骤:
- 从项目侧边栏中,单击 设置 > 常规。
- 在“常规设置”页面上,单击 可视性 > 项目功能部件 > 许可权。
- 选中 禁用电子邮件通知 复选框。
- 单击保存更改。
项目集成和 Webhook
Git Repos and Issue Tracking 项目还可以通过与其他系统的集成或 Webhook 进行配置,或者配备访问令牌,部署令牌和部署密钥。 要查看或更改可能与项目一起配置的集成,Webhook,令牌和密钥,请从项目侧边栏完成以下步骤:
- 从项目侧边栏中,单击 设置。
- 单击 集成 以使用项目与其他应用程序的集成。
- 单击 Webhook 以将项目的 Webhook 用于其他系统。
- 单击 访问令牌 以使用可能授予项目访问权的访问令牌。
- 展开 部署令牌 以使用可能授予项目访问权的部署令牌。
- 展开 部署密钥 以使用可授予项目访问权的部署密钥。
要了解有关使用 Git Repos and Issue Tracking的更多信息,请参阅 Git Repos and Issue Tracking。
使用 Delivery Pipeline 时保护数据
Continuous Delivery 管道运行您提供的作业和步骤。 Continuous Delivery 服务安全地管理由管道运行生成的日志输出和构建工件。 但是,Continuous Delivery 不会限制或管理管道作业或步骤脚本的功能。
在开发和配置管道作业和步骤脚本时,请确保脚本不会运行可能损害资源的机密性,完整性或可用性或违反法规控制的操作。
要了解有关 Delivery Pipeline 的更多信息,请参阅 使用管道 和 使用 Tekton 管道。
使用 Terraform 时保护数据
使用 Terraform 来管理 Continuous Delivery 资源时,Terraform 处理的某些变量,自变量和属性可能包含密码或 API 令牌之类的私钥值。 这些值可能由您在 Terraform 配置语言文件中指定,也可能由 Terraform 工具以 Terraform 状态检索和/或存储。 以下列表提供了使用 Terraform 时必须保护的私钥值的示例。
- IBM Cloud Terraform Provider 需要向 IBM Cloud认证的 IAM API 密钥。 此键在 Terraform 模块的
provider "ibm"
块的ibmcloud_api_key
自变量中指定。 - 表示某些
ibm_cd_toolchain_tool
资源和数据源中的密码,访问令牌,API 密钥或其他类型私钥的参数或属性。 - 在某些
ibm_cd_tekton_pipeline_property
或ibm_cd_tekton_pipeline_trigger_property
资源或数据源中指定为私钥的属性值。
使用 IBM Cloud Schematics 和以下实践来限制敏感数据的暴露:
- 使用 Terraform 变量将值注入到 Terraform 块中。
- 使用 IBM Cloud Schematics 来安全地管理和共享私钥。
- 使用 IBM Cloud Schematics 来安全地管理和共享 Terraform 状态。
- 在
ibm_cd_toolchain_tool
,ibm_cd_tekton_pipeline_property
或ibm_cd_tekton_pipeline_trigger_property
资源中指定私钥时,请使用 Continuous Delivery 私钥引用。
如果您正在使用 Terraform 命令行工具,请使用以下实践来限制敏感数据的暴露:
- 使用 Terraform 变量将值注入到 Terraform 块中。
- 允许 Terraform 命令行工具在运行
terraform plan
或terraform apply
之类的命令时提示输入值。 - 控制对 Terraform 状态的访问,因为它可能包含私钥。 本地 Terraform 状态以纯文本编写。
- 在
ibm_cd_toolchain_tool
,ibm_cd_tekton_pipeline_property
或ibm_cd_tekton_pipeline_trigger_property
资源中指定私钥时,请使用 Continuous Delivery 私钥引用。
要限制敏感数据的暴露,请避免以下做法:
- 在任何 Terraform 块 (例如资源块,数据块或提供程序块) 内以纯文本编写私钥。
- 在
terraform.tfvars
,terraform.tfvars.json
,*.auto.tfvars
或*.auto.tfvars.json
文件中以纯文本编写私钥。 - 将包含私钥的
terraform.tfvars
,terraform.tfvars.json
,*.auto.tfvars
或*.auto.tfvars.json
文件交付到源代码存储库。 - 将 Terraform 状态交付到源代码存储库中。
使用 IBM Cloud Schematics 而不是 Terraform 命令行工具来处理 Terraform 配置。IBM Cloud Schematics 提供多种优势,例如敏感配置属性的安全存储。
有关 IBM Cloud Schematics 的更多信息,请参阅 IBM Cloud Schematics 文档。
有关处于 Terraform 状态的敏感数据的更多信息,请参阅 处于状态的敏感数据。
有关如何在 Terraform 中设置输入变量的更多信息,请参阅 将值分配给根模块变量。
从 Continuous Delivery 中删除数据
删除 Continuous Delivery 服务实例时,不会删除相关工具链,工具集成,工具和数据 (包括个人数据)。 有关如何管理和删除使用工具链,工具集成和工具存储的数据的更多信息,请参阅 修改,浏览和删除个人数据。