İki Faktörlü Kimlik Doğrulama: Google Authenticator ile SSH Güvenliği

Sunucunuza SSH ile bağlanan birinin şifresini ele geçirdiğini düşünün. Tek bir kimlik bilgisi, tüm sisteminizi tehlikeye atabilir. İşte bu yüzden “bir şey bilmek” ile “bir şeye sahip olmak” kavramlarını birleştiren iki faktörlü kimlik doğrulama (2FA), özellikle SSH erişiminde artık bir lüks değil, zorunluluk haline geldi. Bu yazıda Google Authenticator’ı SSH ile entegre ederek sunucunuza ekstra bir güvenlik katmanı nasıl eklersiniz, tüm adımlarıyla ve gerçek dünya senaryolarıyla ele alacağız.

İki Faktörlü Kimlik Doğrulama Nedir ve Neden Önemli?

Klasik SSH güvenliği genellikle şu iki yöntemden birine dayanır: parola tabanlı giriş ya da anahtar çifti (key pair) doğrulaması. Parola tabanlı girişin brute-force saldırılarına ne kadar açık olduğunu hepimiz biliyoruz. Anahtar tabanlı doğrulama daha güvenli olmakla birlikte, özel anahtarın çalınması durumunda tek başına yeterli olmuyor.

İki faktörlü kimlik doğrulama bu denkleme üçüncü bir boyut katıyor:

  • Bilgi faktörü: Parolanız ya da SSH anahtarınız
  • Sahiplik faktörü: Telefonunuzdaki TOTP (Time-based One-Time Password) uygulaması
  • Biyometri faktörü: Parmak izi, yüz tanıma gibi (bu yazının kapsamı dışında)

Google Authenticator, TOTP standardını (RFC 6238) uygulayan ve her 30 saniyede bir yeni bir 6 haneli kod üreten bir uygulamadır. Sunucu ile telefon aynı gizli anahtarı paylaşır ve matematiksel olarak aynı kodu üretirler. Araya giren biri parolanızı bilse bile, fiziksel olarak telefonunuza sahip olmadan sisteme giremez.

Kurulum Ortamı ve Gereksinimler

Bu rehberde Ubuntu 22.04 LTS üzerinde çalışacağız, ancak adımların büyük kısmı Debian tabanlı tüm dağıtımlarda ve küçük farklarla RHEL/CentOS ailesi için de geçerlidir.

Başlamadan önce şunlara sahip olduğunuzdan emin olun:

  • Root veya sudo yetkili bir kullanıcı
  • Çalışan ve erişilebilir bir SSH servisi
  • Akıllı telefonda Google Authenticator veya Authy gibi TOTP uygulaması
  • Kritik: Mevcut SSH oturumunuzu kapatmayın, kurulum boyunca ikinci bir terminal açık tutun

Son madde gerçekten çok önemli. Yanlış yapılandırma sizi sisteminizden tamamen kilitleyebilir. Her adımda ikinci bir açık oturumunuz olsun.

Google Authenticator PAM Modülünü Kurma

PAM (Pluggable Authentication Modules), Linux’ta kimlik doğrulama işlemlerini modüler hale getiren altyapıdır. Google’ın bu sistem için hazırladığı PAM modülünü kurmakla başlıyoruz.

# Ubuntu/Debian için
sudo apt update
sudo apt install libpam-google-authenticator -y

# RHEL/CentOS/Fedora için
sudo dnf install google-authenticator -y
# veya eski sistemlerde
sudo yum install google-authenticator -y

Kurulum tamamlandıktan sonra modülün başarıyla yüklendiğini doğrulayalım:

dpkg -l | grep google-authenticator
# veya
rpm -qa | grep google-authenticator

Kullanıcı Bazında Google Authenticator Yapılandırması

Önemli bir nokta: google-authenticator komutu her kullanıcı için ayrı ayrı çalıştırılmalıdır ve root olarak değil, ilgili kullanıcı hesabıyla çalıştırılmalıdır. Bu komut, kullanıcının ev dizinine .google_authenticator dosyasını oluşturur.

# Normal kullanıcı olarak çalıştırın, sudo ile değil
google-authenticator

Komut çalıştıktan sonra terminalde büyük bir QR kodu görünecek. Bu kodu telefonunuzdaki Google Authenticator uygulamasıyla tarayın. Ardından komut size birkaç soru soracak:

“Do you want authentication tokens to be time-based?” sorusuna y deyin. Zaman tabanlı TOTP kullanmak istiyoruz.

QR kodu taradıktan sonra uygulama 6 haneli kod üretmeye başlayacak. Terminalde sorulan doğrulama kodunu girerek telefon ve sunucunun senkronize olduğunu teyit edin.

Diğer sorular için önerilen cevaplar:

  • “Do you want me to update your ~/.google_authenticator file?”: y – Yapılandırmayı kaydet
  • “Do you want to disallow multiple uses of the same authentication token?”: y – Aynı kodun tekrar kullanılmasını engelle, replay saldırılarına karşı koruma
  • “By default, a new token is generated every 30 seconds…”: n – Zaman senkronizasyon sorunlarına karşı tolerans penceresi açmak isterseniz y yapabilirsiniz
  • “Do you want to enable rate-limiting?”: y – Brute-force koruması için sınırlama uygula

Oluşturulan .google_authenticator dosyasını inceleyelim:

cat ~/.google_authenticator
# İlk satır gizli anahtar (secret key)
# Devamında yedek kodlar ve yapılandırma bayrakları

Bu dosyayı güvenli bir yerde yedekleyin. Telefonu kaybettiğinizde gizli anahtarı başka bir cihaza aktarabilirsiniz.

PAM Yapılandırması

Şimdi SSH’ın bu PAM modülünü kullanmasını sağlamamız gerekiyor. /etc/pam.d/sshd dosyasını düzenleyelim:

sudo nano /etc/pam.d/sshd

Dosyanın en üstüne şu satırı ekleyin:

auth required pam_google_authenticator.so

Eğer SSH anahtar doğrulaması kullananları 2FA’dan muaf tutmak istiyorsanız (bu konuya ilerleyen bölümde değineceğiz), bunun yerine şu satırı kullanın:

auth required pam_google_authenticator.so nullok

nullok parametresi, henüz google-authenticator kurulmamış kullanıcıların normal şekilde giriş yapabilmesine izin verir. Toplu dağıtım senaryolarında faydalıdır, ancak 2FA zorunluluğunu geçici olarak devre dışı bıraktığı unutulmamalıdır.

Standart Ubuntu kurulumlarında /etc/pam.d/sshd içinde @include common-auth satırı bulunur. Bu satır şifre doğrulamasını da devreye sokar. Yapılandırmanıza göre bu satırı yoruma alıp almamaya karar verebilirsiniz:

# Eğer sadece 2FA kodu + SSH anahtarı kullanacaksanız
# @include common-auth  satırını yorum satırına çevirin

SSH Daemon Yapılandırması

PAM yapılandırmasının ardından SSH daemon’ını 2FA kullanacak şekilde ayarlamamız gerekiyor. /etc/ssh/sshd_config dosyasını düzenleyelim:

sudo nano /etc/ssh/sshd_config

Aşağıdaki ayarların bu değerlere sahip olduğundan emin olun:

# Klavye etkileşimli kimlik doğrulamayı etkinleştir
ChallengeResponseAuthentication yes
# veya yeni OpenSSH sürümlerinde
KbdInteractiveAuthentication yes

# PAM kullanımını etkinleştir
UsePAM yes

# Parola doğrulamasına izin ver (2FA kodu için gerekli)
PasswordAuthentication yes

Eğer hem SSH anahtarı hem de 2FA kodunu zorunlu kılmak istiyorsanız (en güvenli seçenek), şu satırı da ekleyin:

AuthenticationMethods publickey,keyboard-interactive

Bu yapılandırma, kullanıcının önce geçerli bir SSH anahtarıyla doğrulanmasını, ardından TOTP kodunu girmesini zorunlu kılar. İki faktörü gerçek anlamda bir arada kullanmış olursunuz.

Değişiklikleri kaydedip SSH servisini yeniden başlatmadan önce yapılandırmayı test edin:

sudo sshd -t
# Hata yoksa devam edin
sudo systemctl restart sshd

İlk Test: Her Şey Çalışıyor Mu?

