Ta strona wygl─ůda najlepiej z w┼é─ůczon─ů obs┼éug─ů JavaScript

Serwer SSH

 ·  ÔśĽ 10 min czytania  ·  ­čÉž sysadmin
    ­čĆĚ´ŞĆ
  • #SSH

─ćwiczenia do wykonania:

  1. Wygeneruj par─Ö kluczy RSA za pomoc─ů ssh-keygen
  2. Wyeksportuj klucz publiczny z klienta do serwera za pomoc─ů ssh-copy-id
  3. Zaloguj si─Ö za pomoc─ů has┼éa poprzez ssh do serwera i prze┼é─ůcz na konto root za pomoc─ů komendy sudo - su lub sudo -i
  4. W┼é─ůcz logowanie kluczami i wy┼é─ůcz logowanie has┼éem. Zapisz zmiany i zrestartuj us┼éug─Ö ssh.
  5. Nie zamykaj bie┼╝─ůcej sesji. Otw├│rz now─ů sesj─Ö ssh i zaloguj si─Ö do serwera za pomoc─ů klucza prywatnego.
  6. Je┼Ťli uda┼éo ci si─Ö zalogowa─ç, zabezpiecz serwer korzystaj─ůc z poni┼╝szych informacji a nast─Öpnie zrestartuj us┼éug─Ö ssh na drugiej sesji.
  7. Pami─Ötaj, by pierwsz─ů sesj─Ö ssh ca┼éy czas mie─ç otwart─ů, by w razie potrzeby m├│c cofn─ů─ç zmiany.
  8. Zrestartuj us┼éug─Ö ssh i sprawd┼║, czy mo┼╝esz zalogowa─ç si─Ö za pomoc─ů trzeciej sesji do serwera. Je┼Ťli tak, uda┼éo ci si─Ö poprawnie skonfigurowa─ç serwer ssh.
  9. Dla chętnych napisz skrypt z użyciem sed lub awk, który dokona zmian po stronie serwera w pliku sshd_config, aby nie trzeba było ręcznie nanosić zmian.

OpenSSH : KeyBoard-Intereractive Auth

OpenSSH jest ju┼╝ domy┼Ťlnie zainstalowany, wi─Öc nie ma potrzeby instalowania nowych pakiet├│w. Domy┼Ťlnie mo┼╝esz logowa─ç si─Ö za pomoc─ů KeyBoard-Interactive Authentication, ale zmie┼ä niekt├│re ustawienia dla bezpiecze┼ästwa jak poni┼╝ej.

Je┼Ťli OpenSSH jednak nie jest jeszcze zainstalowany mo┼╝esz go zainstalowa─ç za pomoc─ů nast─Öpuj─ůcego polecenia:

SLES

Aby zainstalowa─ç OpenSSH wpisz:

# od┼Ťwie┼╝ repozytoria
sudo zypper ref
# zainstaluj OpenSSH
sudo zypper -n in openssh
# w┼é─ůcz OpenSSH podczas boot-owania
sudo systemctl enable sshd
# wystartuj openSSH
sudo systemctl start sshd
# w┼é─ůcz regu┼é─Ö w firewalld dla ssh
sudo firewall-cmd --permanent --add-service=ssh
success
# Przeładuj reguły firewalld
sudo firewall-cmd --reload
success

Debian

Aby zainstalowa─ç OpenSSH wpisz:

# od┼Ťwie┼╝ repozytoria
sudo apt update
# zainstaluj OpenSSH
sudo apt -y install openssh-server
# w┼é─ůcz OpenSSH podczas boot-owania
sudo systemctl enable sshd
# wystartuj OpenSSH
sudo systemctl start sshd
# w┼é─ůcz regu┼é─Ö w ufw firewall dla ssh
sudo ufw allow ssh

Red Hat

Aby zainstalowa─ç OpenSSH wpisz:

sudo yum install openssh-server -y
lub
sudo dnf install openssh-server -y
# w┼é─ůcz OpenSSH podczas boot-owania
sudo systemctl enable sshd
# wystartuj OpenSSH
sudo systemctl start sshd
# w┼é─ůcz regu┼é─Ö w firewalld dla ssh
sudo firewall-cmd --permanent --add-service=ssh
success
# Przeładuj reguły firewalld
sudo firewall-cmd --reload
success

Nast─Öpnie na maszynie z Linux, za pomoc─ů kt├│rej zamierzasz ┼é─ůczy─ç si─Ö do serwera, musisz zainstalowa─ç odpowiedniego klienta:

SLES

Aby zainstalowa─ç OpenSSH wpisz:

# od┼Ťwie┼╝ repozytoria
sudo zypper ref
# zainstaluj OpenSSH
sudo zypper -n in openssh-clients

Debian

Aby zainstalowa─ç OpenSSH wpisz:

# od┼Ťwie┼╝ repozytoria
sudo apt update
# zainstaluj OpenSSH
sudo apt -y install openssh-client

Red Hat

Aby zainstalowa─ç OpenSSH wpisz:

sudo yum install openssh-clients -y
lub
sudo dnf install openssh-clients -y

Instalacja firewalld

SLES

Aby zainstalowa─ç firewalld wpisz:

# od┼Ťwie┼╝ repozytoria
sudo zypper ref
# zainstaluj firewalld
sudo zypper -n in firewalld
# w┼é─ůcz firewalld podczas boot-owania
sudo systemctl enable firewalld
# wystartuj firewalld
sudo systemctl start firewalld

Debian

Aby zainstalowa─ç firewalld wpisz:

# od┼Ťwie┼╝ repozytoria
sudo apt update
# zainstaluj firewalld
sudo apt -y install firewalld
# w┼é─ůcz firewalld podczas boot-owania
sudo systemctl enable firewalld
# wystartuj firewalld
sudo systemctl start firewalld

Red Hat

Aby zainstalowa─ç firewalld wpisz:

sudo yum install firewalld -y
lub
sudo dnf install firewalld -y
# w┼é─ůcz firewalld podczas boot-owania
sudo systemctl enable firewalld
# wystartuj firewalld
sudo systemctl start firewalld

Domy┼Ťlnie firewalld po instalacji ma zaimplementowan─ů us┼éug─Ö SSH jako dozwolon─ů. Je┼Ťli nie, zawsze mo┼╝esz zezwoli─ç na us┼éug─Ö SSH.

SLES

linux:~ # sudo firewall-cmd --add-service=ssh --permanent
success
linux:~ # sudo firewall-cmd --reload
success

Debian

sudo ufw allow ssh

Red Hat

linux:~ # sudo firewall-cmd --add-service=ssh --permanent
success
linux:~ # sudo firewall-cmd --reload
success

Konfiguracja klienta SSH

Po┼é─ůcz si─Ö z serwerem SSH za pomoc─ů zwyk┼éego u┼╝ytkownika.

# ssh [login_user@hostname_or_IP_address]
adrian@client:~> ssh adrian@example.com
The authenticity of host 'example.com (10.0.0.50)' can't be established.
ECDSA key fingerprint is SHA256:h0QhlXgCZ860UjM8sAjY6Wmrr2EqSIY5UADBi0wAFV4.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'example.com,10.0.0.50' (ECDSA) to the list of known hosts.
Password:          # login user's password
adrian@example.com:~>    # just logined

Uwierzytelnianie par─ů kluczy SSH

Skonfiguruj serwer SSH do logowania za pomoc─ů Key-Pair Authentication. Utw├│rz klucz prywatny dla klienta i klucz publiczny dla serwera, aby to zrobi─ç.

Utw├│rz Key-Pair dla ka┼╝dego u┼╝ytkownika, wi─Öc zaloguj si─Ö wsp├│lnym u┼╝ytkownikiem na SSH Server Host i pracuj jak poni┼╝ej.

# utw├│rz par─Ö kluczy na kliencie
ssh-keygen -t rsa -b 4096 -C "imi─Ö i nazwisko"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/adrian/.ssh/id_rsa): /home/adrian/.ssh/p-tech
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/adrian/.ssh/p-tech
Your public key has been saved in /home/adrian/.ssh/p-tech.pub
The key fingerprint is:
SHA256:IPtApVZ/8o6mCY3lKSvcfEtkD6wzHJ0LzKeHFm3qbxs adrian@G02PLXN05963
The key's randomart image is:
+---[RSA 4096]----+
|      o          |
|     + .         |
|    = . o .      |
|   = * o +       |
|    O % S .      |
|   . ^ = o       |
| . o& E + .      |
|  oooOo=         |
|   .o+*o         |
+----[SHA256]-----+

Aby wygenerowa─ç passphrase mo┼╝esz u┼╝y─ç nast─Öpuj─ůcego polecenia w osobnym oknie CLI

hexdump -vn16 -e'4/4 "%08X" 1 "\n"' /dev/urandom

Wylistuj par─Ö kluczy

