#note ssh tips & tricks - czyli jak szybko i sprawnie korzystać z połączeń SSH post
Regularnie korzystam z SSH, ale nie zawsze pamiętam wszystkie opcje, które mogą być przydatne. Postanowiłem zebrać je w jednym miejscu. Sam zobacz jak szybko i sprawnie korzystać z połączeń SSH.
SSH Config
Kluczem do efektywnej pracy z połączeniami SSH są klucze i pliki konfiguracyjne. I tak, to nie pomyłka, nie mam na myśli tylko ~/.ssh/config
, ale także ~/.ssh/authorized_keys
i ~/.ssh/known_hosts
oraz podział plików na partiale.
~/.ssh/config - domyślny plik konfiguracyjny
e.g. https://linux.die.net/man/5/ssh_config
Plik konfiguracyjny SSH pozwala na zdefiniowanie wielu opcji, które mogą być użyteczne w codziennej pracy. Poniżej przykładowy plik konfiguracyjny:
Host ha.pve
HostName 10.0.0.10
User homeassistant
Dzięki temu, że zdefiniowaliśmy hosta ha.pve
możemy teraz połączyć się z nim poleceniem:
ssh ha.pve
Cała jednak zabawa zaczyna się, gdy zaczynamy używać opcji, które pozwalają na bardziej zaawansowane połączenia. Poniżej więcej przykładów.
Separacja plików konfiguracyjnych
Trzymanie wszystkich aliasów i opcji w jednym pliku może być uciążliwe. Szczególnie, jeśli na co dzień zajmujemy się utrzymaniem wielu projektów i serwerów. Dla mnie rozwiązaniem jest podział pliku konfiguracyjnego na mniejsze części. Można je podzielić na wg nazwy kliena, nazwy projektu czy też grupy serwerów. Poniżej przykład podziału na grupy serwerów:
# ~/.ssh/config
Include ~/.ssh/config.d/*
W pliku ~/.ssh/config
możemy zdefiniować opcję Include
która pozwala na podzielenie pliku konfiguracyjnego na mniejsze części. Dzięki temu możemy łatwo zarządzać plikiem konfiguracyjnym, a także dzielić się nim z innymi użytkownikami.
U mnie wygląda to tak:
~/.ssh/config
~/.ssh/config.d/${nazwa-klienta}
~/.ssh/config.d/${nazwa-klienta}-${nazwa-srodowiska} # ~/.ssh/config.d/cool-client-prod oraz ~/.ssh/config.d/cool-client-stage
~/.ssh/config.d/${nazwa-projektu-non-profit-1}
~/.ssh/config.d/${nazwa-projektu-non-profit-2}
~/.ssh/config.d/${nazwa-projektu-non-profit-2}
Automatyczna zmiana katalogu po połączeniu
Na jednym serwerze hostuję wiele projektów, za każdym razem musiałem ręcznie przechodzić do katalogu projektu by z nim pracować. Początkiem 2024 zapytałem się, dlaczego tego nie zautomatyzować i tak powstał pomysł na aliasy 🤣
Host michal.kruczek.it
RemoteCommand cd ~/domains/michal.kruczek.it && exec bash --login
RequestTTY yes
HostName 127.0.0.1
User michal
Dzięki czemu nie muszę już ręcznie przechodzić do katalogu projektu, a po połączeniu automatycznie znajduję się w katalogu projektu.
Jump Host / Proxy Host
Ze względów bezpieczeństwa nie zawsze możemy połączyć się bezpośrednio z serwerem. W takim przypadku możemy skorzystać z opcji ProxyJump
lub ProxyCommand
. Spójrzmy na poniższy przykład:
Host gateway.pve
HostName 127.0.0.1
User michal
Port 22
Host ha.pve
HostName 10.0.0.10
User homeassistant
ProxyJump gateway.pve
Wykonując połączenie ssh -A ha.pve
najpierw łączymy się z hostem gateway.pve
a następnie z hostem ha.pve
. Dzięki temu możemy zabezpieczyć serwer ha.pve
przed atakami z zewnątrz używając firewalla.
~/.ssh/authorized_keys
- lista autoryzowanych kluczy
Większość programistów, adminów i devopsów wie, że do pliku ~/.ssh/authorized_keys
można dodać klucze publiczne, które pozwalają na połączenie się z serwerem bez podawania hasła. Jednak nie każdy wie, że można dodać do niego także opcje, które pozwalają na bardziej zaawansowane połączenia. Poniżej przykład:
command="/usr/bin/true" ${twoj-publiczny-klucz-ssh}
Powyższa komenda de facto blokuje wejście na serwer przez nadpisanie komendy, pozwala jednakże wykorzystać to połączenie do proxowania ruchu przez serwer.
Opcji jest więcej, bo możemy dla konkretnego klucza dodać zmienne środowiskowe np.:
command="/usr/bin/true" environment="APP_ENV=staging" ${twoj-publiczny-klucz-ssh}
Możemy też zablokować przesyłanie kluczy tj. agent forwarding czy przekierowanie portów tj. port forwarding.
command="/usr/bin/true" no-agent-forwarding,no-port-forwarding,no-X11-forwarding,no-pty ${twoj-publiczny-klucz-ssh}
Więcej informacji można znaleźć na: