กำหนดค่าข้อมูลรับรอง AWS และตัวแปรสภาพแวดล้อมภูมิภาคของคุณเพื่อใช้ในการกระทำอื่น ๆ ของ GitHub
การดำเนินการนี้ใช้ AWS JavaScript SDK Credential Resolution Chain และตัวแปรสภาพแวดล้อมเซสชันการส่งออกสำหรับการกระทำอื่น ๆ ของคุณที่จะใช้ ตรวจพบการส่งออกตัวแปรสภาพแวดล้อมโดยทั้ง AWS SDKS และ AWS CLI สำหรับการโทร AWS API
การเรียก API ไปยัง AWS จะต้องลงนามด้วยข้อมูลข้อมูลรับรองดังนั้นเมื่อคุณใช้หนึ่งใน AWS SDK หรือเครื่องมือ AWS คุณต้องให้ข้อมูลรับรอง AWS และภูมิภาค AWS วิธีหนึ่งในการทำเช่นนั้นในการกระทำของ GitHub คือการใช้ความลับที่เก็บกับข้อมูลรับรอง IAM แต่สิ่งนี้ไม่เป็นไปตามแนวทางการรักษาความปลอดภัย AWS ในการใช้ข้อมูลรับรองระยะยาว แต่เราขอแนะนำให้คุณใช้ข้อมูลรับรองระยะยาวหรือ JWT เพื่อดึงข้อมูลรับรองชั่วคราวและใช้กับเครื่องมือของคุณแทน การกระทำของ GitHub นี้ช่วยอำนวยความสะดวกในเรื่องนั้น
AWS SDKS และเครื่องมือมองหาข้อมูลประจำตัวของคุณในตัวแปรสภาพแวดล้อมที่เป็นมาตรฐาน ในสาระสำคัญการดำเนินการนี้ดำเนินการผ่านการไหลความละเอียดของข้อมูลรับรองมาตรฐานและในตอนท้ายตัวแปรการส่งออกสภาพแวดล้อมเพื่อให้คุณใช้ในภายหลัง
เราสนับสนุนห้าวิธีในการดึงข้อมูลรับรองจาก AWS แต่เราขอแนะนำให้คุณใช้ผู้ให้บริการ OIDC ของ GitHub ร่วมกับจุดสิ้นสุดของผู้ให้บริการ AWS IAM Identity
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำเช่นนั้นอ่านต่อ
เอกสารบางอย่างนี้อาจไม่ถูกต้องหากคุณใช้ GHES (GitHub Enterprise Server) โปรดจดบันทึกเพื่อตรวจสอบเอกสาร GitHub เมื่อเกี่ยวข้อง
ตัวอย่างเช่น URL ที่ OIDC JWT ออกมาจากนั้นแตกต่างจาก token.actions.githubusercontent.com
ปกติ Actions.githubusercontent.com และจะไม่ซ้ำกันกับเซิร์ฟเวอร์องค์กรของคุณ เป็นผลให้คุณจะต้องกำหนดค่าสิ่งนี้แตกต่างกันเมื่อคุณสร้างผู้ให้บริการข้อมูลประจำตัว
ปัจจุบันเราไม่มีสภาพแวดล้อมการทดสอบ GHES เพื่อตรวจสอบการกระทำนี้ หากคุณกำลังทำงานใน GHES และพบปัญหาโปรดแจ้งให้เราทราบ
เราขอแนะนำให้ทำตามแนวทางปฏิบัติที่ดีที่สุดของ Amazon IAM สำหรับข้อมูลรับรอง AWS ที่ใช้ในเวิร์กโฟลว์การกระทำของ GitHub รวมถึง:
มีห้าวิธีที่ได้รับการสนับสนุนที่แตกต่างกันในการดึงข้อมูลรับรอง:
AssumeRoleWithWebIdentity
)AssumeRole
)AssumeRoleWithWebIdentity
)AssumeRole
)เนื่องจากเราใช้ AWS JavaScript SDK เราจะใช้โฟลว์ความละเอียดของข้อมูลรับรองสำหรับ Node.js การกระทำของคุณอาจแทนที่บางส่วนของการไหลนี้ทั้งนี้ขึ้นอยู่กับอินพุตของคุณ
เราขอแนะนำให้ใช้ตัวเลือกแรกด้านบน: ผู้ให้บริการ OIDC ของ GitHub วิธีนี้ใช้ OIDC เพื่อรับข้อมูลรับรองระยะสั้นที่จำเป็นสำหรับการกระทำของคุณ ดู OIDC สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการตั้งค่าบัญชี AWS ของคุณเพื่อรับบทบาทกับ OIDC
ตารางต่อไปนี้อธิบายถึงวิธีใดที่เราจะใช้เพื่อรับข้อมูลประจำ
ตัวตนที่ใช้ | aws-access-key-id | role-to-assume | web-identity-token-file | role-chaining | การอนุญาต id-token |
---|---|---|---|---|---|
[✅แนะนำ] สมมติบทบาทโดยตรงโดยใช้ผู้ให้บริการ GitHub OIDC | |||||
ผู้ใช้ IAM | |||||
สมมติว่ามีบทบาทโดยใช้ข้อมูลรับรองผู้ใช้ IAM | |||||
สมมติว่ามีบทบาทโดยใช้ข้อมูลรับรองไฟล์โทเค็น WebIdentity Token | |||||
สมมติว่ามีบทบาทโดยใช้ข้อมูลประจำตัวที่มีอยู่ |
หมายเหตุ: role-chaining
ไม่จำเป็นต้องใช้ข้อมูลประจำตัวที่มีอยู่เสมอไป หากคุณได้รับข้อผิดพลาด "ข้อมูลรับรองที่โหลดโดย SDK ไม่ตรงกัน" ลองเปิดใช้งานตัวเลือกนี้
ดู Action.yml สำหรับรายละเอียดเพิ่มเติม
ตัวเลือก | คำอธิบาย | ที่จำเป็น |
---|---|---|
AWS-Region | AWS ภูมิภาคใดที่จะใช้ | ใช่ |
การสวมบทบาท | บทบาทที่จะดึงข้อมูลรับรอง จำเป็นสำหรับการตรวจสอบบางประเภทเท่านั้น | เลขที่ |
aws-access-key-id | AWS Access Key ที่จะใช้ จำเป็นสำหรับการตรวจสอบบางประเภทเท่านั้น | เลขที่ |
AWS-Secret-Access-Key | AWS Secret Key ที่จะใช้ จำเป็นสำหรับการตรวจสอบบางประเภทเท่านั้น | เลขที่ |
aws-session-token | โทเค็นเซสชัน AWS ที่จะใช้ ใช้ในสถานการณ์การตรวจสอบความถูกต้องที่ไม่ธรรมดา | เลขที่ |
การปราบปรามบทบาท | ใช้ข้อมูลรับรองที่มีอยู่จากสภาพแวดล้อมเพื่อรับบทบาทใหม่ | เลขที่ |
ผู้ชม | ผู้ชม JWT เมื่อใช้ OIDC ใช้ในพาร์ทิชัน AWS ที่ไม่ใช่ default เช่นภูมิภาคจีน | เลขที่ |
http-proxy | พร็อกซี HTTP ที่จะใช้สำหรับการโทร API | เลขที่ |
Mask-Aws-account-id | รหัสบัญชี AWS ไม่ถือว่าเป็นความลับ การตั้งค่านี้จะซ่อนรหัสบัญชีจากเอาต์พุตอยู่ดี | เลขที่ |
ระยะเวลาบทบาทที่สอง | ระยะเวลาบทบาทที่สันนิษฐานในไม่กี่วินาทีหากสมมติว่ามีบทบาท ค่าเริ่มต้นถึง 1 ชั่วโมง | เลขที่ |
คนภายนอก | รหัสภายนอกของบทบาทที่จะสมมติ จำเป็นก็ต่อเมื่อบทบาทของคุณต้องการ | เลขที่ |
ชื่อเซสชันบทบาท | ค่าเริ่มต้นเป็น "gitHubactions" แต่อาจมีการเปลี่ยนแปลงหากจำเป็น | เลขที่ |
การติดแท็กบทบาท | ข้ามการติดแท็กเซสชันหากตั้งค่า | เลขที่ |
นโยบายอินไลน์-เซสชัน | คุณอาจ จำกัด นโยบายบทบาทที่สันนิษฐานได้โดยการกำหนดนโยบายแบบอินไลน์ที่นี่ | เลขที่ |
การจัดการ-การบังคับใช้ | คุณสามารถ จำกัด นโยบายบทบาทที่สันนิษฐานได้โดยการระบุนโยบายที่มีการจัดการที่นี่ | เลขที่ |
เอาต์พุต | เมื่อตั้งค่าเอาต์พุตจะดึงข้อมูลรับรองเป็นเอาต์พุตขั้นตอนการดำเนินการ ค่าเริ่มต้นเป็นเท็จ | เลขที่ |
unset-drent-credentials | เมื่อตั้งค่าให้พยายามที่จะยกเลิกข้อมูลรับรองใด ๆ ที่มีอยู่ในนักวิ่งแอ็คชั่นของคุณ | เลขที่ |
ปิดการศึกษา | ปิดใช้งานตรรกะการลองใหม่/backoff สำหรับสมมติว่ามีการเรียกบทบาท โดยค่าเริ่มต้นจะเปิดใช้งานการลองใหม่ | เลขที่ |
ลองรอคอย | จำกัด จำนวนความพยายามลองใหม่ก่อนที่จะยอมแพ้ ค่าเริ่มต้นถึง 12 | เลขที่ |
ตัวละครพิเศษ | ไม่ธรรมดาสภาพแวดล้อมบางอย่างไม่สามารถทนต่ออักขระพิเศษในคีย์ลับได้ ตัวเลือกนี้จะลองใช้ข้อมูลรับรองอีกครั้งจนกว่าปุ่ม Secret Access จะไม่มีอักขระพิเศษ ตัวเลือกนี้แทนที่การปิดการใช้งานและลองใช้ Max-Attempts | เลขที่ |
ระยะเวลาเซสชันเริ่มต้นคือ 1 ชั่วโมง
หากคุณต้องการปรับสิ่งนี้คุณสามารถผ่านระยะเวลาไปยัง role-duration-seconds
แต่ระยะเวลาต้องไม่เกินค่าสูงสุดที่กำหนดเมื่อบทบาท IAM ถูกสร้างขึ้น
หากบทบาทของคุณต้องการ ID ภายนอกที่จะสันนิษฐานคุณสามารถให้ ID ภายนอกด้วยอินพุต role-external-id
ชื่อเซสชันเริ่มต้นคือ "gitHubactions" และคุณสามารถแก้ไขได้โดยระบุชื่อที่ต้องการใน role-session-name
เซสชันจะถูกติดแท็กด้วยแท็กต่อไปนี้: (ดูเอกสารของ GitHub สำหรับคำจำกัดความตัวแปรสภาพแวดล้อม GITHUB_
)
สำคัญ | ค่า |
---|---|
คนอื่น ๆ | "การกระทำ" |
ที่เก็บ | github_repository |
เวิร์กโฟลว์ | github_workflow |
การกระทำ | github_action |
นักแสดงชาย | github_actor |
สาขา | github_ref |
ให้สัญญา | github_sha |
หมายเหตุ: ค่าแท็กทั้งหมดจะต้องสอดคล้องกับข้อกำหนดของแท็ก โดยเฉพาะอย่างยิ่ง GITHUB_WORKFLOW
จะถูกตัดทอนถ้ามันยาวเกินไป หาก GITHUB_ACTOR
หรือ GITHUB_WORKFLOW
มีอักขระที่ไม่ถูกต้องอักขระจะถูกแทนที่ด้วย '*'
การกระทำจะใช้การติดแท็กเซสชันโดยค่าเริ่มต้นในระหว่างการสันนิษฐานบทบาทเว้นแต่คุณจะทำตามคำแนะนำของเราและกำลังสมมติว่ามีบทบาทกับ webidentity สำหรับสมมติฐานบทบาทของ WebIdentity แท็กเซสชันจะต้องรวมอยู่ในโทเค็น WebIdentity ที่เข้ารหัส ซึ่งหมายความว่าแท็กสามารถจัดหาได้โดยผู้ให้บริการ OIDC เท่านั้นและพวกเขาไม่สามารถตั้งค่าในระหว่างการเรียก AssumeroLewithWebidentity API ภายในการดำเนินการ ดู #419 สำหรับข้อมูลเพิ่มเติม
คุณสามารถข้ามการติดแท็กเซสชันนี้ได้โดยให้ role-skip-session-tagging
เป็นจริงในอินพุตของแอ็คชั่น:
uses : aws-actions/configure-aws-credentials@v4
with :
role-skip-session-tagging : true
ไม่จำเป็นต้องใช้นโยบายเซสชัน แต่อนุญาตให้คุณ จำกัด ขอบเขตของข้อมูลประจำตัวที่ดึงมาโดยไม่ต้องเปลี่ยนแปลงบทบาทของ IAM คุณสามารถระบุนโยบายเซสชันแบบอินไลน์ในไฟล์เวิร์กโฟลว์ของคุณหรืออ้างอิงถึงนโยบายเซสชันที่มีการจัดการที่มีอยู่โดย ARN
นโยบาย IAM ในรูปแบบ stringified JSON ที่คุณต้องการใช้เป็นนโยบายเซสชันแบบอินไลน์ ขึ้นอยู่กับการตั้งค่า JSON สามารถเขียนได้ในบรรทัดเดียวเช่นนี้:
uses : aws-actions/configure-aws-credentials@v4
with :
inline-session-policy : ' {"Version":"2012-10-17","Statement":[{"Sid":"Stmt1","Effect":"Allow","Action":"s3:List*","Resource":"*"}]} '
หรือเราสามารถมี JSON ที่จัดรูปแบบได้อย่างดีเช่นกัน:
uses : aws-actions/configure-aws-credentials@v4
with :
inline-session-policy : >-
{
"Version": "2012-10-17",
"Statement": [
{
"Sid":"Stmt1",
"Effect":"Allow",
"Action":"s3:List*",
"Resource":"*"
}
]
}
ชื่อทรัพยากร Amazon (ARNS) ของนโยบายการจัดการ IAM ที่คุณต้องการใช้เป็นนโยบายเซสชันที่มีการจัดการ นโยบายจะต้องมีอยู่ในบัญชีเดียวกันกับบทบาท คุณสามารถผ่านนโยบายที่มีการจัดการเดียวเช่นนี้:
uses : aws-actions/configure-aws-credentials@v4
with :
managed-session-policies : arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
และเราสามารถผ่านนโยบายที่มีการจัดการหลายอย่างเช่นนี้:
uses : aws-actions/configure-aws-credentials@v4
with :
managed-session-policies : |
arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
arn:aws:iam::aws:policy/AmazonS3OutpostsReadOnlyAccess
ตอนนี้คุณสามารถกำหนดค่าการตั้งค่าลองอีกครั้งเมื่อการโทร STS ล้มเหลว โดยค่าเริ่มต้นเราลองใหม่ด้วย backoff แบบเอ็กซ์โปเนนเชียล 12
ครั้ง คุณสามารถปิดการใช้งานพฤติกรรมนี้ได้ทั้งหมดโดยการตั้งค่าอินพุต disable-retry
เป็น true
หรือคุณสามารถกำหนดค่าจำนวนครั้งที่พวกเขาลองใหม่ด้วยอินพุต retry-max-attempts
รหัสบัญชีของคุณไม่ได้ถูกปกปิดโดยค่าเริ่มต้นในบันทึกเวิร์กโฟลว์เนื่องจากไม่ถือว่าเป็นข้อมูลที่ละเอียดอ่อน อย่างไรก็ตามคุณสามารถตั้งค่าอินพุต mask-aws-account-id
เป็น true
เพื่อปกปิดรหัสบัญชีของคุณในบันทึกเวิร์กโฟลว์หากต้องการ
บางครั้งข้อมูลประจำตัวที่มีอยู่ในนักวิ่งของคุณอาจได้รับผลลัพธ์ที่ตั้งใจไว้ คุณสามารถตั้งค่าอินพุต unset-current-credentials
เป็น true
เพื่อแก้ไขปัญหานี้
บางกรณีขอบไม่สามารถแยกวิเคราะห์ AWS_SECRET_ACCESS_KEY
ได้อย่างถูกต้องหากมีอักขระพิเศษ สำหรับข้อมูลเพิ่มเติมโปรดดูเอกสาร AWS CLI หากคุณตั้งค่าตัวเลือก special-characters-workaround
การกระทำนี้จะลองใช้ข้อมูลรับรองอย่างต่อเนื่องจนกว่าเราจะได้รับที่ไม่มีอักขระพิเศษ ตัวเลือกนี้จะแทนที่ตัวเลือก disable-retry
และ retry-max-attempts
เราขอแนะนำให้คุณไม่เปิดใช้งานตัวเลือกนี้เว้นแต่จะจำเป็นเพราะการลองใหม่ APIs อีกครั้งจนกว่าพวกเขาจะประสบความสำเร็จไม่ใช่แนวปฏิบัติที่ดีที่สุด
เราขอแนะนำให้ใช้ผู้ให้บริการ OIDC ของ GitHub เพื่อรับข้อมูลรับรอง AWS อายุสั้นที่จำเป็นสำหรับการกระทำของคุณ เมื่อใช้ OIDC คุณกำหนดค่า IAM ให้ยอมรับ JWTs จากจุดสิ้นสุด OIDC ของ GitHub การกระทำนี้จะสร้าง JWT ที่ไม่ซ้ำกันกับเวิร์กโฟลว์การทำงานโดยใช้จุดสิ้นสุด OIDC และจะใช้ JWT เพื่อรับบทบาทที่ระบุด้วยข้อมูลรับรองระยะสั้น
เพื่อให้สิ่งนี้ทำงานได้
กำหนดค่าเวิร์กโฟลว์ของคุณเพื่อใช้ id-token: write
กำหนดค่าผู้ชมของคุณหากจำเป็น
ในบัญชี AWS ของคุณกำหนดค่า IAM เพื่อไว้วางใจผู้ให้บริการข้อมูลประจำตัว OIDC ของ GitHub
กำหนดค่าบทบาท IAM ที่มีขีด จำกัด การเรียกร้องที่เหมาะสมและขอบเขตการอนุญาต
หมายเหตุ : การตั้งชื่อบทบาทของคุณ "GitHubactions" ได้รับการรายงานว่าไม่ทำงาน ดู #953
ระบุ ARN ของบทบาทนั้นเมื่อตั้งค่าการกระทำนี้
ก่อนอื่นเพื่อให้การดำเนินการนี้สร้าง JWT ไฟล์เวิร์กโฟลว์ของคุณจะต้องมี id-token: write
:
permissions :
id-token : write
contents : read
เมื่อสร้าง JWT ผู้ชมจะต้องระบุ โดยปกติคุณจะใช้ sts.amazonaws.com
และการกระทำนี้ใช้สิ่งนี้โดยค่าเริ่มต้นหากคุณไม่ได้ระบุ สิ่งนี้จะใช้งานได้สำหรับกรณีส่วนใหญ่ การเปลี่ยนผู้ชมเริ่มต้นอาจมีความจำเป็นเมื่อใช้พาร์ติชัน AWS ที่ไม่ได้รับการป้องกันเช่นภูมิภาคจีน คุณสามารถระบุผู้ชมผ่านข้อมูล audience
:
- name : Configure AWS Credentials for China region audience
uses : aws-actions/configure-aws-credentials@v4
with :
audience : sts.amazonaws.com.cn
aws-region : us-east-3
role-to-assume : arn:aws-cn:iam::123456789100:role/my-github-actions-role
ในการใช้ผู้ให้บริการ OIDC ของ GitHub คุณต้องตั้งค่าสหพันธ์กับผู้ให้บริการเป็น IAM IDP ก่อน ผู้ให้บริการ GitHub OIDC จะต้องสร้างขึ้นเพียงครั้งเดียวต่อบัญชี (เช่นหลายบทบาท IAM ที่สามารถสันนิษฐานได้โดย OIDC ของ GitHub สามารถแบ่งปันผู้ให้บริการ OIDC เดียว) นี่คือเทมเพลตตัวอย่าง CloudFormation ที่จะกำหนดค่าความไว้วางใจนี้ให้คุณ
โปรดทราบว่าการพิมพ์นิ้วแบบด้านล่างนั้นถูกตั้งค่าให้กับ F ทั้งหมดเนื่องจากไม่ได้ใช้ thumbprint เมื่อตรวจสอบความถูกต้อง token.actions.githubusercontent.com
นี่เป็นกรณีพิเศษที่ใช้ เมื่อ OIDC ของ GitHub กำลังตรวจสอบสิทธิ์ IAM IAM ใช้ห้องสมุดของ CA ที่เชื่อถือได้เพื่อตรวจสอบสิทธิ์ ค่ายังคงเป็น API ดังนั้นจึงต้องระบุ
คุณสามารถคัดลอกเทมเพลตด้านล่างหรือโหลดได้จากที่นี่: https://d38mtn6aq9zhn6.cloudfront.net/configure-aws-credentials-latest.yml
Parameters :
GitHubOrg :
Description : Name of GitHub organization/user (case sensitive)
Type : String
RepositoryName :
Description : Name of GitHub repository (case sensitive)
Type : String
OIDCProviderArn :
Description : Arn for the GitHub OIDC Provider.
Default : " "
Type : String
OIDCAudience :
Description : Audience supplied to configure-aws-credentials.
Default : " sts.amazonaws.com "
Type : String
Conditions :
CreateOIDCProvider : !Equals
- !Ref OIDCProviderArn
- " "
Resources :
Role :
Type : AWS::IAM::Role
Properties :
AssumeRolePolicyDocument :
Statement :
- Effect : Allow
Action : sts:AssumeRoleWithWebIdentity
Principal :
Federated : !If
- CreateOIDCProvider
- !Ref GithubOidc
- !Ref OIDCProviderArn
Condition :
StringEquals :
token.actions.githubusercontent.com:aud : !Ref OIDCAudience
StringLike :
token.actions.githubusercontent.com:sub : !Sub repo:${GitHubOrg}/${RepositoryName}:*
GithubOidc :
Type : AWS::IAM::OIDCProvider
Condition : CreateOIDCProvider
Properties :
Url : https://token.actions.githubusercontent.com
ClientIdList :
- sts.amazonaws.com
ThumbprintList :
- ffffffffffffffffffffffffffffffffffffffff
Outputs :
Role :
Value : !GetAtt Role.Arn
เพื่อให้สอดคล้องกับแนวทางปฏิบัติที่ดีที่สุดของ Amazon IAM ในการให้สิทธิ์น้อยที่สุดเอกสารนโยบายบทบาทสมมติควรมี Condition
ที่ระบุเรื่อง ( sub
) ที่ได้รับอนุญาตให้รับบทบาท GitHub ยังแนะนำการกรองสำหรับผู้ชมที่ถูกต้อง ( aud
) ดูเอกสาร AWS IAM ที่อ้างว่าคุณสามารถกรองในนโยบายความน่าเชื่อถือของคุณ
หากไม่มีเงื่อนไข ( sub
) ผู้ใช้ GitHub หรือที่เก็บใด ๆ อาจถือว่าเป็นบทบาท เรื่องสามารถกำหนดขอบเขตไปยังองค์กร GitHub และที่เก็บข้อมูลดังแสดงในเทมเพลต CloudFormation อย่างไรก็ตามการกำหนดขอบเขตลงไปที่องค์กรและ repo ของคุณอาจทำให้สมมติฐานของบทบาทล้มเหลวในบางกรณี ดูตัวอย่างการอ้างสิทธิ์ในการเรียกร้องรายละเอียดเฉพาะเกี่ยวกับค่าหัวข้อจะขึ้นอยู่กับเวิร์กโฟลว์ของคุณ นอกจากนี้คุณยังสามารถปรับแต่งการเรียกร้องเรื่องของคุณหากคุณต้องการควบคุมข้อมูลที่คุณสามารถกรองได้อย่างเต็มที่ในนโยบายความน่าเชื่อถือของคุณ หากคุณไม่แน่ใจว่าคีย์เรื่อง ( sub
) ของคุณคืออะไรคุณสามารถเพิ่มการกระทำของ actions-oidc-debugger
ลงในเวิร์กโฟลว์ของคุณเพื่อดูค่าของคีย์ ( sub
) และการเรียกร้องอื่น ๆ
สามารถเพิ่มเงื่อนไขการเรียกร้องเพิ่มเติมเพื่อความจำเพาะที่สูงขึ้นตามที่อธิบายไว้ในเอกสาร GitHub เนื่องจากรายละเอียดการใช้งานการเรียกร้อง OIDC ทุกครั้งไม่ได้รับการสนับสนุนจาก IAM ในปัจจุบัน
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการกระทำของ OIDC และ GitHub โปรดดู:
หากคุณเรียกใช้การกระทำของ GitHub ในนักวิ่งที่โฮสต์ตนเองซึ่งสามารถเข้าถึงข้อมูลรับรอง AWS ได้แล้วเช่นอินสแตนซ์ EC2 คุณไม่จำเป็นต้องให้ข้อมูลรับรองคีย์ผู้ใช้ IAM เข้าถึงการกระทำนี้ เราจะใช้วิธีการแก้ปัญหาข้อมูลรับรองของ AWS JavaScript SDK มาตรฐานเพื่อค้นหาข้อมูลประจำตัวของคุณดังนั้นหาก AWS JS SDK สามารถตรวจสอบความถูกต้องของนักวิ่งของคุณการกระทำนี้ก็เช่นกัน
หากไม่มีการให้ข้อมูลรับรองคีย์การเข้าถึงในอินพุตการดำเนินการการกระทำนี้จะใช้ข้อมูลรับรองจากสภาพแวดล้อมนักวิ่งโดยใช้วิธีการเริ่มต้นสำหรับ AWS SDK สำหรับ JavaScript
คุณสามารถใช้การกระทำนี้เพื่อกำหนดค่าภูมิภาคและรหัสบัญชีในสภาพแวดล้อมจากนั้นใช้ข้อมูลรับรองของนักวิ่งสำหรับการโทร AWS API ทั้งหมดที่ทำโดยเวิร์กโฟลว์การกระทำของคุณ:
uses : aws-actions/configure-aws-credentials@v4
with :
aws-region : us-east-2
ในกรณีนี้ข้อมูลประจำตัวของนักวิ่งของคุณจะต้องมีสิทธิ์เรียก AWS API ใด ๆ ที่เรียกโดยเวิร์กโฟลว์การกระทำของคุณ
หรือคุณสามารถใช้การกระทำนี้เพื่อรับบทบาทจากนั้นใช้ข้อมูลรับรองบทบาทสำหรับการเรียก AWS API ทั้งหมดที่ทำโดยเวิร์กโฟลว์การกระทำของคุณ:
uses : aws-actions/configure-aws-credentials@v4
with :
aws-region : us-east-2
role-to-assume : my-github-actions-role
ในกรณีนี้ข้อมูลประจำตัวของนักวิ่งของคุณจะต้องมีสิทธิ์ในการรับบทบาท
นอกจากนี้คุณยังสามารถรับบทบาทโดยใช้ไฟล์โทเค็นเว็บเอกลักษณ์เช่นถ้าใช้ Amazon EKS IRSA POD ที่ทำงานในโหนด EKS Worker ที่ไม่ทำงานเป็นรูทสามารถใช้ไฟล์นี้เพื่อรับบทบาทกับเว็บเอกลักษณ์
หากต้องการใช้พร็อกซี HTTP คุณสามารถตั้งค่าในการกระทำด้วยตนเอง
นอกจากนี้การกระทำนี้จะพิจารณาตัวแปรสภาพแวดล้อม HTTP_PROXY
เสมอ
พร็อกซีที่กำหนดค่าด้วยตนเอง:
uses : aws-actions/configure-aws-credentials@v4
with :
aws-region : us-east-2
role-to-assume : my-github-actions-role
http-proxy : " http://companydomain.com:3128 "
พร็อกซีกำหนดค่าในตัวแปรสภาพแวดล้อม:
# Your environment configuration
HTTP_PROXY= " http://companydomain.com:3128 "
เวิร์กโฟลว์นี้ ไม่ได้ ติดตั้ง AWS CLI ลงในสภาพแวดล้อมของคุณ นักวิ่งโฮสต์ตัวเองที่ตั้งใจจะเรียกใช้การกระทำนี้ก่อนที่จะดำเนินการคำสั่ง aws
จำเป็นต้องติดตั้ง AWS CLI หากยังไม่ปรากฏ สภาพแวดล้อมนักวิ่งที่โฮสต์ GitHub ส่วนใหญ่ควรรวม AWS CLI ตามค่าเริ่มต้น
- name : Configure AWS Credentials
uses : aws-actions/configure-aws-credentials@v4
with :
aws-region : us-east-2
role-to-assume : arn:aws:iam::123456789100:role/my-github-actions-role
role-session-name : MySessionName
ในตัวอย่างนี้การกระทำจะโหลดโทเค็น OIDC จากตัวแปรสภาพแวดล้อม MySessionName
จัดเตรียม GitHub และใช้เพื่อรับบทบาท arn:aws:iam::123456789100:role/my-github-actions-role
- name : Configure AWS Credentials
uses : aws-actions/configure-aws-credentials@v4
with :
aws-region : us-east-2
role-to-assume : arn:aws:iam::123456789100:role/my-github-actions-role
role-session-name : MySessionName
- name : Configure other AWS Credentials
uses : aws-actions/configure-aws-credentials@v4
with :
aws-region : us-east-2
role-to-assume : arn:aws:iam::987654321000:role/my-second-role
role-session-name : MySessionName
role-chaining : true
ในตัวอย่างสองขั้นตอนนี้ขั้นตอนแรกจะใช้ OIDC เพื่อรับบทบาท arn:aws:iam::123456789100:role/my-github-actions-role
เช่นเดียวกับในตัวอย่างก่อนหน้า ต่อไปนี้ขั้นตอนที่สองจะใช้บทบาทนี้เพื่อรับบทบาทที่แตกต่างกัน arn:aws:iam::987654321000:role/my-second-role
- name : Configure AWS Credentials
uses : aws-actions/configure-aws-credentials@v4
with :
aws-access-key-id : ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key : ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region : us-east-2
role-to-assume : ${{ secrets.AWS_ROLE_TO_ASSUME }}
role-external-id : ${{ secrets.AWS_ROLE_EXTERNAL_ID }}
role-duration-seconds : 1200
role-session-name : MySessionName
ในตัวอย่างนี้ความลับ AWS_ROLE_TO_ASSUME
มีสตริงเช่น arn:aws:iam::123456789100:role/my-github-actions-role
ในการรับบทบาทในบัญชีเดียวกันกับข้อมูลประจำตัวแบบคงที่คุณสามารถระบุชื่อบทบาทได้เช่น role-to-assume: my-github-actions-role
- name : Configure AWS Credentials 1
id : creds
uses : aws-actions/configure-aws-credentials@v4
with :
aws-region : us-east-2
role-to-assume : arn:aws:iam::123456789100:role/my-github-actions-role
output-credentials : true
- name : get caller identity 1
run : |
aws sts get-caller-identity
- name : Configure AWS Credentials 2
uses : aws-actions/configure-aws-credentials@v4
with :
aws-region : us-east-2
aws-access-key-id : ${{ steps.creds.outputs.aws-access-key-id }}
aws-secret-access-key : ${{ steps.creds.outputs.aws-secret-access-key }}
aws-session-token : ${{ steps.creds.outputs.aws-session-token }}
role-to-assume : arn:aws:iam::123456789100:role/my-other-github-actions-role
- name : get caller identity2
run : |
aws sts get-caller-identity
ตัวอย่างนี้แสดงให้เห็นว่าคุณสามารถอ้างอิงข้อมูลรับรองที่ดึงมาเป็นเอาต์พุตหากตั้ง output-credentials
ถูกตั้งค่าเป็นจริง ตัวอย่างนี้ยังแสดงให้เห็นว่าคุณสามารถใช้อินพุต aws-session-token
ในสถานการณ์ที่โทเค็นเซสชันถูกดึงและส่งผ่านไปยังการกระทำนี้
รหัสนี้มีให้ภายใต้ใบอนุญาต MIT
หากคุณต้องการรายงานปัญหาความปลอดภัยที่อาจเกิดขึ้นในโครงการนี้โปรดอย่าสร้างปัญหา GitHub โปรดทำตามคำแนะนำที่นี่หรืออีเมลความปลอดภัย AWS โดยตรง