Este conteúdo foi traduzido por máquina para sua conveniência e a Huawei Cloud não pode garantir que o conteúdo foi traduzido com precisão. Para exibir o conteúdo original, use o link no canto superior direito para mudar para a página em inglês.
Central de ajuda/ Data Encryption Workshop/ Melhores práticas/ Serviço de gerenciamento de segredo em nuvem/ Uso do CSMS para alterar senhas de contas de banco de dados codificadas rigidamente
Atualizado em 2024-09-14 GMT+08:00

Uso do CSMS para alterar senhas de contas de banco de dados codificadas rigidamente

Geralmente, os segredos usados​para acesso estão incorporados nas aplicações. Para atualizar um segredo, você precisa criar um novo segredo e gastar tempo atualizando suas aplicações. Se você tiver várias aplicações usando o mesmo segredo, terá que atualizar todas elas, ou as aplicações que você se esqueceu de atualizar não poderão usar o segredo para logon.

Uma ferramenta de gerenciamento de segredos fácil de usar, eficaz e segura será útil.

O Cloud Secret Management Service (CSMS) tem as seguintes vantagens:

  • Você pode hospedar seus segredos em vez de usar segredos codificados rigidamente, melhorando a segurança de dados e ativos.
  • Seus serviços não são afetados quando você faz a rotação manual dos segredos.
  • O acesso seguro ao SDK permite que você chame seus segredos dinamicamente.
  • Você pode armazenar muitos tipos de segredos. Você pode armazenar contas de serviço, senhas e informações de banco de dados, incluindo, mas não limitado a, nomes de banco de dados, endereços IP e números de porta.

Fazer logon em um banco de dados usando segredos

Você pode criar um segredo e fazer logon no seu banco de dados chamando o segredo por meio de uma API.

Verifique se sua conta tem a permissão KMS Administrator ou KMS CMKFullAccess. Para obter detalhes, consulte Gerenciamento de permissões do DEW.

Figura 1 Processo de logon baseado em segredo

O processo é o seguinte:

  1. Crie um segredo no console ou por meio de uma API para armazenar informações do banco de dados (como endereço, porta e senha do banco de dados).
  2. Use uma aplicação para acessar o banco de dados. CSMS irá consultar o segredo criado em 1.
  3. O CSMS recupera e descriptografa o texto cifrado de segredo e retorna com segurança as informações armazenadas no segredo para a aplicação por meio da API de gerenciamento de segredo.
  4. A aplicação obtém o segredo de texto não criptografado descriptografado e o usa para acessar o banco de dados.

APIs de criação e consulta de segredos

Você pode chamar as seguintes APIs para criar segredos, salvar seu conteúdo e consultar informações de segredos.

API

Descrição

Criação de um segredo

Essa API é usada para criar um segredo e armazenar o valor de segredo na versão de segredo inicial.

Consulta de um segredo

Essa API é usada para consultar um segredo.

Criação e consulta de segredos por meio de APIs

  1. Prepare informações básicas de autenticação.
    • ACCESS_KEY: chave de acesso da conta de Huawei
    • SECRET_ACCESS_KEY: chave de acesso de segredo da conta de Huawei
    • PROJECT_ID: ID do projeto de um site da Huawei Cloud. Para obter detalhes, consulte Projeto.
    • CSMS_ENDPOINT: ponto de extremidade para acessar o CSMS. Para obter detalhes, consulte Pontos de extremidade.
    • Haverá riscos de segurança se a AK/SK usada para autenticação for gravada diretamente no código. Criptografe a AK/SK no arquivo de configuração ou nas variáveis de ambiente para armazenamento.
    • Neste exemplo, a AK/SK armazenada nas variáveis de ambiente é usada para autenticação de identidade. Configure as variáveis de ambiente HUAWEICLOUD_SDK_AK e HUAWEICLOUD_SDK_SK primeiro no ambiente local.
  2. Crie e consulte informações de segredos.

    Nome de segredo: secretName

    Valor de segredo: secretString

    Valor da versão de segredo: LATEST_SECRET

    Versão de segredo: versionId

import com.huaweicloud.sdk.core.auth.BasicCredentials;
import com.huaweicloud.sdk.csms.v1.CsmsClient;
import com.huaweicloud.sdk.csms.v1.model.CreateSecretRequest;
import com.huaweicloud.sdk.csms.v1.model.CreateSecretRequestBody;
import com.huaweicloud.sdk.csms.v1.model.CreateSecretResponse;
import com.huaweicloud.sdk.csms.v1.model.ShowSecretVersionRequest;
import com.huaweicloud.sdk.csms.v1.model.ShowSecretVersionResponse;

