SSH

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:

AllowUsers user1 user2
AllowUsers user3@server2.example.com
AllowUsers user4@192.168.0.110 user5@192.168.0.120

AllowGroups Zezwala na dostęp do serwera tylko członkom grup umieszczonym na liście. Składnia wygląda następująco:

AllowGroups dba unixadmins
AllowGroups dba@server2.example.com

DenyUsers Nie pozwala umieszczonym na liście użytkownikom na dostęp do serwera. Składnia wygląda następująco:

DenyUsers user1 user2
DenyUsers user3@server2.example.com
DenyUsers user4@192.168.0.110 user5@192.168.0.120

DenyGroups Nie pozwala członkom grup umieszczonym na liście na dostęp do serwera. Składnia wygląda następująco:

DenyGroups dba unixadmins
DenyGroups dba@server2.example.com

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 prywatne
  • id_rsa.pub, id_dsa.pub, id_ecdsa.pub – składujące klucze prywatne
  • authorized_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

Leave a Reply

Your email address will not be published. Required fields are marked *