SSH nasıl 2-faktörlü doğrulama ile korunur? (Two-Factor Authentication)

authenticatorBu yazımda, Ubuntu SSH bağlantılarımızda Google Authenticator PAM modülü ile nasıl 2-faktörlü (2-step verification) hesap doğurlaması yapılır bunu inceleyeceğiz.

Kullanıcı adı ve şifrelerin güvenliğini sağlamak bilişim uzmanları için bile zaman zaman pek mümkün olmuyor. Ele geçirilen sunucu sistemlerinde kayıtlı binlerce hesap tek seferde çalınabiliyor. Zararlı yazılım yüklü bilgisayarlardan giriş yapmak, kötü niyetli yazılımlara hesap bilgilerini girmeniz hesabınızın çalınması ile sonuçlanabilir. İşin kötü tarafı, yıllarca hesabınızın çalındığından haberdar olmadan hesabınızı kullanmaya devam ediyor olabilirsiniz.

Hesap güvenliğimizi bir adım ileri götürerek SSH bağlantılarımıza 2 adımlı giriş nasıl entegre edilir inceleyelim;

Google Authenticator uygulamasını akıllı telefonunuza yükledikten sonra yapılacak basit bir aktivasyon işleminin ardından, ssh bağlantısı kurarken önce doğrulama kodunu telefonunuzdan öğrenerek kullanmanız gerekecek. DİKKAT; Authenticator hangi kullanıcı için aktif edildiyse sonraki işlemlerde sadece o kullanıcı SSH ile erişim sağlayabilir.

1.Adım;

Öncelikle akıllı telefonunuza Google Authenticator’ü yükleyin. Sonrasında sunucunuza bağlanarak aşağıdaki adımları tamamlayın;

sudo apt-get install libpam-google-authenticator

libqrencode3 otomatik olarak yüklenecek ve qr-code üreterek aktivasyon işlemini kolaylaştıracak.

2.Adım;

auth required pam_google_authenticator.so

yukarıdaki satırı aşağıdaki dosyanın başına ekleyin.

nano /etc/pam.d/sshd

aşağıdaki dosyada;

nano /etc/ssh/sshd_config

ilgili satırı bulup aşağıdaki gibi değiştirin,

ChallengeResponseAuthentication yes

3.Adım;

Şimdi cep telefonundaki uygulamayı aktifleştirelim; 2-faktör doğrulamalı kullanacağınız hesaba geçin ve aşağıdaki komutu çalıştırın,

google-authenticator

sorulan sorulara ihtiyaçlarınıza göre yanıt verdikten sonra ekranda kocaman bir qr-code oluşacak. Buradaki qr-code’u okutarak yada “secret key” yardımıyla cep telefonuzdaki Authenticator uygulamasını etkinleştirin.

Oluşabilecek terslikler için “emergency scratch codes” satırlarını biryere not edin. Buradaki kodlar tek kullanımlıktır. Console erişiminde tüm kullanıcılar 2-faktöre gerek kalmadan giriş yapabiliyor, bu yüzden bu kodları kaybetseniz dahi sorun değil.

sudo services ssh restart

İşlemi tamamladık, SSH sunucunuz 2-faktör doğrulamaya sahip. Public-key ile bağlantılarda ek doğrulama gerekmeyecek, bu da güzel yönlerinden.

10 Nisan 2014

Posted In: 2-faktör, 2-step verification, google authenticator, lkd, PAM, ssh, teknik, tr

SSH nasıl 2-faktörlü doğrulama ile korunur? (Two-Factor Authentication)

authenticatorBu yazımda, Ubuntu SSH bağlantılarımızda Google Authenticator PAM modülü ile nasıl 2-faktörlü (2-step verification) hesap doğurlaması yapılır bunu inceleyeceğiz.

Kullanıcı adı ve şifrelerin güvenliğini sağlamak bilişim uzmanları için bile zaman zaman pek mümkün olmuyor. Ele geçirilen sunucu sistemlerinde kayıtlı binlerce hesap tek seferde çalınabiliyor. Zararlı yazılım yüklü bilgisayarlardan giriş yapmak, kötü niyetli yazılımlara hesap bilgilerini girmeniz hesabınızın çalınması ile sonuçlanabilir. İşin kötü tarafı, yıllarca hesabınızın çalındığından haberdar olmadan hesabınızı kullanmaya devam ediyor olabilirsiniz.

Hesap güvenliğimizi bir adım ileri götürerek SSH bağlantılarımıza 2 adımlı giriş nasıl entegre edilir inceleyelim;

Google Authenticator uygulamasını akıllı telefonunuza yükledikten sonra yapılacak basit bir aktivasyon işleminin ardından, ssh bağlantısı kurarken önce doğrulama kodunu telefonunuzdan öğrenerek kullanmanız gerekecek. DİKKAT; Authenticator hangi kullanıcı için aktif edildiyse sonraki işlemlerde sadece o kullanıcı SSH ile erişim sağlayabilir.

1.Adım;

Öncelikle akıllı telefonunuza Google Authenticator’ü yükleyin. Sonrasında sunucunuza bağlanarak aşağıdaki adımları tamamlayın;

sudo apt-get install libpam-google-authenticator

libqrencode3 otomatik olarak yüklenecek ve qr-code üreterek aktivasyon işlemini kolaylaştıracak.

2.Adım;

auth required pam_google_authenticator.so

yukarıdaki satırı aşağıdaki dosyanın başına ekleyin.

nano /etc/pam.d/sshd

