- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
想通了
所以有两种方法可以解决这个问题:
选项 1:
我没有让项目访问用于加密/解密存储桶的 KMS key 。我能够通过在 cli 中以我自己身份登录时运行以下命令来进行测试:
gsutil kms authorize -p PROJECTNAME -k projects/PROJECTNAME/locations/global/keyRings/KEYRINGNAME/cryptoKeys/KEYNAME
选项 2:
我还更新了用于上传的 SA 凭据的范围,以包含 cloudkms 和 devstorage.full_control。不过,我不确定这是否影响了什么。
原始问题:
我正在制定一个工作流程,自动为 Multi-Tenancy 托管环境自动创建服务帐户、存储桶和 KMS key 环和 key 。
我有一个具有有限 KMS、SA 和存储权限的服务帐户,可以创建其他服务帐户并允许他们成为自己租用项目的管理员(例如:为租户创建一个服务帐户,它已满控制该租户的 KMS 和存储桶,但不控制其他租户的)。
不过,我目前遇到了让新服务帐户能够上传文件的问题。它已获得所需的所有权限:
<强>1。 KMS Admin 及其 KeyRing 的加密/解密
2。存储桶管理员
但是,当我尝试使用该服务帐户上传内容时出现以下错误
[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);
}
知道我可能做错了什么吗?看起来这是一个权限问题,但我几乎每一个都可用于存储和 KMS 分配给这个动态创建的新服务帐户。
完整堆栈跟踪:
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
最佳答案
您必须在与要加密的数据相同的位置创建 Cloud KMS key 。如需进一步引用,请查看链接 [1]。
https://cloud.google.com/storage/docs/encryption/using-customer-managed-keys#prereqs
关于c# - 将内容上传到 GCP 存储桶的 KMS 权限 403 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58651884/
我正在评估 GCP 的 stackdriver 以跨多个微服务进行日志记录。 其中一些服务部署在本地,其中一些在 AWS/GCP 上。 我们的服务是基于 .NET 或 nodejs 的应用程序,我们投
我处于必须与 GCP 服务器建立 rabbitMQ 连接(我是消费者)的情况。我的代码也在 GCP 机器上。因此双方(一个是 MQ 生产者,另一个是我)决定创建一个本地网络连接,而不是进行外部 IP
我是 GCP 的新手。“GCP 服务”和“GCP 资源”之间的差异让我感到困惑。我认为 GCP 资源是物理 Assets ,例如计算机、硬盘驱动器、虚拟资源、CPU 和 RAM 等。但是 GCP 服务
Google 云平台多久更新(刷新)GCP 控制台上显示的结算费用?有固定的延迟还是实时的? 最佳答案 计费费用每天更新,发票每月生成。也可以通过编程方式按需检查使用情况,按照说明-> https:/
我在 GCP 存储桶中有以下格式的数据: gs://bucket/my_table/data_date=2021-03-26/000 gs://bucket/my_table/data_date=20
我使用 Terraform 在 GCP 中创建了一个服务帐户和一个自定义角色。如何将此自定义角色附加到服务帐户?我可以使用 GCP Console 来做到这一点,但这不是这里的需要,因为我必须使用 T
我正在学习 GCP,遇到了 Kuberflow 和 Google Cloud Composer。 据我了解,似乎两者都用于编排工作流,使用户能够在 GCP 中安排和监控管道。 我能弄清楚的唯一区别是
我们在 gcp 中需要 ufw 吗?还是 gcp 提供的防火墙足够好? 最佳答案 根据您想要实现的目标,您可以选择在 VM 实例级别或 GCP 级别使用防火墙。 出于安全原因,Google Cloud
我正在寻找一种方法来了解我为 GCP 虚拟机实例支付了多少费用。我有 4 个实例,当我转到计费帐户 -> 报告时,我通常会看到 Compute Engine 上特定项目的价格。 我的实例有窗口和许可以
我有一个已经发布到 Play 商店的 react-native 应用程序。在上次更新中,我遇到了这个错误,并且在描述中谷歌说 com.--.MainApplication.onCreate 我有一个由
我正在玩 spring gcp 项目。我的first example with GCP bucket工作正常并使用我在属性文件中指出的正确Google帐户: spring.cloud.gcp.cred
场景:存储在 GCP 存储桶中的图像文件需要通过 POST 发送到第三方 REST 端点 问题:这真的是最好的模式吗?有没有更有效、更简洁的方法? 我们有移动应用将图像上传到 GCP 存储桶。当图像上
我正在尝试使用Simba JDBC从本地连接GCP BigQuery,但收到错误。之前我遇到了服务帐户角色权限问题,这些问题已通过为服务帐户添加必要的角色来解决。服务帐户需要角色权限,但我仍收到错误
我的项目有一个依赖项,需要 python v3.6+。因此,它会在通过 pip 在 python 3 内核中安装时抛出错误,因为 AI Platform Notebooks 默认附带 v3.5。如何使
尝试在本地运行“java cloud run hello word sample”Cloud Run:在本地运行 我一直在努力 Enabling GCP auth addon... Failed to
尝试在本地运行“java cloud run hello word sample”Cloud Run:在本地运行 我一直在努力 Enabling GCP auth addon... Failed to
通过在 application.properties 文件中指定文件位置来传递服务帐户 key 文件(从 GCP 控制台生成)似乎很简单。但是,我尝试了以下所有选项: 1. spring.cloud.
我正在尝试从在 Google Cloud 上运行的常规 VM 实例(即 ubuntu-1904)上的私有(private) GCP 容器注册表中提取 docker 容器,但出现以下错误: user@t
我正在使用 zsh,并且我已经安装了 gcloud,以便通过我的 Mac 上的本地终端与 GCP 进行交互。我遇到了这个错误“zsh:找不到匹配项:apache-beam[gcp]”。但是,当我在 G
我有一个 Spring boot 项目,应该使用 spring-cloud-gcp-starter-sql-postgresql 连接 Cloud SQL 实例,以避免在项目中显式使用 IP . 到目
我是一名优秀的程序员,十分优秀!