adrian@linux:~> ll ~/.ssh/p-tech*
-rw------- 1 adrian adrian 3.4K Apr  1 16:44 /home/adrian/.ssh/p-tech
-rw-r--r-- 1 adrian adrian  745 Apr  1 16:44 /home/adrian/.ssh/p-tech.pub

Skopiuj klucz publiczny z klienta na serwer

ssh-copy-id -i ~/.ssh/p-tech.pub student@IP-ADDRRESS

Podaj hasło

Zaloguj si─Ö z kluczem do serwera

ssh -i ~/.ssh/p-tech student@IP-ADDRRESS

Podaj passphrase

Automatyzacja

Dodaj poni┼╝sze wpisy do pliku .bashrc lub .zshrc znajduj─ůcego si─Ö w katalogu /home/user. Pierwszy wpis uruchamia agenta ssh, a drugi ┼éaduje do niego Tw├│j klucz prywatny. Je┼Ťli ustawi┼ée┼Ť passphrase na swoim kluczu, agent zapyta o jego wpisanie. Mo┼╝esz doda─ç wi─Öcej ni┼╝ jeden klucz. Nale┼╝y pami─Öta─ç, ┼╝e za ka┼╝dym razem, gdy Bash lub Zsh uruchomi proces restartu lub rozruchu systemu operacyjnego, w CLI poprosi o podanie passphrase.

eval $(ssh-agent -s)
ssh-add ~/.ssh/p-tech

Zabezpieczanie SSH

Edytuj /etc/ssh/sshd_config

sudo vi /etc/ssh/sshd_config

# odkomentuj te linie i zmień na [no]
PasswordAuthentication no
ChallengeResponseAuthentication no

# Wy┼é─ůcz puste has┼éa
# Musisz zapobiec zdalnym logowaniom z kont z pustymi hasłami dla zwiększenia bezpieczeństwa.

PermitEmptyPasswords no

# Ograniczenie dost─Öpu u┼╝ytkownik├│w do SSH
# Aby zapewni─ç kolejn─ů warstw─Ö bezpiecze┼ästwa, powiniene┼Ť ograniczy─ç logowanie do SSH
# tylko do niekt├│rych u┼╝ytkownik├│w, kt├│rzy potrzebuj─ů zdalnego dost─Öpu.
# W ten sposób zminimalizujesz wpływ posiadania użytkownika ze słabym hasłem.
# Dodaj lini─Ö "AllowUsers", a nast─Öpnie list─Ö nazw u┼╝ytkownik├│w i oddziel je spacj─ů:

AllowUsers student adrian

# Wy┼é─ůczanie logowania roota
# Jedn─ů z najbardziej niebezpiecznych dziur w zabezpieczeniach, 
# jakie mo┼╝esz mie─ç w swoim systemie jest umo┼╝liwienie bezpo┼Ťredniego logowania si─Ö 
# do roota przez SSH. W ten spos├│b hakerzy pr├│buj─ůcy z┼éama─ç has┼éo roota mog─ů
# hipotetycznie uzyska─ç dost─Öp do systemu; a je┼Ťli si─Ö nad tym zastanowi─ç,
# root mo┼╝e wyrz─ůdzi─ç du┼╝o wi─Öcej szk├│d na maszynie ni┼╝ zwyk┼éy u┼╝ytkownik.
# Aby wy┼é─ůczy─ç logowanie przez SSH jako root, zmie┼ä lini─Ö na tak─ů:

PermitRootLogin no

# Ostatecznie mo┼╝esz pozwoli─ç rootowi na logowanie si─Ö przez SSH przy u┼╝yciu pary kluczy.
# Zr├│b to tylko je┼Ťli serwer nie jest w DMZ (nie ma dost─Öpu z Internetu)

PermitRootLogin prohibit-password

# Dodaj Protocol 2
# SSH posiada dwa protokoły, których może używać. Protokół 1 jest starszy i mniej bezpieczny.
# Protok├│┼é 2 jest tym, czego powiniene┼Ť u┼╝ywa─ç, aby wzmocni─ç swoje bezpiecze┼ästwo.
# Je┼Ťli chcesz, aby Tw├│j serwer by┼é zgodny z PCI, musisz wy┼é─ůczy─ç protok├│┼é 1.

Protocol 2

# Protocol
#  Okre┼Ťla wersje protoko┼éu, kt├│re obs┼éuguje sshd(8).  Mo┼╝liwe.
#  warto┼Ťci to '1' i '2'.  Wiele wersji musi by─ç oddzielonych przecinkami.
#  Domy┼Ťlnie jest to '2'.  Protok├│┼é 1 cierpi na szereg
#  s┼éabo┼Ťci kryptograficznych i nie powinien by─ç u┼╝ywany.
#  Jest oferowany tylko w celu wsparcia starszych urz─ůdze┼ä.
#  Przykład: Protocol 2, 1

# U┼╝yj innego portu
# Jedn─ů z g┼é├│wnych korzy┼Ťci ze zmiany portu i u┼╝ycia niestandardowego portu
# jest unikni─Öcie bycia widzianym przez przypadkowe skanowanie. Zdecydowana wi─Ökszo┼Ť─ç haker├│w
# szukaj─ůcych otwartych serwer├│w SSH b─Ödzie szuka┼éa portu 22, poniewa┼╝ domy┼Ťlnie,
# SSH nas┼éuchuje po┼é─ůcze┼ä przychodz─ůcych na tym porcie.
# Je┼Ťli trudniej jest zeskanowa─ç Tw├│j serwer SSH, to zmniejszaj─ů si─Ö Twoje szanse na atak.
# Uruchom SSH na niestandardowym porcie powy┼╝ej portu 1024.

Port 2025

# Mo┼╝esz wybra─ç dowolny nieu┼╝ywany port, o ile nie jest on u┼╝ywany przez inn─ů us┼éug─Ö.
# Wiele os├│b mo┼╝e wybra─ç 222 lub 2222 jako sw├│j port, poniewa┼╝
# jest to do┼Ť─ç ┼éatwe do zapami─Ötania, ale w┼éa┼Ťnie z tego powodu, hakerzy skanuj─ůcy port 22
# prawdopodobnie b─Öd─ů r├│wnie┼╝ pr├│bowa─ç port├│w 222 i 2222. Spr├│buj wybra─ç numer portu
# kt├│ry nie jest jeszcze u┼╝ywany, pod─ů┼╝aj za tym linkiem, aby uzyska─ç list─Ö numer├│w port├│w i ich znanych us┼éug.

# Je┼Ťli StrictModes jest ustawiony na tak, to wymagane s─ů poni┼╝sze uprawnienia.
# sudo chmod 700 ~/.ssh
# sudo chmod 600 ~/.ssh/authorized_keys

StrictModes yes

# Konfiguracja interwa┼éu czasu bezczynno┼Ťci

ClientAliveInterval 360
ClientAliveCountMax 1

# ClientAliveInterval - Ustawia interwa┼é czasowy w sekundach, po kt├│rym, je┼Ťli nie otrzymano ┼╝adnych danych od klienta, 
# sshd wy┼Ťle wiadomo┼Ť─ç przez kana┼é szyfrowany, aby za┼╝─ůda─ç odpowiedzi od klienta. Domy┼Ťlnie jest to 0, co oznacza, 
# ┼╝e te wiadomo┼Ťci nie b─Öd─ů wysy┼éane do klienta. Opcja dotyczy tylko protoko┼éu w wersji 2.

# ClientAliveCountMax - Warto┼Ť─ç domy┼Ťlna to 3. Je┼Ťli ClientAliveInterval ustawiony jest na 15, a ClientAliveCountMax 
# na warto┼Ť─ç domy┼Ťln─ů, to niereaguj─ůcy klienci SSH b─Öd─ů roz┼é─ůczani po oko┼éo 45 sekundach. 
# Opcja dotyczy tylko protokołu w wersji 2.

# Warto┼Ť─ç timeout jest obliczana przez pomno┼╝enie
# ClientAliveInterval i ClientAliveCountMax.
# timeout interval = ClientAliveInterval * ClientAliveCountMax
# Opcje OpenSSH ClientAliveInterval i ClientAliveCountMax
# nie s─ů u┼╝ywane do roz┼é─ůczania nieaktywnych sesji.
# W rzeczywisto┼Ťci zapobiegaj─ů one zamkni─Öciu po┼é─ůczenia,
# nawet na nieaktywnych sesjach, tak d┼éugo jak klient i ┼é─ůcze sieciowe jest ┼╝ywe.
# Jest to wewnętrzny mechanizm ssh, który wysyła pakiet "null
# wewn─ůtrz ustanowionego tunelu, i czeka na odpowied┼║ od klienta.
# W tym przypadku wysy┼éa jeden pakiet co 360 sekund, i roz┼é─ůcza si─Ö po 1 brakuj─ůcej odpowiedzi.
# Chocia┼╝ te opcje s─ů pomocne w wykrywaniu i czyszczeniu roz┼é─ůczonych sesji klient├│w,
# nie zabij─ů one sesji klient├│w, kt├│rzy nadal s─ů po┼é─ůczeni, nawet je┼Ťli s─ů nieaktywni.
# Chyba, ┼╝e ich klient nie odpowie na pakiet null.

Aby od┼é─ůczy─ç nieaktywnych klient├│w, je┼Ťli u┼╝ywasz bash jako pow┼éoki, mo┼╝esz ustawi─ç warto┼Ť─ç TMOUT w og├│lnosystemowym profilu domy┼Ťlnym lub na u┼╝ytkownika:

# TMOUT Je┼Ťli ustawione na warto┼Ť─ç wi─Öksz─ů od zera,
# TMOUT traktowane jest jako domy┼Ťlny limit czasu (tiomeout) 
# dla wbudowanego odczytu (read).
#
# Polecenie select ko┼äczy prac─Ö je┼Ťli nie otrzyma danych na wej┼Ťciu 
# z terminala po TMOUT sekund.
#
# W pow┼éoce interaktywnej, warto┼Ť─ç ta interpretowana jest jako liczba
# sekund oczekiwania na wiersz wej┼Ťcia po wydaniu g┼é├│wnej zach─Öty.
#
# Bash kończy pracę po odczekaniu tej liczby sekund
# je┼Ťli nie nadejdzie pe┼ény wiersz wej┼Ťcia.

# Na przyk┼éad, dodanie nast─Öpuj─ůcej linii do `/etc/.bashrc`.
# zamknie sesje bashowe nieaktywnego u┼╝ytkownika po 5 minutach,
# ale przeczytaj nast─Öpuj─ůce ostrze┼╝enie przed w┼é─ůczeniem tego:

`export TMOUT=300`

# Ostrzeżenie: jako codzienny użytkownik powłoki, często pozwalam,
# aby jaki┼Ť terminal by┼é otwarty podczas wielozadaniowo┼Ťci.
# Osobi┼Ťcie uzna┼ébym ten mechanizm TMOUT za bardzo denerwuj─ůcy,
# je┼Ťli by┼éby ustawiony na nisk─ů warto┼Ť─ç (nawet 10 minut).
# Nie polecam tego, chyba ┼╝e jest przynajmniej ustawiony
# na bardzo wysok─ů warto┼Ť─ç (co najmniej 1 godzin─Ö - 3600 sekund).

# Moja opinia jest taka, ┼╝e opcje OpenSSH `ClientAliveInterval` i `ClientAliveCountMax`
# (lub `ServerAliveInterval` i `ServerAliveCountMax`, ustawiane po stronie serwera),
# wystarcz─ů, aby pozby─ç si─Ö zombie/roz┼é─ůczonych klient├│w.
# U┼╝ywaj─ůc ich, masz ju┼╝ gwarancj─Ö, ┼╝e aktywna sesja na serwerze
# odpowiada otwartemu terminalowi na pod┼é─ůczonym kliencie.
#
# To jest wyb├│r u┼╝ytkownika, aby utrzyma─ç sw├│j terminal otwarty, 
# podczas gdy rozumiem. ┼╝e chcesz zamkn─ů─ç roz┼é─ůczonych klient├│w.
# Nie widz─Ö sensu zamykania sesji od legalnych u┼╝ytkownik├│w.

Bezpieczna konfiguracja szyfr├│w/MAC/Kex dost─Öpnych w SSH

KexAlgorithms diffie-hellman-group14-sha256,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512,diffie-hellman-group-exchange-sha256,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,curve25519-sha256,curve25519-sha256@libssh.org
Ciphers aes256-ctr,aes192-ctr,aes128-ctr
MACs hmac-sha2-512

# Mniej bezpieczne, lecz dzia┼éaj─ůce
KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp521,ecdh-sha2-nistp384,ecdh-sha2-nistp256,diffie-hellman-group-exchange-sha256
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com,hmac-sha2-512,hmac-sha2-256,umac-128@openssh.com

Upewnij si─Ö, ┼╝e tw├│j klient ssh mo┼╝e u┼╝ywa─ç tych szyfr├│w, uruchom:

ssh -Q cipher | sort -u
to see the list

Polecam przeczytać ten artykuł::
Secure Configuration of Ciphers/MACs/Kex available in SSH

Przeładuj usługę SSH

sudo systemctl reload sshd
Podziel si─Ö

sysadmin
UTWORZONE PRZEZ
sysadmin
QA & Linux Specialist