GitHub Hesabı Kurulumu ve SSH Key Yapılandırması

Yeni bir sunucuya bağlandığınızda ya da temiz bir geliştirici makinesi kurduğunuzda, ilk yapmanız gereken şeylerden biri GitHub ile SSH üzerinden güvenli bağlantı kurmaktır. Parola girmeye devam etmek, özellikle günde onlarca git push yaptığınızda dayanılmaz hale geliyor. Bu yazıda sıfırdan başlayarak, hem kişisel hem de kurumsal ortamlar için sağlam bir GitHub SSH yapılandırması nasıl kurulur, bunu anlatacağım. Yol boyunca karşılaşabileceğiniz gerçek sorunlara da değineceğim.

GitHub Hesabı Temel Güvenlik Ayarları

Hesabı açtıktan sonra doğrudan SSH’a atlamadan önce birkaç temel güvenlik adımını tamamlamak gerekiyor. Bu adımları atlayanların, ileride başı ağrıyor.

İki faktörlü kimlik doğrulama (2FA) aktifleştirme:

GitHub hesabınıza giriş yaptıktan sonra Settings > Password and authentication yolunu izleyin. TOTP tabanlı bir uygulama (Google Authenticator, Authy veya açık kaynak alternatifleri) kullanmanızı öneririm. SMS tabanlı 2FA zayıf bir seçenek, SIM swap saldırılarına karşı savunmasız.

Recovery kodlarınızı indirin ve güvenli bir yere saklayın. Bu kodları kaybederseniz ve telefonunuza erişiminizi yitirirseniz, hesabınıza geri dönmek ciddi bir baş ağrısına dönüşebilir.

E-posta gizliliği:

Settings > Emails bölümünde “Keep my email addresses private” seçeneğini aktifleştirin. Bu sayede GitHub, commit’lerde gerçek e-posta adresiniz yerine [email protected] formatında bir adres kullanır. Özellikle açık kaynak projelere katkı sağlıyorsanız bu önemli bir detay.

SSH Key Neden Kullanmalısınız

HTTPS üzerinden parola ile çalışmak mümkün, ama GitHub 2021’den itibaren HTTPS bağlantılarında parola kimlik doğrulamasını kaldırdı. Personal Access Token (PAT) kullanmak bir alternatif, ancak SSH key’ler kurulumu bir kez yapıp sonrasında tamamen unutmanızı sağlıyor. Üstelik:

  • Özel anahtar hiçbir zaman ağ üzerinden iletilmiyor
  • Her cihaz için ayrı key oluşturabiliyorsunuz, gerektiğinde sadece o cihazın erişimini iptal edebiliyorsunuz
  • ssh-agent ile passphrase’i sadece bir kez girip oturum boyunca rahat çalışabiliyorsunuz
  • CI/CD sistemlerinde deploy key olarak kullanabiliyorsunuz

SSH Key Oluşturma

Modern sistemlerde Ed25519 algoritmasını kullanın. RSA 4096 bit ile kıyaslandığında daha kısa key, daha hızlı işlem ve benzer güvenlik seviyesi sunuyor.

ssh-keygen -t ed25519 -C "[email protected]" -f ~/.ssh/github_ed25519

-C parametresi bir yorum alanı, key’i tanımlamanıza yardımcı oluyor. Ben genellikle hangi makinede hangi amaçla oluşturulduğunu yazıyorum. Birden fazla key yönetirken bu alışkanlık hayat kurtarıyor.

Passphrase sorusu geldiğinde boş bırakmayın. Güçlü bir passphrase girin. Anahtar dosyası ele geçirilse bile passphrase olmadan işe yaramaz.

Oluşturulan dosyaları kontrol edelim:

ls -la ~/.ssh/
# github_ed25519     <- özel anahtar, asla paylaşmayın
# github_ed25519.pub <- açık anahtar, GitHub'a ekleyeceğiniz

cat ~/.ssh/github_ed25519.pub

Parmak izini görüntülemek için:

ssh-keygen -lf ~/.ssh/github_ed25519.pub
# 256 SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxx [email protected] (ED25519)

Bu parmak izini bir yere not edin. GitHub arayüzünde de görüntüleyebileceksiniz ve key’in doğru eklendiğini bu şekilde teyit edebilirsiniz.

GitHub’a Public Key Ekleme

GitHub web arayüzünde Settings > SSH and GPG keys > New SSH key yolunu izleyin.

  • Title: Makineyi tanımlayan anlamlı bir isim yazın. “Laptop” değil, “Dell XPS 15 – Ubuntu 22.04 – Ev” gibi spesifik olun.
  • Key type: Authentication Key seçin (Signing Key ayrı bir kullanım amacına hizmet ediyor, ona sonra geliyoruz)
  • Key: cat ~/.ssh/github_ed25519.pub çıktısının tamamını yapıştırın

Yapıştırdıktan sonra parmak izini kontrol edin, GitHub bunu size gösteriyor. Daha önce not aldığınız değerle eşleşmeli.

SSH Config Dosyası Yapılandırması

