TL; DR: vai in fondo alla risposta, "Applicazione delle restrizioni"
L'aggiunta di un utente con accesso limitato consiste di due parti: 1. Creazione dell'utente 2. Configurazione del demone SSH (sshd)
Configurazione di sshd
Il posto migliore per conoscere le possibilità di SSH è leggere le relative pagine di manuale:
Dove può eseguire azioni il client SSH?
Prima di poter limitare qualcosa, è necessario conoscere le funzionalità di SSH. Sputare attraverso le pagine del manuale produce:
- Shell comanda l'esecuzione
- Caricamento file tramite sftp
- Port forwarding
- Il client inoltra al server una porta (non) utilizzata
- Il server inoltra la sua porta al client
- Il server inoltra al client una porta di un altro host (proxy-ish)
- X11 forwarding (display forwarding)
- Inoltro dell'agente di autenticazione
- Inoltro di un dispositivo tunnel
Dalla sezione Autenticazione della pagina del manuale di sshd (8) :
Se il client si autentica correttamente, viene inserita una finestra di dialogo per preparare la sessione. In questo momento il client può richiedere cose come l'
allocazione di una pseudo-tty, l'inoltro di connessioni X11, l'inoltro di connessioni TCP o l'inoltro della connessione dell'agente di autenticazione sul canale protetto.
Successivamente, il client richiede una shell o l'esecuzione di un comando . I lati quindi entrano in modalità sessione. In questa modalità, entrambe le parti possono inviare dati in qualsiasi momento e tali dati vengono inoltrati a / dalla shell o dal comando sul lato server e al terminale utente sul lato client.
Opzioni per limitare le funzionalità SSH
I file e le loro opzioni che alterano il comportamento sono:
~/.ssh/authorized_keys
- contiene chiavi a cui è consentito connettersi a cui è possibile assegnare opzioni:
command="command"
- Il comando fornito dall'utente (se presente) viene ignorato. Si noti che il client può specificare l'inoltro TCP e / o X11 a meno che non siano esplicitamente vietati . Nota che questa opzione si applica all'esecuzione di shell, comandi o sottosistemi.
no-agent-forwarding
- Vieta l'inoltro dell'agente di autenticazione quando questa chiave viene utilizzata per l'autenticazione.
no-port-forwarding
- Vieta l'inoltro TCP quando questa chiave viene utilizzata per l'autenticazione
no-X11-forwarding
- "Vieta l'inoltro X11 quando questa chiave viene utilizzata per l'autenticazione."
permitopen="host:port"
- Limitare il port forwarding 'ssh -L' locale in modo tale che possa connettersi solo all'host e alla porta specificati.
~/.ssh/environment
- Questo file viene letto nell'ambiente all'accesso (se esiste). L'elaborazione dell'ambiente è disabilitata per impostazione predefinita ed è controllata tramite l'opzione PermitUserEnvironment
~/.ssh/rc
- Contiene routine di inizializzazione da eseguire prima che la directory home dell'utente diventi accessibile.
/etc/ssh/sshd_config
- il file di configurazione dell'intero sistema
AllowAgentForwarding
- Specifica se è consentito l'inoltro di ssh-agent (1).
AllowTcpForwarding
ForceCommand
- "Forza l'esecuzione del comando specificato da ForceCommand, ignorando qualsiasi comando fornito dal client e ~ / .ssh / rc se presente. Il comando viene invocato utilizzando la shell di accesso dell'utente con l'opzione -c."
GatewayPorts
- "Specifica se agli host remoti è consentito connettersi alle porte inoltrate per il client. Per impostazione predefinita, sshd (8) associa i port forwarding remoti all'indirizzo di loopback. Ciò impedisce ad altri host remoti di connettersi alle porte inoltrate. GatewayPorts può essere utilizzato per specificare che sshd dovrebbe consentire il port forwarding remoto da associare a indirizzi non loopback, permettendo così ad altri host di connettersi. "
PermitOpen
:
Specifica le destinazioni a cui è consentito il port forwarding TCP. La specifica di inoltro deve essere una delle seguenti forme:
PermitOpen host:port
PermitOpen IPv4_addr:port
PermitOpen [IPv6_addr]:port
I forward multipli possono essere specificati separandoli con spazi bianchi. Un argomento di "qualsiasi" può essere utilizzato per rimuovere tutte le restrizioni e consentire eventuali richieste di inoltro. Per impostazione predefinita sono consentite tutte le richieste di port forwarding.
PermitTunnel
- Specifica se è consentito l'inoltro del dispositivo tun (4). L'impostazione predefinita è "no"
X11Forwarding
- Specifica se è consentito l'inoltro X11. L'impostazione predefinita è "no"
Applicando le restrizioni
La modifica del file di configurazione a livello di sistema /etc/ssh/sshd_config
consente di applicare la configurazione anche se viene applicata l'autenticazione basata su password o se le restrizioni ~/.ssh/authorized_keys
vengono rimosse accidentalmente. Se hai modificato le impostazioni predefinite globali, dovresti decommentare le opzioni di conseguenza.
Match User limited-user
#AllowTcpForwarding yes
#X11Forwarding no
#PermitTunnel no
#GatewayPorts no
AllowAgentForwarding no
PermitOpen localhost:62222
ForceCommand echo 'This account can only be used for [reason]'
Ora aggiungi un utente:
sudo useradd -m limited-user
L'opzione ForceCommand
può essere omessa se la shell è impostata su un tipo non shell /bin/false
(o /bin/true
) in quanto /bin/false -c [command]
non farà nulla.
Ora il client può connettersi solo alla porta 62222 sull'indirizzo di loopback del server su SSH (non ascolterà sull'indirizzo IP pubblico)
La disabilitazione AllowTcpForwarding
impedirebbe anche l'uso di -R
, sconfiggendo così l'uso di un account così limitato per l'inoltro di una singola porta. PermitOpen localhost:62222
presuppone che la porta 62222 sul server non sia mai in uso perché il client può connettersi felicemente ad esso e ascoltare anche su di esso.
Se l'inoltro TCP è consentito nella configurazione a livello di sistema e l'autenticazione basata su password disabilitata, è possibile utilizzare anche le impostazioni per chiave. Modifica ~/.ssh/authorized_keys
e aggiungi le opzioni seguenti prima di ssh-
(con uno spazio tra le opzioni e ssh-
):
command="echo 'This account can only be used for [reason]'",no-agent-forwarding,no-X11-forwarding,permitopen="localhost:62222"
Verificare
Per essere sicuri che funzioni come previsto, è necessario eseguire alcuni casi di test. Nei comandi seguenti, host
deve essere sostituito dall'account di accesso effettivo se non è impostato ~/.ssh/config
. Dietro al comando, viene mostrato un comando che dovrebbe essere eseguito sul client o sul server (come specificato).
# connection closed:
ssh host
# connection closed (/bin/date is not executed):
ssh host /bin/date
# administratively prohibited (2x):
ssh host -N -D 62222 # client: curl -I --socks5 localhost:62222 example.com
ssh host -N -L 8080:example.com:80 # client: curl -I localhost:8080
sftp host
# should be possible because the client should forward his SSH server
ssh host -N -R 8080:example.com:80 # server: curl -I localhost:8080
# This works, it forwards the client SSH to the server
ssh host -N -R 62222:localhost:22
# unfortunately, the client can listen on that port too. Not a big issue
ssh host -N -L 1234:localhost:62222
Conclusione
Elenco di controllo: l'utente SSH non dovrebbe:
- esegui comandi shell - fatto
- accedere ai file o caricare i file sul server - fatto
- usa il server come proxy (es. webproxy) - fatto
- accedere a servizi locali che altrimenti non erano accessibili al pubblico a causa di un firewall - in parte , il client non può accedere ad altre porte oltre a 62222, ma può ascoltare e connettersi alla porta 62222 sul server
- kill the server - done
(nota che questi controlli sono limitati al server SSH. Se hai un altro servizio vulnerabile sulla macchina, potrebbe consentire a un eventuale aggressore di eseguire comandi, uccidere il server, ecc.)