簡體   English   中英

在HTTP Google Cloud Function(NodeJS)中同步加載機密

[英]Synchronously load secrets in an HTTP Google Cloud Function (NodeJS)

我有一個提供登錄API端點的Google Cloud Function。 該函數使用私鑰對JWT進行簽名。

現在,在部署功能時,我需要安全地加載用於簽名JWT的私鑰。 我當然不能使用環境變量或將其嵌入代碼的任何部分,因為任何在gcloud中可以讀取該函數的人都可以看到。

我考慮過的選項有:

  1. 為該功能創建專用的服務帳戶,以及僅該服務帳戶可以訪問的GCS存儲桶,並在其中以純文本格式存儲密碼。 當函數加載時,加載秘密( await loadMySecrets(...) )並繼續。

  2. 推薦的方法:創建一個KMS密鑰,用該密鑰加密秘密,然后將密文和功能代碼一起上傳。 在運行時,要求KMS解密密鑰( await decryptSecret(...) )。

問題是:據我所知,當加載HTTP函數時,整個加載過程必須是同步的

您的函數返回一個請求處理程序,然后GCF執行該請求處理程序。 返回請求處理程序之前沒有機會await Promise,並且GCF不支持HTTP函數的返回Promises。 GCS和KMS API是基於Promise的,不支持*Sync()調用。

其他人如何解決這個問題? 我無法同步等待Promise解決(例如,通過sleep() ),因為那樣會阻塞Node事件循環。 我是否被迫以某種方式同步提供機密,或者是否有一種方法可以使其與GCF完美兼容?

注意:這是普通的Google Cloud Functions, 而不是 Firebase。

注意2:有一個核心選​​擇,即將異步方面轉移到Express中間件中。 我真的非常不想這樣做,因為我不得不包裝cookie-parserpassport類的東西,它們希望在初次創建中間件時可以使用秘密,然后在異步中間件中加載我的秘密然后委托。 丑陋,可能會影響性能。

您可以使整個函數處理程序異步(需要節點8+):

const decrypt = async (ciphertext) => {
  result = await client.decrypt({
      name: cryptoKeyID,
      ciphertext: ciphertext,
  });
  return result.plaintext;
}

exports.F = async (req, res) => {
  const username = await decrypt(process.env.DB_USER);
  const password = await decrypt(process.env.DB_PASS);
  res.send(`${username}:${password}`)
}

我看到了您關於中間件的說明。 如果您發布代碼示例,我將嘗試對其進行更新以使其更好地匹配。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM