สำเนา gsutil ส่งคืน“ AccessDeniedException: 403 สิทธิ์ไม่เพียงพอ” จาก GCE


94

ฉันลงชื่อเข้าใช้อินสแตนซ์ GCE ผ่าน SSH จากนั้นฉันต้องการเข้าถึงที่เก็บข้อมูลด้วยความช่วยเหลือของบัญชีบริการ:

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

ก่อนอื่นฉันตรวจสอบให้แน่ใจว่าบัญชีบริการนี้ถูกตั้งค่าสถานะ "สามารถแก้ไข" ในสิทธิ์ของโครงการที่ฉันกำลังทำงานอยู่ฉันยังแน่ใจว่าได้ให้เขียน ACL ในที่เก็บข้อมูลแก่เขาด้วยซึ่งฉันต้องการให้เขาคัดลอกไฟล์:

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

แต่คำสั่งต่อไปนี้ล้มเหลว:

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

(ฉันยังแน่ใจด้วยว่า "บันทึก" ถูกสร้างขึ้นภายใต้ "mybucket")

ข้อความแสดงข้อผิดพลาดที่ฉันได้รับคือ:

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

ฉันขาดอะไรไป?


7
GCE VM ถูกสร้างขึ้นโดยมีขอบเขตการควบคุมหรืออ่าน / เขียน GCS ทั้งหมดหรือไม่
jterrace

1
ขอบคุณที่ชี้ให้เห็น ฉันไม่รู้ตัวเลือกนั้นแน่นอน ฉันสร้างอินสแตนซ์ใหม่โดยเปิดใช้งานตัวเลือกและใช้งานได้ หากคุณสามารถแนะนำให้เปิดธงเป็นคำตอบฉันยินดีที่จะตั้งค่าสถานะ
Christophe

คำตอบ:


145

อีกสิ่งหนึ่งที่ต้องค้นหาคือตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่าขอบเขตที่เหมาะสมเมื่อสร้าง GCE VM แม้ว่า VM จะมีบัญชีบริการแนบอยู่ แต่ก็ต้องกำหนดขอบเขตการจัดเก็บข้อมูลเพื่อเข้าถึง GCS

ตัวอย่างเช่นหากคุณสร้าง VM ที่มีdevstorage.read_onlyขอบเขตการพยายามเขียนลงในที่เก็บข้อมูลจะล้มเหลวแม้ว่าบัญชีบริการของคุณจะได้รับอนุญาตให้เขียนลงในที่เก็บข้อมูลก็ตาม คุณจะต้องหรือdevstorage.full_controldevstorage.read_write

ดูส่วนการเตรียมอินสแตนซ์เพื่อใช้บัญชีบริการสำหรับรายละเอียด

หมายเหตุ: บัญชีบริการคำนวณเริ่มต้นมีขอบเขตที่ จำกัด มาก (รวมถึงการมี GCS แบบอ่านอย่างเดียว) สิ่งนี้ทำได้เนื่องจากบัญชีบริการเริ่มต้นมีสิทธิ์ Project Editor IAM หากคุณใช้บัญชีบริการผู้ใช้โดยทั่วไปจะไม่ใช่ปัญหาเนื่องจากผู้ใช้สร้างบัญชีบริการจะได้รับการเข้าถึงขอบเขตทั้งหมดตามค่าเริ่มต้น

หลังจากเพิ่มขอบเขตที่จำเป็นลงใน VM แล้วgsutilอาจยังคงใช้ข้อมูลรับรองที่แคชไว้ซึ่งไม่มีขอบเขตใหม่ ลบ~/.gsutilก่อนลองใช้คำสั่ง gsutil อีกครั้ง (ขอบคุณ @mndrix ที่ชี้ให้เห็นในความคิดเห็น)


1
ฉันสร้างอินสแตนซ์ของฉันขึ้นใหม่ด้วยสิทธิ์และทุกอย่างใช้งานได้แล้ว ขอบคุณ
Syclone

34
ณ ตอนนี้คุณสามารถแก้ไขขอบเขตได้ หยุดเครื่อง - แก้ไข - จากนั้นเปลี่ยนขอบเขตการเข้าถึง Cloud API ฉันเชื่อว่าสิ่งนี้ใช้ได้ประมาณหนึ่งเดือนเท่านั้น
Warren

152
หลังจากเพิ่มขอบเขตที่จำเป็นลงใน VM แล้วgsutilอาจยังคงใช้ข้อมูลรับรองที่แคชไว้ซึ่งไม่มีขอบเขตใหม่ ลบ ~ / .gsutil ก่อนลองใช้gsutilคำสั่งอีกครั้ง
mndrix

2
ขอบคุณมาก mndrix!
Guillermo

2
@mndrix บันทึกวัน
Ben Guild

51

คุณต้องเข้าสู่ระบบด้วยบัญชีที่มีสิทธิ์ที่คุณต้องการสำหรับโครงการนั้น:

gcloud auth login

1
อย่าลืมออกgcloud auth revoke <email-account>หลังจากทำเสร็จแล้ว
ssasa

51

gsutil config -b

จากนั้นท่องไปยัง URL ที่มีให้ [คลิกอนุญาต]

จากนั้นคัดลอกรหัสยืนยันและวางในเทอร์มินัล


หมายเหตุนี้ไม่ทำงานถ้าคุณทำงานจากgsutil ssh
bfontaine

3
มัน "ไม่ทำงาน" ตราบเท่าที่ไม่ได้เปิดเบราว์เซอร์ของคุณ แต่จะมี URL ให้คุณคัดลอกและวางด้วยตนเอง
BuvinJ

6
นอกจากนี้ยังใช้งานได้ดีสำหรับทุกคนหากคุณวางไฟล์-b . ซึ่งจะไม่เปิดเบราว์เซอร์ แต่จะพ่น url ที่สามารถเปิดออกมานอกเชลล์ได้
oligofren

13
  1. หยุด VM
  2. ได้ -> รายละเอียดอินสแตนซ์ VM
  3. ใน "ขอบเขตการเข้าถึง Cloud API" ให้เลือก "อนุญาตการเข้าถึงแบบเต็มไปยัง Cloud API ทั้งหมด" จากนั้นคลิก "บันทึก"
  4. รีสตาร์ท VM และ Delete ~ / .gsutil


9

ฉันได้เขียนคำตอบสำหรับคำถามนี้แล้วเนื่องจากฉันไม่สามารถแสดงความคิดเห็นได้:

ข้อผิดพลาดนี้อาจเกิดขึ้นได้หากคุณกำลังเรียกใช้gsutilคำสั่งด้วยsudoคำนำหน้าในบางกรณี


3
นี่คือความคิดเห็นจริงๆไม่ใช่คำตอบ ด้วยตัวแทนอีกเล็กน้อยคุณจะสามารถโพสต์ความคิดเห็นได้
Lece

1
ฉันได้ให้คำตอบ (+1) เพื่อให้ @TheLoneDeranger มีชื่อเสียงใกล้ชิดกับสิทธิ์ 'โพสต์ความคิดเห็น'
Rann Lifshitz

3
  1. หลังจากสร้างที่เก็บข้อมูลแล้วให้ไปที่แท็บสิทธิ์และเพิ่มอีเมลของคุณและตั้งค่าสิทธิ์ผู้ดูแลระบบพื้นที่เก็บข้อมูล

ภาพหน้าจอ

  1. เข้าถึงอินสแตนซ์ VM ผ่าน SSH >> run คำสั่ง: gcloud auth loginและทำตามขั้นตอน

อ้างอิง: https://groups.google.com/d/msg/gce-discussion/0L6sLRjX8kg/kP47FklzBgAJ


2

ฉันจึงลองทำหลายอย่างพยายามคัดลอกจากที่เก็บข้อมูล GCS ไปยัง VM หวังว่าโพสต์นี้จะช่วยใครบางคนได้

ผ่านการเชื่อมต่อ SSHed: ป้อนคำอธิบายภาพที่นี่

และทำตามสคริปต์นี้:

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

รับข้อผิดพลาดนี้:

AccessDeniedException: ไม่ได้กำหนดค่าการเข้าถึง 403 โปรดไปที่คอนโซล Google Cloud Platform ( https://cloud.google.com/console#/project ) สำหรับโปรเจ็กต์ของคุณเลือก API และ Auth และเปิดใช้งาน Google Cloud Storage JSON API

สิ่งที่แก้ไขได้คือหลังจากส่วน "การเปิดใช้งาน API" ที่กล่าวถึงในลิงก์นี้ - https://cloud.google.com/storage/docs/json_api/

ป้อนคำอธิบายภาพที่นี่

เมื่อฉันเปิดใช้งาน API แล้วฉันจะตรวจสอบตัวเองในหน้าต่าง SSHed ผ่านทาง

gcloud auth login

ทำตามขั้นตอนการตรวจสอบสิทธิ์ในที่สุดฉันก็สามารถดาวน์โหลดจาก Google Storage Bucket ไปยัง VM ของฉันได้

ปล

ฉันแน่ใจว่าจะ:

  1. ตรวจสอบให้แน่ใจว่าได้ติดตั้ง gsutils บนอินสแตนซ์ VM ของฉันแล้ว
  2. ไปที่ที่เก็บข้อมูลของฉันไปที่แท็บสิทธิ์และเพิ่มบัญชีบริการที่ต้องการและตั้งค่าสิทธิ์ / บทบาทของผู้ดูแลระบบพื้นที่เก็บข้อมูล ป้อนคำอธิบายภาพที่นี่

    3. ตรวจสอบว่า VM ของฉันมีขอบเขตการเข้าถึง Cloud API ที่เหมาะสม: ป้อนคำอธิบายภาพที่นี่

ป้อนคำอธิบายภาพที่นี่


1

จากเอกสาร: https://cloud.google.com/compute/docs/access/create-enable-service-accounts-for-instances#changeserviceaccountandscopes

ก่อนอื่นคุณต้องหยุดอินสแตนซ์ -> ไปที่หน้าแก้ไข -> ไปที่ "ขอบเขตการเข้าถึง Cloud API" และเลือก "การเข้าถึงพื้นที่เก็บข้อมูลแบบเต็มหรืออ่าน / เขียนหรืออะไรก็ได้ที่คุณต้องการ"

การเปลี่ยนบัญชีบริการและขอบเขตการเข้าถึงสำหรับอินสแตนซ์หากคุณต้องการเรียกใช้ VM เป็นข้อมูลประจำตัวอื่นหรือคุณพิจารณาว่าอินสแตนซ์ต้องการชุดขอบเขตที่แตกต่างกันเพื่อเรียกใช้ API ที่ต้องการคุณสามารถเปลี่ยนบัญชีบริการและขอบเขตการเข้าถึงได้ ของอินสแตนซ์ที่มีอยู่ ตัวอย่างเช่นคุณสามารถเปลี่ยนขอบเขตการเข้าถึงเพื่อให้สิทธิ์การเข้าถึง API ใหม่หรือเปลี่ยนอินสแตนซ์เพื่อให้ทำงานเป็นบัญชีบริการที่คุณสร้างขึ้นแทนบัญชีบริการเริ่มต้นของ Compute Engine

ในการเปลี่ยนบัญชีบริการของอินสแตนซ์และขอบเขตการเข้าถึงอินสแตนซ์ต้องหยุดชั่วคราว หากต้องการหยุดอินสแตนซ์ของคุณโปรดอ่านเอกสารสำหรับการหยุดอินสแตนซ์ หลังจากเปลี่ยนบัญชีบริการหรือขอบเขตการเข้าถึงอย่าลืมรีสตาร์ทอินสแตนซ์ ใช้วิธีใดวิธีหนึ่งต่อไปนี้ในการเปลี่ยนแปลงบัญชีบริการหรือขอบเขตการเข้าถึงของอินสแตนซ์ที่หยุดทำงาน


0

เปลี่ยนสิทธิ์ของที่เก็บข้อมูล

เพิ่มผู้ใช้สำหรับ "ผู้ใช้ทั้งหมด" และให้สิทธิ์ "ผู้ดูแลระบบจัดเก็บข้อมูล"

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.