aşağıdaki dosyada;

nano /etc/ssh/sshd_config

ilgili satırı bulup aşağıdaki gibi değiştirin,

ChallengeResponseAuthentication yes

3.Adım;

Şimdi cep telefonundaki uygulamayı aktifleştirelim; 2-faktör doğrulamalı kullanacağınız hesaba geçin ve aşağıdaki komutu çalıştırın,

google-authenticator

sorulan sorulara ihtiyaçlarınıza göre yanıt verdikten sonra ekranda kocaman bir qr-code oluşacak. Buradaki qr-code’u okutarak yada “secret key” yardımıyla cep telefonuzdaki Authenticator uygulamasını etkinleştirin.

Oluşabilecek terslikler için “emergency scratch codes” satırlarını biryere not edin. Buradaki kodlar tek kullanımlıktır. Console erişiminde tüm kullanıcılar 2-faktöre gerek kalmadan giriş yapabiliyor, bu yüzden bu kodları kaybetseniz dahi sorun değil.

sudo services ssh restart

İşlemi tamamladık, SSH sunucunuz 2-faktör doğrulamaya sahip. Public-key ile bağlantılarda ek doğrulama gerekmeyecek, bu da güzel yönlerinden.

10 Nisan 2014

Posted In: 2-faktör, 2-step verification, google authenticator, lkd, PAM, ssh, teknik, tr

SSH tünel ile bağlantı güvenliği (SSH Tunnel)

SSH ile bağlantımızı tünelleyip istediğimiz noktalar arasında kriptolu geçirebiliriz. Bu yöntem hangi durumlar için kullanılabilir;

sshtunnel

• Güvensiz bir İnternet bağlantısı kullandığımız konumlarda bağlantı güvenliğimizi arttırmak
• Ağ filtrelerine takılmamak (ağ filtrelerini aşmak, varsa “kullanım politikası sözleşmenize” aykırı olabilir)
• NAT arkasından gerçek dünyaya soket açmak (NAT arkasından dışarıya servis vermek)
• İnternet çıkışını farklı ülkelere taşıyarak testler yapmak
• Sistemlere uzaktan erişim için bir zıplama noktası oluşturmak (VPN alternatifi)

SSH Tunnel in 3 farklı tipi bulunuyor, bunlar;

• Yerel port yönlendirme (Local port forwarding)
• Uzak port yönlendirme (Remote port forwarding | Reverse Tunnelling)
• Dinamik port yönlendirme (Dynamic port forwarding)

Yerel port yönlendirme (Local port forwarding):

ssh -L 9001:domain.com:80 sshServerIP

Bağlı bulunduğunuz ağdan domain.com adresine erişiminiz yoksa, bu adrese erişimi olan bir SSH sunucu üzerinden erişim sağlanabilir. Yukarıdaki örnekte sshServerIP sunucusuna kurduğum SSH bağlantısı üzerinden domain.com‘a 80. port üzerinden tünel açtık. Bu komutu çalıştırdıktan sonra tarayıcınıza http://localhost:9001 yazdığınızda domain.com yüklenecektir. https protokolü için de aynı yöntem uygulanabilir. (kötü haber facebook.com gibi dağıtık yapıdaki sistemler bu yöntemle çalışmıyor, onlara erişim için dinamik port yönlendirme kullanılmalı )

Uzak port yönlendirme (Remote port forwarding | Reverse Tunnelling):

ssh -R 9001:localhost:80 sshServerIP

NAT veya firewall arkasından dış dünyaya bulunduğunuz ağdaki veya kendi makinenizden hizmet sağlanabilir. Dış dünyadaki gerçek IP adresine (sunucu) istek gönderenler tünelin ucundaki makine ile konuşabilirler. Yukarıdaki örnekte güvenli ağ arkasındaki makineden sshServerIP sunucusunun 80. portuna ters tünel açtık. Kurulan bu bağlantı ile dış dünyada bulunan sunucumuza tarayıcı ile ulaşanlar, güvenlikli bölgedeki makinemizin üzerinde çalışan web sunucudan hizmet alabilecekler.

Yukarıdaki örneği biraz değiştirerek iş yerinizdeki intranet sayfalarına evden erişim sağlanabilir. VPN erişimi alınamadığı durumlarda zorlukları aşmada kuvvetli bir alternatif olacaktır.

Dinamik port yönlendirme (Dynamic port forwarding):

ssh -D 9001 sshServerIP

En çok işimize yarayacak bağlantı tipi dinamik port yönlendirmedir. Yerel makinede açılan bir soket uzak makine üzerinden tüm hedeflere ulaştırılır. Yerel soket üzerinden SOCKS proxy protokolü kullanılarak bağlantı karşı tarafa ulaştırılır. Özetle uzak makinenin İnternet erişimi kullanılabilir. Yerel makinede tarayıcıya SOCKS proxy ayarlarının girilmesi gerekir. Firefox kendi bağlantı ayarlarını içsel olarak kullandığından bu iş için kolaylık sağlar. Ayrıca tarayıcılar için proxy uzantıları kullanılabilir. Veya yerel makinenin tüm trafiğinin proxy üzerinden geçirilmesi tercih edilebilir.

Firefox ağ ayarlarından SOCKS proxy tanımlandığında DNS sorguları bu proxy üzerinden geçirilmez. DNS sorgularının da tünelden geçmesi için adres satırına “about:config” yazıp, “network.proxy.socks_remote_dns” true olarak ayarlanmalıdır.

