Instalace programů
Strana klient
Skupina příkazů pro kopírování dat, předávání si portů (tunneling), připojení se jako terminál, vše šifrovaným spojením se s cílovou stranou (server), kde naslouchá služba sshd
.
sudo apt install openssh-client
Strana server
Cílová strana, kde běží služba sshd
, naslouchající standardně na portu 22
. V instalaci je obsažen i klient.
sudo apt install openssh-server
Umístění ssh autorizace a klíčů
Zakázání oprávnění přístupu čtení a zápisu všem, kromě uživatele vlastníka a to na celý adresář ~/.ssh
.
mkdir ~/.ssh chmod -R u+w,go-rwx ~/.ssh
Strana klient
Zde se jedná především o soubory klíče privátního (bez koncovky .pub) a přidruženého veřejného (s koncovkou .pub).
~/.ssh/uzivatel_rsa ~/.ssh/uzivatel_rsa.pub
Lze na klient uživateli přednastavit, který klíč se má požívat, pokud není v
ssh
příkazu uveden za parametrem -i ...
a to v souboru
~/.ssh/config
Host * IdentityFile ~/.ssh/uzivatel_rsa
Strana server
Zde na cílové straně je především soubor autorizace authorized_keys
, obsahující obsahy veřejných klíčů od klientů s možností dalších restrikcí, kterým je tímto umožněno navázání spojení.
Vygenerování rsa klíče
Strana klient
Příklad vytvoření klíče typu rsa
o velikosti 4096
bitů pojmenovaného složením z uživateského jména, jeho hostname a případně poskytovaného portu (sestaveného do proměnné NAME
). V průběhu je dotaz na zvolení hesla rsa klíče. Výsledkem jsou dva soubory, kdy jeho veřejná část, soubor s koncovkou .pub
se předá cílové straně, která je u sebe obsah vloží do autorizačního souboru authorized_keys
cílového uživatele a tím povolí klientu možnost ssh login.
V souboru ~/.ssh/config
předdefinování použití rsa klíče, kdy se pak v ssh
příkazu nemusí zadávat přes parametr -i
.
NAME="`whoami`@`hostname -s`_p55520" ssh-keygen -t rsa -b 4096 -C "${NAME}_rsa" -f ~/.ssh/${NAME}_rsa echo -e "Host *\n IdentityFile ~/.ssh/'${NAME}_rsa'" |tee -a ~/.ssh/config chmod -R u+w,go-rwx ~/.ssh
Omezení přístupu na sshd server pouze na autentikaci klíče
Strana server
Sshd server umožňuje ověření uživatele heslem jako má login v Linuxu (uživatel root toto povolené standardně nemá). Šifrování zůstává, výhodou snad je jen, že pro přihlášení odpadá nutnost mít pořešené na klientu a serveru klíče. Ovšem použitím klíčů je adresnější kontrola přístupů a oprávnění, což více posiluje zabezpečení. V principu vypnout přihlášení přes login heslo a ponechat autentikaci na heslo klíče. Jedná se o změnu v konfiguračním souboru:
/etc/ssh/sshd_config
PasswordAuthentication no StrictModes no ChallengeResponseAuthentication no UsePAM no PrintMotd no AcceptEnv LANG LC_* Subsystem sftp /usr/lib/openssh/sftp-server
Zavedení změn
sudo systemctl reload sshd.service
Autorizace a restrikce přístupu klienta na sshd server
Akcetpovatelný klient má na cílovém sshd serveru u uživatele, na který se přihlašuje v autorizačním souboru ~/.ssh/authorized_keys
připsán obsah souboru klientova veřejného klíče (soubor s koncovkou .pub). V autorizačním souboru co klient, to řádek a přidaná omezení pro daného klienta se vkládají do stejného řádku kde má veřejný klíč. Omezení jsou obzvlášť nutná pro nezaheslované klíče (případ bezobslužného navázání spojení).
Příklad plných omezení, kdy klientem vložený příkaz cíl ignoruje a odpoví jen echem (pro ignoraci bez odezvy lze: command="/bin/true"
):
command="/bin/echo ECHO: $SSH_ORIGINAL_COMMAND",no-X11-forwarding,no-agent-forwarding,no-user-rc,no-pty <veřejný klíč klienta>
Uživatel pro navazování tunnel spojení
Pro možnost přístupu například admina s pevnou, veřejnou IP na klienta, který nemá pevnou, veřejnou IP, je za NATetm lze přes šifrovaný ssh tunnel navazovaný klientem. Navázání ssh tunnel spojení je pouze poskytnutí portu, přes který se dá zpět na klienta přihlásil už zaheslovaným ssh loginem.
Z důvodu bezpečnosti je nejvhodnější navazovat tunnel spojení pouze pod uživatelem s k tomu omezenými právy.
Na klientu: Vytvoření uživatele „tunnel“ pouze k navazování tunnel spojení
Zvolené ID 1999
pro uživatele tunnel
musí být na klientu unikátní (pokud již existuje, zvolit jiný).
Klientem poskytnutý ssh cílový port 55520
musí být na adminu unikátní, jinak pro něj zvolit jiný.
Pro přehlednost jsem zde zvolil pojmenování rsa klíče složeného z uživatele tunnel, hostname klienta a poskytovaného portu (sestaveného do proměnné NAME
). Vytvoří se nezaheslovaný rsa klíč, dva soubory, kdy jeho veřejná část (soubor s koncovkou .pub
) se předá adminovi, ktery je u sebe vloží autorizačního souboru a tím povolí klientu možnost navázat ssh tunnel spojení.
Nakonec omezení přístupvých práv do skrytého adresáře /home/.tunnel
.
sudo useradd -u 1999 -g 65534 -c "Pro tunelovani portu" -Md /home/.tunnel -s /bin/false -o tunnel sudo mkdir -p /home/.tunnel/.ssh NAME="tunnel@`hostname -s`_p55520" sudo ssh-keygen -t rsa -b 4096 -N "" -C "${NAME}_rsa" -f /home/.tunnel/.ssh/${NAME}_rsa sudo chown -R tunnel:nogroup /home/.tunnel sudo chmod -R u-w,go-rwx /home/.tunnel
Na adminu: Vytvoření uživatele pouze pro navazování tunnel spojení
Princip stejný jako na klientu s rozdílem, kdy místo generování klíče se vytvoří autorizační soubor authorized_keys
obsahující veřejnou část rsa klíče klienta (obsah souboru s .pub
koncovkou) a omezení práv jen pro tunnel spojení a jen určitý port 55520
. Zde je v příkladu obecně hostname ve jméně souboru tunnel@hostname_p55520_rsa.pub
a jeho obsah přidán do authorized_keys
souboru echo
příkazem.
Nakonec omezení přístupových práv celému adresáři /home/.tunnel
.
sudo useradd -u 1999 -g 65534 -c "Pro tunelovani portu" -Md /home/.tunnel -s /bin/false -o tunnel sudo mkdir -p /home/.tunnel/.ssh sudo echo 'permitopen="localhost:55520",command="/bin/true",no-X11-forwarding,no-agent-forwarding,no-user-rc,no-pty' `cat /home/.tunnel/.ssh/'tunnel@hostname_p55520_rsa.pub'` |sudo tee -a /home/.tunnel/.ssh/authorized_keys sudo chown -R tunnel:nogroup /home/.tunnel sudo chmod -R u-w,go-rwx /home/.tunnel
Na klientu: Navázání tunnel spojení s adminem
Při úspěšném navázání spojení příkaz nevrátí prompt. Pro ukončení spojení je stisk Ctrl
+ c
.
sudo -u tunnel ssh -v -CXNn -o StrictHostKeyChecking=no -o ConnectTimeout=7 -o ConnectionAttempts=1 -o ServerAliveCountMax=2 -o ServerAliveInterval=120 -TR 55520:localhost:22 -i /home/.tunnel/.ssh/'tunnel@hostname_p55520_rsa' tunnel@admin.server.com
Příklad sdílení SAMBA soborového systému přes tunnel
Jde o šifrované tunelování, serverem poskytnutí SAMBA portu klientu s autentikací nezaheslovaného RSA klíče jen pro bezobslužnému navázání spojení a zároveň omezení klienta pouze pro účel tunelování (převzetí) SAMBA portu.
Z cílového serveru si klient tunelem nasdílí samba port 445 k sobě jako lokální např. 55445. Po aktivaci tohoto port tunelu bude možné sdílení souborové odkazem lokálně na port 55445 (localhost).
Na klientu: Vygenerování bezheslového klíče pro navázání tunnel spojení
S parametrem -N ""
se vygeneruje klíč rovnou nezaheslovaný. Vzniknou soubory: ~/.ssh/samba_NOPWD_rsa
a ~/.ssh/samba_NOPWD_rsa.pub
ssh-keygen -t rsa -b 4096 -N "" -C "samba_NOPWD_rsa" -f ~/.ssh/samba_NOPWD_rsa
Na serveru: Nastavení omezení pro bezheslové navázání pouhého tunnel spojení
Do souboru ~/.ssh/authorized_keys
se přidá řádek obsahující pravidla omezující spojení a obsah souboru veřejného klíče klienta. Nepopisuji jak překopírovat předem tento veřejný klíč z klienta na server.
echo 'permitopen="localhost:445",command="/bin/true",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-user-rc,no-pty' `cat ~/.ssh/samba_NOPWD_rsa.pub` >> ~/.ssh/authorized_keys cat ~/.ssh/authorized_keys
Na klientu: Tunnel spojením převzetí ze serveru port 445 a jeho lokální poskytnutí jako 55445
Pro otestování je přidán parametr -v
(debug mód) a nepoužít -q
,aby nebyl potlačen výpis. Při úspěchu lze potlačit výpisy odebráním -v
a přidáním -q
.
ssh -v -CXNn -o StrictHostKeyChecking=no -o ConnectTimeout=7 -o ConnectionAttempts=1 -o ServerAliveCountMax=2 -o ServerAliveInterval=120 -L 55445:localhost:445 -i ~/.ssh/samba_NOPWD_rsa uzivatel@cilovy.server.com
Jelikož navázané ssh tunnel spojení nevrátí promtp (lze ukončit [Ctrl]), tak z jiného terminálu klienta otestovat průchodnost tunelu
nc -vzw 1 localhost 55445 && echo OK || echo FAILED
Vrátí-li nc příkaz „OK“ a zároveň ssh tunel spojení nevypíše chybu „channel 1: open failed: administratively prohibited: open failed„, je možno zkusi připojit souborové sdílení.
Dál je to dosti individuální dle konfigurace na straně samba serveru, tak jen ilustračně příklad připojení sdílení s názvem „ShareDir“ na adresář „/mnt“ .
sudo mount.cifs -o username=uzivatel,port=55445 //localhost/ShareDir /mnt