Mevcut oturumu kapatmadan yeni bir terminal açın ve bağlantıyı test edin:

ssh kullanici@sunucu-ip

SSH anahtarı doğrulandıktan sonra size şunu sorması gerekir:

Verification code:

Telefonunuzdaki Google Authenticator uygulamasında görünen 6 haneli kodu girin. Başarılı olursa giriş tamamlanır. Eğer bir sorun varsa, eski oturumunuz hala açık olduğu için sisteme erişiminizi kaybetmezsiniz.

Gerçek Dünya Senaryosu: Ekip Ortamında 2FA Yönetimi

Diyelim ki 5 kişilik bir DevOps ekibiniz var ve hepsinin aynı sunucuya 2FA ile erişmesini istiyorsunuz. Her kullanıcının kendi hesabında google-authenticator kurması gerekiyor:

# Her kullanıcı kendi hesabıyla bağlanıp çalıştırır
su - ali
google-authenticator

su - ayse
google-authenticator

su - mehmet
google-authenticator

Peki ya yeni bir ekip üyesi geldiğinde? İşte pratik bir onboarding scripti:

#!/bin/bash
# 2fa_setup.sh - Yeni kullanıcı için 2FA kurulum scripti

USERNAME=$1
if [ -z "$USERNAME" ]; then
    echo "Kullanim: $0 <kullanici_adi>"
    exit 1
fi

# Kullanicinin var olup olmadigini kontrol et
if ! id "$USERNAME" &>/dev/null; then
    echo "Hata: $USERNAME kullanicisi bulunamadi"
    exit 1
fi

echo "=== $USERNAME icin Google Authenticator kurulumu ==="
echo "Bu komutu $USERNAME olarak calistirin:"
echo "  su - $USERNAME -c 'google-authenticator -t -d -f -r 3 -R 30 -W'"
echo ""
echo "QR kodu taradiktan sonra yoneticiyi bilgilendirin."

-t (zaman tabanlı), -d (tekrar kullanimi engelle), -f (onayli), -r 3 (3 deneme), -R 30 (30 sn aralık) parametreleri ile etkileşimsiz kurulum yapılabilir, ancak QR kodu ayrıca gösterilir.

Servis Hesapları ve Otomasyon: İstisna Yönetimi

Gerçek dünyada her zaman otomasyon hesapları, deploy scriptleri veya monitoring araçları için SSH bağlantısı kurmanız gerekebilir. Bu hesapların 2FA’dan muaf tutulması gerekir.

Bunun için sshd_config içinde Match bloğu kullanabilirsiniz:

# /etc/ssh/sshd_config içine ekleyin

# Servis hesapları icin 2FA'yi devre disi birak
Match User deploy,monitor,backup
    AuthenticationMethods publickey
    PasswordAuthentication no

# Admin hesaplari icin hem anahtar hem 2FA zorunlu
Match Group sysadmin
    AuthenticationMethods publickey,keyboard-interactive

# Belirli IP araliginden geliyorsa 2FA'yi es gec (ic ag)
Match Address 192.168.1.0/24
    AuthenticationMethods publickey

Bu yapılandırma sonrası SSH servisini yeniden başlatmayı unutmayın:

sudo systemctl restart sshd
sudo systemctl status sshd

Yedek Kodlar ve Felaket Kurtarma

Google Authenticator kurulumu sırasında size 5 adet yedek (emergency) kod verilir. Bu kodlar TOTP cihazınıza erişemediğinizde kullanabileceğiniz tek kullanımlık şifrelerdir. Bu kodları fiziksel olarak güvenli bir yerde saklayın, asla sunucuda tutmayın.

Yedek kodları sonradan görmek ya da yenilemek için:

# Mevcut .google_authenticator dosyasini incele
# Dosyadaki " EMERGENCY SCRATCH CODES" kismindaki satirlar yedek kodlardir
grep -A 5 "EMERGENCY" ~/.google_authenticator

Bir yedek kodu kullandıktan sonra tekrar kullanılamaz. Tüm kodları tükettiyseniz ve telefonunuzu kaybettiyseniz, fiziksel sunucu erişimi veya konsol erişimi olan birisinin yardımına ihtiyacınız olacak.

Toplu yedek kod yenileme için:

