#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:

Kategorie: notes, tools

Tagi: ssh, notes, note, notatki, notatka, proxy