Sécurisation de vos données dans Continuous Delivery

DevOps Insights Le service prendra fin et sera interrompu le 31 août 2026. Le service Continuous Delivery sera interrompu dans les régions suivantes le 12 février 2027 : au-syd, ca-tor, us-east. Code Risk Analyzer sera également retiré du marché dans toutes les régions à cette date. Si ces fonctionnalités ne sont pas activement utilisées dans une région donnée, elles pourraient y être supprimées plus tôt et ne plus accepter de nouvelles instances. En savoir plus

IBM Cloud® Continuous Delivery héberge vos bases de données dans un environnement hautement disponible et sécurisé :

  • Les données sont chiffrées au repos (GPFS, LUKS et disque intégré) et en transit (HTTPS et SSH) à l'aide de clés de chiffrement internes au service Continuous Delivery ou en utilisant les services et l'infrastructure dont elles dépendent.
  • Le chiffrement des données personnelles n'est possible que dans le cadre de la formule Professional, à l'aide d'une clé racine au sein d'une instance du service IBM® Key Protect for IBM Cloud® ou du service IBM Cloud® Hyper Protect Crypto Services.
  • Les données d'identification client et système sont stockées sur des disques chiffrés.
  • Les données de configuration pour les intégrations d'outils et les valeurs de propriétés Delivery Pipeline peuvent comporter des informations sensibles. Ces données sont chiffrées à l'aide de clés de chiffrement internes au service Continuous Delivery car elles sont stockées dans des bases de données qui sont internes au service.
  • L'application et les données sont configurées pour la haute disponibilité.
  • L'accès aux données est limité uniquement aux utilisateurs qui en ont besoin pour prendre en charge le service et assurer sa maintenance.

Protection de vos données sensibles dans Continuous Delivery

Le service Continuous Delivery chiffre les données sensibles appartenant au client avant de les stocker dans des bases de données utilisées par le service en interne. Les données sensibles comprennent les données de configuration d'intégration d'outils tiers et des valeurs de propriétés Delivery Pipeline. Les données sont chiffrées à l'aide de clés de chiffrement internes au service Continuous Delivery ou à l'aide de clés de chiffrement dérivées de la clé racine spécifiée dans une instance du service IBM® Key Protect for IBM Cloud® ou du service IBM Cloud® Hyper Protect Crypto Services.

Les processus DevOps requièrent souvent différents types de données d'identification (par exemple, des noms d'utilisateur et des mots de passe, des clés d'API, des clés de service et des clés SSH) pour interagir avec d'autres systèmes afin de générer, tester et déployer des applications. C'est à vous de garantir que ces données d'identification ne sont pas partagées par inadvertance avec des utilisateurs auxquels elles sont destinées. L'accès à ces données d'identification par des intervenants malveillants peut perturber vos opérations informatiques, entraîner des coûts imprévus ou l'utilisation de vos ressources pour lancer des attaques. IBM n'est pas responsable de la protection et du maintien de la sécurité de vos données d'identification.

Pour sécuriser vos données d'identification, veillez à suivre les conseils suivants :

  • Ne stockez pas les données d'identification dans des référentiels Git. Selon les paramètres du référentiel, les fichiers d'un référentiel peuvent être visibles par les autres membres de votre organisation, les autres utilisateurs IBM Cloud ou l'Internet public.
  • N'incluez pas les données d'identification d'utilisateur dans des définitions Delivery Pipeline car elles pourraient être visibles par d'autres utilisateurs. Plus précisément, ne placez pas les données d'identification de l'utilisateur dans des scripts de définition de travail Delivery Pipeline Classic, des fichiers yaml Delivery Pipeline Tekton ou des scripts démarrés par des pipelines de distribution.
  • Ne publiez pas les données d'identification d'utilisateur dans des fichiers journaux créés lors de l'exécution d'un pipeline car ces fichiers pourraient être partagés.
  • Ne spécifiez pas de données d'identification en texte en clair dans les appels aux API Continuous Delivery, par exemple lorsque vous configurez des intégrations d'outils, des propriétés d'environnement de pipeline Tektonou des propriétés de déclencheur de pipeline Tekton.
  • N'incluez pas de données d'identification, d'informations d'identification personnelle ou d'autres informations sensibles dans les appels à l'API POST /toolchains/{toolchain_id}/events. L'API envoie des événements contenant les données que vous spécifiez aux instances de Event Notifications qui sont intégrées à la chaîne d'outils. Event Notifications transmettra ensuite les événements à des destinations configurées telles que le courrier électronique, les SMS et Slack.
  • Ne spécifiez pas de données d'identification en texte en clair dans les fichiers de configuration Terraform, par exemple lorsque vous définissez des ressources d'intégration d'outils, des ressources de propriété d'environnement de pipeline Tekton ou des ressources de propriété de déclencheur de pipeline Tekton. A la place, gérez les données d'identification dans un service de stockage de secrets et spécifiez-les par référence dans les appels d'API et les configurations Terraform. Pour plus d'informations sur la gestion des secrets par référence, voir Protection de vos données d'identification à l'aide de références de secrets.

IBM Cloud fournit plusieurs options que vous pouvez utiliser pour le stockage des clés sécurisées et des valeurs confidentielles.

Pour plus d'informations sur les meilleures pratiques DevOps sécurisées, voir DevOps Security.

Protection de vos données d'identification à l'aide de références de secrets

De nombreuses propriétés que vous pouvez configurer lorsque vous utilisez des chaînes d'outils et des pipelines de distribution Continuous Delivery, tels que des mots de passe, des clés d'API, des certificats ou d'autres jetons, sont classées en tant que secrets ou données d'identification. Pour définir la valeur d'une propriété sécurisée, vous pouvez utiliser un texte en clair ou une référence de secrets. L'utilisation d'une référence de secrets est la méthode recommandée pour définir la valeur d'une propriété sécurisée.

Lorsque vous définissez une propriété sécurisée avec une valeur confidentielle texte en clair, Continuous Delivery chiffre et stocke la valeur en interne. Bien que la valeur soit sécurisée dans le service Continuous Delivery, le service ne peut pas protéger la valeur côté client. Lorsque vous définissez une propriété sécurisée à l'aide de la console de votre navigateur, en appelant une API ou en configurant une ressource Terraform, le secret en texte clair peut être exposé sur vos systèmes locaux. Les secrets en texte clair sont également plus difficiles à faire pivoter. Lorsqu'un secret, tel qu'une clé d'API, doit faire l'objet d'une rotation, toutes les propriétés sécurisées qui portent la valeur de secret doivent également être localisées et mises à jour.

Lorsque vous définissez une propriété sécurisée avec une valeur de référence de secrets, la valeur est une chaîne spécialement formatée qui fait référence à l'emplacement ou à l'adresse d'un secret géré au sein d'un service de stockage de secrets tel que IBM® Key Protect for IBM Cloud®, IBM Cloud® Secrets Manager ou HashiCorp Vault. Bien que Continuous Delivery chiffre et stocke activement la valeur de référence des secrets en interne, la valeur de secret n'est pas exposée côté client. Lorsque Continuous Delivery doit extraire le secret pour effectuer un traitement en votre nom, il extrait en interne la valeur du magasin de secrets référencé. Les références de secrets sont également résilientes à la rotation. Généralement, lorsqu'un secret fait l'objet d'une rotation dans un magasin de secrets, l'emplacement ou l'adresse du secret reste le même. Seule la valeur de secret elle-même est modifiée.

Deux types de références de secrets sont pris en charge: par nom ou par Cloud Resource Name(CRN). Actuellement, seules les intégrations d'outils Secrets Manager prennent en charge le référencement des secrets par CRN. Ce format offre une plus grande flexibilité car vous pouvez référencer des secrets à partir d'une instance Secrets Manager dans un autre compte si l'autorisation correcte est en place.

Veillez à prendre en compte les prérequis suivants pour la spécification d'une référence de secrets dans la portée d'une chaîne d'outils:

Lorsque vous travaillez en dehors de la console, par exemple avec l'API ou Terraform, utilisez le format suivant pour les références de secrets par nom:

  • {vault::SECRET_STORE_INTEGRATION_NAME.SECRET_NAME} lorsque vous référencez des secrets qui sont contenus dans Key Protect.
  • {vault::SECRET_STORE_INTEGRATION_NAME.SECRET_GROUP_NAME.SECRET_NAME} lorsque vous référencez des secrets qui sont contenus dans Secrets Manager.
  • {vault::SECRET_STORE_INTEGRATION_NAME.SECRET_NAME.FIELD_NAME} lorsque vous faites référence à des secrets contenus dans HashiCorp Vault.

Valeur secrète :

  • ref://secrets-manager.REGION.RESOURCE-GROUP.SECRETS-MANAGER-INSTANCE-NAME1/SECRETS-GROUP-NAME/SECRET-NAME lorsque vous référencez des secrets qui sont contenus dans Key Protect.
  • ref://secrets-manager.eu-de.EU-RG.SM-1/default/api-key lorsque vous référencez des secrets qui sont contenus dans Secrets Manager.

Par exemple, si le secret concerne une valeur de clé, vous pouvez sélectionner la clé :

  • ref://secrets-manager.eu-gb.Default.Secrets%20Manager-zc/Default/mk-kv-pair?key=ibmcloud-api-key

où :

  • SECRETS-MANAGER-INSTANCE-NAME1 est le nom de l'intégration du magasin de secrets dans la chaîne d'outils, et non le nom de l'instance de service du magasin de secrets.
  • SECRET_GROUP_NAME est le nom du groupe qui contient le secret dans Secrets Manager.
  • SECRET_NAME est le nom du secret dans le magasin de secrets.
  • KEY_NAME est le nom de la clé dans le secret clé-valeur.

Pour utiliser une référence de secrets CRN, procurez-vous le CRN secret directement à partir de l'interface utilisateur Secrets Manager ou à l'aide d'un programme à l'aide de l'interface de ligne de commande, de l'API ou de logiciels SDK.

Spécification de références de secrets à l'aide de la console

Lorsque vous utilisez la console, les zones des propriétés de configuration de l'intégration d'outils et des propriétés Delivery Pipeline qui sont classées comme sécurisées sont annotées avec une icône de clé. Cliquez sur cette icône pour ouvrir une boîte de dialogue à partir de laquelle vous pouvez sélectionner un magasin de secrets et un secret. Sinon, pour les références de secrets par CRN, collez la valeur CRN directement dans la propriété.

Spécification de références de secrets à l'aide de l'API

Vous pouvez utiliser des propriétés sécurisées avec des valeurs de référence de secrets dans les appels à l'API, qui requiert un jeton bearer IAM. Sinon, si vous utilisez un SDK, obtenez une clé d'API IAM et définissez les options client à l'aide de variables d'environnement.

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

Utilisation de références de secrets par nom

L'exemple suivant montre comment utiliser une référence de secrets par secret de nom. Il montre comment créer une intégration d'outil Slack avec un jeton d'API (webhook Slack) stocké dans une instance de Key Protect. Cet exemple suppose que la chaîne d'outils contient déjà une intégration d'outils Key Protect et qu'une règle d'autorisation de service à service IAM de la chaîne d'outils source vers l'instance de service cible Key Protect est en place.

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();

Le tableau suivant répertorie et décrit chacune des valeurs de référence de secret utilisées dans l'exemple précédent.

Valeurs de référence secrètes
Valeur Description
my-kms-tool-integration Nom de l'intégration d'outils Key Protect dans la chaîne d'outils. Il ne s'agit pas du nom de l'instance de service Key Protect.
my-slack-webhook Nom de la clé standard qui est gérée dans l'instance de service Key Protect.

Utilisation de références de secrets par CRN

L'exemple suivant montre comment utiliser une référence de secrets par secret CRN. Il montre comment créer une intégration d'outil Slack avec un jeton d'API (webhook Slack) stocké dans une instance de Secrets Manager. Cet exemple suppose que la chaîne d'outils contient déjà une intégration d'outils Secrets Manager et qu'une règle d'autorisation de service à service IAM de la chaîne d'outils source à l'instance de service Secrets Manager cible est en place.

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();

Spécification de références de secrets avec Terraform

Vous pouvez utiliser des propriétés sécurisées avec des valeurs de référence de secrets dans Terraform.

Utilisation de références de secrets par nom

L'exemple suivant présente un ensemble complet de ressources pour une instance de service Key Protect, une clé standard (webhook Slack), une chaîne d'outils, une règle d'autorisation de service à service IAM, une intégration d'outil Key Protect et une intégration d'outil Slack qui fait référence à la valeur confidentielle du webhook par son nom.

Cet exemple inclut également une ressource ibm_kms_key clé standard avec un payload qui est défini sur le secret du base64-encoded webhook Slack. Il montre la relation entre le nom de la clé et la valeur de la référence de secrets dans la ressource d'intégration d'outil Slack. En pratique, il est plus sûr de créer la clé standard à l'avance à partir d'un projet Terraform distinct ou d'un autre processus auquel seul un personnel autorisé limité a accès.

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
    ]
}

Le tableau suivant répertorie et décrit chacune des valeurs de référence de secrets utilisées dans l'exemple précédent.

Valeurs de référence secrètes
Valeur Description
my-kms-tool-integration Nom de l'intégration d'outils Key Protect dans la chaîne d'outils. Il ne s'agit pas du nom de l'instance de service Key Protect.
my-slack-webhook Nom de la clé standard qui est gérée dans l'instance de service Key Protect.

Utilisation de références de secrets par CRN

L'exemple suivant suppose qu'il existe une instance de Secrets Manager. Il affiche des ressources pour un secret arbitraire (webhook Slack), une chaîne d'outils, une règle d'autorisation de service à service IAM, une intégration d'outil Secrets Manager et une intégration d'outil Slack qui fait référence au secret de webhook par CRN.

Cet exemple inclut une ressource de clé ibm_sm_arbitrary_secret avec un payload défini sur le secret de webhook Slack. Il montre comment utiliser le CRN de la ressource de clé comme valeur de la référence de secrets dans la ressource d'intégration d'outil Slack. En pratique, il est plus sûr de créer la clé standard à l'avance à partir d'un projet Terraform distinct ou d'un autre processus auquel seul un personnel autorisé limité a accès.

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
    ]
}

Protection de vos données avec des clés gérées par le client

Par défaut, Continuous Delivery chiffre vos données à l'aide de clés internes au service Continuous Delivery. Pour plus de sécurité et de contrôle, vous pouvez configurer Continuous Delivery pour chiffrer vos données à l'aide de clés que vous gérez. Cette option est disponible uniquement dans le cadre du plan Professional et uniquement au moment où vous mettez à disposition une instance du service Continuous Delivery. Si vous choisissez votre propre service de gestion des clés, tel que Key Protect, IBM Cloud® ou Hyper Protect Crypto Services, les valeurs suivantes sont chiffrées à l’aide de votre propre clé plutôt qu’à l’aide des clés de chiffrement internes au service Continuous Delivery.

