Merhabalar,
Bu makalemde, linux sunuculara daha güvenli bir SSH bağlantısı kurabilmek için Multi-Factor Authentication kullanarak, 30 saniyede bir değişen Google Authenticator kodlarıyla sistemi nasıl konfigüre edeceğimize dair bilgiler aktarmak istiyorum.
Kimlik doğrulama faktörü (authentication factor), bir sistemde oturum açmak gibi bir eylem gerçekleştirme haklarına sahip olduğunuzu kanıtlamak için kullanılan tek bir bilgidir. Kimlik doğrulama kanalı (authentication channel), kimlik doğrulama sisteminin kullanıcıya bir giriş faktörü iletme veya kullanıcının yanıt vermesini gerektirme yöntemidir. Parolalar ve security token’lar, kimlik doğrulama faktörlerine örnektir; bilgisayarlar ve telefonlar da bu kanallara örnek olabilir.
SSH, kimlik doğrulaması için varsayılan olarak parolalar kullanır ve SSH güvenlik sıkılaştırma yönergelerinin çoğu, bunun yerine bir SSH key kullanılmasını önerir. Ancak bu hala tek bir kimlik doğrulama faktördür. Kötü niyetli bir kullanıcı, bilgisayarınızın güvenliğini aşmışsa, sunucularınıza erişmek için bu anahtarınızı kullanabilir.
Bu makalede, bununla mücadele etmek için çok faktörlü kimlik doğrulaması (Multi-Factor Authentication) ayarlayacağız.
Multi-factor authentication (MFA), kimlik doğrulaması yapmak veya oturum açmak için birden fazla faktör gerektirir. Bu, kötü niyetli bir kullanıcının içeri girmek için hem bilgisayarınız hem de telefonunuz gibi birden fazla yöntemle kimliğini doğrulaması gerektiği anlamına gelir. Farklı kimlik doğrulama faktörleri genellikle şu şekilde özetlenir:
- Parola veya güvenlik sorusu gibi bildiğiniz bir şey
- Kimlik doğrulama uygulaması veya güvenlik belirteci gibi sahip olduğunuz bir şey
- Parmak iziniz veya sesiniz gibi olduğunuz bir şey
Yaygın giriş faktörlerinden biri de Google Authenticator gibi bir OATH-TOTP uygulamasıdır. OATH-TOTP (Open Authentication Time-Based One-Time Password) bir kerelik kullanım şifresi oluşturan, genellikle 30 saniyede bir yeniden oluşturulan, 6 haneli bir sayı üreten açık bir protokoldür.
Google Şifrematik Nasıl Çalışır?
İki adımlı doğrulama olarak da bilinen iki faktörlü kimlik doğrulaması (2FA), giriş yapabilmek için iki farklı kanal tarafından oluşturulan bilgileri girmenizi gerektirir. Google Şifrematik, paylaşılan gizli anahtarı ve geçerli saati kullanarak bir defalık bir şifre oluşturur. Yalnızca doğru kullanıcı adını ve şifreyi sağlamanızın yanı sıra, SSH sunucunuza giriş yapmak için Google Şifrematik tarafından oluşturulan bir defalık bir şifre de girmeniz gerekir.
Böylece, kötü niyetli bir kullanıcı parolanızı ele geçirse bile, bu hesap için tanımlanmış olan kodları komut satırına giremeyeceği için, güvenliği de üst seviyelere çıkarmış olursunuz.
Şimdi bu ayarları nasıl yapabileceğimize geçelim.
Başlamadan önce…
- Telefonunuzda Google Authenticator uygulaması yüklü olmalı
- Google Authenticator, Selinux ile uyumlu değildir. Dolayısıyla Selinux’u disable etmenizi öneriyorum. Eğer disable etmeden kullanmak isterseniz, workaround çözümleri de kullanabilirsiniz.
- Sunucunun saat ve tarih ayarlarının doğru olması gerekmektedir. Global ya da bölgesel bir NTP sunucuyla senkronize etmenizi tavsiye ediyorum. Aksi durumda Google Authenticator kodları, saat farkında dolayı çalışmayacaktır.
Selinux durumunu aşağıdaki komut ile kontrol edebiliriz.
sestatus
Enable durumda, aşağıdaki komutla, ilgili dosya içindeki SELINUX satırını disabled olarak değiştiriyoruz.
nano /etc/selinux/config
SELINUX=disabled
Bu işlem reboot gerektirdiği için, sunucumuzu reboot ediyoruz.
Sunucu açıldığında sestatus komutuyla tekrar kontrol ettiğimizde disabled olduğunu da görebiliyoruz.
Adım 1: CentOS Sunucu üzerine Google Authenticator kurulumu ve konfigürasyonu (Google PAM Yüklenmesi)
Bu adımda, Google’ın PAM’ini yükleyecek ve yapılandıracağız.
PAM (Pluggable Authentication Module), bir kullanıcının kimliğini doğrulamak için Linux sistemlerinde kullanılan bir kimlik doğrulama altyapısıdır. Google bir OATH-TOTP uygulamasına sahip. TOTP üreten ve Google Authenticator veya Authy gibi OATH-TOTP uygulamalarıyla tamamen uyumlu bir PAM hizmeti sağlamakta.
İlk olarak, EPEL deposunu sistemimize eklememiz gerekiyor.
dnf install epel-release -y
Sonrasında da Google Authenticator paketini yüklüyoruz.
dnf install google-authenticator -y
PAM yüklüyken, ikinci bir faktör eklemek istediğiniz kullanıcı için bir TOTP anahtarı oluşturmak üzere PAM ile birlikte gelen bir yardımcı uygulama kullanacağız. Bu anahtar sistem genelinde değil, kullanıcı bazında oluşturulur.
Bu, bir TOTP yetkilendirme uygulaması kullanmak isteyen her kullanıcının kendi anahtarını almak için giriş yapması ve yardımcı uygulamayı çalıştırması gerektiği anlamına gelir.
Aşağıdaki komutla, konfigürasyonumuza başlıyoruz.
google-authenticator
Komutu çalıştırdıktan sonra birkaç soru sorulacaktır. Birincisi, kimlik doğrulama belirteçlerinin zamana dayalı olup olmayacağını sorar. Y ile devam ediyoruz.
Bu PAM, zamana dayalı veya sıralı tabanlı belirteçlere izin verir. Zamana dayalı belirteçlerin kullanılması, kodun belirli bir süre geçtikten sonra rastgele değişeceği anlamına gelir. Zamana bağlı kalacağız çünkü Google Şifrematik gibi uygulamalar bunu öngörüyor, bu nedenle yes için y yanıtını verin.
Bu soruyu cevapladıktan sonra, normalde büyük bir QR kodu görmemiz gerekiyor. Fakat komut satırında olduğumuz için bu grafikler oluşturulamıyor. Bunun yerine ekranda bir link verilmekte.
Bu noktada, QR kodunu taramak veya gizli anahtarı manuel olarak yazmak için telefonunuzdaki Google Authenticator uygulamanızı kullanın. Eklendikten sonra, uygulamanızda her 30 saniyede bir değişen altı haneli bir kod görürsünüz.
Not: Gizli anahtarı, doğrulama kodunu ve kurtarma kodlarını, şifre yöneticisi gibi güvenli bir yere kaydettiğinizden emin olun. Eğer telefonunuzdan Google Authenticator uygulamasını silerseniz sadece kurtarma kodlarıyla bu hesabı yeniden ekleyebilirsiniz. Kurtarma kodları, örneğin TOTP uygulamanıza erişiminizi kaybederseniz erişimi yeniden kazanmanın tek yoludur.
Uygulama tarafından üretilen geçici kodu “Enter code” satırına yazıyoruz ve enter ile devam ediyoruz.
Bu işlem, anahtarı ve seçenekleri .google_authenticator dosyasına yazar. Hayır derseniz, program sonlandırılır ve hiçbir şey yazılmaz, yani kimlik doğrulayıcı çalışmaz.
Bir sonraki soruda evet yanıtı vererek, kullanımdan hemen sonra her bir kodun süresinin dolmasını sağlayarak bir tekrar saldırısını önlersiniz. Böylece, bir saldırganın az önce kullandığınız bir kodu yakalamasını ve onunla giriş yapmasını önlemiş olacaksınız.
Sonraki soruda evet yanıtı vermek, ilerleyen dört dakikalık bir pencerede 8 geçerli koda kadar izin vereceğiniz anlamına geliyor. Bir hayır cevabıyla devam ediyoruz.
Rate limiting (hız sınırlaması), uzaktaki bir saldırganın engellenmeden önce yalnızca belirli sayıda tahminde bulunabileceği anlamına gelir. Daha önce hız sınırını doğrudan SSH ile sınırlandırmadıysanız, şimdi bunu yapmak harika bir güvenlik sıkılaştırma tekniği olabilir.
Not: Bu kurulumu tamamladıktan sonra gizli anahtarınızı yedeklemek istiyorsanız ~/.google-authenticator dosyasını güvenilir bir konuma kopyalayabilirsiniz. Oradan, ek sistemlere dağıtabilir veya bir yedeklemeden sonra yeniden dağıtabilirsiniz.
Google’ın PAM’ı yüklenip yapılandırıldığına göre, sonraki adım olan SSH bağlantısını, TOTP anahtarınızı kullanacak şekilde yapılandırma işlemine geçebiliriz. SSH konfigürasyonuna PAM kullanılacağını anlatmamız ve ardından SSH’yi kullanması için yapılandırmamız gerekiyor.
Adım 2 —OpenSSH konfigürasyonunun yapılması
SSH konfigürasyonu üzerinde, SSH bağlantı değişiklikleri yapacağımız için, ilk SSH bağlantı pencerenizi asla kapatmamak önemlidir. Bunun yerine, test yapmak için ikinci bir SSH oturumu açın. Böylece, SSH yapılandırmanızda bir hata olması durumunda kendinizi sunucunuzun dışında bırakıp uzak bağlatıya kilitlemekten kaçınmış olacaksınız. Yaptığınız konfigürasyonlar çalıştığında, oturumları güvenle kapatabilirsiniz.
Başlamak için sshd yapılandırma dosyasını düzenleyeceğiz.
nano /etc/pam.d/sshd
Aşağıdaki satırı dosyanın altına ekleyin.
auth required pam_google_authenticator.so nullok
Son satırın sonundaki nullok sözcüğü, PAM’a bu kimlik doğrulama yönteminin isteğe bağlı olduğunu söyler. Bu, OATH-TOTP jetonu olmayan kullanıcıların SSH key kullanarak oturum açmaya devam etmelerini sağlar. Tüm kullanıcılar bir OATH-TOTP jetonuna sahip olduktan sonra, MFA’yı zorunlu hale getirmek için nullok’u bu satırdan kaldırabilirsiniz.
Dosyayı kaydedip kapatın.
Ardından, SSH’yi bu tür kimlik doğrulamayı destekleyecek şekilde yapılandıracağız. Düzenlemek için SSH yapılandırma dosyasını açın.
nano /etc/ssh/sshd_config
ChallengeResponseAuthentication satırlarına bakın. Hayır satırını # ile yorum satırına çevirin ve no satırını açın.
İlk açtığınızda şu şekilde:
Şu şekilde değiştiriyoruz.
Dosyayı kaydedip kapatın, ardından yapılandırma dosyalarını yeniden yüklemek için SSH’yi yeniden başlatın. Sshd hizmetini yeniden başlatmak açık bağlantıları kapatmaz, bu nedenle bu komutla kendinizi kilitleme riskiniz olmaz.
systemctl restart sshd.service
Şimdiye kadar her şeyin çalıştığını test etmek için başka bir terminal açın ve SSH üzerinden giriş yapmayı deneyin. Daha önce bir SSH anahtarı oluşturduysanız ve kullanıyorsanız, kullanıcı şifrenizi veya MFA doğrulama kodunu yazmanız gerekmediğini fark edeceksiniz. Bunun nedeni, SSH anahtarının varsayılan olarak diğer tüm kimlik doğrulama seçeneklerini geçersiz kılmasıdır. Aksi takdirde, bir şifre ve doğrulama kodu istemi almış olmanız gerekir.
Bakınız verification code soruldu. Demek ki şu ana kadar yaptığımız konfigürasyon çalışıyor durumda.
Şimdi verification code yazmadan enter tuşuyla devam ediyorum. Giriş izni vermediğini görmektesiniz.
Tekrar root parolası soruluyor, parola girişi yapınca verification code yeniden soruluyor. Google authenticator programında oluşturulan kodu buraya giriyoruz.
Bakınız giriş yapıldı ve az önceki failed login deneme logunu da burada görmekteyiz.
Bu konfigürasyonla, aynı zamanda SCP bağlantıları için de Google Authenticator kodları kullanılmasını sağlar. Böylece, sunucu üzerine dosya kopyalama işlemleri de denetim altına alınmış olur.
SSH Key kullanmadığınız durum için, SSH bağlantısı üzerinde 2FA aktif etme işlemleri bu adımlardan ibaret.
Yararlı olması dileğiyle.
Yusuf İşleyen