Secure Shell (SSH) to protokół sieciowy, który dostarcza bezpieczny mechanizm transmisji danych pomiędzy systemami przez sieci IP. Zaprojektowany został do zastąpienia starego protokołu telnet, który przesyłał hasła otwartym tekstem przez sieć. SSH używa szyfrowania do zabezpieczenia kanału komunikacji i wykorzystuje cyfrowe sygnatury do uwierzytelniania. Ponadto sprawdza przesyłane w czasie sesji dane zapewniając ich integralność. SSH zawiera wiele narzędzi pozwalających użytkownikom na bezpieczne zdalne logowanie się, przesyłanie plików i wykonywanie komend, wykorzystuje przy tym silny mechanizm szyfrowania i uwierzytelniania użytkowników.
OpenSSH jest wolną open source’ową implementacją prawnie zastrzeżonego SSH. Może zastąpić takie niebezpieczne usługi jak: telnetd, rlogind, rshd, rexec i ftpd. OpenSSH wspiera także takie usługi jak tunelowanie, forwardowanie portów TCP i forwardowanie X11. Pakiet OpenSSH instaluje wiele komend w systemie, poniższa tabela przedstawia niektóre z nich.
Komenda | Opis |
scp |
Bezpieczna alternatywa dla rcp. |
sftp |
Bezpieczna alternatywa dla ftp. |
slogin |
Bezpieczna alternatywa dla rlogin, alias dla klienta ssh. |
ssh |
Bezpieczna alternatywa dla rlogin i telnet. |
ssh-add |
Dodaje charakterystykę RSA/DSA/ECDSA do ssh-agent. |
ssh-agent |
Agent uwierzytelniania. Zarządza kluczami używanymi przez RSA/DSA/ECDSA do uwierzytelniania. |
ssh-copy-id |
Kopiuje klucze RSA/DSA/ECDSA na zdalne systemy. |
ssh-keygen |
Generuje prywatne i publiczne klucze. |
Pliki konfiguracyjne OpenSSH to: /etc/sshd_config
, /etc/ssh_config
oraz /etc/sysconfig/sshd
. Do przechwytywania komunikatów autoryzacji wykorzystywany jest plik z logami /var/log/secure
. Część dyrektyw pliku /etc/sshd_config przedstawia tabela poniżej.
Dyrektywa | Opis |
Port |
Port, na którym nasłuchuje sshd, domyślnie 22. |
ListenAddress |
Adres IP, na którym ma nasłuchiwać demon. |
Protocol |
Wersja protokołu, która ma być używana. Domyślnie 2. |
SyslogFacility |
Domyślnie AUTHPRIV . Definiuje kod udogodnienia, jakie ma być używane podczas logowania komunikatów do /var/log/secure . Oparte o konfigurację w pliku /etc/rsyslog.conf . |
LogLevel |
Domyślnie INFO. Poziom krytyczności logowanych komunikatów. |
LoginGraceTime |
Domyślnie 2 minuty. Czas, po którym rozłączane jest połączenie z użytkownikiem, który się nie zalogował. |
PermitRootLogin |
Domyślnie tak (yes). Pozwala na bezpośrednie logowanie roota do systemu. |
MaxAuthTries |
Domyślnie 6. Maksymalna liczba dozwolonych prób uwierzytelnienia użytkownika. Po tej ilości prób zrywane jest połączenie. |
MaxSessions |
Domyślnie 10. Maksymalna ilość otwartych sesji SSH równolegle. |
RSAAuthentication |
Domyślnie yes. Określa czy pozwalać na uwierzytelnienie RSA. |
PubKeyAuthentication |
Domyślnie yes. Określa czy ma być włączona możliwość uwierzytelnienia przez klucz publiczny. |
AuthorizedKeysFile |
Domyślnie ~/.ssh/authorized_keys . Określa położenie pliku z autoryzowanymi kluczami użytkowników. |
PasswordAuthentication |
Domyślnie yes. Określa czy ma być włączona możliwość uwierzytelnienia w oparciu o hasło. |
PermitEmptyPasswords |
Domyślnie no. Określa czy zezwalać na puste hasła. |
ChallengeResponseAuthentication |
Domyślnie yes. Określa czy pozwalać na uwierzytelnianie metodą challenge-response. |
UsePAM |
Domyślnie yes. Włącza lub wyłącza uwierzytelnianie przez PAM. Jeżeli włączone tylko root może uruchomić demona. |
AllowAgentForwarding |
Domyślnie yes. Włącza lub wyłącza komendę ssh-agent służącą do forwardowania kluczy prywatnych do zdalnych systemów. |
AllowTCPForwarding |
Domyślnie yes. Określa czy pozwalać na forwardowanie komunikacji TCP przez kanał ssh. |
X11Forwarding |
Domyślnie yes. Pozwala lub zakazuje na zdalny dostęp do aplikacji graficznych (z GUI). |
TCPKeepAlive |
Domyślnie yes. Określa czy wysyłać sygnały TCP keepalive do serwera ssh aby sprawdzić jego dostępność. |
UseLogin |
Domyślnie no. Pozwala lub zakazuje na użycie komendy login dla sesji interaktywnych. |
Compression |
Domyślnie delayed. Określa czy pozwolić na kompresję lub opóźnić kompresję do czasu aż użytkownik zostanie uwierzytelniony z powodzeniem. |
ClientAliveInterval |
Domyślnie 0. Określa interwały czasowe (timeout interval) w sekundach dla serwera aby wysyłał komunikaty do klienta oczekując na odpowiedź. |
ClientAliveCountMax |
Domyślnie 3. Jeżeli ta dyrektywa jest ustawiona na inną wartość niż 0, określa ona maksymalną ilość komunikatów, jakie mają być wysłane do klienta. |
AllowUsers |
Zezwala na dostęp do serwera tylko umieszczonym na liście użytkownikom. Składnia wygląda następująco:
|
AllowGroups |
Zezwala na dostęp do serwera tylko członkom grup umieszczonym na liście. Składnia wygląda następująco:
|
DenyUsers |
Nie pozwala umieszczonym na liście użytkownikom na dostęp do serwera. Składnia wygląda następująco:
|
DenyGroups |
Nie pozwala członkom grup umieszczonym na liście na dostęp do serwera. Składnia wygląda następująco:
|
Dostęp do ssh możemy przydzielać użytkownikom lub jej zakazywać nie tylko w oparciu o dyrektywy AllowUsers, DenyUsers, AllowGroups, and DenyGroups
w pliku sshd_config ale także ustawiając odpowiednie restrykcje w plikach TCP Wrappers: hosts.allow
i hosts.deny.
Dostęp do ssh możemy także zabezpieczyć na poziomie firewalla.
Spójrzmy na kilka dyrektyw pliku /etc/ssh_config
:
…… . .
# Host *
# ForwardAgent no
# ForwardX11 no
# RhostsRSAAuthentication no
# RSAAuthentication yes
# PasswordAuthentication yes
# HostbasedAuthentication no
# GSSAPIAuthentication no
…… . .
W pliku tym możemy przypisywać różne ustawienia użytkownikom lub grupom. Dla każdego klienta czy grupy możemy dodać osobną sekcję z dyrektywami, zaczynającą się od od dyrektywy Host.
Osobne pliki konfiguracyjne użytkowników.
Plik o nazwie config z konfiguracją ssh dla danego użytkownika składowany jest w katalogu ~/.ssh ( podkatalog katalogu domowego tego użytkownika). Format pliku ~/.ssh/config jest taki sam jak pliku /etc/ssh/ssh_config. Katalog ~/.ssh nie istnieje domyślnie, zakładany jest gdy użytkownik po raz pierwszy loguje się na serwer. Katalog ~/.ssh zawiera ponadto plik o known_host. Plik ten zawiera adres IP i kopię klucza publicznego systemu, do którego uzyskaliśmy dostęp. Przykładowo może wyglądać tak:
192.168.1.4 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBJUiDpnI4TxEOuAHmGU8MHhbDsmEraxp38qfOPIK1ajlVzeJPb0Vwoim1PwAcQQGVbE+1xfKmXShqEjUQm4ew7M=
W katalogu, o którym mowa mogą także znajdować się pliki takie jak:
id_rsa, id_dsa, id_ecdsa
– składujące klucze prywatneid_rsa.pub, id_dsa.pub, id_ecdsa.pub
– składujące klucze prywatneauthorized_keys
– wykorzystywany gdy ustawiamy relację zaufania między dwoma systemami.
Konfiguracja uwierzytelnienia w oparciu o klucz prywatny i publiczny.
1. Logujemy się na server1 jako user. Generujemy klucze RSA. Wybieramy domyślne miejsce składowania kluczy, tj. wciskamy ENTER przy wyborze nazwy pliku. Hasło ustawiamy puste.
# ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (~/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in ~/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
46:87:a9:c8:6b:bf:2c:f1:99:ab:77:1d:05:1f:2a:dc user@centos.host.pl
The key's randomart image is:
+--[ RSA 2048]----+
| |
| o. . |
| .+..+ . |
| . . oo.E o |
| o . S. . |
| .. . . |
| oo o . . |
| ..o= . . |
| .+=+ |
+-----------------+
Klucze zapisane zostają w katalogu ~/.ssh
.
Klucz publiczny: ~/.ssh/id_rsa.pub
Klucz prywatny: ~/.ssh/id_rsa
2. Plik z kluczem publicznym kopiujemy na serwer2 (adres IP=192.168.10.2) do katalogu domowego odpowiedniego użytkownika na drugim serwerze. Przy pierwszym logowaniu na serwer2 wyświetli się zapytanie czy akceptujemy fingerprint (odcisk palca) dla drugiego serwera. Potwierdzamy yes.
# ssh-copy-id user@192.168.10.2
The authenticity of host '192.168.10.2 (192.168.10.2)' can't be established.
ECDSA key fingerprint is a6:28:81:79:a2:8c:f9:0d:5c:39:a2:aa:f9:3f:12:6a.
Are you sure you want to continue connecting (yes/no)? yes
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
3. Teraz możemy zalogować się na zdalnym serwerze bez użycia hasła.
# ssh 192.168.10.2
Wykonywanie komend na zdalnym serwerze przy użyciu ssh.
# ssh 192.168.10.2 /bin/ls -l
Kopiowanie plików przy użyciu scp.
Kopiowanie z lokalnego serwera pliku plik_lokalny na serwer host2:
# scp plik_lokalny user@host2:/sciezka/do/pliku
Kopiowanie z serwera zdalnego pliku pliku2 na serwer lokalny:
# scp user@host2:/sciezka/do/pliku2 plik_lokalny
Przesyłanie plików przy użyciu sftp.
$ sftp server2
Enter passphrase for key '/home/user1/.ssh/id_rsa':
Connected to server2.
sftp>
Tutaj możemy wpisać znak zapytania ? aby wyświetlić listę dostępnych komend.
sftp> ?
Available commands:
bye Quit sftp
cd path Change remote directory to 'path'
chgrp grp path Change group of file 'path' to 'grp'
chmod mode path Change permissions of file 'path' to 'mode'
chown own path Change owner of file 'path' to 'own'
df [-hi] [path] Display statistics for current directory or filesystem containing 'path'
exit Quit sftp
get [-Ppr] remote [local] Download file
reget remote [local] Resume download file
help Display this help text
lcd path Change local directory to 'path'
lls [ls-options [path]] Display local directory listing
lmkdir path Create local directory
ln [-s] oldpath newpath Link remote file (-s for symlink)
lpwd Print local working directory
ls [-1 afhlnrSt] [path] Display remote directory listing
lumask umask Set local umask to 'umask'
mkdir path Create remote directory
progress Toggle display of progress meter
put [-Ppr] local [remote] Upload file
pwd Display remote working directory
quit Quit sftp
rename oldpath newpath Rename remote file
rm path Delete remote file
rmdir path Remove remote directory
symlink oldpath newpath Symlink remote file
version Show SFT P version
! command Execute 'command' in local shell
! Escape to local shell
? Synonym for help