GCE'den "AccessDeniedException: 403 Yetersiz İzin" döndüren gsutil kopyası


93

SSH aracılığıyla bir GCE örneğine giriş yaptım. Oradan Depoya bir Hizmet Hesabı yardımıyla erişmek istiyorum:

GCE> gcloud auth list
Credentialed accounts:
 - 1234567890-compute@developer.gserviceaccount.com (active)

Öncelikle, bu Hizmet hesabının, çalıştığım projenin izinlerinde "Düzenleyebilir" olarak işaretlendiğinden emin oldum. Ayrıca, ona klasörde Yazma ACL'sini de verdim. Bir dosyayı kopyalamasını istiyorum:

local> gsutil acl ch -u 1234567890-compute@developer.gserviceaccount.com:W gs://mybucket

Ancak daha sonra aşağıdaki komut başarısız olur:

GCE> gsutil cp test.txt gs://mybucket/logs

(Ayrıca "günlüklerin" "mybucket" altında oluşturulduğundan emin oldum).

Aldığım hata mesajı:

Copying file://test.txt [Content-Type=text/plain]...
AccessDeniedException: 403 Insufficient Permission               0 B  

Neyi kaçırıyorum?


7
GCE sanal makinesi tam denetimle mi yoksa GCS okuma / yazma kapsamıyla mı oluşturuldu?
jterrace

1
Bunu belirttiğiniz için teşekkür ederim. Bu seçeneğin gerçekten farkında değildim. Örneği etkin seçenekle yeniden oluşturdum ve işe yaradı. Cevap olarak bayrağı açmayı önerebilseydiniz, seve seve bayraklarım.
Christophe

Yanıtlar:


142

Aranacak diğer bir şey de, GCE sanal makinesini oluştururken uygun kapsamları ayarladığınızdan emin olmaktır. Bir sanal makineye ekli bir hizmet hesabı olsa bile, GCS'ye erişmek için ona devstorage kapsamları atanmalıdır.

Örneğin, sanal makinenizi devstorage.read_onlykapsam ile oluşturduysanız , hizmet hesabınızın pakete yazma izni olsa bile bir pakete yazmaya çalışmak başarısız olur. Sen gerekir devstorage.full_controlya devstorage.read_write.

Ayrıntılar için hizmet hesaplarını kullanmak için bir örnek hazırlama bölümüne bakın .

