Ошибка 403 в разрешениях KMS для загрузки содержимого в корзину хранения GCP - PullRequest
0 голосов
/ 01 ноября 2019

понял это

Так что есть два способа решить эту проблему:

Вариант 1:

  • Я не былпредоставление проекту доступа к ключу KMS, который использовался для шифрования / дешифрования хранилища. Я смог протестировать, выполнив следующую команду в cli при входе в систему под своим именем:

    gsutil kms authorize -p PROJECTNAME -k projects/PROJECTNAME/locations/global/keyRings/KEYRINGNAME/cryptoKeys/KEYNAME
    
  • Затем я вошел в систему как учетная запись службы и попытался загрузить файл. После этого он был успешным.

Вариант 2:

  • После изучения облачной консоли я обнаружил, что существует учетная запись службы хранения, которой требуется доступ к Encrypt. Расшифровать. Эта учетная запись указана в разделе Хранилище> Настройки> Учетная запись службы облачного хранения.
  • Похоже, что GCP делегирует фактическую работу этой учетной записи для выполнения задачи загрузки. Таким образом, хотя у него есть доступ к корзине (очевидно, поскольку это учетная запись службы хранения), у него не было доступа к KMS. После добавления KMS Encrypt / Decrypt к этому SA теперь он работает автоматически без какого-либо вмешательства gsutil.

Я также обновил область действия учетных данных SA для загрузки, чтобы иметь как cloudkms, так и devstorage.full_control. Я не уверен, что это повлияло на что-то, хотя.


Оригинальный вопрос:

Я делаю рабочий процесс, который автоматически создает учетные записи служб, сегменты хранилища и KMS Key Rings & Keys для несколькихсреда размещения арендаторов.

У меня есть служебная учетная запись с ограниченными разрешениями KMS, SA и Storage, которая может создавать другие учетные записи службы и позволяет им быть администраторами своих собственных арендованных объектов (например, создать служебную учетную запись для арендатора иу него есть полный контроль над KMS и Bucket этого Арендатора, но не у других Арендаторов).

В настоящее время я сталкиваюсь с проблемой получения новой учетной записи службы для возможности загрузки файлов. У него есть все необходимые разрешения:

1. Администратор KMS и Шифрование / дешифрование для его KeyRing
2. Storage Bucket Admin

Но я получаю следующую ошибку при попытке загрузить что-либо с этой учетной записью службы

