Uso do CSMS para alterar senhas de contas de banco de dados codificadas rigidamente
Geralmente, os segredos usadospara 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.
O processo é o seguinte:
- 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).
- Use uma aplicação para acessar o banco de dados. CSMS irá consultar o segredo criado em 1.
- 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.
- 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 |
---|---|
Essa API é usada para criar um segredo e armazenar o valor de segredo na versão de segredo inicial. |
|
Essa API é usada para consultar um segredo. |
Criação e consulta de segredos por meio de APIs
- 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.
- Crie e consulte informações de segredos.
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
- Obtenha a declaração de dependência do SDK do CSMS.
<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>
- 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()); }