
Esempi pratici , che porteranno a un nuovo livello le tue competenze come amministratore di sistema remoto. I comandi e i consigli non solo ti aiuteranno a usare SSH, ma anche a muoverti in rete in modo più efficace.
Conoscere alcuni trucchi ssh è utile per qualsiasi amministratore di sistema, ingegnere di rete o esperto di sicurezza.
Esempi pratici di SSH
Fondamenti di base
Analisi della riga di comando SSH
Nell'esempio seguente vengono utilizzati parametri comuni, frequentemente riscontrati durante la connessione a un server remoto SSH.
localhost:~$ ssh -v -p 22 -C neo@remoteserver-v: l'output delle informazioni di debug è particolarmente utile nell'analisi dei problemi di autenticazione. Può essere utilizzato più volte per visualizzare informazioni aggiuntive.- p 22: porta per la connessione al server remoto SSH. 22 non deve essere necessariamente specificato, poiché è il valore predefinito, ma se il protocollo è su una porta diversa, bisogna specificarlo con il parametro-p. La porta di ascolto è specificata nel filesshd_confignel formatoPort 2222.-C: compressione per la connessione. Se si dispone di una connessione lenta o si visualizzano molte informazioni, ciò può accelerare la comunicazione.neo@: la stringa prima del simbolo @ rappresenta il nome utente per l'autenticazione sul server remoto. Se non specificato, verrà utilizzato il nome utente dell'account corrente (~$ whoami). È possibile specificare anche un altro utente con il parametro-l.remoteserver: nome dell'host a cui ci si connettessh, può essere un nome di dominio completo, un indirizzo IP o qualsiasi host nel file hosts locale. Per connettersi a un host che supporta sia IPv4 che IPv6, è possibile aggiungere un parametro alla riga di comando-4o-6per una risoluzione corretta.
Tutti i parametri sopra elencati sono facoltativi, tranne remoteserver.
Uso del file di configurazione
Anche se molti sono familiari con il file sshd_config, esiste un file di configurazione client per il comando ssh. Il valore predefinito ~/.ssh/config, ma può essere specificato come parametro per l'opzione -F.
Host *
Port 2222
Host remoteserver
HostName remoteserver.thematrix.io
User neo
Port 2112
IdentityFile /home/test/.ssh/remoteserver.private_keyNel file di configurazione ssh di esempio sopra, ci sono due voci host. La prima designa tutti gli host ai quali si applica il parametro di configurazione Port 2222. La seconda indica che per l'host remoteserver si dovrebbe utilizzare un altro nome utente, porta, FQDN e IdentityFile.
Il file di configurazione può far risparmiare molto tempo nel digitare, permettendo di applicare automaticamente configurazioni avanzate quando ci si connette a host specifici.
Copiare file tramite SSH usando SCP
Il client SSH è fornito con due altri strumenti molto utili per il trasferimento di file tramite una connessione ssh crittografata. Di seguito è riportato un esempio di utilizzo standard dei comandi scp e sftp. Si noti che molti parametri per ssh si applicano anche a questi comandi.
localhost:~$ scp mypic.png neo@remoteserver:/media/data/mypic_2.pngIn questo esempio, il file mypic.png è stato copiato su remoteserver nella cartella /media/data e rinominato in mypic_2.png.
Non dimenticate la differenza nel parametro della porta. Qui è dove molti sbagliano quando avviano scp da riga di comando. Qui il parametro della porta -P, e non -p, come nel client ssh! Dimenticherete, ma non preoccupatevi, lo fanno tutti.
Per coloro che sono familiari con il ftpda console, molti dei comandi sono simili in sftp. Potete fare push, put e ls, come desiderate.
sftp neo@remoteserverEsempi pratici
In molti di questi esempi, è possibile raggiungere il risultato con metodi diversi. Come in tutti i nostri e esempi, si preferiscono esempi pratici che fanno semplicemente il loro lavoro.
1. Proxy socks SSH
La funzione SSH Proxy è di fondamentale importanza. È più potente di quanto molti possano immaginare e ti offre accesso a qualsiasi sistema al quale accede il server remoto, utilizzando praticamente qualsiasi applicazione. Il client ssh può incanalare il traffico tramite un server proxy SOCKS con un semplice comando. È importante comprendere che il traffico verso i sistemi remoti sembrerà provenire dal server remoto, come indicato nei log del web server.
localhost:~$ ssh -D 8888 user@remoteserver
localhost:~$ netstat -pan | grep 8888
tcp 0 0 127.0.0.1:8888 0.0.0.0:* LISTEN 23880/sshQui avviamo un proxy socks sulla porta TCP 8888, il secondo comando verifica che la porta sia attiva in ascolto. 127.0.0.1 indica che il servizio è in esecuzione solo su localhost. Possiamo utilizzare un comando leggermente diverso per ascoltare su tutte le interfacce, inclusi ethernet o wifi, consentendo così ad altre applicazioni (browser, ecc.) nella nostra rete di connettersi al servizio proxy tramite il proxy socks ssh.
localhost:~$ ssh -D 0.0.0.0:8888 user@remoteserverOra possiamo configurare il browser per collegarsi al proxy socks. In Firefox, seleziona Impostazioni | Generali | Opzioni di rete. Inserisci l'indirizzo IP e la porta per connetterti.