public class CsmsCreateSecretExample {
    /**
     * Basic authentication information:
     * - ACCESS_KEY: Access key of the Huawei account
     * - SECRET_ACCESS_KEY: Secret access key of the Huawei account
     * - PROJECT_ID: Huawei Cloud project ID. For details, see https://support.huaweicloud.com/intl/pt-br/productdesc-iam/iam_01_0023.html
* - CSMS_ENDPOINT: endpoint address for accessing CSMS. For details, see https://support.huaweicloud.com/intl/pt-br/api-dew/dew_02_0052.html.
     * - There will be security risks if the AK/SK used for authentication is directly written into code. Encrypt the AK/SK in the configuration file or environment variables for storage.
     * - In this example, the AK/SK stored in the environment variables are used for identity authentication. Configure the environment variables HUAWEICLOUD_SDK_AK and HUAWEICLOUD_SDK_SK in the local environment first.
     */
    private static final String ACCESS_KEY = System.getenv("HUAWEICLOUD_SDK_AK");
    private static final String SECRET_ACCESS_KEY = System.getenv("HUAWEICLOUD_SDK_SK");
    private static final String PROJECT_ID = "<ProjectID>";
    private static final String CSMS_ENDPOINT = "<CsmsEndpoint>";

    //Version ID used to query the latest secret version details
    private static final String LATEST_SECRET = "latest";

    public static void main(String[] args) {
        String secretName = args[0];
        String secretString = args[1];

        //Create a secret.
        createSecret(secretName, secretString);

        //Query the content of the new secret based on the secret version latest or v1.
        ShowSecretVersionResponse latestVersion = showSecretVersion(secretName, LATEST_SECRET);
        ShowSecretVersionResponse firstVersion = showSecretVersion(secretName, "v1");

        assert latestVersion.equals(firstVersion);
        assert latestVersion.getVersion().getSecretString().equalsIgnoreCase(secretString);
    }

    /**
     * Create a secret.
     * @param secretName
     * @param secretString
     */
    private static void createSecret(String secretName, String secretString) {
        CreateSecretRequest secret = new CreateSecretRequest().withBody(
                new CreateSecretRequestBody().withName(secretName).withSecretString(secretString));

        CsmsClient csmsClient = getCsmsClient();

        CreateSecretResponse createdSecret = csmsClient.createSecret(secret);

        System.out.printf("Created secret success, secret detail:%s", createdSecret);
    }
    /**
     * Query secret version details based on the secret version ID.
     * @param secretName
     * @param versionId
     * @return
     */
    private static ShowSecretVersionResponse showSecretVersion(String secretName, String versionId) {
        ShowSecretVersionRequest showSecretVersionRequest = new ShowSecretVersionRequest().withSecretName(secretName)
                .withVersionId(versionId);

        CsmsClient csmsClient = getCsmsClient();

        ShowSecretVersionResponse version = csmsClient.showSecretVersion(showSecretVersionRequest);

        System.out.printf("Query secret success. version id:%s", version.getVersion().getVersionMetadata().getId());

        return version;
    }

    /**
     * Obtain the CSMS client.
     * @return
     */
    private static CsmsClient getCsmsClient() {
        BasicCredentials auth = new BasicCredentials()
                .withAk(ACCESS_KEY)
                .withSk(SECRET_ACCESS_KEY)
                .withProjectId(PROJECT_ID);

        return CsmsClient.newBuilder().withCredential(auth).withEndpoint(CSMS_ENDPOINT).build();
    }
}

Obtenção da conta do banco de dados por meio de uma aplicação

  1. Obtenha a declaração de dependência do SDK do CSMS.

    Exemplo:

    <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>XXX</version>
            </dependency>
            <dependency>
                <groupId>com.google.code.gson</groupId>
                <artifactId>gson</artifactId>
                <version>2.8.9</version>
            </dependency>
            <dependency>
                <groupId>com.huaweicloud.sdk</groupId>
                <artifactId>huaweicloud-sdk-csms</artifactId>
                <version>3.0.79</version>
            </dependency>
  2. Estabeleça uma conexão com o banco de dados e obtenha a conta.
    Exemplo:
    import com.google.gson.Gson;
    import com.google.gson.JsonObject;
    import com.huaweicloud.sdk.csms.v1.model.ShowSecretVersionRequest;
    import com.huaweicloud.sdk.csms.v1.model.ShowSecretVersionResponse;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    
     // Obtain the specified database account based on the secret information.
        public static Connection getMySQLConnectionBySecret(String secretName, String jdbcUrl) throws ClassNotFoundException, SQLException{
            Class.forName(MYSQL_JDBC_DRIVER);
            ShowSecretVersionResponse latestVersionValue = getCsmsClient().showSecretVersion(new ShowSecretVersionRequest().withSecretName(secretName).withVersionId("latest"));
            String secretString = latestVersionValue.getVersion().getSecretString();
            JsonObject jsonObject = new Gson().fromJson(secretString, JsonObject.class);
            return DriverManager.getConnection(jdbcUrl, jsonObject.get("username").getAsString(), jsonObject.get("password").getAsString());
        }