应用程序可以采用多种方式接入凭据管家,动态使用凭据。

接入方式

应用程序可以通过以下三种方式接入凭据管家:

使用KMS SDK

以下以Java语言为例,为您介绍如何在应用程序中使用动态RDS凭据。如果您使用的不是动态RDS凭据而是其他类型的凭据,也可以使用此方法。

  1. 获取密钥管理服务Java SDK的依赖声明。
    需要获取的版本请参见SDK概览。示例如下:
     <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>aliyun-java-sdk-core</artifactId>
        <version>4.5.16</version>
      </dependency>
      <dependency>
        <groupId>com.aliyun</groupId>
        <artifactId>aliyun-java-sdk-kms</artifactId>
        <version>2.12.0</version>
      </dependency>
      <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.9</version>
      </dependency>
      <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.4</version>
      </dependency> 
  2. 应用程序从凭据管家获取数据库账号和口令,建立数据库连接。
    示例代码如下:
    package com.aliyun.kms.samples;
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    import com.aliyuncs.DefaultAcsClient;
    import com.aliyuncs.exceptions.ClientException;
    import com.aliyuncs.http.FormatType;
    import com.aliyuncs.http.MethodType;
    import com.aliyuncs.http.ProtocolType;
    import com.aliyuncs.kms.model.v20160120.GetSecretValueRequest;
    import com.aliyuncs.kms.model.v20160120.GetSecretValueResponse;
    import com.aliyuncs.profile.DefaultProfile;
    import com.aliyuncs.profile.IClientProfile;
    import org.apache.commons.lang3.tuple.Pair;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    
    public class RdsSecretSampleCode {
    
        private static final String MYSQL_JDBC_DRIVER = "com.mysql.jdbc.Driver";
        private static final String MSSQL_JDBC_DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
    
        private static KmsClient kmsClient;
    
        static {
            kmsClient = KmsClient.getKMSClient("<regionId>", "<accessKeyId>", "<accessKeySecret>");
        }
    
        static class KmsClient {
            private DefaultAcsClient acsClient;
    
            private KmsClient(DefaultAcsClient acsClient) {
                this.acsClient = acsClient;
            }
    
            private static KmsClient getKMSClient(String regionId, String accessKeyId, String accessKeySecret) {
                IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
                DefaultAcsClient client = new DefaultAcsClient(profile);
                return new KmsClient(client);
            }
        }
    
        // 通过凭据信息获取MySQL链接。
        public static Connection getMySQLConnectionBySecret(String secretName, String jdbcUrl) throws ClassNotFoundException, SQLException, ClientException {
            Class.forName(MYSQL_JDBC_DRIVER);
            Pair<String, String> userAndPasswordPair = getUserAndPasswordPair(secretName);
            return DriverManager.getConnection(jdbcUrl, userAndPasswordPair.getKey(), userAndPasswordPair.getValue());
        }
    
        // 通过凭据信息获取MSSQL链接。
        public static Connection getMSSQLConnectionBySecret(String secretName, String jdbcUrl) throws ClassNotFoundException, SQLException, ClientException {
            Class.forName(MSSQL_JDBC_DRIVER);
            Pair<String, String> userAndPasswordPair = getUserAndPasswordPair(secretName);
            return DriverManager.getConnection(jdbcUrl, userAndPasswordPair.getKey(), userAndPasswordPair.getValue());
        }
    
        // 通过凭据信息获取指定的数据库账号和口令。
        private static Pair<String, String> getUserAndPasswordPair(String secretName) throws ClientException {
            final GetSecretValueRequest request = new GetSecretValueRequest();
            request.setProtocol(ProtocolType.HTTPS);
            request.setAcceptFormat(FormatType.JSON);
            request.setMethod(MethodType.POST);
            request.setSecretName(secretName);
            GetSecretValueResponse response = kmsClient.acsClient.getAcsResponse(request);
            JSONObject secretDataJSON = JSON.parseObject(response.getSecretData());
            return Pair.of(secretDataJSON.getString("AccountName"), secretDataJSON.getString("AccountPassword"));
        }
    }

使用Kubernetes插件

如果您使用自建Kubernetes或者阿里云容器服务Kubernetes版ACK(Alibaba Cloud Container Service for Kubernetes),可以通过下列方式无代码集成KMS凭据管家:

  • 通过阿里云容器服务Kubernetes版ACK安装插件
    1. 登录容器服务管理控制台
    2. 在左侧导航栏中,选择市场 > 应用目录
    3. 应用目录页面,单击阿里云应用页签。
    4. 在页面上方输入ack-secret-manager,然后单击搜索按钮。
    5. 单击ack-secret-manager软件,安装插件。
    说明 您也可以访问ack-secret-manager安装插件。
  • 访问kubernetes-external-secrets安装插件

Kubernetes插件支持配置KMS凭据管家进行凭据存储,您可以在插件中配置凭据管家中的凭据名称,插件将定期从凭据管家中读取最新的凭据值,缓存在Kubernetes集群中。您可以按照使用Kubernetes原生Secret的方式,使用托管在凭据管家中的动态Secret。

说明 为了进一步保护从凭据管家读取后缓存在Kubernetes集群中的Secret(同时也加密保护Kubernetes集群中的其他静态Secret,这些静态Secret通常为系统Secret),您可以对Kubernetes集群Secret进行一键加密。具体操作,请参见使用KMS一键加密Kubernetes集群Secret