# google-authenticator dosyasini yeniden olustur
# DİKKAT: Bu gizli anahtari da degistirir, uygulamayi yeniden taramaniz gerekir
google-authenticator -t -d -f -r 3 -R 30 -W -e 10
# -e 10 parametresi 10 adet yedek kod uretir

Sorun Giderme: Sık Karşılaşılan Problemler

“Permission denied” Hatası

SSH bağlantısında doğrulama kodu doğru olmasına rağmen hata alıyorsanız, önce PAM yapılandırmasını kontrol edin:

# SSH auth loglarini gercek zamanli izle
sudo tail -f /var/log/auth.log | grep sshd

# Veya journald kullaniyorsaniz
sudo journalctl -fu sshd

Zaman Senkronizasyon Sorunları

TOTP, sunucu ve telefon saatlerinin senkronize olmasına dayanır. Sunucu saatini kontrol edin:

timedatectl status
# NTP'nin aktif oldugunu dogrulayin
timedatectl set-ntp true

# NTP servisini kontrol et
systemctl status systemd-timesyncd
# veya
ntpq -p

Eğer saat farkı sorun yaratıyorsa, google-authenticator kurulumunda zaman toleransını artırabilirsiniz. .google_authenticator dosyasına WINDOW_SIZE 3 satırı eklemek, 3 pencere (90 saniye) tolerans sağlar.

Dosya İzin Sorunları

# .google_authenticator dosyasi sadece sahibi tarafindan okunabilmeli
chmod 600 ~/.google_authenticator
ls -la ~/.google_authenticator
# Sonuc: -rw------- 1 kullanici kullanici ... .google_authenticator

Güvenlik Sertleştirme: Son Dokunuşlar

2FA kurulumunu tamamladıktan sonra ek güvenlik önlemleri almak iyi pratiktir:

# /etc/ssh/sshd_config icine eklenecek guvenlik ayarlari

# Root ile direkt SSH girisini engelle
PermitRootLogin no

# Bos parola ile girisi engelle
PermitEmptyPasswords no

# Maksimum kimlik dogrulama deneme sayisi
MaxAuthTries 3

# Oturum zaman asimi
ClientAliveInterval 300
ClientAliveCountMax 2

# Sadece belirli kullanicilara izin ver
AllowUsers ali ayse deploy
# veya grup bazli
AllowGroups sysadmin developers

# SSH protokol versiyonu (modern OpenSSH icin gerekli degil ama kontrol edin)
Protocol 2

Fail2ban ile brute-force koruma eklemek de bu noktada mantıklıdır:

sudo apt install fail2ban -y
sudo systemctl enable --now fail2ban

# SSH icin jail yapilandirmasi
sudo nano /etc/fail2ban/jail.local
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600

Sonuç

Google Authenticator ile SSH entegrasyonu, birkaç dakikalık kurulum süresi karşısında ciddi bir güvenlik katmanı sağlıyor. Parola sızıntısı, brute-force saldırıları veya SSH anahtarı çalınması gibi senaryolara karşı ikinci bir bariyer oluşturuyorsunuz.

Özetlemek gerekirse izlediğimiz yol şuydu: libpam-google-authenticator kurulumu, kullanıcı bazında google-authenticator yapılandırması, PAM ve sshd_config düzenlemeleri ve servis hesapları için Match blokları ile ince ayar.

Gerçek dünya uygulamalarında dikkat edilmesi gereken kritik noktalar şunlardır:

  • Yapılandırma değişikliklerinde her zaman ikinci bir terminal açık tutun
  • Yedek kodları güvenli bir fiziksel ortamda saklayın
  • Servis ve otomasyon hesaplarını publickey ile keyboard-interactive arasında doğru şekilde ayırın
  • nullok parametresini geçiş sürecinde kullanın, ancak tüm kullanıcılar kurulumu tamamlayınca kaldırın
  • Sunucu saatinin NTP ile senkronize olduğundan emin olun

2FA tek başına yeterli değil, sistemin bir parçasıdır. Fail2ban, güçlü SSH anahtar yönetimi, düzenli denetim logları ve en az yetki prensibi ile birlikte uygulandığında gerçek anlamda sağlam bir SSH güvenlik altyapısı oluşturmuş olursunuz.

Yorum yapın