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-agentile 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österirServer accepts key:başarılı kimlik doğrulamanın göstergesiPermission deniedgö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.
