AWS IAM Kullanıcı ve Grup Yönetimi
AWS hesabınızı ilk açtığınızda her şeyi root kullanıcıyla yönetmeye başlamak cazip geliyor. Ama bu, anahtarları kapıda bırakmak gibi bir şey. Gerçek ortamlarda IAM (Identity and Access Management) olmadan ciddi bir AWS altyapısı yönetmek hem güvensiz hem de kaotik bir hal alıyor. Bu yazıda IAM kullanıcı ve grup yönetimini, gerçek dünya senaryolarıyla birlikte ele alacağız.
IAM Nedir ve Neden Bu Kadar Önemli?
IAM, AWS kaynaklarına kimin, ne zaman, hangi koşullarda erişebileceğini kontrol eden servistir. Sadece bir kullanıcı yönetim paneli değil; politikalar, roller, gruplar ve izin sınırlarıyla birlikte çalışan kapsamlı bir kimlik ve erişim altyapısıdır.
Düşün ki 20 kişilik bir DevOps ekibiniz var. Birinin yanlışlıkla production veritabanını silmesini istemiyorsun. Ya da bir stajyerin S3 bucket içeriklerini herkese açık yapmasını. IAM tam da bu noktada devreye giriyor.
En az ayrıcalık prensibi (Principle of Least Privilege) IAM’in temel felsefesidir. Bir kullanıcıya sadece işini yapması için gerekli olan izinleri ver, fazlasını değil.
AWS CLI Kurulumu ve Yapılandırması
Önce ortamımızı hazırlayalım. AWS CLI olmadan IAM yönetimi konsol üzerinden yapılabilir ama otomasyon ve scripting için CLI şart.
# AWS CLI v2 kurulumu (Linux)
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
# Versiyon kontrolü
aws --version
# Yapılandırma
aws configure
# AWS Access Key ID: AKIAIOSFODNN7EXAMPLE
# AWS Secret Access Key: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
# Default region name: eu-west-1
# Default output format: json
Root kullanıcınla sadece bu ilk yapılandırmayı yap. Hemen ardından bir admin IAM kullanıcısı oluştur ve root erişimini kilitle.
IAM Kullanıcı Oluşturma
Temel Kullanıcı Oluşturma
# Yeni IAM kullanıcısı oluştur
aws iam create-user --user-name mehmet.yilmaz
# Kullanıcıya programmatic erişim için access key oluştur
aws iam create-access-key --user-name mehmet.yilmaz
# Kullanıcıya konsol erişimi için login profili oluştur
aws iam create-login-profile
--user-name mehmet.yilmaz
--password "Gecici123!"
--password-reset-required
# Kullanıcı bilgilerini listele
aws iam list-users --output table
# Belirli kullanıcının detaylarını gör
aws iam get-user --user-name mehmet.yilmaz
--password-reset-required parametresi kullanıcının ilk girişte şifresini değiştirmesini zorlar. Production ortamlarda bunu atlamak ciddi bir güvenlik açığı.
Toplu Kullanıcı Oluşturma Scripti
Gerçek hayatta tek tek kullanıcı oluşturmak zaman kaybı. Şirkete 10 yeni geliştirici katıldığında işe yarayacak bir script:
#!/bin/bash
# bulk_create_users.sh
USERS=("ali.kaya" "ayse.demir" "can.ozturk" "elif.sahin" "fatih.arslan")
GROUP_NAME="developers"
TEMP_PASSWORD="Welcome123!"
for user in "${USERS[@]}"; do
echo "Kullanici olusturuluyor: $user"
# Kullanıcı oluştur
aws iam create-user --user-name "$user"
# Login profili oluştur
aws iam create-login-profile
--user-name "$user"
--password "$TEMP_PASSWORD"
--password-reset-required
# Gruba ekle
aws iam add-user-to-group
--user-name "$user"
--group-name "$GROUP_NAME"
echo "$user olusturuldu ve $GROUP_NAME grubuna eklendi"
done
echo "Tum kullanicilar basariyla olusturuldu."
Bu scripti çalıştırmadan önce $GROUP_NAME grubunun var olduğundan emin ol. Yoksa bir sonraki bölümde oluşturuyoruz.
IAM Grup Yönetimi
Gruplar, kullanıcılara tek tek politika atamak yerine merkezi bir yönetim sağlar. Bir geliştiriciyi farklı bir ekibe taşıdığında sadece gruptan çıkarıp yeni gruba ekliyorsun.
Grup Oluşturma ve Yapılandırma
# Grupları oluştur
aws iam create-group --group-name developers
aws iam create-group --group-name devops
aws iam create-group --group-name data-engineers
aws iam create-group --group-name security-auditors
# Gruba AWS managed policy ekle
# Geliştiriciler için EC2 ve S3 okuma yetkisi
aws iam attach-group-policy
--group-name developers
--policy-arn arn:aws:iam::aws:policy/AmazonEC2ReadOnlyAccess
aws iam attach-group-policy
--group-name developers
--policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess
# DevOps grubuna daha geniş yetkiler
aws iam attach-group-policy
--group-name devops
--policy-arn arn:aws:iam::aws:policy/PowerUserAccess
# Kullanıcıyı gruba ekle
aws iam add-user-to-group
--user-name mehmet.yilmaz
--group-name developers
# Grubun üyelerini listele
aws iam get-group --group-name developers
# Gruba bağlı politikaları listele
aws iam list-attached-group-policies --group-name developers
Özel IAM Politikası Oluşturma
AWS’nin hazır politikaları çoğu zaman ya fazla kısıtlayıcı ya da fazla geniş oluyor. Özel politikalar yazman gerekiyor.
Senaryo: Geliştirici ekibinin sadece dev-* prefix’li S3 bucket’larına erişebilmesi gerekiyor.
# Önce politika JSON dosyasını oluştur
cat > developer-s3-policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "ListBuckets",
"Effect": "Allow",
"Action": [
"s3:ListAllMyBuckets",
"s3:GetBucketLocation"
],
"Resource": "*"
},
{
"Sid": "DevBucketAccess",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:DeleteObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::dev-*",
"arn:aws:s3:::dev-*/*"
]
},
{
"Sid": "DenyProductionAccess",
"Effect": "Deny",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::prod-*",
"arn:aws:s3:::prod-*/*"
]
}
]
}
EOF
# Politikayı AWS'ye yükle
aws iam create-policy
--policy-name DeveloperS3Access
--policy-document file://developer-s3-policy.json
--description "Geliştiriciler için dev ortamı S3 erişimi"
# Politikayı gruba ekle (account ID'ni değiştir)
aws iam attach-group-policy
--group-name developers
--policy-arn arn:aws:iam::123456789012:policy/DeveloperS3Access
Deny statement’larının her zaman Allow‘u geçersiz kıldığını unutma. Production bucket’larına erişim başka bir politikayla verilmiş olsa bile bu Deny onu engelleyecek.
Gerçek Dünya Senaryosu: Çok Katmanlı Ekip Yapısı
Diyelim ki bir fintech şirketinde çalışıyorsun. Ekip yapın şöyle:
- Backend geliştiriciler: EC2, RDS, ElastiCache okuma; Lambda deploy
- Frontend geliştiriciler: S3, CloudFront yönetimi; sadece dev ortamı
- DevOps mühendisleri: Neredeyse tam yetki ama IAM değiştiremesin
- Güvenlik ekibi: Her şeyi okuyabilsin ama yazamasm
- Veri mühendisleri: Redshift, Glue, S3 data lake erişimi
# Güvenlik ekibi için salt-okunur politika
cat > security-audit-policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"cloudtrail:GetTrailStatus",
"cloudtrail:DescribeTrails",
"cloudtrail:LookupEvents",
"config:Describe*",
"config:Get*",
"config:List*",
"iam:GenerateCredentialReport",
"iam:Get*",
"iam:List*",
"securityhub:Get*",
"securityhub:List*",
"guardduty:Get*",
"guardduty:List*"
],
"Resource": "*"
}
]
}
EOF
aws iam create-policy
--policy-name SecurityAuditCustom
--policy-document file://security-audit-policy.json
# DevOps için IAM hariç power user
cat > devops-policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"NotAction": [
"iam:CreateUser",
"iam:DeleteUser",
"iam:AttachUserPolicy",
"iam:DetachUserPolicy",
"iam:CreateGroup",
"iam:DeleteGroup",
"organizations:*",
"account:*"
],
"Resource": "*"
}
]
}
EOF
aws iam create-policy
--policy-name DevOpsRestrictedAccess
--policy-document file://devops-policy.json
NotAction kullanımına dikkat et. Bu, belirtilen aksiyonlar dışındaki her şeye izin ver demek. Çok güçlü bir araç ama dikkatli kullanılmazsa beklenmedik izinlere yol açabilir.
MFA Zorunluluğu
Konsol erişimi olan her kullanıcı için MFA (Multi-Factor Authentication) zorunlu olmalı. Bu konuda taviz verme.
# MFA olmadan erişimi engelleyen politika
cat > require-mfa-policy.json << 'EOF'
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowViewAccountInfo",
"Effect": "Allow",
"Action": [
"iam:GetAccountPasswordPolicy",
"iam:ListVirtualMFADevices"
],
"Resource": "*"
},
{
"Sid": "AllowManageOwnMFA",
"Effect": "Allow",
"Action": [
"iam:CreateVirtualMFADevice",
"iam:EnableMFADevice",
"iam:GetUser",
"iam:ListMFADevices",
"iam:ResyncMFADevice"
],
"Resource": [
"arn:aws:iam::*:mfa/${aws:username}",
"arn:aws:iam::*:user/${aws:username}"
]
},
{
"Sid": "DenyWithoutMFA",
"Effect": "Deny",
"NotAction": [
"iam:CreateVirtualMFADevice",
"iam:EnableMFADevice",
"iam:GetUser",
"iam:ListMFADevices",
"iam:ResyncMFADevice",
"sts:GetSessionToken"
],
"Resource": "*",
"Condition": {
"BoolIfExists": {
"aws:MultiFactorAuthPresent": "false"
}
}
}
]
}
EOF
# Bu politikayı tüm gruplara ekle
for group in developers devops data-engineers security-auditors; do
aws iam put-group-policy
--group-name "$group"
--policy-name RequireMFA
--policy-document file://require-mfa-policy.json
echo "$group grubuna MFA politikası eklendi"
done
Şifre Politikası Ayarları
Kurumsal ortamlarda şifre politikası standartlarını CLI üzerinden ayarlayabilirsin:
# Hesap şifre politikasını ayarla
aws iam update-account-password-policy
--minimum-password-length 14
--require-symbols
--require-numbers
--require-uppercase-characters
--require-lowercase-characters
--allow-users-to-change-password
--max-password-age 90
--password-reuse-prevention 12
--hard-expiry
# Mevcut şifre politikasını görüntüle
aws iam get-account-password-policy
--hard-expiry parametresi şifresi süresi dolmuş kullanıcının konsola girişini tamamen engeller. Bazı ekiplerde bu operasyonel sorunlara yol açabilir; durumuna göre değerlendir.
IAM Credential Report ve Denetim
Düzenli olarak hangi kullanıcıların aktif olduğunu, MFA kullanıp kullanmadığını ve access key yaşlarını kontrol etmelisin.
# Credential report oluştur
aws iam generate-credential-report
# Raporu indir ve çözümle
aws iam get-credential-report
--output text
--query 'Content' | base64 -d > credential-report.csv
# 90 günden eski access key'leri bul
python3 << 'EOF'
import csv
from datetime import datetime, timezone
with open('credential-report.csv', 'r') as f:
reader = csv.DictReader(f)
print("90 gunden eski access key'leri olan kullanicilar:")
for row in reader:
for key_num in ['1', '2']:
last_rotated = row.get(f'access_key_{key_num}_last_rotated', 'N/A')
if last_rotated and last_rotated != 'N/A' and last_rotated != 'not_supported':
try:
key_date = datetime.fromisoformat(last_rotated.replace('Z', '+00:00'))
age_days = (datetime.now(timezone.utc) - key_date).days
if age_days > 90:
print(f" {row['user']} - Key {key_num}: {age_days} gun")
except ValueError:
pass
EOF
Bu scripti cron job olarak haftalık çalıştır ve sonuçları Slack’e ya da mail’e at. 90 günden eski access key gördüğünde ilgili kişiye haber ver.
Kullanıcı Silme ve Temizleme
Şirketten ayrılan birisinin erişimini kesmek acil bir iş. Access key’i deactivate etmek yetmez, tüm kaynakları temizlemen gerekir.
#!/bin/bash
# disable_user.sh - Kullanıcıyı devre dışı bırak
USERNAME=$1
if [ -z "$USERNAME" ]; then
echo "Kullanim: $0 <kullanici-adi>"
exit 1
fi
echo "=== $USERNAME kullanicisi devre disi birakiliyor ==="
# Konsol erişimini kapat
aws iam delete-login-profile --user-name "$USERNAME" 2>/dev/null &&
echo "Konsol erisimi kapatildi" ||
echo "Konsol profili bulunamadi (normal olabilir)"
# Access key'leri deactivate et
ACCESS_KEYS=$(aws iam list-access-keys --user-name "$USERNAME"
--query 'AccessKeyMetadata[].AccessKeyId' --output text)
for key_id in $ACCESS_KEYS; do
aws iam update-access-key
--user-name "$USERNAME"
--access-key-id "$key_id"
--status Inactive
echo "Access key deactivate edildi: $key_id"
done
# MFA cihazlarını listele ve kaldır
MFA_DEVICES=$(aws iam list-mfa-devices --user-name "$USERNAME"
--query 'MFADevices[].SerialNumber' --output text)
for device in $MFA_DEVICES; do
aws iam deactivate-mfa-device
--user-name "$USERNAME"
--serial-number "$device"
echo "MFA cihazi kaldirildi: $device"
done
# Tüm gruplardan çıkar
GROUPS=$(aws iam list-groups-for-user --user-name "$USERNAME"
--query 'Groups[].GroupName' --output text)
for group in $GROUPS; do
aws iam remove-user-from-group
--user-name "$USERNAME"
--group-name "$group"
echo "Gruptan cikarildi: $group"
done
echo "=== $USERNAME kullanicisi devre disi birakildi ==="
echo "NOT: Kullanici silinmedi. Audit loglar icin 30 gun bekle, sonra sil."
Kullanıcıyı hemen silme. Çoğu şirkette audit ve compliance gereksinimleri nedeniyle belirli bir süre hesabın deactivate halde tutulması gerekiyor. 30 gün sonra aşağıdaki komutla tamamen silebilirsin:
# Önce inline politikaları sil
aws iam list-user-policies --user-name "$USERNAME"
--query 'PolicyNames[]' --output text |
tr 't' 'n' | while read policy; do
aws iam delete-user-policy --user-name "$USERNAME" --policy-name "$policy"
done
# Managed politikaları detach et
aws iam list-attached-user-policies --user-name "$USERNAME"
--query 'AttachedPolicies[].PolicyArn' --output text |
tr 't' 'n' | while read arn; do
aws iam detach-user-policy --user-name "$USERNAME" --policy-arn "$arn"
done
# Access key'leri sil
aws iam list-access-keys --user-name "$USERNAME"
--query 'AccessKeyMetadata[].AccessKeyId' --output text |
tr 't' 'n' | while read key; do
aws iam delete-access-key --user-name "$USERNAME" --access-key-id "$key"
done
# Son olarak kullanıcıyı sil
aws iam delete-user --user-name "$USERNAME"
echo "$USERNAME kullanicisi tamamen silindi."
IAM Best Practices Özeti
Yıllar içinde öğrendiğim, “keşke daha önce bilseydim” dediğim birkaç pratik kural:
- Root kullanıcıyı kilitle: Root’a MFA ekle, access key oluşturma, sadece billing ve hesap yönetimi için kullan
- Access key’leri düzenli rotate et: 90 günde bir zorunlu, 30 günde bir ideal
- CloudTrail’i aç: IAM aksiyonları dahil tüm API çağrıları loglanmalı, aksi halde kim ne yapmış bilemezsin
- Kullanılmayan izinleri temizle: AWS Access Analyzer ve IAM Access Advisor ile hangi izinlerin kullanılmadığını düzenli kontrol et
- Servis hesapları için rol kullan: EC2’nun S3’e erişmesi gerekiyorsa access key değil IAM Role kullan
- Ortamları ayır: Dev, staging ve production için ayrı AWS hesapları idealdir, en azından ayrı gruplar ve politikalar şart
- Tag’leri kullan: IAM kullanıcılarına
Department,Environment,CreatedBygibi tag’ler ekle, raporlama ve maliyet takibi için faydalı - Politika değişikliklerini versiyon kontrolüne al: Tüm JSON politika dosyalarını Git’e koy
Sonuç
IAM, AWS güvenliğinin temel taşı. “Sonra düzeltirim” diyerek ertelenen IAM yapılandırması, ilerleyen dönemde hem güvenlik açıklarına hem de düzeltmesi son derece zor karmaşık izin yapılarına yol açıyor. Baştan doğru yapmak, sonradan uğraşmaktan çok daha az efor istiyor.
Bu yazıda ele aldığımız konular; kullanıcı oluşturma, grup yönetimi, özel politika yazımı, MFA zorunluluğu ve kullanıcı offboarding süreçleri, gerçek bir kurumsal ortamda ihtiyacın olacak temel yapı taşları. Bunların üzerine IAM Roles, Permission Boundaries ve AWS Organizations konularını da ekleyerek çok daha sağlam bir güvenlik altyapısı kurabilirsin.
Otomasyonu da ihmal etme. Her şeyi Terraform veya AWS CloudFormation ile yönetmek, manuel hataların önüne geçiyor ve “infrastructure as code” pratiğini IAM tarafında da hayata geçirmiş oluyorsun. Bu konuları da yakın zamanda ele alacağız.