Bağlantısını kullanacağımız uzak makine için bir VPS yeterli olacaktır. Avrupa konumlu DigitalOcean planlarını incelemenizi tavsiye ederim.

Linux istemcilerde doğrudan komut satırından SSH komutu (OpenSSH) ile tünelleme kolayca yapılabilir. Windows istemcilerde Putty yukarıda bahsettiğim tüm bağlantı tiplerini kurabilecek yeteneğe sahip.

RDP yazılımlarından içsel olarak SSH tünel özelliğine sahip olanlara örnek; RemminaMobaXterm .

SSH’ın standart portu 22 dir. Bu port ile geçiş yapamıyorsanız, OpenSSH ayar dosyasında küçük bir değişiklikle 80 veya 443 kullanmanız pek çok engeli aşmanıza yardımcı olacaktır. Sıkı firewall cihazlarına karşı (deep packet inspection),  SSH tüneli HTTP tünelinden geçirilebilir.

Bağlantınızı istediğiniz yerden istediğiniz gizlilikte geçirebilme özgürlüğünü muhakkak yaşamalısınız.

10 Ocak 2014

Posted In: dinamik port yönlendirme, dynamic port forwarding, lkd, socks proxy, ssh, ssh tünel, ssh tunnel, teknik, tr, tünel, tunnel, vpn

SSH tünel ile bağlantı güvenliği (SSH Tunnel)

SSH ile bağlantımızı tünelleyip istediğimiz noktalar arasında kriptolu geçirebiliriz. Bu yöntem hangi durumlar için kullanılabilir;

sshtunnel

• Güvensiz bir İnternet bağlantısı kullandığımız konumlarda bağlantı güvenliğimizi arttırmak
• Ağ filtrelerine takılmamak (ağ filtrelerini aşmak, varsa “kullanım politikası sözleşmenize” aykırı olabilir)
• NAT arkasından gerçek dünyaya soket açmak (NAT arkasından dışarıya servis vermek)
• İnternet çıkışını farklı ülkelere taşıyarak testler yapmak
• Sistemlere uzaktan erişim için bir zıplama noktası oluşturmak (VPN alternatifi)

SSH Tunnel in 3 farklı tipi bulunuyor, bunlar;

• Yerel port yönlendirme (Local port forwarding)
• Uzak port yönlendirme (Remote port forwarding | Reverse Tunnelling)
• Dinamik port yönlendirme (Dynamic port forwarding)

Yerel port yönlendirme (Local port forwarding):

ssh -L 9001:domain.com:80 sshServerIP

Bağlı bulunduğunuz ağdan domain.com adresine erişiminiz yoksa, bu adrese erişimi olan bir SSH sunucu üzerinden erişim sağlanabilir. Yukarıdaki örnekte sshServerIP sunucusuna kurduğum SSH bağlantısı üzerinden domain.com‘a 80. port üzerinden tünel açtık. Bu komutu çalıştırdıktan sonra tarayıcınıza http://localhost:9001 yazdığınızda domain.com yüklenecektir. https protokolü için de aynı yöntem uygulanabilir. (kötü haber facebook.com gibi dağıtık yapıdaki sistemler bu yöntemle çalışmıyor, onlara erişim için dinamik port yönlendirme kullanılmalı )

Uzak port yönlendirme (Remote port forwarding | Reverse Tunnelling):

ssh -R 9001:localhost:80 sshServerIP

NAT veya firewall arkasından dış dünyaya bulunduğunuz ağdaki veya kendi makinenizden hizmet sağlanabilir. Dış dünyadaki gerçek IP adresine (sunucu) istek gönderenler tünelin ucundaki makine ile konuşabilirler. Yukarıdaki örnekte güvenli ağ arkasındaki makineden sshServerIP sunucusunun 80. portuna ters tünel açtık. Kurulan bu bağlantı ile dış dünyada bulunan sunucumuza tarayıcı ile ulaşanlar, güvenlikli bölgedeki makinemizin üzerinde çalışan web sunucudan hizmet alabilecekler.

Yukarıdaki örneği biraz değiştirerek iş yerinizdeki intranet sayfalarına evden erişim sağlanabilir. VPN erişimi alınamadığı durumlarda zorlukları aşmada kuvvetli bir alternatif olacaktır.

Dinamik port yönlendirme (Dynamic port forwarding):

ssh -D 9001 sshServerIP

En çok işimize yarayacak bağlantı tipi dinamik port yönlendirmedir. Yerel makinede açılan bir soket uzak makine üzerinden tüm hedeflere ulaştırılır. Yerel soket üzerinden SOCKS proxy protokolü kullanılarak bağlantı karşı tarafa ulaştırılır. Özetle uzak makinenin İnternet erişimi kullanılabilir. Yerel makinede tarayıcıya SOCKS proxy ayarlarının girilmesi gerekir. Firefox kendi bağlantı ayarlarını içsel olarak kullandığından bu iş için kolaylık sağlar. Ayrıca tarayıcılar için proxy uzantıları kullanılabilir. Veya yerel makinenin tüm trafiğinin proxy üzerinden geçirilmesi tercih edilebilir.

Firefox ağ ayarlarından SOCKS proxy tanımlandığında DNS sorguları bu proxy üzerinden geçirilmez. DNS sorgularının da tünelden geçmesi için adres satırına “about:config” yazıp, “network.proxy.socks_remote_dns” true olarak ayarlanmalıdır.

