簡體   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