[403] Errors [ 
          Message[Permission denied on Cloud KMS key. 
          Please ensure that your Cloud Storage service
          account has been authorized to use this key. ] 
      Location[ - ] 
      Reason[forbidden] 
      Domain[global] 

Вот код, который я использую для назначения разрешений, затемпо коду, используемому для доступа к корзине:

class Program
  {
    private static string solutionLocation = Path.GetFullPath(Path.Combine(Directory.GetCurrentDirectory(), @".." + Path.DirectorySeparatorChar + ".." + Path.DirectorySeparatorChar + ".." + Path.DirectorySeparatorChar));

static void Main(string[] args)
{
//Deserialize the JSON File for use with other things
JSONCreds jsonCreds =  JsonConvert.DeserializeObject<JSONCreds>(
File.ReadAllText(Path.Combine(solutionLocation, "gcp-general-sa.json")));



Environment.SetEnvironmentVariable("GOOGLE_APPLICATION_CREDENTIALS",
Path.Combine(solutionLocation, "gcp-general-sa.json"));

KeyManagementServiceClient client = KeyManagementServiceClient.Create();

StorageClient storageClient = StorageClient.Create();

//Collect Tenant ID for testing purposes
Console.WriteLine("Tenant ID?");
string TID = Console.ReadLine();
if (TID.Length > 23)
{
     TID = TID.Substring(0, 23);
}

//Setting some variables that are used throughout

string keyID = "key-" + TID;
string keyRingName = "ring-" + TID;
string keyLocationID = "global";
string saName = "sa-" + TID;

//Create a Service Account for this agency
var newServiceAccount = CreateServiceAccount(jsonCreds.project_id, saName, saName);


//Create an API Key for this Service Account, and then decode it 
var credential = GoogleCredential.GetApplicationDefault().CreateScoped(IamService.Scope.CloudPlatform);

var service = new IamService(new IamService.Initializer
{
    HttpClientInitializer = credential
});

var newServiceAccountFullKey = service.Projects.ServiceAccounts.Keys.Create( new CreateServiceAccountKeyRequest(), "projects/-/serviceAccounts/" + newServiceAccount.Email).Execute();

var newServiceAccountKey = System.Text.ASCIIEncoding.ASCII.GetString(Convert.FromBase64String(newServiceAccountFullKey.PrivateKeyData));
Console.WriteLine("Created Service Account Key For: " + newServiceAccountFullKey.Name);


//Create KMS Key Ring for this agency
KeyRing newKeyRing = CreateKeyRing(client, jsonCreds.project_id, keyLocationID, keyRingName);


//Create a KMS Key in that new Key Ring
CryptoKey newKey = CreateCryptoKey(client, jsonCreds.project_id, keyLocationID, newKeyRing.KeyRingName.KeyRingId, keyID);


//Create Bucket with specified Parameters
Bucket bucket = new Bucket
{
    Location = "us-central1",
    Name = TID,
    StorageClass = StorageClasses.Standard,
    Encryption = new Bucket.EncryptionData()
    {
        DefaultKmsKeyName = newKey.Name
    }
};
var newStorageBucket = storageClient.CreateBucket(jsonCreds.project_id, bucket);

//Set permissions for the new Service Account for the new KeyRing and Bucket
AddMemberToKeyRingPolicy(client, jsonCreds.project_id, keyLocationID, newKeyRing.KeyRingName.KeyRingId, "custom_role_with_multiple_permissions", "serviceAccount:" + newServiceAccount.Email);

AddBucketIamMember(newStorageBucket.Name, "roles/storage.admin", "serviceAccount:" + newServiceAccount.Email);


//Testing uploading to the new bucket with the new account
var newSACredential = GoogleCredential.FromJson(newServiceAccountKey.ToString()).CreateScoped("https://www.googleapis.com/auth/cloudkms");

var storage = StorageClient.Create(newSACredential);

using (var fileStream = new FileStream("sample_image.png", FileMode.Open, FileAccess.Read, FileShare.Read))
{
    storage.UploadObject(newStorageBucket.Name, "sample_image_uploaded.png", null, fileStream);
}

}

Есть идеи, что я могу делать не так? Похоже, это проблема с разрешениями, но у меня есть почти все доступные и для Storage, и для KMS, назначенные этой новой учетной записи службы, которая создается на лету.

Full Stack Trace:

Google.GoogleApiException: Google.Apis.Requests.RequestError
Insufficient Permission [403]
Errors [
    Message[Insufficient Permission] Location[ - ] Reason[insufficientPermissions] Domain[global]
]

  at Google.Cloud.Storage.V1.StorageClientImpl.UploadHelper.CheckFinalProgress() in T:\src\github\google-cloud-dotnet\releasebuild\apis\Google.Cloud.Storage.V1\Google.Cloud.Storage.V1\StorageClientImpl.UploadObject.cs:204
  at Google.Cloud.Storage.V1.StorageClientImpl.UploadHelper.Execute() in T:\src\github\google-cloud-dotnet\releasebuild\apis\Google.Cloud.Storage.V1\Google.Cloud.Storage.V1\StorageClientImpl.UploadObject.cs:154
  at Google.Cloud.Storage.V1.StorageClientImpl.UploadObject(Object destination, Stream source, UploadObjectOptions options, IProgress`1 progress) in T:\src\github\google-cloud-dotnet\releasebuild\apis\Google.Cloud.Storage.V1\Google.Cloud.Storage.V1\StorageClientImpl.UploadObject.cs:97
  at Google.Cloud.Storage.V1.StorageClientImpl.UploadObject(String bucket, String objectName, String contentType, Stream source, UploadObjectOptions options, IProgress`1 progress) in T:\src\github\google-cloud-dotnet\releasebuild\apis\Google.Cloud.Storage.V1\Google.Cloud.Storage.V1\StorageClientImpl.UploadObject.cs:70
  at ConsoleApp1.Program.Main(String[] args) in /Users/btruman/Desktop/gcp_scripts/VOCA Onboarding/Program.cs:136

Ответы [ 2 ]

1 голос
/ 01 ноября 2019

Вы должны создать ключ Cloud KMS в том же месте, где находятся данные, которые вы собираетесь зашифровать. Для получения дополнительной информации перейдите по ссылке [1].

https://cloud.google.com/storage/docs/encryption/using-customer-managed-keys#prereqs

0 голосов
/ 01 ноября 2019

Таким образом, есть два способа решить эту проблему:

Вариант 1:

  • Я не позволял проекту иметь доступ к ключу KMS, который использовался длязашифровать / расшифровать хранилище. Я смог протестировать, выполнив следующую команду в cli при входе в систему под своим именем:

    gsutil kms authorize -p PROJECTNAME -k projects/PROJECTNAME/locations/global/keyRings/KEYRINGNAME/cryptoKeys/KEYNAME
    
  • Затем я вошел в систему как учетная запись службы и попытался загрузить файл. После этого все прошло успешно.

Вариант 2:

  • Покопавшись в облачной консоли, я обнаружил, что существует учетная запись службы хранения, которой требуется доступ к Encrypt Decrypt. Эта учетная запись указана в разделе «Хранилище»> «Настройки»> «Учетная запись облачного хранилища».
  • Похоже, что GCP делегирует фактическую работу этой учетной записи для выполнения задачи загрузки. Таким образом, хотя у него есть доступ к корзине (очевидно, поскольку это учетная запись службы хранения), у него не было доступа к KMS. После добавления KMS Encrypt / Decrypt в этот SA он теперь работал автоматически без какого-либо вмешательства gsutil.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...