Bağlantısını kullanacağımız uzak makine için bir VPS yeterli olacaktır. Avrupa konumlu DigitalOcean planlarını incelemenizi tavsiye ederim.

Linux istemcilerde doğrudan komut satırından SSH komutu (OpenSSH) ile tünelleme kolayca yapılabilir. Windows istemcilerde Putty yukarıda bahsettiğim tüm bağlantı tiplerini kurabilecek yeteneğe sahip.

RDP yazılımlarından içsel olarak SSH tünel özelliğine sahip olanlara örnek; RemminaMobaXterm .

SSH’ın standart portu 22 dir. Bu port ile geçiş yapamıyorsanız, OpenSSH ayar dosyasında küçük bir değişiklikle 80 veya 443 kullanmanız pek çok engeli aşmanıza yardımcı olacaktır. Sıkı firewall cihazlarına karşı (deep packet inspection),  SSH tüneli HTTP tünelinden geçirilebilir.

Bağlantınızı istediğiniz yerden istediğiniz gizlilikte geçirebilme özgürlüğünü muhakkak yaşamalısınız.

10 Ocak 2014

Posted In: dinamik port yönlendirme, dynamic port forwarding, lkd, socks proxy, ssh, ssh tünel, ssh tunnel, teknik, tr, tünel, tunnel, vpn

SSH kullanicilarini ev dizinlerine hapsetmek

Onceki gun, arkadasimin internet baglantisini sunucu uzerinden tunellemek icin ihtiyac duydugu bir kullanici olusturmak istedim. Gereksinimlerim ozetle soyleydi. Kullanici baglandiginda ev dizinine hapsedilecek. Temel dosya ihtiyaclari (ssh -N burada secenek olmaktan cikiyor) icin kullanabilecegi nano, rm, cp, ls, mv, grep ve cat disinda baska bir komut/programcik kullanamayacak. Shell olarak BASH atayacagim. Bu kisimdan itibaren yapilan tum islemler Ubuntu 12.04.2 LTS 64 bit sunucuda yapildi.

sshdconfig(5) man sayfasini okurken yapmak istedigim seyin ChrootDirectory direktifi sayesinde yapilabilecegini gordum. Problem ChrootDirectory’nin varsayilan olarak tum kullanicilari hapsetmesiydi. Sisteme yonetici olarak erismesi gereken uc kisiyi bir sekilde bu yeni olusturacagim tunel kullanicisindan ayirmam gerekiyordu. sshdconfig(5) sayfasinda chroot diye arama yaparken bir de Match direktifine denk geldim. Match ifadesi User, Group, Host ve Address kriterleriyle eslesme yapabiliyormus. Eslesme ardindan ise genel ayarlari ne sekilde ezecegimizi belirtmemiz gerekiyormus. Yapmak istedigime geri donecek olursak, kullanicilari ev dizinlerine hapsetme. Yalniz bir kullanici sana adim ORNEK diyorsa onu ev dizinine hapsetmelisin. Match ifadeleri bir baska Match ifadesine rastlayana ya da dosya bitene kadar devam ediyorlarmis. Dolayisiyla ornegin normalde X11Forwarding’e izin verdigimizi varsayarsak Match bloguna yazilacak X11Forwarding no ile kritere uyan oturumlar icin X yonlendirmeyi kapatabilmek mumkun.

man sayfasina gore ChrootDirectory en az bir kabuk, /dev/null, /dev/zero, /dev/stdin, /dev/stdout, /dev/arandom ve /dev/tty aygit dugumlerini icermeliymis. Bu bilgiyi bir kenarda tutup yavas yavas islemi nasil yapacagimizi anlatmaya baslayayim.

Once yeni kullanicimizi olusturuyoruz.

sudo adduser --home /home/ornek --shell /bin/bash ornek

Sifreyi ve bir iki soruyu yanitladiktan sonra kullanicimiz olusturulmus oldu. Simdi /etc/ssh/sshd_config dosyasinin en sonuna su ifadeleri eklemeliyiz. Duzenledigimiz yapilandirma dosyasinin aktif hale gelmesi icin servisi yeniden baslatiyoruz.

Match User ornek ChrootDirectory %h sudo service ssh restart

Su anda ornek kullanicisi SSH baglantisi yapmak isterse sifresini girdikten sonra su iki satiri gorecek ve baglanti kuramayacaktir.

Connection to ornek.com closed by remote host. Connection to ornek.com closed.

Yukarida da belirttigim gibi kullanici bir kabuk bulmayi bekliyor -olustururken /bin/bash demistik- fakat hapsoldugu dizinde -ki %h ile ev dizini olan /home/ornek altina hapsediyoruz- /bin/bash yok. O halde kopyalayalim.

sudo mkdir /home/ornek/bin sudo cp /bin/bash /home/ornek/bin

Su asamada baglanmayi denerse yine ayni sekilde hata alacaktir. (Ubuntu 12.04.2 LTS 64 bit altinda calistigimizi tekrar hatirlatayim) Bunun nedeni BASH’in kullandigi kitaplik nesnelerinin dinamik olarak baglanmis olmasi. Peki bunu nasil ogreniyoruz? Asagidaki komutu calistiralim ve ciktisina bakalim.

file /bin/bash /bin/bash: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0xe643cefb2c672ad94e955067c511537ddbab48da, stripped

Yukaridaki cikti kabaca bize BASH’i calistirmak icin birkac baska dosyaya ihtiyacimiz oldugunu soyluyor. Neyse ki bu dosyalari bulmak cok kolay. ldd komutunun bir dosyanin hangi paylasilan nesnelere ihtiyaci oldugunu gosterdigini biliyoruz. Hemen BASH icin bakalim. linux-vdso.so.1 icin bir dizin vermemis fakat bellek adresi oldugunu tahmin ettigim bir adres var. O halde bizim bir kopyalama islemi yapmamiza gerek yok. libtinfo.so.5, libdl.so.2, libc.so.6 nesnelerini /home/ornek/lib/x86_64-linux-gnu altina, ld-linux-x86-64.so.2 nesnesini ise /home/ornek/lib64 altina kopyalamamiz gerekiyor.

ldd /bin/bash linux-vdso.so.1 => (0x00007ffff8dfc000) libtinfo.so.5 => /lib/x8664-linux-gnu/libtinfo.so.5 (0x00007f5e61aa7000) libdl.so.2 => /lib/x8664-linux-gnu/libdl.so.2 (0x00007f5e618a3000) libc.so.6 => /lib/x8664-linux-gnu/libc.so.6 (0x00007f5e614e3000) /lib64/ld-linux-x86-64.so.2 (0x00007f5e61cd5000) sudo mkdir -p /home/ornek/lib/x8664-linux-gnu sudo mkdir /home/ornek/lib64 sudo cp /lib/x8664-linux-gnu/libtinfo.so.5 /home/ornek/lib/x8664-linux-gnu/ sudo cp /lib/x8664-linux-gnu/libdl.so.2 /home/ornek/lib/x8664-linux-gnu/ sudo cp /lib/x8664-linux-gnu/libc.so.6 /home/ornek/lib/x8664-linux-gnu/ sudo cp /lib64/ld-linux-x86-64.so.2 /home/ornek/lib64/ sudo chown -R root:root /home/ornek

Tekrar giris yapmayi denerse kullanici, su asamada giris yapabilecektir. Fakat bu haliyle henuz saydigim gereksinimlerin tumunu yerine getirebilmis degiliz. Kullanici bir ev dizini bulmayi bekliyor fakat /home/ornek altinda hapsoldugundan -yani /home/ornek dizinini / olarak gordugunden- ev dizinini bulamiyor. Bu yuzden dogrudan / altinda basliyor oturumuna. Bulmayi bekledigi dizini olusturup izinlerini verelim.

sudo mkdir -p /home/ornek/home/ornek sudo chown ornek:ornek /home/ornek/home/ornek

ls, nano, rm, cat ve grep hala eksik. Oncelikle bu komutlar icin hangi nesnelere ihtiyac duyuldugunu ogrenmeliyiz. libncursesw.so.5 disindaki nesneleri zaten BASH icin kopyalamistik. Dolayisiyla onu ve /bin/nano’yu kopyalayalim.

ldd /bin/nano linux-vdso.so.1 => (0x00007fffe97ff000) libncursesw.so.5 => /lib/x8664-linux-gnu/libncursesw.so.5 (0x00007f93b0480000) libc.so.6 => /lib/x8664-linux-gnu/libc.so.6 (0x00007f93b00c1000) libdl.so.2 => /lib/x8664-linux-gnu/libdl.so.2 (0x00007f93afebc000) libtinfo.so.5 => /lib/x8664-linux-gnu/libtinfo.so.5 (0x00007f93afc95000) /lib64/ld-linux-x86-64.so.2 (0x00007f93b06b4000) sudo cp /lib/x8664-linux-gnu/libncursesw.so.5 /home/ornek/lib/x8664-linux-gnu sudo cp /bin/nano /home/ornek/bin

Su anda nano’yu calistirabiliriz diye dusunuyorsaniz, yaniliyorsunuz. ornek kullanicisi ile hemen denememizi yapalim. Bir terminal emulatoru bulamadi. xterm icin gereken dosyayi kopyalayalim.

-bash-4.2$ nano ornekyazi Error opening terminal: xterm. sudo mkdir -p /home/ornek/lib/terminfo/x sudo cp /lib/terminfo/x/xterm /home/ornek/lib/terminfo/x/

Nano’yu boylelikle calisir hale getirdik. Simdi sirada ls ve rm var. rm icin gereken butun nesneleri daha once kopyalamistik. /bin/rm’i kopyaladigimizda o da calisir hale gelecek.

ldd /bin/rm linux-vdso.so.1 => (0x00007ffff8621000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fac4d2bf000) /lib64/ld-linux-x86-64.so.2 (0x00007fac4d685000) sudo cp /bin/rm /home/ornek/bin

ls ile devam ediyoruz. Eksik olanlari yerlerine kopyalayalim.

ldd /bin/ls linux-vdso.so.1 => (0x00007fffdd5ff000) libselinux.so.1 => /lib/x8664-linux-gnu/libselinux.so.1 (0x00007f3fde415000) librt.so.1 => /lib/x8664-linux-gnu/librt.so.1 (0x00007f3fde20d000) libacl.so.1 => /lib/x8664-linux-gnu/libacl.so.1 (0x00007f3fde004000) libc.so.6 => /lib/x8664-linux-gnu/libc.so.6 (0x00007f3fddc45000) libdl.so.2 => /lib/x8664-linux-gnu/libdl.so.2 (0x00007f3fdda41000) /lib64/ld-linux-x86-64.so.2 (0x00007f3fde63b000) libpthread.so.0 => /lib/x8664-linux-gnu/libpthread.so.0 (0x00007f3fdd823000) libattr.so.1 => /lib/x8664-linux-gnu/libattr.so.1 (0x00007f3fdd61e000) sudo cp /lib/x8664-linux-gnu/libselinux.so.1 /home/ornek/lib/x8664-linux-gnu/ sudo cp /lib/x8664-linux-gnu/librt.so.1 /home/ornek/lib/x8664-linux-gnu/ sudo cp /lib/x8664-linux-gnu/libacl.so.1 /home/ornek/lib/x8664-linux-gnu/ sudo cp /lib/x8664-linux-gnu/libdl.so.2 /home/ornek/lib/x8664-linux-gnu/ sudo cp /lib/x8664-linux-gnu/libpthread.so.0 /home/testci/lib/x8664-linux-gnu/ sudo cp /lib/x8664-linux-gnu/libattr.so.1 /home/ornek/lib/x86_64-linux-gnu/ sudo cp /bin/ls /home/ornek/bin/ls

ls’i de calisir hale getirdik. BASH ile ilgili dosyalari ev dizinine alip izinlerini duzenleyelim.

sudo cp /home/ornek/.bash* /home/ornek/home/ornek sudo cp /home/ornek/.profile /home/ornek/home/ornek sudo chown -R root:root /home/ornek sudo chown -R ornek:ornek /home/ornek/home/ornek

Kullanici giris yaptiginda .bashrc PS1 degiskenine kullanici adini atamaya calisacak fakat kullanici adini bulamadigi icin “I have no name!” ismiyle karsilasacagiz. Gereken dosyalari olusturalim. Genel bilgi olarak /etc/profile ve /etc/profile.d/ nedir ne ise yarar arastirilirsa iyi olacaktir. Aslinda bu dosyalar gerekli degil fakat kullaniciya masaustunde alistigi ortami yaratmak istiyoruz.

sudo mkdir /home/ornek/etc grep ornek /etc/passwd | sudo tee /home/ornek/etc/passwd grep ornek /etc/group | sudo tee /home/ornek/etc/group sudo cp /etc/profile /home/ornek/etc/profile sudo cp -R /etc/profile.d/ /home/ornek/etc

Su asamada giris yapilirsa id komutunun bulunamadigindan yakinacaktir. /etc/profile dosyasi id ile kullanici numarasini kontrol eder. Olusturalim.

sudo mkdir -p /home/ornek/usr/bin sudo cp /usr/bin/id /home/ornek/usr/bin

Tekrar giris yaptigimizda /etc/passwd ve /etc/group yerinde olmasina ragmen yine “I have no name!” ile karsilasilacagiz. Bunun nedeni bu dosyalari okumak icin gereken kitaplik nesnelerinin kayip olmasi. nsswitch.conf(5) man sayfasi FILES bolumunde ilgili dosyalardan bahseder.

sudo cp /lib/x8664-linux-gnu/libnssfiles* /home/ornek/lib/x86_64-linux-gnu/

Iste artik kullanici adi da gozukuyor. Gelelim geride kalan son birkac komut ve gorsel zenginlestirmeye. ~/.bashrc dircolors komutuna ihtiyac duyar ls’in renkli cikti verebilmesi icin. Hemen ayarlayalim.

sudo cp /usr/bin/dircolors /home/ornek/usr/bin

Kullanicinin hapsoldugu kok dizindeki gereksiz dosyalari silelim. Geri kalan gereksinimlerimizi tamamlayalim. Hepsinin paylasilan nesnelerini daha once kopyaladigimiz icin ana programlari kopyalamamiz yeterli.

sudo rm -rf /home/ornek/.cache sudo rm /home/ornek/.bash* sudo rm /home/ornek/.profile sudo cp /bin/cat /home/ornek/bin sudo cp /bin/grep /home/ornek/bin sudo cp /bin/cp /home/ornek/bin sudo cp /bin/mv /home/ornek/bin sudo chown -R root:root /home/ornek sudo chown -R ornek:ornek /home/ornek/home/ornek

Su asamada istedigimiz sekilde chroot ortamimizi yapilandirmis olduk. Butun bu islemleri baska bir kullanici icin de tekrarlamamak adina /home/ornek dizinimizin bir arsiv yedegini alabilir ve yeni kullanicilar yaratirken bu yedekten ev dizinlerini rahatlikla olusturabiliriz. chroot ortamindaki /etc/passwd, /etc/group dosyalarinin duzenlenmesi unutulmamali. Ayrica dosya isimleri ve sahiplikleri yeniden duzenlenip sunucudaki asil /etc/ssh/sshd_config dosyasina da kullaniciya ait Match direktifi eklenmeli ya da olan Match direktifine ek yapilmali ve ssh servisi yeniden baslatilmalidir. Fakat sunu da hatirlatmak gerek ki chroot etmeniz gereken kullanicilar eger sistemde yonetim islemlerini yapacak kullanicilardan fazla hale geliyorsa varsayilan ayari tum kullanicilari chroot edecek sekilde degistirip yonetim yetkisine sahip kullanicilari match ile kacmak daha mantikli olacaktir.

Bonus: Yazinin basinda /dev altindaki cesitli sanal aygitlarin da sshd_config(5) tarafindan baglanmasinin onerildigini yazmistim. Su ana kadar bu hesabi olusturdugumuz kullanici bu dugumlerin eksikliklerinden kaynaklanan bir hata bildirmedi. Fakat ornegin scp’yi de kullanicinin erisimi olan komutlar arasina katarsaniz /dev/null aygitini bulamadigindan yakinacaktir. Bunun icin aygit dugumlerini su adimlari izleyerek olusturabilirsiniz.

sudo mkdir /home/ornek/dev cd /home/ornek/dev sudo MAKEDEV -v std

Ardindan icinde bulundugunuz dizinde olusturulmus pekcok aygit dugumu goreceksiniz. Bunlardan kmem, mem, ram, loop olanlarini silmenizde bir sakinca yok. Digerleri cat ile kullanicinin da isine yarayabilecek olanlar.

Yazida dilimin dondugunce yonettigimiz makinede hesaba sahip olan bir SSH kullanicisini nasil istegimize gore kisitlayabilecegimizi anlatmaya calistim. Umarim benzer ihtiyaci olan birine yol gosterir.

26 Nisan 2013

Posted In: "I have no name!", chroot, Gezegen, linux, NSS, ssh

scp ile dosya transferinde boşluk içeren dosya adları

Konsoldan uygulamalara argüman olarak boşluk, bölü, parantez vb. özel karakterler içeren değerler vermek bazen beklenenden daha zor olabiliyor. Bazı durumlarda bu değerleri tırnak içine almak iş görse de kimi zaman kaçış karakteri (ters bölü karakteri “\”) veya karakterleri devreye girmek zorunda kalıyor.

scp ile dosya transferi de buna örnek durumlardan biri. Uygulamaya verdiğimiz argümanlar hem bizim sistemimizde hem de uzak sistemde yorumlandığı için kaçış karakteri mevzusunda normalden iki adım öteye gitmek gerekiyor. Boşluk içeren dosya adları kullanırken dosya yolunu tırnak içine almalı ve boşluk vb. karakterler için “çift” kaçış karakteri kullanmalıyız.

scp user@10.0.0.1:”/home/user/Gutenberg\\ Project/The\\ White\\ Crystals\\ by\\ Howard\\ Roger\\ Garis.epub”

14 Ocak 2012

Posted In: bash, dosya transferi, Gezegen, ipucu, Kendime notlar, scp, sistem yönetimi, ssh

Linux ssh ve proxy

Şu anda Hacettepe Üniversitesi’nde yurtlardan hiç birinde internet bağlantısı yok. 3 şey sayesinde sanıyorum internete erişebilen bir tek benim.

İltiraf etmek gerekirse ilki şans. Tesadüfen hacettepe.edu.tr alan adı altındaki adreslere erişebildiğimi fark ettim. Dışarıya çıkışlarda bir sorun olmalı.

İkincisi bölümümüz tarafından sağlanan ssh (Secure Shell) ile hesabımıza uzaktan etişme hakkı. Bu makine de hacettepe.edu.tr altında olduğu için buna bağlanmam da pek sorun olmadı. Eriştiğim bilgisara sadece komut satırı ara yüzüyle erişsem de komut satırı tarayıcısı sayesinde internete girmeyi deneyebildim. (Lynx ya da links deneyebilirsiniz.) Gariptir ki bağlandığım makinenin internete sorunsuz erişebildiğini farkettim. Aslında teorik olarak bir şekilde internete eriştiğinizde onu istediğiniz gibi kullanıyor olmanız gerekir. Fakat bahsettiğim tarayıcılar normal ihtiyaçları pek karşılayamıyorlar malesef.

Üçüncü etmense Linux’un daha doğrusu Linux’taki ssh yazılımının sağladığı bir olanak.

#ssh -D <portNo> <adres>

Kullandığınızda <adres> ile belirttiğiniz adresteki bilgisayara bağlanır. (kullanıcı adı belirtmek için kullaiciadi@adres seçmelisiniz.) ve bilgisayarınızın <portNo> ile belirttiğimiz portundan bir vekil sunucu (proxy server) açar.

Tarayıcınızın vekil sunucu ayarlarında adres olarak 127.0.0.1 (her zaman kendi bilgisayarınızı gösterir) port olarak seçtiğiniz portu gösterip vekil sunucunun SOCKS olduğunu belirttiğinizde bağlandığınız o bilgisayar üzerinden internete erişebiliyor olmanız gerekir.

Kabul etmek gerekirse benim için işe yaraması biraz şansla alakalı fakat bu olayın daha yaygın olarak kullanıldığı yerler de yok değil.

Normalde yerel ağlarda (özellikle kablosuz ağlarda) bilgisayarınızın yolladığı veri paketlerinin okunup okunmadığını bilmenin pek bir yolu yoktur. İletişiminizin gizliğini güvence altına alamazsınız. Bu gibi durumlarda (biraz paronayakça bir düşünce olsa da) güvendiğiniz sitelere yolladığınız bilgierin bile izleniyor olma olasılığı vardır. Hem de bahsi geçen sitelerin hiçbir kabahati olmadan…

SSH ise iki bilgisayar arasında güvenli iletişim sağlayabilmek için yaratılmıştır. SSH yoluyla iletişim kuran iki bilgisayarın iletişimi dinlense bile anlamsız şifrelenmiş verilerle karşılaşacaklardır. Bağlandığınız bilgisayarın fiziksel olarak güvenli olduğunu düşünürsek verileriniz tamamen güvende olur.

1 Kasım 2009

Posted In: bilgisayar, hacettepe, internet, linux, LinuxGezegen, proxy, ssh, teknik, vekil sunucu

Bilgisayarlarınızı kontrol edin