Valeurs chiffrées à l'aide de votre propre clé
Composant Valeur
Chaîne d'outils propriétés et paramètres
Pipeline * Clés et valeurs de propriété
* Journaux des travaux
* Artefacts de travail
Intégrations * Slack (webhook Slack)
* Pagerduty (clé d'accès à l'API, clé d'intégration)
* Sauce Labs (clé d'accès)
* Artifactory (clé API)
* HashiCorp Vault (jeton, ID de rôle, ID secret, mot de passe)
* Jenkins (jeton API Jenkins )
* JIRA (jeton API JIRA)
* Nexus (jeton d’authentification)
* Rational Team Concert (mot de passe)
* Sonarqube (mot de passe SonarQube ou jeton d’authentification)
IBM Cloud® DevOps Insights Pièce jointe dans les enregistrements de test

Les composants suivants chiffrent les données personnelles à l'aide de la clé de chiffrement gérée par le fournisseur.

Valeurs chiffrées à l'aide de la clé gérée par le fournisseur
Composant Valeur
Git Repos and Issue Tracking
  • Problèmes, demandes d'extraction et code source
  • Informations personnelles, telles que le nom, le courrier électronique, l'image de profil, l'adresse et d'autres Informations de la page de profil

Pour plus d'informations sur la création d'une instance de service Continuous Delivery qui chiffre les données avec une clé client, voir Création d'une instance de service Continuous Delivery.

Protection de vos données lorsque vous utilisez des intégrations d'outils tiers

Lorsque vous configurez une intégration d'outil pour une chaîne d'outils, vous activez explicitement le partage de données entre le service Continuous Delivery et l'intégration d'outil. Le type de données partagées, et si les données sont envoyées à l'outil, reçues de l'outil, ou les deux, varient en fonction du type d'intégration de l'outil.

Avant de configurer une intégration d'outil, assurez-vous de bien comprendre ce que sont les données partagées. Si vous travaillez avec des données ou des données réglementées que vous considérez sensibles, assurez-vous que l'utilisation de l'outil tiers et toutes les données qui peuvent être partagées avec elle ne compromettent pas la confidentialité, l'intégrité ou la disponibilité de vos ressources, ou enfreignent les contrôles réglementaires.

Pour en savoir plus sur les intégrations d'outils, voir Configuration des intégrations d'outil.

Protection de vos données lorsque vous utilisez Git Repos and Issue Tracking

Git Repos and Issue Tracking est un composant hébergé par IBMdu service Continuous Delivery. Toutes les données que vous fournissez à Git Repos and Issue Tracking, notamment les fichiers source, les problèmes, les demandes d'extraction et les propriétés de configuration de projet, sont gérées de manière sécurisée dans Continuous Delivery. Toutefois, Git Repos and Issue Tracking prend en charge différents mécanismes d'exportation, d'envoi ou de partage de données avec des utilisateurs et des tiers.

La capacité de Git Repos and Issue Tracking à partager des informations est typique de nombreuses plateformes de codage social. Toutefois, ce partage pourrait entrer en conflit avec les contrôles réglementaires applicables à votre entreprise. Une fois que vous avez créé un projet dans Git Repos and Issue Tracking, mais avant de charger des fichiers, des problèmes, des enregistrements ou d'autres données avec le projet, consultez les paramètres du projet et modifiez les paramètres que vous jugez nécessaires pour protéger vos données. Les paramètres à examiner incluent les niveaux de visibilité, les notifications par courrier électronique, les intégrations, les webhooks, les jetons d'accès, les jetons de déploiement et les clés de déploiement.

Nommage des projets et des fichiers

Dans Git Repos and Issue Tracking, le nom d'un projet et les noms de chemin des fichiers stockés dans le référentiel du projet deviennent des segments dans les URL que vous utilisez pour interagir avec le projet, que ce soit par le biais du navigateur, des API ou de Terraform. Vous devez partir du principe que les URL ne sont pas sécurisées. Par conséquent, n'utilisez pas ou n'intégrez pas d'informations sensibles dans les noms de projets et les noms des chemins d'accès aux fichiers du référentiel.

Niveaux de visibilité du projet

Les projets Git Repos and Issue Tracking peuvent avoir l'un des niveaux de visibilité suivants : privé, interne ou public.

  • Les projets privés ne sont visibles que par les membres du projet. Ce paramètre est le niveau de visibilité par défaut pour les nouveaux projets et est le niveau de visibilité le plus sûr pour vos données.
  • Les projets internes sont visibles par tous les utilisateurs connectés à IBM Cloud.
  • Les projets publics sont visibles par tous.

Pour limiter l'accès au projet aux seuls membres du projet, procédez comme suit :

  1. Dans la barre d'options latérale du projet, cliquez sur Paramètres > Général.
  2. Dans la page Paramètres généraux, cliquez sur Visibilité > Fonctions de projet > Droits.
  3. Localisez le paramètre de visibilité du projet.
  4. Sélectionnez Privé, s'il cela n'est pas déjà sélectionné.
  5. Cliquez sur Enregistrer les modifications.

Appartenance à un projet

Git Repos and Issue Tracking est un environnement de codage social hébergé dans le cloud qui est disponible pour tous les utilisateurs Continuous Delivery. Si vous êtes un propriétaire ou un responsable de projet Git Repos and Issue Tracking, vous pouvez inviter des membres d'utilisateur et de groupe dans le projet. IBM Cloud n'impose aucune restriction sur les personnes que vous pouvez inviter à rejoindre un projet. Etant donné que vous pouvez inviter n'importe qui dans un projet GitLab, veillez à inviter uniquement les utilisateurs ou les groupes qui font partie de votre société ou de votre organisation, sauf si vous en avez explicitement l'intention.

Pour plus d'informations sur la gestion des membres de projet GitLab, voir Membres d'un projet.

Paramètres de courrier électronique du projet

Par défaut, Git Repos and Issue Tracking informe les membres du projet par courrier électronique sur les activités du projet. Ces courriers électroniques incluent généralement des données appartenant à des clients qui ont été fournies à Git Repos and Issue Tracking par les utilisateurs. Par exemple, si un utilisateur envoie un commentaire au sujet d'un problème, Git Repos and Issue Tracking envoie un courrier électronique à tous les abonnés qui inclut des informations telles qu'une copie du commentaire, l'utilisateur qui l'a posté et le moment où le commentaire a été posté. Pour désactiver toutes les notifications par courrier électronique pour votre projet, procédez comme suit :

  1. Dans la barre d'options latérale du projet, cliquez sur Paramètres > Général.
  2. Dans la page Paramètres généraux, cliquez sur Visibilité > Fonctions de projet > Droits.
  3. Cochez la case Désactiver les notifications par courrier électronique.
  4. Cliquez sur Enregistrer les modifications.

Intégrations de projet et webhooks

Les projets Git Repos and Issue Tracking peuvent également être configurés avec des intégrations ou des webhooks sur d'autres systèmes, ou équipés de jetons d'accès, de jetons de déploiement et de clés de déploiement. Pour réviser ou modifier les intégrations, les webhooks, les jetons et les clés qui peuvent être configurés avec votre projet, à partir de la barre d'options latérale du projet, procédez comme suit :

  1. Dans la barre d'options latérale du projet, cliquez sur Paramètres.
  2. Cliquez sur Intégrations pour utiliser les intégrations de votre projet avec d'autres applications.
  3. Cliquez sur webhooks pour utiliser les webhooks de votre projet dans d'autres systèmes.
  4. Cliquez sur Jetons d'accès pour utiliser les jetons d'accès qui peuvent accorder l'accès à votre projet.
  5. Développez Déployer des jetons pour utiliser les jetons de déploiement qui peuvent accorder l'accès à votre projet.
  6. Développez Déployer les clés pour utiliser les clés de déploiement qui peuvent accorder l'accès à votre projet.

Pour en savoir plus sur l'utilisation de Git Repos and Issue Tracking, voir Git Repos and Issue Tracking.

Protection de vos données lorsque vous utilisez des pipelines de distribution

Les pipelines Continuous Delivery exécutent les travaux et les étapes que vous fournissez. Le service Continuous Delivery gère en toute sécurité la sortie de journal et la génération des artefacts générés par vos exécutions de pipeline. Toutefois, Continuous Delivery ne limite ni ne gère la fonction de vos scripts de travaux de pipeline ou d'étapes.

Lorsque vous développez et configurez vos scripts de travaux et d'étapes de pipeline, assurez-vous que vos scripts n'exécutent pas d'actions susceptibles de compromettre la confidentialité, l'intégrité ou la disponibilité de vos ressources, ou d'enfreindre d'une autre manière les contrôles réglementaires.

Commande add-mask de Delivery Pipelines

L'agent Tekton worker (version 0.22.3 +) prend en charge une fonction add-mask qui vous permet de masquer dynamiquement les valeurs sensibles dans la sortie des journaux, ligne par ligne. Lorsqu'une ligne de journal contient le modèle ::add-mask::{value}, le marqueur est supprimé de la sortie et la valeur est masquée en tant que *** pour le reste du flux de journaux.

Utilisation

Vous pouvez consulter l'exemple suivant pour comprendre l'utilisation de la commande add-mask.

Journal des entrées :

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

Journal de sortie :

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

Fonctionnement

Le système exécute les étapes suivantes lorsque vous utilisez la commande add-mask:

  1. Lorsqu'une ligne contient ::add-mask::{value}, le système :

    • Supprime le marqueur ::add-mask:: de la sortie
    • Extrait tout ce qui se trouve après ::add-mask:: (jusqu'à la fin de la ligne) comme valeur à masquer
    • Remplace la valeur par *** dans la ligne actuelle
    • Ajoute la valeur à une liste de masques
  2. Pour toutes les lignes suivantes :

    • Toute occurrence de valeurs précédemment masquées est automatiquement remplacée par ***

Masques multiples

Vous pouvez masquer plusieurs valeurs dans vos journaux :

Entrée :

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

Sortie :

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

Pour en savoir plus sur les pipelines de distribution, voir et Utilisation des pipelines et Utilisation des pipelines de Tekton.

Protéger vos données lorsque vous utilisez Terraform

Lorsque vous utilisez Terraform pour gérer des ressources Continuous Delivery, certaines des variables, arguments et attributs traités par Terraform peuvent contenir des valeurs secrètes telles que des mots de passe ou des jetons d'API. Ces valeurs peuvent être spécifiées par vous dans vos fichiers de langage de configuration Terraform, elles peuvent être extraites et stockées dans l'état Terraform par l'outil Terraform, ou les deux. La liste suivante fournit des exemples de valeurs de secret que vous devez protéger lorsque vous utilisez Terraform.

  • Clé d'API IAM requise par le fournisseur Terraform IBM Cloud pour s'authentifier auprès de IBM Cloud. Cette clé est spécifiée dans l'argument ibmcloud_api_key du bloc provider "ibm" de votre module Terraform.
  • Arguments ou attributs représentant des mots de passe, des jetons d'accès, des clés d'API ou d'autres types de secrets dans certaines ressources et sources de données ibm_cd_toolchain_tool.
  • Valeurs de propriété désignées comme secrets dans certaines ressources ou sources de données ibm_cd_tekton_pipeline_property ou ibm_cd_tekton_pipeline_trigger_property.

Utilisez IBM Cloud Schematics et les pratiques suivantes pour limiter l'exposition des données sensibles:

  • Utilisez des variables Terraform pour injecter des valeurs dans des blocs Terraform.
  • Utilisez IBM Cloud Schematics pour gérer et partager des secrets en toute sécurité.
  • Utilisez IBM Cloud Schematics pour gérer et partager en toute sécurité l'état Terraform.
  • Utilisez les références de secrets Continuous Delivery lorsque vous spécifiez des secrets dans les ressources ibm_cd_toolchain_tool, ibm_cd_tekton_pipeline_property ou ibm_cd_tekton_pipeline_trigger_property.

Si vous utilisez l'outil de ligne de commande Terraform, utilisez les pratiques suivantes pour limiter l'exposition des données sensibles:

  • Utilisez des variables Terraform pour injecter des valeurs dans des blocs Terraform.
  • Autorisez l'outil de ligne de commande Terraform à demander des valeurs lorsque vous exécutez des commandes telles que terraform plan ou terraform apply.
  • Contrôlez l'accès à votre état Terraform car il peut contenir des secrets. L'état Terraform local est écrit en texte clair.
  • Utilisez les références de secrets Continuous Delivery lorsque vous spécifiez des secrets dans les ressources ibm_cd_toolchain_tool, ibm_cd_tekton_pipeline_property ou ibm_cd_tekton_pipeline_trigger_property.

Pour limiter l'exposition des données sensibles, évitez les pratiques suivantes:

  • Ecriture de secrets en texte en clair dans des blocs Terraform, tels que des blocs de ressources, des blocs de données ou des blocs de fournisseur.
  • Ecriture de secrets en texte en clair dans les fichiers terraform.tfvars, terraform.tfvars.json, *.auto.tfvars ou *.auto.tfvars.json.
  • Distribution des fichiers terraform.tfvars, terraform.tfvars.json, *.auto.tfvars ou *.auto.tfvars.json qui contiennent des secrets dans des référentiels de code source.
  • Distribution de votre état Terraform dans des référentiels de code source.

Utilisez IBM Cloud Schematics à la place de l'outil en ligne de commande Terraform pour traiter vos configurations Terraform. IBM Cloud Schematics offre plusieurs avantages, tels que le stockage sécurisé des propriétés de configuration sensibles.

Pour en savoir plus sur IBM Cloud Schematics, consultez la documentation relative à IBM Cloud Schematics.

Pour plus d'informations sur les données sensibles à l'état Terraform, voir Données sensibles à l'état.

Pour plus d'informations sur la définition des variables d'entrée dans Terraform, voir Affectation de valeurs à des variables de module racine.

Suppression de vos données de Continuous Delivery

Lorsque vous supprimez une instance de service Continuous Delivery, les chaînes d'outils, les intégrations d'outils, les outils et les données associés (y compris les données personnelles) ne sont pas supprimés. Pour plus d'informations sur la gestion et la suppression des données stockées avec les chaînes d'outils, les intégrations d'outils et les outils, voir Modification, exportation et suppression des données personnelles.