GitHub Actions’ta AWS Erişim Anahtarlarını Kullanmayı Bırakın: İhtiyacınız Olan OIDC Rehberi
Günümüzün hızla gelişen DevOps dünyasında, CI/CD süreçleri yazılım geliştirme döngüsünün ayrılmaz bir parçası haline geldi. GitHub Actions gibi platformlar, otomatik derleme, test ve dağıtım süreçlerini kolaylaştırırken, bu otomasyonun güvenliği her zaman öncelikli bir endişe kaynağı olmuştur. Geleneksel olarak, GitHub Actions’tan AWS kaynaklarına erişim için statik AWS erişim anahtarları (access keys) kullanılırdı. Ancak bu yaklaşım, anahtar sızıntısı, yetkisiz erişim ve yönetim zorlukları gibi ciddi güvenlik risklerini beraberinde getiriyor. Neyse ki, OpenID Connect (OIDC) sayesinde bu riskleri ortadan kaldırabilir, GitHub Actions iş akışlarınız için daha güvenli ve yönetilebilir bir kimlik doğrulama mekanizması oluşturabiliriz. Bu rehber, AWS erişim anahtarlarını terk edip OIDC’nin sunduğu geçici kimlik bilgilerinin gücünden nasıl yararlanacağınızı adım adım açıklayacaktır.
Neden Statik AWS Erişim Anahtarlarından Kaçınmalıyız?
Statik AWS erişim anahtarları, uzun ömürlü ve değişmez oldukları için birçok güvenlik zafiyetine yol açabilir. Bu anahtarların kullanımı kolay olsa da, beraberinde getirdiği riskler, modern güvenlik standartlarıyla uyumlu değildir.
Güvenlik Riskleri
Statik erişim anahtarları, bir kez oluşturulduktan sonra süresiz olarak geçerli kalır. Bu durum, bir anahtarın yanlışlıkla bir kod deposuna yüklenmesi, bir günlük dosyasına sızması veya bir geliştiricinin cihazında çalınması halinde büyük bir risk oluşturur. Kötü niyetli kişiler bu anahtarları ele geçirdiklerinde, anahtarın yetkilendirildiği tüm AWS kaynaklarına erişebilir ve ciddi veri ihlallerine veya mali kayıplara neden olabilirler.
Yönetim Zorlukları
Erişim anahtarlarının düzenli olarak döndürülmesi (rotate edilmesi) ve güvenli bir şekilde saklanması gerekir. Bu, özellikle büyük ekiplerde ve çok sayıda proje olduğunda önemli bir yönetim yükü oluşturur. Anahtarların nerede saklandığı, kimlerin erişimi olduğu ve ne zaman yenilenmesi gerektiği gibi konular, karmaşık ve hataya açık süreçlere yol açabilir. Ayrıca, bir anahtarın süresi dolduğunda veya kaybolduğunda, iş akışlarının kesintiye uğraması kaçınılmazdır.
Uyum ve Denetim Sorunları
Birçok endüstri standardı ve düzenleyici uyumluluk çerçevesi (örneğin, SOC 2, HIPAA, PCI DSS), uzun ömürlü kimlik bilgilerinin kullanımını kısıtlar ve geçici, kısa ömürlü kimlik bilgilerini teşvik eder. Statik anahtarların kullanılması, bu tür uyumluluk gereksinimlerini karşılamayı zorlaştırır ve denetim süreçlerinde sorunlara yol açabilir. Olay incelemelerinde, statik anahtarların kim tarafından ve ne zaman kullanıldığını takip etmek de zor olabilir.
OpenID Connect (OIDC) Nedir ve Nasıl Çalışır?
OIDC, OAuth 2.0 protokolünün üzerine inşa edilmiş basit bir kimlik doğrulama katmanıdır. Kullanıcıların (veya bu durumda iş yüklerinin) bir kimlik sağlayıcı tarafından doğrulanmasını ve bu doğrulamanın güvenli bir şekilde başka bir hizmete (hizmet sağlayıcıya) iletilmesini sağlar.
OIDC Temelleri
OIDC, kullanıcıların kimliklerini doğrulamak için bir “ID Token” kullanır. Bu token, kullanıcının kimliği hakkında doğrulanmış bilgiler içeren bir JSON Web Token (JWT) formatındadır. Bir iş yükü (örneğin, GitHub Actions iş akışı), bir kimlik sağlayıcıdan (GitHub) bir ID Token alır ve bu token’ı bir hizmet sağlayıcıya (AWS) sunarak kimliğini kanıtlar. AWS, token’ı doğrular ve iş yüküne geçici kimlik bilgileri verir.
Kimlik Sağlayıcıları ve Güven İlişkisi
OIDC mimarisinde üç ana bileşen bulunur:
- Son Kullanıcı/İş Yükü: Kimlik doğrulaması yapmak isteyen varlık (bizim senaryomuzda GitHub Actions iş akışı).
- Kimlik Sağlayıcı (IdP): Kimlik doğrulamayı gerçekleştiren ve ID Token’ı veren taraf (GitHub).
- Hizmet Sağlayıcı (SP/Relying Party): Kimlik doğrulamasını kabul eden ve kaynaklara erişim izni veren taraf (AWS).
AWS’de, bir OIDC kimlik sağlayıcısı oluşturarak GitHub’a güvenebileceğimizi belirtiriz. Bu güven ilişkisi sayesinde, GitHub tarafından imzalanan bir ID Token’ın geçerli olduğunu ve belirli koşulları karşıladığını doğrulayabiliriz.
GitHub Actions ve OIDC Entegrasyonu
GitHub Actions, her iş akışı çalıştırması için otomatik olarak benzersiz ve kısa ömürlü bir OIDC ID Token’ı oluşturabilir. Bu token, iş akışının çalıştığı depoyu, dalı, etiketi ve diğer bağlamsal bilgileri içerir. AWS, bu token’ı alıp doğruladıktan sonra, iş akışına belirli bir IAM rolünü üstlenmesi için geçici kimlik bilgileri sağlar. Bu sayede statik anahtarlar yerine, her çalıştırmada dinamik olarak oluşturulan, kısa ömürlü ve belirli bir bağlama bağlı kimlik bilgileri kullanılır.
AWS’de OIDC Sağlayıcısını Yapılandırma
GitHub Actions’tan OIDC kullanarak AWS’ye güvenli bir şekilde bağlanmak için AWS IAM tarafında bazı yapılandırmalar yapmanız gerekir.
IAM Kimlik Sağlayıcısı Oluşturma
İlk adım, AWS IAM konsolunda bir OIDC kimlik sağlayıcısı oluşturmaktır. Bu sağlayıcı, GitHub’ın OIDC token’larını doğrulayabilmemizi sağlar.
- AWS Yönetim Konsolu’na giriş yapın ve IAM servisine gidin.
- Sol menüden “Kimlik Sağlayıcıları”nı seçin ve “Sağlayıcı Ekle” butonuna tıklayın.
- Sağlayıcı türü olarak “OpenID Connect”i seçin.
- Sağlayıcı URL’si alanına
https://token.actions.githubusercontent.comadresini girin. “Parmak İzi Al” butonuna tıklayarak otomatik olarak parmak izini doldurun. - Hedef Kitle alanına
sts.amazonaws.comdeğerini girin. - Sağlayıcıyı oluşturun.
Güven Politikası Oluşturma (Trust Policy)
Oluşturduğunuz OIDC sağlayıcısını kullanarak bir IAM rolüne güven politikası eklemeniz gerekir. Bu politika, hangi GitHub depolarının ve koşullarının bu rolü üstlenmesine izin verildiğini tanımlar.
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "arn:aws:iam:::oidc-provider/token.actions.githubusercontent.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"token.actions.githubusercontent.com:aud": "sts.amazonaws.com"
},
"StringLike": {
"token.actions.githubusercontent.com:sub": "repo:/:*"
}
}
}
]
}
Yukarıdaki politikada:
yerine kendi AWS hesap kimliğinizi girin.yerine GitHub'daki organizasyonunuzu ve depo adınızı (örn./ my-org/my-repo) girin. Bu koşul, yalnızca belirli bir depodan gelen isteklerin bu rolü üstlenmesine izin verir. İstersenizrepo:ile tüm depolara veya/*:* ref:refs/heads/maingibi dallara özel koşullar ekleyebilirsiniz.
GitHub Actions Rolü Oluşturma
Son olarak, GitHub Actions iş akışınızın üstleneceği bir IAM rolü oluşturmanız gerekir. Bu rol, iş akışınızın AWS'de hangi eylemleri gerçekleştirebileceğini tanımlayan izin politikalarını içerecektir.
- IAM konsolunda "Roller"e gidin ve "Rol Oluştur" butonuna tıklayın.
- "Özel varlık" olarak "Web kimliği"ni seçin.
- "Kimlik Sağlayıcısı" olarak az önce oluşturduğunuz OIDC sağlayıcısını (
token.actions.githubusercontent.com) seçin. - "Hedef Kitle" olarak
sts.amazonaws.comdeğerini seçin. - İleri'ye tıklayın ve rol için gerekli izin politikalarını (örneğin, S3'e yazma, EC2 başlatma vb.) ekleyin. En az ayrıcalık prensibini uygulayarak yalnızca ihtiyaç duyulan izinleri verdiğinizden emin olun.
- İleri'ye tıklayın, bir rol adı (örn.
github-actions-deploy-role) ve açıklama girin. - Rolü oluşturun. Rolün ARN'sini (Amazon Resource Name) not alın, çünkü bunu GitHub Actions iş akışınızda kullanacaksınız.
GitHub Actions İş Akışınızı Güncelleme
AWS'deki yapılandırmayı tamamladıktan sonra, GitHub Actions iş akışınızı OIDC kullanacak şekilde güncellemeniz gerekir.
OIDC Kimlik Doğrulama Adımı
GitHub Actions iş akışınızda, actions/configure-aws-credentials eylemini kullanarak OIDC kimlik doğrulamasını yapılandırabilirsiniz.
name: Deploy to AWS with OIDC
on:
push:
branches:
- main
permissions:
id-token: write # Bu izni eklemek zorunludur
contents: read
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam:::role/
aws-region:
Önemli: permissions bloğunda id-token: write iznini eklemek zorunludur. Bu izin, GitHub Actions'ın OIDC ID Token'ı oluşturmasına ve AWS'ye göndermesine olanak tanır. Ayrıca, , ve değerlerini kendi ortamınıza göre güncellemeyi unutmayın.
AWS Kimlik Bilgilerini Kullanma
configure-aws-credentials eylemi başarıyla çalıştıktan sonra, iş akışınızdaki sonraki adımlar otomatik olarak geçici AWS kimlik bilgilerini kullanacaktır. Artık AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY veya AWS_SESSION_TOKEN gibi ortam değişkenlerini manuel olarak ayarlamanıza gerek kalmaz. AWS CLI, SDK'lar veya diğer AWS araçları, bu geçici kimlik bilgilerini otomatik olarak algılayacak ve kullanacaktır.
Örnek İş Akışı Yapılandırması
İşte bir S3 kovasına dosya yükleyen basit bir GitHub Actions iş akışı örneği:
name: S3 Deployment with OIDC
on:
push:
branches:
- main
permissions:
id-token: write
contents: read
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Configure AWS credentials
uses: aws-actions/configure-aws-credentials@v4
with:
role-to-assume: arn:aws:iam:::role/github-actions-s3-deploy-role
aws-region: us-east-1
- name: Install AWS CLI
run: |
sudo apt-get update
sudo apt-get install -y awscli
- name: Deploy to S3
run: |
aws s3 cp ./index.html s3://your-s3-bucket-name/index.html --acl public-read
echo "index.html successfully deployed to S3!"
Bu örnekte, github-actions-s3-deploy-role adlı IAM rolüne S3'e yazma izinleri verilmiş olmalıdır.
Pratik Uygulama ve En İyi Yöntemler
OIDC ile güvenli bir CI/CD ortamı kurarken göz önünde bulundurmanız gereken bazı en iyi uygulamalar vardır.
En Az Ayrıcalık Prensibi
IAM rollerine her zaman yalnızca işlerini yapmaları için kesinlikle gerekli olan minimum izinleri verin. Örneğin, bir dağıtım rolünün bir S3 kovasına yalnızca yazma iznine ihtiyacı varsa, ona tam yönetici erişimi vermeyin. Bu, olası güvenlik ihlallerinin etkisini sınırlar.
Rollerin Kapsamını Sınırlandırma
AWS'deki IAM güven politikalarında, Condition bloğunu kullanarak GitHub Actions iş akışlarınızın rol üstlenme yeteneğini daha da kısıtlayabilirsiniz. Örneğin, yalnızca belirli bir dal (ref:refs/heads/main), belirli bir ortam (environment:production) veya belirli bir iş akışı (workflow:deploy.yml) tarafından başlatılan çalıştırmaların rol üstlenmesine izin verebilirsiniz. Bu, yetkisiz erişimi daha da zorlaştırır.
{
"StringLike": {
"token.actions.githubusercontent.com:sub": "repo:my-org/my-repo:ref:refs/heads/main"
}
}
Bu koşul, rolün yalnızca my-org/my-repo deposunun main dalındaki çalıştırmalar tarafından üstlenilmesini sağlar.
OIDC Sağlayıcısını Yönetme
OIDC sağlayıcınızın URL'sinin ve parmak izinin güncel olduğundan emin olun. GitHub, zaman zaman OIDC uç noktalarını güncelleyebilir, bu nedenle düzenli olarak kontrol etmek iyi bir uygulamadır. Ayrıca, kullanılmayan OIDC sağlayıcılarını ve rolleri temizlemek, güvenlik duruşunuzu güçlendirecektir.
Olası Sorunlar ve Giderme
OIDC kurulumu sırasında karşılaşabileceğiniz bazı yaygın sorunlar ve bunların çözümleri.
Güven Politikası Hataları
Eğer GitHub Actions iş akışınız sts:AssumeRoleWithWebIdentity eyleminde yetkilendirme hatası alıyorsa, büyük olasılıkla IAM rolünüzün güven politikasında bir sorun vardır.
- Çözüm: IAM rolünüzün güven politikasını dikkatlice inceleyin. AWS hesap kimliğinizin, OIDC sağlayıcısı ARN'sinin ve
Conditionbloğundaki GitHub depo adının doğru olduğundan emin olun. ÖzellikleStringLikekoşulundaki depo adının (repo:) doğru yazıldığını kontrol edin./ :*
İzin Sorunları
İş akışınız bir rolü başarıyla üstleniyor ancak AWS kaynaklarına erişirken "Access Denied" hataları alıyorsa, bu rolün gerekli izinlere sahip olmadığı anlamına gelir.
- Çözüm: IAM rolüne eklediğiniz izin politikalarını gözden geçirin. İş akışınızın gerçekleştirmesi gereken tüm AWS eylemleri için (örneğin, S3'e yazma, EC2'yi başlatma) gerekli izinlerin verildiğinden emin olun. En az ayrıcalık prensibini uygularken, eksik izinler vermemeye dikkat edin.
Token Doğrulama Hataları
Nadiren de olsa, OIDC token'ının doğrulanmasında sorunlar yaşanabilir. Bu genellikle OIDC sağlayıcısının URL'si veya parmak izi ile ilgili bir uyuşmazlıktan kaynaklanır.
- Çözüm: IAM'deki OIDC sağlayıcınızın URL'sinin
https://token.actions.githubusercontent.comolduğundan ve parmak izinin doğru bir şekilde alındığından emin olun. GitHub Actions iş akışınızdapermissions: id-token: writeizninin doğru bir şekilde ayarlandığını kontrol edin.
Sonuç
GitHub Actions'ta AWS erişim anahtarlarını kullanmak, ciddi güvenlik riskleri taşıyan eski bir yaklaşımdır. OpenID Connect (OIDC) entegrasyonu sayesinde, bu riskleri ortadan kaldırarak iş akışlarınız için kısa ömürlü, dinamik ve güvenli kimlik bilgileri sağlayabilirsiniz. Bu rehberde belirtilen adımları izleyerek, AWS'de OIDC sağlayıcınızı ve IAM rollerinizi yapılandırabilir, GitHub Actions iş akışlarınızı güncelleyerek modern ve güvenli bir CI/CD hattı oluşturabilirsiniz. Güvenlik, DevOps süreçlerinin temel taşıdır ve OIDC, bu temeli sağlamlaştırmak için atabileceğiniz en önemli adımlardan biridir.
SSS (Sık Sorulan Sorular)
OIDC kullanmak ücretli mi?
Hayır, OIDC protokolünü kullanmak veya GitHub Actions'ın OIDC token'larını oluşturması için ek bir ücret ödemezsiniz. AWS IAM servisi ve GitHub Actions kullanımı, kendi fiyatlandırma modellerine tabidir.
Mevcut iş akışlarımı nasıl geçirebilirim?
Mevcut iş akışlarınızda statik erişim anahtarlarını kullanan adımları, aws-actions/configure-aws-credentials eylemini kullanan OIDC tabanlı bir kimlik doğrulama adımıyla değiştirmeniz gerekir. Daha sonra, AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY gibi ortam değişkenlerini kaldıra ve AWS CLI/SDK'ların otomatik olarak OIDC tarafından sağlanan geçici kimlik bilgilerini kullanmasını sağlayın.
OIDC sadece GitHub Actions için mi geçerli?
Hayır, OIDC genel bir kimlik doğrulama protokolüdür ve birçok farklı CI/CD platformu (örneğin, GitLab CI/CD, CircleCI) ve diğer hizmetler tarafından da desteklenmektedir. AWS, birçok farklı OIDC sağlayıcısıyla entegrasyonu destekler.
OIDC ile hangi AWS servislerine erişebilirim?
OIDC aracılığıyla üstlendiğiniz IAM rolüne verdiğiniz izinlere bağlı olarak, AWS'deki herhangi bir servise erişebilirsiniz. Önemli olan, rolün en az ayrıcalık prensibine uygun olarak yalnızca ihtiyaç duyduğu izinlere sahip olmasıdır.