繁体   English   中英

安全服务帐户凭据 json 密钥 kotlin

[英]Secure Service Account Credentials json key kotlin

因此,我试图在本地主机上获取服务应用程序凭据,但遇到了一些问题。 我创建并下载了 json 密钥,我想保护它们而不是让它们以纯文本形式出现。

我想知道最好的方法。 我有这段代码:

fun getServiceAccountCredentials(
    pathToFallBackCredentialsFile: String
): ServiceAccountCredentials {
    return try {
        getApplicationDefault() as ServiceAccountCredentials
    } catch (e: IOException) {
        return ServiceAccountCredentials.fromStream(FileInputStream(pathToFallBackCredentialsFile))
    } catch (e: ClassCastException) {
        return ServiceAccountCredentials.fromStream(this::class.java.classLoader.getResourceAsStream(pathToFallBackCredentialsFile))
    }
}

这里的问题是我的 JSON 文件在我的存储库中以纯文本形式公开。

选项

  1. 加密它们,然后让应用程序解密它们。 但是,如果解密密钥在同一个存储库中,那么您只是问题转移到了另一个地方,尽管有人需要有人阅读/执行您的代码才能获得它们。
  2. 您的应用程序将如何运行,例如在 Kube.netes 或在您的数据中心运行的其他应用程序中的 Docker 容器内? 如果是这样,那么您将责任向下传递给该应用程序容器管理器,以在启动时注入凭据(和其他环境细节),例如使用诸如 Kube.netes 配置映射之类的东西。 我们这样做并将生产配置映射保存在单独的 DevOps-only 存储库中。
  3. 有针对此问题的专业机密管理解决方案,您的应用程序会在运行时调用机密管理器以获取所需的机密,例如https://www.hashicorp.com/products/vault或云供应商的一些自定义

我找到了解决办法。

我从 GCP 激活了 Secret Manager,并在那里添加了 JSON 文件。

为了在 java/kotlin 应用程序中获取秘密(没有 spring,如果你有 spring,你可以使用“spring-cloud-gcp-starter-secretmanager”),我使用了以下代码。

fun accessSecretVersion(secretId: String?, versionId: String?): String {
    val googleCredentials = GoogleCredentials.getApplicationDefault() as UserCredentials
    val projectId = googleCredentials.quotaProjectId
    return getSecret(projectId, secretId, versionId)
}

fun getSecret(projectId: String?, secretId: String?, versionId: String?): String {
    SecretManagerServiceClient.create().use { client ->
        val secretVersionName = SecretVersionName.of(projectId, secretId, versionId)

        val response = client.accessSecretVersion(secretVersionName)

        return response.payload.data.toStringUtf8()
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM