This is an automated email from the ASF dual-hosted git repository.

laiyingchun pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/kudu.git


The following commit(s) were added to refs/heads/master by this push:
     new b341d099a [multi-tenancy] add tenant key generate api
b341d099a is described below

commit b341d099afee51f3ed6dac8a272d46ce975fb3d1
Author: kedeng <[email protected]>
AuthorDate: Thu Jul 6 16:57:50 2023 +0800

    [multi-tenancy] add tenant key generate api
    
    In the data at rest encryption scenario, we can
    obtain the encryption key from KMS by specifying
    the "cluster_key_name_". However, this cannot meet
    the needs of multi-tenant scenario.
    
    For multi-tenant scenario, it needs to obtain the
    corresponding encryption key based on different
    tenant IDs. Therefore, I added this implementation
    in this patch.
    
    Change-Id: Ib10fa08afe80e7314a7841ee962d910e2a57ee9b
    Reviewed-on: http://gerrit.cloudera.org:8080/20165
    Tested-by: Kudu Jenkins
    Reviewed-by: Zoltan Martonka <[email protected]>
    Reviewed-by: Yingchun Lai <[email protected]>
---
 src/kudu/fs/default_key_provider-test.cc | 11 +++++++++++
 src/kudu/fs/default_key_provider.h       |  8 ++++++++
 src/kudu/fs/key_provider.h               |  6 ++++++
 src/kudu/fs/ranger_kms_key_provider.cc   | 22 +++++++++++++++-------
 src/kudu/fs/ranger_kms_key_provider.h    |  5 +++++
 src/kudu/ranger-kms/ranger_kms_client.cc | 22 ++++++++++++++++++----
 src/kudu/ranger-kms/ranger_kms_client.h  | 10 ++++++++++
 7 files changed, 73 insertions(+), 11 deletions(-)

diff --git a/src/kudu/fs/default_key_provider-test.cc 
b/src/kudu/fs/default_key_provider-test.cc
index bc98644b2..b19414192 100644
--- a/src/kudu/fs/default_key_provider-test.cc
+++ b/src/kudu/fs/default_key_provider-test.cc
@@ -44,5 +44,16 @@ TEST_F(DefaultKeyProviderTest, TestEncryptAndDecrypt) {
   ASSERT_NE(encryption_key, decrypted_key);
 }
 
+TEST_F(DefaultKeyProviderTest, TestEncryptAndDecryptWithTenant) {
+  string encryption_key;
+  string iv;
+  string version;
+  string decrypted_key;
+  const string tenant_id = "00000000000000000000000000000000";
+  ASSERT_OK(key_provider_.GenerateTenantKey(tenant_id, &encryption_key, &iv, 
&version));
+  ASSERT_OK(key_provider_.DecryptEncryptionKey(encryption_key, iv, version, 
&decrypted_key));
+  ASSERT_NE(encryption_key, decrypted_key);
+}
+
 } // namespace security
 } // namespace kudu
diff --git a/src/kudu/fs/default_key_provider.h 
b/src/kudu/fs/default_key_provider.h
index 928ec6caf..807ede669 100644
--- a/src/kudu/fs/default_key_provider.h
+++ b/src/kudu/fs/default_key_provider.h
@@ -67,6 +67,14 @@ public:
     *key_version = "encryptionkey@0";
     return Status::OK();
   }
+
+  // The tenant id is useless in 'DefaultKeyProvider'.
+  Status GenerateTenantKey(const std::string& /* tenant_id */,
+                           std::string* encryption_key,
+                           std::string* iv,
+                           std::string* key_version) override {
+    return GenerateEncryptionKey(encryption_key, iv, key_version);
+  }
 };
 } // namespace security
 } // namespace kudu
diff --git a/src/kudu/fs/key_provider.h b/src/kudu/fs/key_provider.h
index c2e00a68d..d74e94599 100644
--- a/src/kudu/fs/key_provider.h
+++ b/src/kudu/fs/key_provider.h
@@ -40,6 +40,12 @@ class KeyProvider {
                                        std::string* iv,
                                        std::string* key_version) = 0;
 
+  // Generates an encryption key with the tenant_id.
+  virtual Status GenerateTenantKey(const std::string& tenant_id,
+                                   std::string* encryption_key,
+                                   std::string* iv,
+                                   std::string* key_version) = 0;
+
 };
 } // namespace security
 } // namespace kudu
diff --git a/src/kudu/fs/ranger_kms_key_provider.cc 
b/src/kudu/fs/ranger_kms_key_provider.cc
index 2bdecd7a1..be2eb2c4c 100644
--- a/src/kudu/fs/ranger_kms_key_provider.cc
+++ b/src/kudu/fs/ranger_kms_key_provider.cc
@@ -24,17 +24,25 @@ using std::string;
 namespace kudu {
 namespace security {
 
-Status RangerKMSKeyProvider::DecryptEncryptionKey(const std::string& 
encryption_key,
-                                                  const std::string& iv,
-                                                  const std::string& 
key_version,
-                                                  std::string* decrypted_key) {
+Status RangerKMSKeyProvider::DecryptEncryptionKey(const string& encryption_key,
+                                                  const string& iv,
+                                                  const string& key_version,
+                                                  string* decrypted_key) {
   return client_.DecryptEncryptionKey(encryption_key, iv, key_version, 
decrypted_key);
 }
 
-Status RangerKMSKeyProvider::GenerateEncryptionKey(std::string* encryption_key,
-                                                   std::string* iv,
-                                                   std::string* key_version) {
+Status RangerKMSKeyProvider::GenerateEncryptionKey(string* encryption_key,
+                                                   string* iv,
+                                                   string* key_version) {
   return client_.GenerateEncryptionKey(encryption_key, iv, key_version);
 }
+
+Status RangerKMSKeyProvider::GenerateTenantKey(const string& tenant_id,
+                                               string* encryption_key,
+                                               string* iv,
+                                               string* key_version) {
+  return client_.GenerateTenantKey(tenant_id, encryption_key, iv, key_version);
+}
+
 } // namespace security
 } // namespace kudu
diff --git a/src/kudu/fs/ranger_kms_key_provider.h 
b/src/kudu/fs/ranger_kms_key_provider.h
index d99d2a362..f05968a69 100644
--- a/src/kudu/fs/ranger_kms_key_provider.h
+++ b/src/kudu/fs/ranger_kms_key_provider.h
@@ -44,6 +44,11 @@ class RangerKMSKeyProvider : public KeyProvider {
                                std::string* iv,
                                std::string* key_version) override;
 
+  // Generates an encryption key with the tenant_id.
+  Status GenerateTenantKey(const std::string& tenant_id,
+                           std::string* encryption_key,
+                           std::string* iv,
+                           std::string* key_version) override;
  private:
   RangerKMSClient client_;
 };
diff --git a/src/kudu/ranger-kms/ranger_kms_client.cc 
b/src/kudu/ranger-kms/ranger_kms_client.cc
index ad6ab3010..79cd44c17 100644
--- a/src/kudu/ranger-kms/ranger_kms_client.cc
+++ b/src/kudu/ranger-kms/ranger_kms_client.cc
@@ -79,16 +79,17 @@ Status RangerKMSClient::DecryptEncryptionKey(const string& 
encryption_key,
   return Status::OK();
 }
 
-Status RangerKMSClient::GenerateEncryptionKey(string* encryption_key,
-                                              string* iv,
-                                              string* key_version) {
+Status RangerKMSClient::GenerateEncryptionKeyFromKMS(const string& key_name,
+                                                     string* encryption_key,
+                                                     string* iv,
+                                                     string* key_version) {
   EasyCurl curl;
   curl.set_auth(CurlAuthType::SPNEGO);
   vector<string> urls;
   urls.reserve(kms_urls_.size());
   for (const auto& url : kms_urls_) {
     
urls.emplace_back(Substitute("$0/v1/key/$1/_eek?eek_op=generate&num_keys=1",
-                      url, cluster_key_name_));
+                      url, key_name));
   }
   faststring resp;
   RETURN_NOT_OK_PREPEND(curl.FetchURL(urls, &resp), "failed to generate 
encryption key");
@@ -118,5 +119,18 @@ Status RangerKMSClient::GenerateEncryptionKey(string* 
encryption_key,
   return Status::OK();
 }
 
+Status RangerKMSClient::GenerateTenantKey(const string& tenant_id,
+                                          string* encryption_key,
+                                          string* iv,
+                                          string* key_version) {
+  return GenerateEncryptionKeyFromKMS(tenant_id, encryption_key, iv, 
key_version);
+}
+
+Status RangerKMSClient::GenerateEncryptionKey(string* encryption_key,
+                                              string* iv,
+                                              string* key_version) {
+  return GenerateEncryptionKeyFromKMS(cluster_key_name_, encryption_key, iv, 
key_version);
+}
+
 } // namespace security
 } // namespace kudu
diff --git a/src/kudu/ranger-kms/ranger_kms_client.h 
b/src/kudu/ranger-kms/ranger_kms_client.h
index 7180f40f7..28122b871 100644
--- a/src/kudu/ranger-kms/ranger_kms_client.h
+++ b/src/kudu/ranger-kms/ranger_kms_client.h
@@ -41,7 +41,17 @@ class RangerKMSClient {
                                std::string* iv,
                                std::string* key_version);
 
+  Status GenerateTenantKey(const std::string& tenant_id,
+                           std::string* encryption_key,
+                           std::string* iv,
+                           std::string* key_version);
+
  private:
+  Status GenerateEncryptionKeyFromKMS(const std::string& key_name,
+                                      std::string* encryption_key,
+                                      std::string* iv,
+                                      std::string* key_version);
+
   std::vector<std::string> kms_urls_;
   std::string cluster_key_name_;
 

Reply via email to