Połaczenia SSH i bezpieczenstwo transmisji

Marek Guevara Braun marek.guevara w atm.com.pl
Pon, 6 Lut 2006, 15:33:50 CET


Marteen wrote:
> 
> Na ile bezpieczny jest protokol SSH i jego implementacja w openssh?? Chodzi 
> mi czy mozna za pomoca polaczen ssh (bez obawy o mozliwosc podsluchania 
> transmisji) przesylac pomiedzy firma a obslugujaca ja firma programistyczna 
> np. bazy danych w celach serwisowych w ktorych moga sie znajdowac dane 
> osobowe klientow itp (odpowiednie umowy pomiedzy firmami w zakresie ochrony 
> danych osobych itp sa podpisane)?? Chodzi o rozwiazanie tanie i tymczasowe 
> ktore ma sluzyc tylko wyslaniu, naprawieniu etc bazy i jej odeslaniu.

O ile jesteś pewien że łączysz się z komputerem, z którym chcesz się
połączyć, a nie jakimś pośrednikiem (aka. znasz odcisk klucza drugiej
strony i wszystko się zgadza), to powinno być OK.

Lepiej jest używać wersji 2 protokołu - dla wersji 1 był nawet gotowy
klient typu Man-in-the-middle (bodajże o wdzięcznej nazwie
monkey-in-the-middle. - Żeby przechwycić/proxować wersję 2 trzeba się
bardziej postarać i napisać sobie program do tego.

Co do samego szyfrowania to SSH pozwala na wykorzystanie kliku
algorytmów: 3DES, AES, Blowfish i odpowiednik RC4.
Są to blokowe algorytmy symetryczne (trzy pierwsze na pewno, RC4 pewnie
też) gdzie dane szyfruje się kluczem symetrycznym. Dodatkowo
obok samego szyfrowania opcjonalnie używa się dodatkowych funkcji.
Klucz symetryczny jakoś tam jest wymieniany między klientem a serwerem
(zakładam, że bezpiecznie) - żeby ktoś mógł odczytać transmitowane dane
musi mieć dostęp do klucza szyfrującego/deszyfrującego - zgadnąć go lub
przechwycić w momencie wymiany przy nawiązywaniu sesji (zakładam, że
sama wymiana jest szyfrowana asymetrycznie, gdzie rolę odgrywają
prywatne klucze serwera - jeśli masz dostęp do kluczy prywatnych serwera
SSH - a tak jest np. w przypadku bootowania systemu z płytki RescueCD -
wyciągnąć klucz symetryczny będzie pewnie łatwiej.

Same algorytmy szyfrowania mogą być stosowane z różnymi funkcjami
mieszającymi - np ECB lub CBC dla AES-a - dla tej pierwszej dane są
szyfrowane blokami 128-bitowymi przy pomocy klucza lub wybranego/znanego
fragmentu klucza (dla kluczy 192 i 256 bitów) - jeśli mamy w danych np.
jednolite fragmenty, to będą one zaszyfrowane tak samo (ew. będzie można
wychwycić odpowiedni wzorzec) [*] - bodajże dwukrotnie wolniejszy
AES-CBC pozbawiony jest tej cechy, gdyż to czym szyfrowane są kolejne
bloki zależy od zaszyfrowanej postaci poprzedniego bloku - jednolite
obszary danych nie będą szyfrowane do tj samej postaci.

Podsumowując - przy transmisji SSH używaj wersji 2.0, sprawdzaj z kim
rozmawiasz - jak najwcześniej rób połączenie tak byś miał publiczny
klucz serwera u siebie, a przy nowym połączeniu sprawdź czy odcisk
klucza serwera, który wyświetli się w okienku PuTTY lub openssh
odpowiada kluczom serwera. Pilnuj kluczy prywatnych serwera oraz
generalnie zabezpiecz serwer :-)

A i polecam zapoznanie się z poleceniem ssh-keygen, eval `ssh-agent`,
ssh-add, ssh-add -l

Pozdrawiam,
Marek

[*] Na podstawie obecności takiego wzorca można stwierdzić, pomimo
że same dane są zaszyfrowane, że np. przesyłano plik z tzw. znakiem
wodnym.

PS. A tak btw fragment mojego .bashrc wynajdujący odpalony ssh-agent
i podłączający się do niego, ew. uruchomiający nowy jeśli nie ma.

-------- CUT HERE -------

# We want share one ssh-agent per user and restart it if closed

ssh-agent-startup () {
        [ ! -z $SSH_AGENT_PID ] && [ "$EUID" = "`/bin/ps -p \
		$SSH_AGENT_PID -o euid=`" ] && \
        [ ! -z $SSH_AUTH_SOCK ] && [ -S $SSH_AUTH_SOCK ] && \
		[ -O $SSH_AUTH_SOCK ] && return

        unset SSH_AGENT_PID
        unset SSH_AUTH_SOCK

        for pid in `/bin/ps -C ssh-agent -o pid=`; do

                sock=`/bin/echo
/tmp/ssh-*$((${pid}-1))/agent\.$((${pid}-1))`

                [ ! -S ${sock} -o ! -O ${sock} ] && continue

                export SSH_AUTH_SOCK=${sock}
                export SSH_AGENT_PID=${pid}
                break
        done

        [ -z $SSH_AGENT_PID -o -z $SSH_AUTH_SOCK ] && \
		eval `/usr/bin/ssh-agent`
}

ssh-agent-startup

-------- CUT HERE -------



Więcej informacji o liście dyskusyjnej pld-users-pl