Continuous Delivery의 데이터 보안

DevOps Insights 2026년 8월 31일에 서비스 종료되어 중단될 예정입니다. Continuous Delivery 은 2027년 2월 12일에 au-syd, ca-tor, us-east 지역에서 중단될 예정입니다. 또한 해당 날짜를 기점으로 ‘Code Risk Analyzer’도 모든 지역에서 서비스가 중단될 예정입니다. 특정 지역에서 해당 기능을 실제로 사용하지 않는 경우, 해당 지역의 기능은 예정보다 일찍 중단될 수 있으며 새로운 인스턴스 등록이 중단될 수 있습니다. 자세히 알아보기

IBM Cloud® Continuous Delivery는 고가용성 보안 환경에서 데이터베이스를 호스팅합니다.

  • 데이터는 Continuous Delivery 서비스 및 종속되는 서비스와 인프라 내부에 있는 암호화 키를 사용하여 저장 시(GPFS, LUKS 및 기본 제공 디스크) 및 전송 중(HTTPS 및 SSH)에 암호화됩니다.
  • 개인 정보는 프로페셔널 요금제에서만 암호화할 수 있습니다 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 Classic 작업 정의 스크립트, Delivery Pipeline Tekton yaml 파일 또는 Delivery Pipeline에서 시작된 스크립트에 배치하지 않습니다.
  • 이러한 파일은 공유될 수 있으므로 파이프라인을 실행할 때 작성되는 로그 파일에서 사용자 인증 정보를 공개하지 않습니다.
  • 도구 통합, Tekton 파이프라인 환경 특성또는 Tekton 파이프라인 트리거 특성을 구성하는 경우와 같이 Continuous Delivery API에 대한 호출에서 일반 텍스트로 신임 정보를 지정하지 마십시오.
  • POST /toolchains/{toolchain_id}/events API에 대한 호출에 신임 정보, 개인 식별 정보 또는 기타 민감한 정보를 포함하지 마십시오. API는 사용자가 지정하는 데이터를 포함하는 이벤트를 도구 체인에 통합된 Event Notifications 의 인스턴스로 전송합니다. Event Notifications 는 이후에 이벤트를 구성된 대상 (예: 이메일, SMS및 Slack) 으로 전달합니다.
  • 도구 통합 리소스, Tekton 파이프라인 환경 특성 리소스 또는 Tekton 파이프라인 트리거 특성 리소스를 정의하는 경우와 같이 Terraform 구성 파일에서 일반 텍스트로 신임 정보를 지정하지 마십시오. 대신 시크릿 스토리지 서비스에서 신임 정보를 관리하고 API 호출 및 Terraform 구성에서 참조로 지정하십시오. 참조로 시크릿을 관리하는 방법에 대한 자세한 정보는 시크릿 참조를 사용하여 신임 정보 보호 를 참조하십시오.

IBM Cloud에서는 보안 키 스토리지 및 시크릿에 사용할 수 있는 여러 옵션을 제공합니다.

보안 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 인스턴스에서 시크릿을 참조할 수 있으므로 이 형식을 사용하면 유연성이 향상됩니다.

도구 체인의 범위 내에서 시크릿 참조를 지정하기 위해 다음 전제조건을 고려해야 합니다.

콘솔 외부에서 작업하는 경우 (예: API 또는 Terraform 사용) 이름별 시크릿 참조에 대해 다음 형식을 사용하십시오.

  • {vault::SECRET_STORE_INTEGRATION_NAME.SECRET_NAME} Key Protect내에 포함된 시크릿을 참조하는 경우.
  • Secrets Manager내에 포함된 시크릿을 참조하는 경우 {vault::SECRET_STORE_INTEGRATION_NAME.SECRET_GROUP_NAME.SECRET_NAME}.
  • {vault::SECRET_STORE_INTEGRATION_NAME.SECRET_NAME.FIELD_NAME} 에 포함된 비밀을 참조할 때 HashiCorp Vault.

비밀 가치:

  • ref://secrets-manager.REGION.RESOURCE-GROUP.SECRETS-MANAGER-INSTANCE-NAME1/SECRETS-GROUP-NAME/SECRET-NAME Key Protect내에 포함된 시크릿을 참조하는 경우.
  • Secrets Manager내에 포함된 시크릿을 참조하는 경우 ref://secrets-manager.eu-de.EU-RG.SM-1/default/api-key.

예를 들어 비밀 번호가 키 값인 경우 키를 선택할 수 있습니다:

  • 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에서 직접 또는 CLI, API 또는 SDK를 사용하여 프로그래밍 방식으로 시크릿 CRN을 확보하십시오.

콘솔을 사용하여 시크릿 참조 지정

콘솔을 사용할 때 보안으로 분류되는 도구 통합 구성 특성 및 Delivery Pipeline 특성에 대한 필드는 키 아이콘으로 어노테이션이 지정됩니다. 시크릿 저장소 및 시크릿을 선택할 수 있는 대화 상자를 열려면 이 아이콘을 클릭하십시오. 또는 CRN에 의한 시크릿 참조의 경우 CRN값을 특성에 직접 붙여넣으십시오.

API를 사용하여 시크릿 참조 지정

IAM Bearer 토큰이 필요한 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 웹훅) 과의 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 웹훅) 과의 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 웹훅), 도구 체인, IAM 서비스 대 서비스 권한 정책, Key Protect 도구 통합 및 이름별로 웹훅 시크릿을 참조하는 Slack 도구 통합에 대한 전체 자원 세트를 표시합니다.

이 예제에는 Slack 웹훅 base64-encoded 비밀번호로 설정된 표준 키 payload ibm_kms_key 리소스도 포함됩니다. 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 웹훅), 도구 체인, IAM 서비스 대 서비스 권한 부여 정책, Secrets Manager 도구 통합 및 CRN에서 웹훅 시크릿을 참조하는 Slack 도구 통합에 대한 리소스가 표시됩니다.

이 예제에는 Slack 웹훅 시크릿으로 설정된 payload 가 있는 ibm_sm_arbitrary_secret 키 자원이 포함되어 있습니다. Slack 도구 통합 자원 내에서 시크릿 참조의 값으로 키 자원의 CRN을 사용하는 방법을 표시합니다. 실제로 별도의 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 서비스 내부의 암호화 키 대신 사용자가 지정한 키를 사용하여 암호화됩니다.

사용자 지정 키를 사용하여 암호화된 값
컴포넌트
Toolchain 특성 및 매개변수
파이프라인 * 특성 키 및 값
* 작업 로그
* 작업 아티팩트
통합 * Slack (Slack 웹훅)
* Pagerduty (API 액세스 키, 통합 키)
* Sauce Labs (액세스 키)
* Artifactory (API 키)
* HashiCorp Vault (토큰, 역할 ID, 비밀 ID, 비밀번호)
* Jenkins ( Jenkins API 토큰)
* JIRA (JIRA API 토큰)
* Nexus (인증 토큰)
* Rational Team Concert (비밀번호)
* Sonarqube ( SonarQube 비밀번호 또는 인증 토큰)
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에서 프로젝트를 작성한 후에 하지만 프로젝트에 파일, 문제, 레코드 또는 기타 데이터를 위임하기 전에, 프로젝트 설정을 검토하고 데이터를 보호하는 데 필요하다고 판단되는 모든 설정을 변경하십시오. 검토할 설정에는 가시성 레벨, 이메일 알림, 통합, 웹훅, 액세스 토큰, 배치 토큰 및 배치 키가 포함됩니다.

프로젝트 및 파일 이름 지정

Git Repos and Issue Tracking 에서 프로젝트 이름과 프로젝트 저장소에 저장된 파일의 경로 이름은 브라우저, API 또는 Terraform을 통해 프로젝트와 상호 작용하는 데 사용하는 URL의 세그먼트가 됩니다. URL은 안전하지 않다고 가정해야 합니다. 따라서 프로젝트 이름과 리포지토리 파일 경로 이름에 민감한 정보를 사용하거나 포함하지 마세요.

프로젝트 가시성 레벨

Git Repos and Issue Tracking 프로젝트는 private, internal 또는 public의 가시성 레벨 중 하나를 포함할 수 있습니다.

  • Private 프로젝트는 프로젝트 멤버만 볼 수 있습니다. 이 설정은 새 프로젝트에 대한 기본 가시성 레벨이며, 데이터에 대한 가장 안전한 가시성 레벨입니다.
  • 내부 프로젝트는 IBM Cloud 에 로그인한 모든 사용자가 볼 수 있습니다.
  • Public 프로젝트는 모든 사용자가 볼 수 있습니다.

프로젝트 멤버로만 프로젝트 액세스를 제한하려면 다음 단계를 완료하십시오.

  1. 프로젝트 사이드바에서 설정 > 일반을 클릭하십시오.
  2. 일반 설정 페이지에서 가시성 > 프로젝트 기능 > 권한을 클릭하십시오.
  3. 프로젝트 가시성 설정을 찾으십시오.
  4. 아직 선택하지 않은 경우 Private을 선택하십시오.
  5. 변경사항 저장을 클릭하십시오.

프로젝트 멤버십

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에서는 주석의 사본, 게시한 사용자 및 주석이 게시된 시기와 같은 정보가 포함된 이메일을 모든 구독자에게 전송합니다. 프로젝트에 대한 모든 이메일 알림을 끄려면, 다음 단계를 완료하십시오.

  1. 프로젝트 사이드바에서 설정 > 일반을 클릭하십시오.
  2. 일반 설정 페이지에서 가시성 > 프로젝트 기능 > 권한을 클릭하십시오.
  3. 이메일 알림 사용 안함 선택란을 선택하십시오.
  4. 변경사항 저장을 클릭하십시오.

프로젝트 통합 및 웹훅

Git Repos and Issue Tracking 프로젝트는 다른 시스템에 대한 통합 또는 웹훅으로 구성되거나 액세스 토큰, 배치 토큰 및 배치 키가 내장되어 있을 수도 있습니다. 프로젝트 사이드바에서, 프로젝트에 구성될 수 있는 통합, 웹훅, 토큰 및 키를 검토하거나 변경하려면 다음 단계를 완료하십시오.

  1. 프로젝트 사이드바에서 설정을 클릭하십시오.
  2. 다른 애플리케이션과 프로젝트의 통합에 대해 작업하려면 통합을 클릭하십시오.
  3. 다른 시스템에 대한 프로젝트의 웹훅에 대해 작업하려면 웹훅을 클릭하십시오.
  4. 프로젝트에 대한 액세스를 부여할 수 있는 액세스 토큰에 대해 작업하려면 액세스 토큰을 클릭하십시오.
  5. 프로젝트에 대한 액세스를 부여할 수 있는 배치 토큰에 대해 작업하려면 배치 토큰을 펼치십시오.
  6. 프로젝트에 대한 액세스 권한을 부여할 수 있는 배치 키에 대해 작업하려면 배치 키를 펼치십시오.

Git Repos and Issue Tracking에 대한 작업에 대해 자세히 알아보려면 Git Repos and Issue Tracking의 내용을 참조하십시오.

Delivery Pipeline 사용 시 데이터 보호

Continuous Delivery Pipeline은 사용자가 제공하는 작업 및 단계를 실행합니다. Continuous Delivery 서비스는 파이프라인 실행에 의해 생성되는 빌드 아티팩트 및 로그 출력을 안전하게 관리합니다. 그러나 Continuous Delivery에서 파이프라인 작업 또는 단계 스크립트의 기능을 제한하거나 관리하지는 않습니다.

파이프라인 작업 및 단계 스크립트를 개발하고 구성하는 경우, 스크립트가 자원의 기밀성, 무결성 또는 가용성을 손상시키거나 규제 제어를 위반할 수 있는 조치를 실행하지 않는지 확인하십시오.

배달 파이프라인 추가-마스크 명령

Tekton 워커 에이전트(버전 0.22.3 +)는 로그 출력에서 민감한 값을 줄 단위로 동적으로 마스킹할 수 있는 마스크 추가 기능을 지원합니다. 로그 행에 ::add-mask::{value} 패턴이 포함되어 있으면 출력에서 마커가 제거되고 나머지 로그 스트림에 대해 *** 로 값이 마스킹됩니다.

사용량

다음 예시를 확인하여 add-mask 명령의 사용법을 이해할 수 있습니다.

입력 로그:

Setting up authentication
API Key: ::add-mask::sk_live_abc123xyz
Using API key for requests
API response: {"key": "sk_live_abc123xyz", "status": "ok"}

출력 로그:

Setting up authentication
API Key: ***
Using API key for requests
API response: {"key": "***", "status": "ok"}

작업 방식

add-mask 명령을 사용하면 시스템이 다음 단계를 실행합니다:

  1. 줄에 ::add-mask::{value} 이 포함된 경우 시스템:

    • 출력에서 ::add-mask:: 마커를 제거합니다
    • ::add-mask:: (줄 끝까지) 이후의 모든 것을 마스킹할 값으로 추출합니다
    • 현재 줄의 값을 *** 로 바꿉니다
    • 마스크 목록에 값을 추가합니다
  2. 이후의 모든 줄에 대해:

    • 이전에 마스킹된 값은 자동으로 다음과 같이 대체됩니다 ***

다중 마스크

로그 전체에서 여러 값을 마스킹할 수 있습니다:

입력:

Setting password ::add-mask::myP@ssw0rd
Setting token ::add-mask::ghp_abc123
Credentials: myP@ssw0rd, token: ghp_abc123

출력:

Setting password ***
Setting token ***
Credentials: ***, token: ***

Delivery Pipeline에 대해 자세히 알아보려면, 파이프라인에 대한 작업Tekton Pipeline에 대한 작업을 참조하십시오.

Terraform 사용 시 데이터 보호하기

Terraform을 사용하여 Continuous Delivery 리소스를 관리하는 경우 Terraform에서 처리하는 일부 변수, 인수 및 속성은 비밀번호 또는 API 토큰과 같은 시크릿 값을 전달할 수 있습니다. 이러한 값은 Terraform 구성 언어 파일에서 사용자에 의해 지정되거나, Terraform 도구에 의해 Terraform 상태에서 검색되고 저장될 수 있습니다. 또는 둘 다일 수 있습니다. 다음 목록은 Terraform을 사용할 때 보호해야 하는 시크릿 값의 예를 제공합니다.

  • IBM Cloud Terraform 제공자가 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 plan 또는 terraform apply 와 같은 명령을 실행할 때 Terraform 명령행 도구가 값에 대한 프롬프트를 표시하도록 허용하십시오.
  • 시크릿을 포함할 수 있으므로 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 사용하십시오. 는 민감한 구성 속성의 안전한 저장 등 여러 장점을 제공합니다 IBM Cloud Schematics.

IBM Cloud Schematics에 대한 자세한 정보는 IBM Cloud Schematics 문서의 내용을 참조하십시오.

Terraform 상태의 민감한 데이터에 대한 자세한 정보는 상태의 민감한 데이터를 참조하십시오.

Terraform에서 입력 변수를 설정하는 방법에 대한 자세한 정보는 루트 모듈 변수에 값 지정을 참조하십시오.

Continuous Delivery에서 데이터 삭제

Continuous Delivery 서비스 인스턴스를 삭제해도 관련 도구 체인, 도구 통합, 도구 및 데이터(개인 데이터 포함)는 삭제되지 않습니다. 도구 체인, 도구 통합 및 도구와 함께 저장된 데이터를 관리하고 삭제하는 방법에 대한 자세한 정보는 개인 데이터 수정, 탐색 및 삭제를 참조하십시오.