Not: Varsayılan işlem hizmeti hesabının çok sınırlı kapsamı vardır (yalnızca GCS'ye okunabilir olması dahil). Bu, varsayılan hizmet hesabının Proje Düzenleyicisi IAM izinlerine sahip olması nedeniyle yapılır. Herhangi bir kullanıcı hizmeti hesabı kullanırsanız, kullanıcı tarafından oluşturulan hizmet hesapları varsayılan olarak tüm kapsam erişimini aldığından bu genellikle bir sorun değildir.

Sanal makineye gerekli kapsamları ekledikten sonra gsutil, yeni kapsamlara sahip olmayan önbelleğe alınmış kimlik bilgilerini kullanmaya devam ediyor olabilir. ~/.gsutilGsutil komutlarını tekrar denemeden önce silin . (Yorumlarda buna işaret ettiği için @ mndrix'e teşekkürler.)


1
Örneğimi izinlerle yeniden oluşturdum ve şimdi hepsi çalışıyor. Teşekkürler
Syclone

34
Şu andan itibaren kapsamları düzenleyebilirsiniz. Makineyi durdurun - düzenleyin - ardından Cloud API erişim kapsamlarını değiştirin. Bunun sadece yaklaşık bir aydır mevcut olduğuna inanıyorum.
Warren

150
Sanal makineye gerekli kapsamları ekledikten sonra gsutil, yeni kapsamlara sahip olmayan önbelleğe alınmış kimlik bilgilerini kullanmaya devam ediyor olabilir. gsutilKomutları tekrar denemeden önce ~ / .gsutil dosyasını silin .
mndrix

2
Çok teşekkürler mndrix!
Guillermo

2
@mndrix günü kurtarıyor
Ben Guild

51

Bu proje için ihtiyacınız olan izinlere sahip bir hesapla oturum açmalısınız:

gcloud auth login

1
gcloud auth revoke <email-account>İşiniz bittikten sonra yayınlamayı unutmayın .
ssasa

51

gsutil config -b

Ardından sağladığı URL’ye gidin, [TIKLAYIN İzin Ver]

Ardından doğrulama kodunu kopyalayın ve terminale yapıştırın.


Koşarsan bu işe yaramazsa Not gsutildan ssh.
bfontaine

3
Tarayıcınızı açmadığı sürece "çalışmıyor". Bunun yerine, manuel olarak kopyalayıp yapıştırmanız için bir url sağlar.
BuvinJ

6
Bu aynı zamanda herkes için ceza işleri yorulana eğer-b . Bu bir tarayıcı açmayacak, ancak kabuğun dışında açılabilen bir url üretecektir.
oligofren

12
  1. Sanal makineyi durdur
  2. got -> Sanal makine örneği ayrıntıları.
  3. "Cloud API erişim kapsamları" nda "Tüm Cloud API'lerine tam erişime izin ver" i seçin ve ardından "Kaydet" i tıklayın.
  4. VM'yi yeniden başlatın ve ~ / .gsutil öğesini silin.


9

Yorum yazamadığım için bu soruya bir cevap yazdım:

Bu hata, bazı durumlarda gsutilkomutu bir sudoönek ile çalıştırdığınızda da ortaya çıkabilir .


3
Bu gerçekten bir yorum, cevap değil. Biraz daha tekrarla, yorum gönderebileceksiniz .
Lece

1
Cevabı (+1) verdim, böylece @ TheLoneDeranger, 'Yorum gönder' ayrıcalığına daha yakın olacak.
Rann Lifshitz


2

Bu yüzden GCS kovasından sanal makineme kopyalamaya çalışan bir sürü şey denedim. Umarım bu yazı birine yardımcı olur.

SSHed bağlantısı aracılığıyla: görüntü açıklamasını buraya girin

ve bu komut dosyasını takip ederek:

sudo gsutil cp gs://[BUCKET_NAME]/[OBJECT_NAME] [OBJECT_DESTINATION_IN_LOCAL]

Bu hatayı aldım:

AccessDeniedException: 403 Erişim Yapılandırılmadı. Lütfen projeniz için Google Cloud Platform Konsoluna ( https://cloud.google.com/console#/project ) gidin, API'leri ve Yetkilendirmeyi seçin ve Google Cloud Storage JSON API'yi etkinleştirin.

Bunu düzelten, bu bağlantıda belirtilen "API'yi Etkinleştirme" bölümünü takip etmekti - https://cloud.google.com/storage/docs/json_api/

görüntü açıklamasını buraya girin

API'yi etkinleştirdikten sonra, SSHed penceresinde kendimi doğruladım.

gcloud auth login

Kimlik doğrulama prosedürünün ardından nihayet Google Storage Bucket'tan sanal makineme indirebildim.

PS

Şunlardan emin oldum:

  1. Sanal makine örneğime gsutils'in yüklendiğinden emin olun.
  2. Paketime gidin, izinler sekmesine gidin ve istediğiniz hizmet hesaplarını ekleyin ve Depolama Yöneticisi iznini / rolünü ayarlayın. görüntü açıklamasını buraya girin

    3. Sanal makinemin uygun Cloud API erişim kapsamlarına sahip olduğundan emin olun: görüntü açıklamasını buraya girin

görüntü açıklamasını buraya girin


1

Dokümanlardan: https://cloud.google.com/compute/docs/access/create-enable-service-accounts-for-instances#changeserviceaccountandscopes

Önce örneği durdurmanız -> düzenleme sayfasına gitmeniz -> "Cloud API erişim kapsamlarına" gitmeniz ve "tam depolama erişimi veya okuma / yazma ya da ihtiyacınız olan her şeyi" seçmeniz gerekir

Bir örnek için hizmet hesabını ve erişim kapsamlarını değiştirme Sanal makineyi farklı bir kimlik olarak çalıştırmak istiyorsanız veya örneğin gerekli API'leri çağırmak için farklı bir kapsam kümesine ihtiyaç duyduğunu belirlerseniz, hizmet hesabını ve erişim kapsamlarını değiştirebilirsiniz. mevcut bir örneğin. Örneğin, yeni bir API'ye erişim vermek için erişim kapsamlarını değiştirebilir veya bir örneği Compute Engine Varsayılan Hizmet Hesabı yerine oluşturduğunuz bir hizmet hesabı olarak çalışacak şekilde değiştirebilirsiniz.

Bir örneğin hizmet hesabını ve erişim kapsamlarını değiştirmek için örneğin geçici olarak durdurulması gerekir. Örneğinizi durdurmak için Örneği Durdurma belgelerini okuyun. Hizmet hesabını veya erişim kapsamlarını değiştirdikten sonra, örneği yeniden başlatmayı unutmayın. Hizmet hesabını değiştirmek veya durdurulan örneğin kapsamlarına erişmek için aşağıdaki yöntemlerden birini kullanın.


0

Paketin izinlerini değiştirin.

"Tüm Kullanıcılar" için bir kullanıcı ekleyin ve "Depolama Yöneticisi" erişimi verin.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.