LINUX-BG   Adres : http://www.linux-bg.org
Zabrana za SSH login ot sluchaini/atakuvashti potrebiteli
Ot: Vladsun
Publikuvana na: 30-10-2006
Adres na statiiata: http://www.linux-bg.org/cgi-bin/y/index.pl?page=article&id=advices&key=374186810
TSelta na statiiata e da opishe nachin za distantsionno i otvariane/zatvariane na opredeleni portove pri tova s visoko nivo na sigurnost. Izpolzva se tehnika narechena v literaturata kato "port knocking", t.e. chrez strogo opredelena kombinatsiia ot opiti za vruzki kum opredeleni portove na otdalechenata mashina se promeniat pravilata na zashtitnata i stena, kato po tozi nachin se dava dostup do opredeleni survurni prilozheniia.
Po sushtestvo opisanata tehnika mozhe da se izpolzva za mnogo i razlichni tseli, no tuk shte razgledame prilozhenieto i za protivodeistvie sreshtu ataki nasocheni kum SSH prilozheniiata. Povecheto administratori vizhdat ogromni logove za neuspeshni (dai bozhe;) ) opiti za SSH login chrez izpolzvane na slabi paroli i chesto sreshtani potrebitelski imena. S uvelichavaneto na broia na potrebitelite, koito se nuzhdaiat ot SSH dostup do konzolata se uvelichava i veroiatnostta ot probiv. Nai-lesnoto reshenie bi bilo da se otkazva TCP vruzka na sluchainite potrebiteli (prim. po IP adres), no tova bi bilo svurzano s nedostatuchno dobra guvkavost na upravlenieto na potrebitelite. Poradi tova smiatam, che predlozhenoto tuk reshenie (ili po-skoro implementatsiia na reshenieto - ideiata ne e moia :) ) e dosta po-dobro po otnoshenie kakto na sigurnost, taka i na guvkavost. Vse pak, realizatsiiata sus sigurnost ne e idealna i podlezhi na promiana.

Sistemni iziskvaniia
Ideiata e realiziran chrez izpolzvane na Perl modulite i iptables s dobaven "recent match".

Instalirane i upotreba
Na otdalechenata mashina (kum koiato iskame da se svurzhem) se kopirat slednite dva Perl faila:

knockoff.pl
#!/usr/bin/perl
 
 $exist = `iptables -nL INPUT | grep SSH_KNOCK`;
 
 if ($exist ne '')
 {
         `iptables -D INPUT -m state --state NEW -p tcp -j SSH_KNOCK`;
         `iptables -F SSH_KNOCK`;
         `iptables -X SSH_KNOCK`;
         print "[+] Port knocking rules deactivated.\n";
 }
 else
 {
         print "[-] Port knocking rules have been already deactivated.\n";
 }


knockon.pl
#!/usr/bin/perl
 
 if (@ARGV < 1) {         
         print "Usage:\r\n";         
         print "Specify passkey! \r\n\r\n";
         exit(); 
 }   
 $port = 0;  
 srand($ARGV[0]);  
 $exist = `iptables -nL INPUT | grep SSH_KNOCK`;  
 if ($exist ne '') {   
         `iptables -F SSH_KNOCK`; 
 } else { 
         `iptables -N SSH_KNOCK`;
         `iptables -I INPUT -m state --state NEW -p tcp -j SSH_KNOCK`; 
 }  
 `iptables -A SSH_KNOCK -p tcp --dport 22 -m recent --rcheck --name SSHK -j ACCEPT`;
 `iptables -A SSH_KNOCK -m recent --rcheck --name SSHK -j RETURN`; 
 # A potential bug here - not checking if there are successive random generated port numbers 
 for ($i=0; $i<5; $i++) {         
         $port = int(rand(40000) + 1024);
         $prev_port = $port - 1;
         $next_port = $port + 1; 
         `iptables -A SSH_KNOCK -p tcp --dport $port -m recent --name SSHK --set -j DROP`;         
         `iptables -A SSH_KNOCK -p tcp --dport $prev_port -m recent --name SSHK --remove -j DROP`;         
         `iptables -A SSH_KNOCK -p tcp --dport $next_port -m recent --name SSHK --remove -j DROP`; 
 }
 `iptables -A SSH_KNOCK -p tcp --dport 22 -j DROP`;  
 print "[+] Port knocking rules activated.\n"; 


A na lokalnata mashina se kopira faila:

knock.pl
#!/usr/bin/perl
 
 use IO::Socket;
 
 if (@ARGV < 2) {         
         print "Usage:\r\n";         
         print "Specify host !\r\n";
         print "Specify passkey! \r\n\r\n";
         exit(); 
 }
 $serv = $ARGV[0];
 $serv =~ s/http:\/\///ge;
 $port = 0;
 srand($ARGV[1]);
 for ($i=0; $i<5; $i++) {
         $port = int(rand(40000)+1024);
         $sock = IO::Socket::INET->new(Proto=>"tcp", PeerAddr=>"$serv", PeerPort=>"$port", Timeout=>"1");
         close($sock);
 }
 
 print "[+] Port knocking finished.\n";
 
 $sock = IO::Socket::INET->new(Proto=>"tcp", PeerAddr=>"$serv", PeerPort=>"22")
 or die "[-] Port 22 - SSH NOT open.\n";
 close($sock);
 print "[+] Post 22 - SSH is now open.\n";


Za puskaneto na opisanata zashtitna sistema se izpulniava na otdalechenata mashina:

knockon.pl 12345
kudeto 12345 e poreditsa ot chisla, koiato shte se izpolzva za razreshavane na dostupa ot lokalnata mashina. Sled izpulniavaneto na tazi komanda port 22 pri skanirane se opredelia kato "filtriran" i SSH vruzka ne mozhe da se osushtestvi.

Za da se razreshi SSH dostupa ot lokalnata mashina se puska:

knock.pl 12345
TSifrovite nizove triabva da sa ednakvi za da se poluchi razreshenie.
S tova port 22 na otdalechenata mashina e otvoren pri tova samo za IP adresa, ot koito sme poiskali razreshenie za dostup. Za da aktivirame zashtitata otnovo e neobhodimo predi da izlezem ot shela da startirame pak:
knockon.pl 12345
Zashtitata e taka napravena, che pri posledovatelno skanirane na portove da ne se dava dostup. Pri skanirane sus sluchaino izbran red na portovete veroiatnostta za davane na dostup e izklyuchitelno malka.

Problemi za koito se znae:

1) Za da se startira zashtitata ot drug potrebitel osven root e neobhodimo da se dadat prava za izpulnenie na iptables kato root - prim. sus sudo ili chrez chmod 6755, koeto ne e dobre :(
2) Mozhe da se poluchi pripokrivane na razreshavashtite i zabraniavashtite portove pri generiraneto na psevdo-sluchainata poreditsa - izberete drug kod :)

<< Kak da formatirame Windows dialove | amaroK - next generation multimedia player >>

Avtorite na saita, kakto i tehnite sutrudnitsi zapazvat avtorskite prava vurhu sobstvenite si materiali publikuvani tuk, no te sa copyleft t.e. mogat svobodno da budat kopirani i razprostraniavani s iziskvaneto izrichno da se upomenava imeto na avtora, kakto i da se publikuva na vidno miasto, che te sa vzeti ot originalniia im URL-adres na tozi survur (http://www.linux-bg.org). Avtorskite prava na prevodnite materiali prinadlezhat na tehnite avtori. Ako s publikuvaneto tuk na niakakuv material nevolno sa narusheni nechii prava - sled konstatiraneto na tozi fakt materialut shte bude svalen.

All trademarks, logos and copyrights mentioned on this site are the property of their respective owners.
Linux is copyright by Linus Torvalds.
© Linuks za bulgari EOOD 2007
© Slavei Karadjov 1999 - 2006

All rights reserved.

Изпълнението отне: 1 wallclock secs ( 0.19 usr + 0.02 sys = 0.21 CPU)