İşte burası çoğu kılavuzun atladığı kritik bölüm. Özellikle birden fazla GitHub hesabı veya farklı Git hosting servisleri kullanıyorsanız, SSH config dosyası olmadan işler karmaşık hale geliyor.

mkdir -p ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/config
chmod 600 ~/.ssh/config
nano ~/.ssh/config

Tek GitHub hesabı için temel yapılandırma:

Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/github_ed25519
    IdentitiesOnly yes
    AddKeysToAgent yes

IdentitiesOnly yes satırı kritik. Bu olmadan SSH, sistemdeki tüm key’leri denemeye çalışıyor ve GitHub bunu engelleme eğiliminde. Özellikle ssh-agent üzerinde birden fazla key varsa bu sorun yaşatıyor.

Birden fazla GitHub hesabı için yapılandırma:

Hem kişisel hem kurumsal GitHub hesabı kullananlar için (benim gibi) bu senaryo çok değerli:

# Kişisel hesap için key
ssh-keygen -t ed25519 -C "[email protected]" -f ~/.ssh/github_personal

# Kurumsal hesap için key
ssh-keygen -t ed25519 -C "[email protected]" -f ~/.ssh/github_work
# Kişisel GitHub hesabı
Host github-personal
    HostName github.com
    User git
    IdentityFile ~/.ssh/github_personal
    IdentitiesOnly yes
    AddKeysToAgent yes

# Kurumsal GitHub hesabı
Host github-work
    HostName github.com
    User git
    IdentityFile ~/.ssh/github_work
    IdentitiesOnly yes
    AddKeysToAgent yes

Bu yapılandırma ile repository klonlarken farklı alias kullanıyorsunuz:

# Kişisel hesaptan klonlama
git clone git@github-personal:kisisel-kullanici/proje.git

# Kurumsal hesaptan klonlama
git clone git@github-work:sirket-adi/proje.git

Mevcut bir repository’nin remote URL’ini değiştirmek için:

git remote set-url origin git@github-work:sirket-adi/proje.git
git remote -v  # doğrulama

SSH Agent Yapılandırması

SSH key’inize passphrase koydunuz, her git push işleminde sormayacak, doğru. Ama ssh-agent çalışmıyorsa yine soracak. Bunu düzenleyelim.

# Agent'ın çalışıp çalışmadığını kontrol
eval "$(ssh-agent -s)"

# Key'i agent'a ekle
ssh-add ~/.ssh/github_ed25519

# Agent'taki key'leri listele
ssh-add -l

Bu komutu her oturum açtığınızda tekrarlamak istemiyorsanız, shell yapılandırma dosyanıza ekleyin:

# ~/.bashrc veya ~/.zshrc dosyasına ekleyin
if [ -z "$SSH_AUTH_SOCK" ]; then
    eval "$(ssh-agent -s)" > /dev/null
    ssh-add ~/.ssh/github_ed25519 2>/dev/null
fi

macOS kullanıcıları için Keychain entegrasyonu çok daha temiz çalışıyor:

# macOS için ~/.ssh/config
Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/github_ed25519
    IdentitiesOnly yes
    UseKeychain yes
    AddKeysToAgent yes

macOS’ta bir kez ssh-add --apple-use-keychain ~/.ssh/github_ed25519 komutunu çalıştırmanız yeterli, sonrasında sistem her açılışta keychain’den okuyor.

Bağlantıyı Test Etme

Her şeyi ayarladıktan sonra test zamanı:

ssh -T [email protected]
# Hi kullanici-adi! You've successfully authenticated, but GitHub does not provide shell access.

Bu mesajı görüyorsanız her şey yolunda. Birden fazla hesap yapılandırdıysanız her birini ayrı test edin:

ssh -T git@github-personal
ssh -T git@github-work

Sorun yaşıyorsanız verbose modda çalıştırın, nerede takıldığını göreceksiniz:

ssh -vT [email protected]

Çıktıda dikkat etmeniz gereken satırlar:

  • Offering public key: satırı hangi key’i sunduğunu gösterir
  • Server accepts key: başarılı kimlik doğrulamanın göstergesi
  • Permission denied görüyorsanız key GitHub’a eklenmemiş ya da yanlış key sunuluyor demektir

Git Global Yapılandırması

SSH bağlantısını kurdunuz, şimdi Git’in kim olduğunuzu bilmesi lazım:

git config --global user.name "Ali Veli"
git config --global user.email "[email protected]"
git config --global init.defaultBranch main
git config --global core.editor "vim"  # veya nano, code --wait, vb.
git config --global pull.rebase false

Birden fazla hesap kullanıyorsanız, global config’i kişisel hesaba ayarlayıp kurumsal projelerde lokal override yapabilirsiniz:

# Kurumsal proje dizinine girince
cd ~/projects/work/proje
git config user.email "[email protected]"
git config user.name "Ali Veli"

Ya da daha şık bir yöntem, .gitconfig conditional include kullanmak:

# ~/.gitconfig
[user]
    name = Ali Veli
    email = [email protected]

[includeIf "gitdir:~/projects/work/"]
    path = ~/.gitconfig-work
# ~/.gitconfig-work
[user]
    email = [email protected]

~/projects/work/ altındaki tüm repository’lerde otomatik olarak kurumsal e-posta adresi kullanılıyor. Bunu ilk keşfettiğimde neden daha önce bu yöntemi bilmediğime hayıflanmıştım.

Deploy Key Kullanımı

CI/CD sistemleri veya sunuculardan belirli bir repository’ye erişim gerektiğinde kullanıcı hesabına bağlı SSH key yerine deploy key kullanmak daha güvenli.

# Sunucu veya CI sistemi üzerinde
ssh-keygen -t ed25519 -C "production-server-deploy" -f ~/.ssh/deploy_key -N ""
# -N "" ile passphrase boş bırakılıyor, CI/CD için gerekli

GitHub’da ilgili repository’ye gidin: Settings > Deploy keys > Add deploy key

  • Title: “Production Server” veya “GitLab CI” gibi tanımlayıcı bir isim
  • Key: deploy_key.pub içeriğini yapıştırın
  • Allow write access: Sadece push yapacaksanız işaretleyin, sadece pull yapacaksa boş bırakın (principle of least privilege)

Sunucudaki SSH config:

Host github-deploy-proje
    HostName github.com
    User git
    IdentityFile /home/deploy/.ssh/deploy_key
    IdentitiesOnly yes

Yaygın Sorunlar ve Çözümleri

“Permission denied (publickey)” hatası:

Bu hatanın birkaç nedeni olabilir. Sırayla kontrol edin:

# GitHub'a hangi key sunuluyor?
ssh -vT [email protected] 2>&1 | grep "Offering|Accepted|denied"

# Key agent'ta var mı?
ssh-add -l

# Key doğru dosyada mı?
ls -la ~/.ssh/

# Dosya izinleri doğru mu?
stat ~/.ssh/config           # 600 olmalı
stat ~/.ssh/github_ed25519   # 600 olmalı
stat ~/.ssh/                 # 700 olmalı

“Bad permissions” uyarısı:

SSH, izinlere çok titiz davranıyor. Yanlış izinler varsa key’i tamamen reddediyor:

chmod 700 ~/.ssh
chmod 600 ~/.ssh/config
chmod 600 ~/.ssh/github_ed25519
chmod 644 ~/.ssh/github_ed25519.pub

Repository klonlarken “Host key verification failed”:

GitHub’ın host key’i ~/.ssh/known_hosts dosyanızda yoksa bu hata çıkar:

ssh-keyscan github.com >> ~/.ssh/known_hosts

Ya da bir kez manuel bağlantı kurup “yes” diyebilirsiniz, ama bu yöntem güvenlik açısından daha az tercih edilebilir. Özellikle otomasyon scriptlerinde ssh-keyscan kullanın.

GPG ile Commit İmzalama

Bu bölüm zorunlu değil ama kurumsal ortamlarda giderek daha fazla talep ediliyor. Commit imzalama, bir commit’in gerçekten sizden geldiğini kriptografik olarak kanıtlıyor. Aksi halde GitHub üzerinde git commit --author="Linus Torvalds " yazarak istediğiniz kişi adına commit atabilirsiniz.

# GPG key oluşturma
gpg --full-generate-key
# RSA and RSA, 4096 bit, geçerlilik süresi tercihinize göre

# Key ID'yi öğrenme
gpg --list-secret-keys --keyid-format=long

# Çıktıda sec satırındaki / sonrasını kopyalayın
# sec   rsa4096/ABCD1234EFGH5678

# Public key'i dışa aktarma
gpg --armor --export ABCD1234EFGH5678

Bu çıktıyı GitHub Settings > SSH and GPG keys > New GPG key bölümüne ekleyin.

Git’i imzalamak için yapılandırın:

git config --global user.signingkey ABCD1234EFGH5678
git config --global commit.gpgsign true
git config --global gpg.program gpg

Artık commit’leriniz otomatik olarak imzalanacak ve GitHub arayüzünde “Verified” etiketi göreceksiniz.

Sonuç

SSH key yapılandırması tek seferlik bir iş, ama doğru yapıldığında yıllarca sorunsuz çalışıyor. Özetlemek gerekirse: Ed25519 algoritmasıyla key oluşturun, passphrase koymaktan kaçınmayın, SSH config dosyasını düzgün yapılandırın ve birden fazla hesap varsa alias kullanın. Deploy key’leri kullanıcı hesabından ayrı tutun ve her key’e hangi makinede ne için oluşturulduğunu anlatan bir isim verin.

Bu yapılandırmayı tamamlayan bir geliştirici ya da sistem yöneticisi için git clone, git push, git pull operasyonları otomatik, güvenli ve hızlı hale geliyor. Parola girmek, token yenilemek gibi dertler tarihe karışıyor. Zaman içinde key rotasyonu yapmayı da alışkanlık haline getirin; özellikle bir çalışan ayrıldığında ya da bir cihaz çalındığında ilgili key’i hemen iptal edip yenisini oluşturabilme yeteneğine sahip olmak, güvenlik perspektifinden çok değerli.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir