GitHub Actions OIDC مع AWS: انشر بدون مفاتيح ثابتة
مستوى القارئ: متوسط
هتطلع من المقال ده بإعداد عملي يخلي GitHub Actions يدخل AWS بصلاحية مؤقتة، بدل ما تخزن Access Key وSecret Key يعيشوا شهور في GitHub Secrets.
المشكلة باختصار
الطريقة الشائعة إنك تعمل IAM User، تطلع منه مفاتيح، وتحطها في GitHub Secrets. الطريقة دي بتشتغل، لكنها بتفشل في نقطة مهمة: السر طويل العمر. لو اتسرّب في log، artifact، fork workflow، أو جهاز مطور، هيبقى عندك مفتاح صالح لحد ما تكتشف وتعمل rotate.
الافتراض هنا إن عندك repository بيعمل deploy إلى S3 أو ECS أو Lambda من GitHub Actions. عندك فريق من 3 إلى 10 مطورين، وبتشغل من 20 إلى 100 workflow شهريًا. في الحالة دي OIDC بيقلل سطح المخاطرة لأن كل run بياخد token قصير العمر من GitHub، ثم AWS STS يبدله credentials مؤقتة مرتبطة بـ IAM Role.
الفكرة ببساطة
ركز في التشبيه ده. بدل ما تدي عامل التوصيل مفتاح البيت، بتدي له تصريح دخول مرة واحدة للبوابة، مربوط بعنوان محدد ووقت محدد. لو التصريح اتصور أو اتنسخ، قيمته محدودة جدًا لأنه ينتهي سريعًا ومينفعش يستخدمه أي شخص من شارع تاني.
بالظبط ده اللي بيحصل مع OIDC. GitHub يصدر JWT للـ workflow. AWS لا يثق في GitHub كله بشكل مفتوح. AWS يراجع شرطين مهمين: aud لازم تكون sts.amazonaws.com، وsub لازم يطابق repo وbranch أو environment محدد. GitHub نفسه يوضح إن OIDC يسمح للـ workflows بالوصول إلى AWS بدون تخزين credentials طويلة العمر، وإن workflow محتاج id-token: write لطلب التوكن. مصدر: GitHub Docs - OIDC in AWS.
الإعداد العملي
أول خطوة تعمل OIDC provider في AWS. الأمر ده يضيف GitHub كـ identity provider. استخدمه مرة واحدة لكل AWS account غالبًا.
aws iam create-open-id-connect-provider \
--url https://token.actions.githubusercontent.com \
--client-id-list sts.amazonaws.com
بعدها اعمل IAM Role بسياسة ثقة مقفولة على repo وbranch. غير 123456789012 وahmedhaies/my-app حسب مشروعك.