Uzun bir süredir kullanıcı parolarını ele geçirip sistemden sisteme SSH ile atlayan bir takım art niyetli ve/veya meraklı kişiyi takip ediyorduk. Onlar parola ele geçirdikçe ilgili kullanıcıların hesaplarını kilitleyi parolarını değiştirmelerini sağlıyorduk. Ara sıra oynadığımız bu köşe kapmaca fazla sık olmadığı için elle tutulur çok fazla önlem almamıştık.

Bu son bir haftalık bir süre içinde, ele geçirilen kullanıcı hesaplarından girilip, yerel açıklardan faydalanarak pek çok makinada root olunduğunu fark ettik. Root olduktan sonra saldırganımız, ssh sunucusunu ve istemcisini kendi getirdiği sürümlerle değiştiriyor; aynı makinaya bağlanan başka kullanıcıların parolalarını topluyor. ssh istemcisini değiştirerek de, bu ele geçmiş makina üzerinden yapılan diğer ssh bağlantılarındaki parolaları da kaydediyor.

Olayın çapı oldukça geniş, ele geçirilen makina üzerinden geçerek bağlantı kurulan tüm diğer makinalar da ele geçirilmiş. Bunun içinde sunucular, asistanların ve hocaların ofislerindeki makinaları, ve bağlantı kurdukları evlerindeki diğer makinalar da var. Bize yapılan saldırının aynısının kendi makinalarınıza yapılıp yapılmadığına bakmak için aşağıdaki komutları kullanabilirsiniz. Eğer komutlar ekrana çıktı veriyorsa siz de etkilenmişsiniz demektir.

strings /usr/sbin/sshd|grep "password auth from"
strings /usr/bin/ssh|grep "password auth to"
Temiz bir makinada bu komutlar çıktı vermiyor. Ancak komutun çıktı vermemesi makinanıza girilmemiş olduğunu garantilemiyor. Farklı bir yöntem kullanılarak bilgisayarınıza girilmiş olabilir. Eğer komutlar çıktı veriyorsa bizim makinalarımızda kullanılan yöntem ile sizin makinanıza da girildiğinden emin olabilirsiniz.

Saldırganımız çaldığı paroları /usr/share/doc ve /usr/share/locale altındaki dosyalarda şifrelenmiş bir biçimde tutuyor. "file" komutu bunları "data" dosyası olarak gösteriyor. Şüpheli dosyaları aramak için aşağıdaki komutları kullanabilirsiniz. Kurduğunuz paketlere göre /usr/share/doc altında bazı "data" dosyaları bulunuyor olabilir, bunlara tek tek bakarak şüphelerinizi giderebilirsiniz.

find /usr/share/locale/ -exec file {} \; | grep ": data"
find /usr/share/doc/ -exec file {} \; | grep ": data"

İşletim sisteminin farklı olmasının pek faydası olmadı bu saldırıda. Debian ve Ubuntu'nun farklı sürümlerinin yanı sıra Gentoo makinalara da girildiğini tespit ettik. Pardus ya da Fedora gibi başka bir dağıtım kullanıyor olmanız sizi tek başına korumaz; parolanız ele geçirildiğinde sudo ile root olunabilir. Ya da -şimdilik- sadece hesabınızı etkileyen bir keylogger ile root parolası ele geçirilebilir. Neler yapabileceğinizle ilgili aşağıda öneriler var.

Eğer makinanıza girilmişse, makinanıza tekrar güvenebilmek için sıfırdan kurulum yapmalısınız, çünkü saldırgan root olduktan sonra nereye nasıl bir arka kapı koyduğunu bulamazsınız. (Bazı şeyler bulsanız bile hepsini bulduğunuzdan %100 emin olamazsınız).

Yeni kurulum yaptıktan sonra bu tarz bir saldırıdan korunmanın yollarını şöyle sıralayabiliriz:

  • Kurulu paketlere güncelleme geldiğinde bunları hemen uygulayın. Servisleri ya da makinayı yeniden başlatmanız gerekiyorsa bunu ertelemeyin. Kullandığınız dağıtımın güvenlik duyurularını takip edin. (Pardus, Debian, Ubuntu)
  • SSH bağlantılarını sadece sizin kullanıdığınız bir kaç IP adresine sınırlayın.
  • Parola ile girişleri devre dışı bırakın: sadece anahtar çiftleri ile girişe izin verin. Evet çok sert bir önlem ama, IP kısıtlaması uygulayamayacağınız kadar çok kullanıcınız varsa şart. iki yıl köşe kapmaca oynadıktan sonra makinaların kırılabilme eşiğini oldukça yükseltecek olan bu önlemi alacağız, sizlere de tavsiye ederiz. Böylelikle basit bir keylogger kullanarak yakalanan parola ile makinaya girilemeyecek, girilebilmesi için anahtar çiftindeki özel anahtar dosyasının da ele geçirilmesi gerekecek. Nasıl yapacağınızı öğrenmek için SSH ile anahtar çifti kullanımı yazısı faydalı olacaktır.
  • Tek kullanımlık parolalara geçin: diğer iki önlemle birlikte de kullanılabilir. Özel anahtar dosyasının ele geçmesi senaryosuna karşı da korunmuş olursunuz. tek kullanımlık parola(one time password) yazısı yardımcı olabilir.

Son olarak siz de bir kurban iseniz; makinası ele geçirilen sistem yöneticileri için terapi grubumuza bekleriz :)

4 Şubat 2009

Posted In: Debian, Gezegen, güvenlik, linux, oi, ssh

WP Twitter Auto Publish Powered By : XYZScripts.com