SSH 2-Step Verification – Google Authenticator
Warning: mysqli_query(): (HY000/3): Error writing file '/tmp/MY1eWxY3' (Errcode: 28 - No space left on device) in /usr/share/nginx/html/syslogs/wp-includes/class-wpdb.php on line 2349
google authenticator, sağladığı PAM modülü üzerinden OpenSSH'a entegre edilebiliyor, bu şekilde ssh erişimlerinde, şifre ya da key based auth'a ek olarak, telefonunuzda yüklü olan google authenticator üzerinden üretebileceğiniz time-based one-time password (TOTP) doğrulamasını da devreye alarak two-step authentication yapabiliyorsunuz.
Özellikle bir nedenle heryerden erişilebilir, standart portta çalışan ssh çalıştıran sunucularınız varsa, ek bir güvenlik katmanı sağladığından dolayı google authenticator entegrasyonunu da kullanmak isteyebilirsiniz. Bu nedenle yazının devamında, CentOS 6 ve Debian 7 sistemler için google authenticator PAM modülünün kurulması ve ssh'a entegre edilmesinden bahsedeceğim.
İçerik İndexi
Gereksinimler
GA üzerinden time-based doğrulama kodları üretileceği için sistem saatinin senkronize olması çok önemli. Aksi halde çalışmayacaktır. Bu nedenle kuruluma başlamadan önce sisteminizde NTP kurulu ve çalışıyor olmalıdır. Eğer değilse öncelikle aşağıdaki linklerden NTP kurulumunuzu tamamlayın.
CentOS Sistemlerde NTP Kurulumu
Debian Sistemlerde NTP Kurulumu
GA PAM Modülünün Kurulması
GA PAM modülü, CentOS sistemler için EPEL repolarında bulunduğundan dolayı, yum üzerinden kurabiliyor; ancak şu anki rpm sürümümde güncel olmadığından ben kaynak koddan derlemeyi anlatacağım. Debian sistemlerde ise kurulumu kaynak koddan yapmak dışında seçenek yok.
Kurulum işlemi her iki dağıtım için aynı olsa da, öncesinde sisteme yüklenmesi gereken paketlerde minor farklılıklar olduğundan bağımlılık paketlerinin yüklnemesini dağıtım spesifik anlatacağım:
CentOS Dependencies
RHEL tabanlı sistemlerde, pam-devel paketinin kurulu olması gerekiyor. Ayrıca, sisteminizin minimal kurulmuş olması ihtimaline karşı, wget ve make gibi diğer gerekli paketleri de kuralım.
# yum install -y wget make pam-devel
CentOS sistemlere spesifik bir diğer gereksinim ise SELinux'un disable edilmesidir. Zira, Google Authenticator ve SELinux arasındaki bir uyumsuzluk nedeni ile SELinux devredeyken bazı problemler çıkıyor. (Gerçi ilgili problemleri gidermek için bazı çözümler var ama ben pek kullanışlı bulmadığım için direk olarak SELinux'u disable etmeyi tercih ediyorum.)
# setenforce 0
ve sistem açılışlarında da disable olması için /etc/selinux/config dosyasını açın ve “SELINUX=” ibaresini disabled olacak şekilde düzenleyin:
SELINUX=disabled
Bu şekilde CentOS sistemler GA entegrasyonu için hazır duruma gelmektedir.
Debian Dependencies
Debian sistemlerde pam'in development paketinin ismi libpam-dev olarak geçiyor. Bu paketi ve diğer gereksinimleri sisteme ekleyelim: (Gene minimal bir Debian kurulumunuz olduğunu varsayıyorum):
# apt-get install gcc make libpam-dev ca-certificates bzip2 libpam-dev
Kurulum
Kurulumların adımları her iki tip dağıtımda da aynı olduğu için bundan sonrasına tek başlık altında değineceğim.
Öncelikle pam modülünü download ediyoruz.
Not: paketin son sürümü var mı diye kontrol etmek için şu adrese göz atabilirsiniz:
https://code.google.com/p/google-authenticator/downloads/list
# wget https://google-authenticator.googlecode.com/files/libpam-google-authenticator-1.0-source.tar.bz2
İndirdiğimiz paketi açıyoruz:
# tar jvfx libpam-google-authenticator-1.0-source.tar.bz2
ve kuruyoruz:
# cd libpam-google-authenticator-1.0/ # make install
Bu şekilde pam modülü,
CentOS sistemlerde, /lib/x86_64-linux-gnu/security/pam_google_authenticator.so path'ine
Debian sistemlerde ise /lib/x86_64-linux-gnu/security/pam_google_authenticator.so path'ine kurulmuş oluyor.
Kurulumun ardından GA yapılandırmasına geçiyoruz.
google-authenticator Yapılandırması
Bu aşamada google-authenticator pam modülü ile ilgilli konfigurasyonu tamamlayıp, sistemi cep telefonumuzdaki Google Authenticator uygulaması ile entegre ediyoruz. Bu işlem için kısaca google-authenticator komutunu çalıştırıyorsunuz ve uygulama bir iki soru sorarak yapılandırmayı tamamlıyor ve telefonunuzdaki app'e girmeniz gereken secret key'i (ya da ilgili secret key'e ait QR koduna giden linki) ekranda basıyor ve yapılandırma login olduğunuz kullanıcının home dizininde oluşturulan .google_authenticator isimli dosyaya yazılıyor. İlgili secret key ya da qr kodunu da telefonunuzdaki google authenticator uygulamasına girdiğiniz zaman entegrasyon tamamlanmış oluyor. Bu şekilde home dizininde .google_authenticator dosyası bulunan kullanıcılara ssh oturumu açılırken yapılan kimlik denetimi için telefondan üretilecek verification kod da sorulacaktır.
Ben aşağıdaki şekilde komuta gerekli parametreleri de vererek yapılandırmanın soru sorulmadan tamamlanması için GA entegrasyonu yapmak istedğim kullanıcı ile login durumdayken şu şekilde çalıştırıyorum:
$ google-authenticator -t -d -r 3 -R 30 -w 17 -f
Komuta geçtiğimiz parametrelerin anlamları şu şekilde. (Detaylar için google-authenticator –help ile yardım menüsüne bakabilirsiniz.)
-t: time-based verification (TOTP) kullanacağımızı belirtir.
-d: Daha önceden kullanılmış tokenlerin yeniden kullanılmasını engeller.
-r 3: brute-force önlemi için rate-limiting. her (N) saniye için max 3 login teşebbüsüne izin ver diyoruz.
-R 30: Yukarıdakinin devamı; her 30 saniye için (N) login teşşebbüsüne izin ver demiş oluyoruz.
-w 17: Max concurrent token sayısı (Default değer 17)
-f: Yapılandırmanın ~/.google_authenticator dosyasına otomatik ekle. (Default olarak izin istenir.)
Komutun çıktısı aşağıdaki gibidir:
https://www.google.com/chart?chs=200x200&chld=M|0&cht=qr&chl=otpauth://totp/[email protected]%3Fsecret%3D5H3DMHLDJYWOWL2I Your new secret key is: 5H3DMHLDJYWOWL2I Your verification code is 925499 Your emergency scratch codes are: 27941089 23804637 45492576 52695555 91790394
Çıktıda verilen URL'de telefonunuzdaki GA uygulaması üzerinden scan edebileceğiniz QRCode bulunmaktadır. QRCode kullanmak istememeniz durumunda ise “secret key”‘i girerek kullanıcınıza ait GA hesabını ekleyebilirsiniz.
Aşağıdaki ilk imajda, uygulamaya ait hesabı hangi yol ile eklemek istediğinizi seçtiğiniz ekran bulunuyor, diğer imaj ise QRCode yöntemi yerine secret code'unuzu kullanarak manual account ekleme ekranı göstermektedir:
Hesabı manual olarak eklemeniz durumunda, Account name olarak [email protected] gibi bir isim verip secret key'inizi girmeniz yeterli olacaktır. (Ama tabi telefonunuzun kamerasında bir sorun yoksa hesabı QRCode üzerinen eklemeniz daha kolay olacaktır.)
Hesap eklendikten sonra ise görüntü şu şekilde olacaktır:
Bu şekilde google authenticator yapılandırması tamamlanmış oluyor. Şimdi son adım olarak sistem tarafında pam ve sshd'deki yapılandırma işlemlerine geçiyoruz.
sshd PAM Yapılandırılması
UYARI!: Bu aşamada, pam ve sshd gibi kimlik doğrulamayla ilgili bileşenlerde değişiklikler yapılacağı için, özellikle console erişiminizin olmadığı sistemlerde çalışırken yedek olarak mutlaka ikinci bir ssh oturumunuzun olmasını öneririm.Zira, pam üzerindeki değişiklikler herhangi bir servisi restart etmeye gerek kalmaksızın on the fly olarak devreye alınmaktadır. Böyle bir durumda GA yapılandırmanızın doğru olmaması ve bir şekilde ssh bağlantınızın kesilmesi durumunda console haricinde GA aktif edilmiş herhangi bir kullanıcı ile login olamayabilirsiniz. |
Öncelikli olarak SSHd'ye ait PAM yapılandırmasına Google Auth. modülünü de eklememiz gerekiyor. Bunun için /etc/pam.d/sshd dosyasını editleyin (Bu hem CentOS hem de Debian sistemler için aynıdır.):
# vi /etc/pam.d/sshd
ve dosyanın muhtelif bir yerine (örneğin ikinci satıra) aşağıdaki ibareyi ekleyin:
auth required pam_google_authenticator.so nullok
Yukarıdaki “nullok” ibaresi, google auth. entegrasyonu olmayan (yani home dizininde .google_authenticator dosyası olmayan) kullanıcılar için GA doğrulamasını devre dışı bırakmaktadır.
Şimdi de /etc/ssh/sshd_config dosyasını editleyin ve
ChallengeResponseAuthentication no
satırını aşağıdaki şekilde değiştirin:
ChallengeResponseAuthentication yes
Son olarak da sshd'yi restart edin:
CentOS:
# /etc/init.d/sshd restart
Debian:
# /etc/init.d/ssh restart
Bu şekilde sistem tarafındaki yapılandırma tamamlanmış olmaktadır. Bundan sonra sisteme SSH bağlantısı kurduğunuz zaman aşağıdaki şekilde verification code'de sorulacaktır.
login as: username Verification code: Password:
Bu şekilde entegrasyon tamamlanmış oluyor.
Bu yazılar da ilginizi çekebilir:
- Linuxlar’da SSH üzerinden Root Erişiminin Engellenmesi
- SSH Üzerinden Root Login Girişimlerinde Artış
- PSSH ile Birden Fazla Sunucuyu Tek Merkezden Yönetmek
- Linux’larda SSH Key Saldırısı
- SSH Tunneling ile Güvenli Surf ve SSH Port Forwarding
Yorumlar
Trackbacks
Yorumda bulunun.
Ubuntu icin soyle bir betik[1] yazmistim zamaninda. Debian’da da calisacaktir diye tahmin ediyorum. Yukaridaki islemleri her hostta tek tek yapmaktansa tercih edilebilir.
[1] https://github.com/cagriemer/betikler/blob/master/totpssh.sh
[Cevapla]
Katkınız için teşekkkür ederim; Debian’larda sorunsuz çalışacak ve küçük bir kaç modifikasyon ile RHEL tabanlı sistemlerle de uyumlu hale getirilebilir gibi gorunuyor.
Yalnız pam’e modülü eklerken nullok parametresi de geçseniz iyi olabilir. Çünkü TOTP kullanmak istemeyeceğiniz spesifik kullanıcılar vs. olabilir.
[Cevapla]
Geri bildiriminiz icin tesekkur ederim. Haklisiniz, betik ilk kez calisirken kullaniciya bunu sormasinda fayda var. Firsatim oldugu bir ara ilgili degisiklikleri yapmaya calisayim.
[Cevapla]