Fai attenzione all'opzione in fondo al modulo, per far sì che anche le richieste DNS del browser passino attraverso il proxy SOCKS. Se utilizzi un server proxy per crittografare il traffico web nella rete locale, probabilmente desidererai selezionare questa opzione per fare in modo che le richieste DNS siano tunnelizzate attraverso la connessione SSH.
Attivazione del proxy socks in Chrome
Avviare Chrome con determinati parametri della riga di comando attiva il proxy socks e il tunnel delle richieste DNS dal browser. Fidati, ma verifica. Usa per controllare che le richieste DNS non siano più visibili.
localhost:~$ google-chrome --proxy-server="socks5://192.168.1.10:8888"Utilizzo di altre applicazioni con il proxy
Tieni presente che molte altre applicazioni possono utilizzare anche il proxy socks. Il web browser è semplicemente la più popolare tra esse. Alcune applicazioni hanno opzioni di configurazione per attivare il server proxy. Altre necessitano di un piccolo aiuto tramite un programma ausiliario. Ad esempio, permette di avviare Microsoft RDP tramite proxy socks e altro ancora.
localhost:~$ proxychains rdesktop $RemoteWindowsServerLe opzioni di configurazione del proxy socks sono definite nel file di configurazione di proxychains.
Suggerimento: stai utilizzando un desktop remoto da Linux su Windows? Prova il client . Questa è una realizzazione più moderna rispetto a
rdesktop, con un'interazione molto più fluida.
Opzione di utilizzo di SSH attraverso un proxy socks
Sei seduto in un caffè o in un hotel e sei costretto a utilizzare una WiFi piuttosto inaffidabile. Da un laptop avviamo localmente un proxy SSH e stabilendo un tunnel SSH nella rete di casa su un Raspberry Pi locale. Utilizzando il browser o altre applicazioni configurate per i proxy socks, possiamo accedere a qualsiasi servizio di rete nella nostra rete domestica o navigare in Internet tramite la connessione di casa. Tutto tra il tuo laptop e il server domestico (tramite Wi-Fi e Internet fino a casa) è crittografato nel tunnel SSH.
2. Tunnel SSH (inoltro delle porte)
Nella sua forma più semplice, un tunnel SSH apre semplicemente una porta nel tuo sistema locale, che si connette a un'altra porta all'altro capo del tunnel.
localhost:~$ ssh -L 9999:127.0.0.1:80 user@remoteserver Analizziamo il parametro -L. Può essere visto come un lato locale in ascolto. Quindi, nell'esempio sopra, la porta 9999 è in ascolto sul lato localhost e viene reindirizzata attraverso la porta 80 su remoteserver. Si noti che 127.0.0.1 si riferisce a localhost sul server remoto!
Facciamo un passo avanti. Nel prossimo esempio, le porte in ascolto vengono collegate ad altri nodi della rete locale.
localhost:~$ ssh -L 0.0.0.0:9999:127.0.0.1:80 user@remoteserverIn questi esempi ci connettiamo a una porta su un server web, ma potrebbe essere un server proxy o qualsiasi altro servizio TCP.
3. Tunnel SSH verso un host esterno
Possiamo usare gli stessi parametri per connettere il tunnel da un server remoto a un altro servizio in esecuzione su un terzo sistema.
localhost:~$ ssh -L 0.0.0.0:9999:10.10.10.10:80 user@remoteserverIn questo esempio, reindirizziamo il tunnel da remoteserver a un server web in esecuzione su 10.10.10.10. Il traffico da remoteserver a 10.10.10.10 non è più nel tunnel SSH. Il server web su 10.10.10.10 considererà remoteserver come sorgente delle richieste web.
4. Tunnel SSH inverso
Qui configuriamo una porta in ascolto sul server remoto, che si connetterà di nuovo a una porta locale sul nostro localhost (o su un altro sistema).
localhost:~$ ssh -v -R 0.0.0.0:1999:127.0.0.1:902 192.168.1.100 user@remoteserverIn questa sessione SSH, viene stabilita una connessione dalla porta 1999 su remoteserver alla porta 902 sul nostro client locale.
5. Proxy inverso SSH
In questo caso, impostiamo un proxy socks sulla nostra connessione ssh, tuttavia il proxy ascolta dall'altra parte del server. Le connessioni a questo proxy remoto ora appaiono attraverso il tunnel come traffico proveniente dal nostro localhost.
localhost:~$ ssh -v -R 0.0.0.0:1999 192.168.1.100 user@remoteserverRisoluzione dei problemi con i tunnel SSH remoti
Se hai problemi con le opzioni SSH remote, controlla con netstat, a quali altre interfacce è collegata la porta di ascolto. Anche se nei nostri esempi abbiamo specificato 0.0.0.0, se il valore GatewayPorts in sshd_config è impostato su no, il listener sarà legato solo a localhost (127.0.0.1).
Avviso di sicurezza
Tieni presente che aprendo tunnel e proxy socks, le risorse di rete interne possono essere accessibili a reti non sicure (ad esempio, internet!). Questo può costituire una grave minaccia per la sicurezza, quindi assicurati di comprendere cosa sia un listener e a cosa ha accesso.
6. Installazione di VPN tramite SSH
Il termine generale tra gli esperti di metodi di attacco (penetration tester e simili) è "punto d'appoggio nella rete". Una volta stabilita la connessione in un sistema, quel sistema diventa un gateway per il successivo accesso alla rete. Il punto d'appoggio ci consente di espandere le nostre operazioni.
Per un tale punto d'appoggio possiamo utilizzare SSH proxy e proxychains, tuttavia ci sono alcune limitazioni. Ad esempio, non sarà possibile lavorare direttamente con i socket, quindi non potremo scansionare le porte all'interno della rete tramite SYN.
Utilizzando questa opzione VPN più avanzata, la connessione viene ridotta a livello 3. Possiamo quindi semplicemente instradare il traffico attraverso un tunnel, utilizzando la normale routinizzazione della rete.
Il metodo utilizza ssh, iptables, interfacce tun e routinizzazione.
Prima di tutto, dobbiamo impostare questi parametri in sshd_config. Poiché stiamo modificando le interfacce sia del sistema remoto che di quello client, abbiamo bisogno dei diritti di root da entrambe le parti.
PermitRootLogin yes
PermitTunnel yesSuccessivamente stabiliremo una connessione ssh utilizzando un'opzione che richiede l'inizializzazione dei dispositivi tun.
localhost:~# ssh -v -w any root@remoteserver Ora dovremmo avere un dispositivo tun visualizzando le interfacce (# ip a). Il passo successivo aggiungerà indirizzi IP alle interfacce tunnel.
Lato cliente SSH:
localhost:~# ip addr add 10.10.10.2/32 peer 10.10.10.10 dev tun0
localhost:~# ip tun0 upLato server SSH:
remoteserver:~# ip addr add 10.10.10.10/32 peer 10.10.10.2 dev tun0
remoteserver:~# ip tun0 up Ora abbiamo una rotta diretta verso l'altro host (route -n e ping 10.10.10.10).
È possibile instradare qualsiasi sottorete attraverso l'host dall'altra parte.
localhost:~# route add -net 10.10.10.0 netmask 255.255.255.0 dev tun0 Dall'altra parte è necessario abilitare ip_forward e iptables.
remoteserver:~# echo 1 > /proc/sys/net/ipv4/ip_forward
remoteserver:~# iptables -t nat -A POSTROUTING -s 10.10.10.2 -o enp7s0 -j MASQUERADEBoom! VPN attraverso un tunnel SSH a livello 3. Questo è già un traguardo.
Se ci sono problemi, usa e ping, per diagnosticare la causa. Poiché operiamo a livello 3, i nostri pacchetti ICMP passeranno attraverso questo tunnel.
7. Copia della chiave SSH (ssh-copy-id)
Ci sono vari metodi, ma questo comando fa risparmiare tempo evitando di copiare i file manualmente. Copia semplicemente ~/.ssh/id_rsa.pub (o la chiave predefinita) dal tuo sistema in ~/.ssh/authorized_keys sul server remoto.
localhost:~$ ssh-copy-id user@remoteserver
8. Esecuzione remota di comandi (non interattiva)
Il comando ssh è possibile collegarsi ad altre utility per un'interfaccia semplice e comoda. Basta aggiungere il comando che si desidera eseguire sul server remoto come ultimo parametro tra virgolette.
localhost:~$ ssh remoteserver "cat /var/log/nginx/access.log" | grep badstuff.php In questo esempio grep viene eseguito sulla macchina locale dopo che il log è stato scaricato tramite ssh. Se il file è grande, è più conveniente eseguire grep sul lato remoto, semplicemente racchiudendo entrambi i comandi tra doppi apici.
Un altro esempio esegue la stessa funzione di ssh-copy-id dell'esempio 7.
localhost:~$ cat ~/.ssh/id_rsa.pub | ssh remoteserver 'cat >> .ssh/authorized_keys'
9. Cattura pacchetti remota e visualizzazione in Wireshark
Ho preso uno dei nostri . Usalo per catturare pacchetti remoti con l'output direttamente nella GUI di Wireshark locale.
:~$ ssh root@remoteserver 'tcpdump -c 1000 -nn -w - not port 22' | wireshark -k -i -
10. Copiare una cartella locale su un server remoto tramite SSH
Un bel trucco che comprime la cartella usando bzip2 (questo è l'opzione -j nel comando tar), e poi estrae il flusso bzip2 dall'altra parte, creando un duplicato della cartella sul server remoto.
localhost:~$ tar -cvj /datafolder | ssh remoteserver "tar -xj -C /datafolder"
11. App remote GUI con inoltro SSH X11
Se sia il client che il server remoto hanno installato X, è possibile eseguire un comando GUI in remoto, visualizzando la finestra sul tuo desktop locale. Questa funzione è disponibile da molto tempo, ma è comunque molto utile. Avvia un browser web remoto o anche la console di VMWare Workstation, come faccio in questo esempio.
localhost:~$ ssh -X remoteserver vmware È necessaria la riga X11Forwarding yes nel file sshd_config.
12. Copia remota di file usando rsync e SSH
rsync è molto più conveniente scp, se è necessaria una copia di backup periodica di una directory, di un gran numero di file o di file molto grandi. Qui c'è una funzione di recupero della trasmissione fallita e copia solo dei file modificati, che risparmia traffico e tempo.
In questo esempio viene utilizzata la compressione gzip (-z) e la modalità di archiviazione (-a), che include la copia ricorsiva.
:~$ rsync -az /home/testuser/data remoteserver:backup/
13. SSH attraverso la rete Tor
La rete anonima Tor può tunnelare il traffico SSH utilizzando il comando torsocks. Il seguente comando inoltrerà il proxy ssh attraverso Tor.
localhost:~$ torsocks ssh myuntracableuser@remoteserversarà utilizzato per il proxy sulla porta 9050 su localhost. Come sempre, quando si utilizza Tor, è fondamentale verificare attentamente quale traffico viene tunnelato e affrontare altre problematiche di sicurezza operativa (opsec). Dove vanno le tue richieste DNS?
14. SSH nell'istanza EC2
Per collegarsi all'istanza EC2 è necessario la chiave privata. Scaricala (estensione .pem) dalla console di gestione di Amazon EC2 e modifica le autorizzazioni (chmod 400 my-ec2-ssh-key.pem). Tieni la chiave in un posto sicuro o posizionala nella tua cartella ~/\.ssh/.
localhost:~$ ssh -i ~/\.ssh\/my-ec2-key.pem ubuntu@my-ec2-public Caratteristica -i indica semplicemente al client SSH di utilizzare questa chiave. Il file ~/.ssh/config è perfetto per configurare automaticamente l'uso della chiave quando ci si connette all'host EC2.
Host my-ec2-public
Hostname ec2???.compute-1.amazonaws.com
User ubuntu
IdentityFile ~/\.ssh\/my-ec2-key.pem
15. Modifica di file di testo con VIM tramite ssh/scp
Per tutti gli amanti vim questo consiglio ti farà risparmiare un po' di tempo. Con vim i file vengono modificati tramite scp con un unico comando. Questo metodo semplicemente crea un file localmente in /tmp, e lo copia di nuovo non appena lo abbiamo salvato da vim.
localhost:~$ vim scp://user@remoteserver//etc/hosts Nota: il formato è leggermente diverso dal solito scp. Dopo l'host abbiamo un doppio //. Questo è un link a un percorso assoluto. Una barra obliqua indica un percorso relativo alla cartella principale users.
**warning** (netrw) impossibile determinare il metodo (formato: protocol://[user@]hostname[:port]/[path])Se vedi questo errore, controlla due volte il formato del comando. Di solito indica un errore di sintassi.
16. Montare un SSH remoto come una cartella locale con SSHFS
Utilizzando sshfs — client del file system ssh — possiamo collegare una cartella locale a una posizione remota con tutte le interazioni dei file in una sessione criptata ssh.
localhost:~$ apt install sshfs Su Ubuntu e Debian, installiamo il pacchetto sshfs, e poi semplicemente montiamo la posizione remota sul nostro sistema.
localhost:~$ sshfs user@remoteserver:/media/data ~/data/
17. Multiplexing SSH usando ControlPath
Per impostazione predefinita, se è presente una connessione esistente a un server remoto tramite ssh una seconda connessione tramite ssh o scp stabilisce una nuova sessione con un'autenticazione aggiuntiva. L'opzione ControlPath permette di utilizzare la sessione esistente per tutte le connessioni successive. Questo accelera significativamente il processo: l'effetto è evidente anche in una rete locale, tanto più quando ci si connette a risorse remote.
Host remoteserver
HostName remoteserver.example.org
ControlMaster auto
ControlPath ~/ .ssh/control/%r@%h:%p
ControlPersist 10m ControlPath indica il socket per controllare le nuove connessioni per sessioni attive. ssh. L'ultima opzione significa che, anche dopo aver chiuso la console, la sessione esistente rimarrà aperta per 10 minuti, in modo da poter riconnettersi allo stesso socket durante quel periodo. Per ulteriori informazioni, consulta la documentazione. ssh_config man.
18. Streaming video tramite SSH con VLC e SFTP
Anche gli utenti più esperti ssh e vlc (Video Lan Client) non sempre sono a conoscenza di questa opzione comoda quando è necessario guardare un video in rete. Nelle impostazioni File | Apri flusso di rete programmi vlc puoi inserire la posizione come sftp://. Se è necessario un password, verrà visualizzata una richiesta.
sftp://remoteserver//media/uploads/myvideo.mkv
19. Autenticazione a due fattori
La stessa autenticazione a due fattori utilizzata per il tuo conto bancario o l'account Google è applicabile al servizio SSH.
Certo, ssh originariamente include una funzione di autenticazione a due fattori, intesa come password e chiave SSH. Il vantaggio di un token hardware o dell'app Google Authenticator è che di solito è un dispositivo fisico diverso.
Guarda la nostra guida di 8 minuti su .
20. Salti tra host con ssh e -J
Se a causa della segmentazione della rete è necessario passare attraverso più host ssh per raggiungere la rete di destinazione finale, il flag -J ti farà risparmiare tempo.
localhost:~$ ssh -J host1,host2,host3 user@host4.internal Qui è fondamentale comprendere che questo non è equivalente al comando ssh host1, poi user@host1:~$ ssh host2 e così via. L'opzione -J utilizza astutamente il forwarding, permettendo a localhost di stabilire una sessione con il successivo host nella catena. Pertanto, nell'esempio sopra, il nostro localhost si autentica su host4. In altre parole, usiamo le nostre chiavi localhost, e la sessione da localhost a host4 è completamente crittografata.
Per questa funzionalità nel ssh_config specifica l'opzione di configurazione ProxyJump. Se è necessario passare regolarmente attraverso più host, l'automazione tramite il config farà risparmiare molto tempo.
21. Bloccare i tentativi di brute force SSH con iptables
Chiunque abbia gestito un servizio SSH e controllato i log sa quante tentativi di brute force avvengono ogni ora, ogni giorno. Un modo rapido per ridurre il rumore nei log è spostare SSH su una porta non standard. Apporta le modifiche al file sshd_config con il parametro di configurazione Port##.
Con iptables è anche possibile bloccare facilmente i tentativi di connessione a una porta superando una certa soglia. Un modo semplice per farlo è utilizzare , poiché non solo blocca SSH, ma esegue anche una serie di altre misure di rilevamento delle intrusioni basate sul nome host (HIDS).
22. SSH Escape per modificare il port forwarding
E il nostro ultimo esempio ssh è progettato per modificare il port forwarding al volo all'interno di una sessione esistente ssh. Immagina uno scenario del genere. Sei in profondità nella rete; forse hai saltato attraverso una mezza dozzina di host e hai bisogno di una porta locale sulla tua workstation, che venga reindirizzata a Microsoft SMB di un vecchio sistema Windows 2003 (qualcuno ricorda ms08-67?).
Premendo enter, prova a inserire nella console ~C. Questa è una sequenza di controllo nella sessione, che consente di apportare modifiche a una connessione esistente.
localhost:~$ ~C
ssh> -h
Comandi:
-L[bind_address:]port:host:hostport Richiedi forward locale
-R[bind_address:]port:host:hostport Richiedi forward remoto
-D[bind_address:]port Richiedi forward dinamico
-KL[bind_address:]port Annulla forward locale
-KR[bind_address:]port Annulla forward remoto
-KD[bind_address:]port Annulla forward dinamico
ssh> -L 1445:remote-win2k3:445
Forwarding port. Qui puoi vedere che abbiamo reindirizzato la nostra porta locale 1445 a un host Windows 2003, che abbiamo trovato nella rete interna. Ora basta avviare msfconsole, e puoi andare avanti (supponendo che tu intenda utilizzare questo host).
Conclusione
Questi esempi, consigli e comandi ssh dovrebbero fornire un punto di partenza; ulteriori informazioni su ciascun comando e funzione sono disponibili nelle pagine di aiuto (man ssh, man ssh_config, man sshd_config).
Sono sempre stato affascinato dalla possibilità di accedere ai sistemi e di eseguire comandi da qualsiasi parte del mondo. Sviluppando le tue abilità con strumenti come ssh diventerai più efficace in qualsiasi gioco tu stia giocando.
Fonte: habr.com
