Come indurire un server SSH?


128

Quali misure posso / dovrei prendere per assicurarmi che la sicurezza attorno al mio server SSH sia assolutamente impermeabile?

Questa sarà la wiki della comunità fin dall'inizio, quindi vediamo cosa fanno le persone per proteggere i loro server.


44
L'impermeabilità assoluta richiede lo spegnimento della scatola.
Thorbjørn Ravn Andersen,

Cosa succede se si dispone di Wake-on-LAN?
rebus,

Il problema sarebbe la parte LAN ... I pacchetti Wake-on-LAN non vengono instradati, quindi dovresti avere accesso a una macchina all'interno della LAN per inviare il pacchetto WOL ...
LassePoulsen

Per l'autenticazione con chiave potresti limitare i Cipher ai cifrari di cui hai veramente bisogno.

Risposte:


108

Utilizzare le coppie di chiavi pubbliche / private per l'autenticazione anziché le password.

  1. Genera una chiave SSH protetta da passphrase per ogni computer che deve accedere al server:

    ssh-keygen

  2. Consentire l'accesso SSH a chiave pubblica dai computer consentiti:

    Copia il contenuto di ~/.ssh/id_rsa.pubogni computer in singole righe del ~/.ssh/authorized_keysserver o eseguilo ssh-copy-id [server IP address]su tutti i computer a cui stai concedendo l'accesso (dovrai inserire la password del server al prompt).

  3. Disabilita accesso SSH password:

    Apri /etc/ssh/sshd_config, trova la riga che dice #PasswordAuthentication yese modificala in PasswordAuthentication no. Riavviare il demone del server SSH per applicare il change ( sudo service ssh restart).

Ora, l'unico modo possibile per SSH nel server è usare una chiave che corrisponda a una linea ~/.ssh/authorized_keys. Utilizzando questo metodo, io non mi preoccupo di attacchi di forza bruta, perché anche se indovinare la password, sarà rifiutato. La forzatura bruta di una coppia di chiavi pubblica / privata è impossibile con la tecnologia di oggi.


5
-1: Generalmente l'accesso è concesso a singoli non computer, la creazione di una chiave per ogni potenziale computer client che si collega al server è irragionevole. La tua ultima affermazione non è corretta, secondo la tua richiesta e poiché non hai suggerito di impostare una passphrase per le chiavi private che hanno accesso / compromissione di uno dei sistemi client concederebbe automaticamente l'accesso al server SSH. L'autenticazione con chiave SSH è consigliata ma le chiavi private devono essere adeguatamente protette e devono essere utilizzate su base individuale, non in modo distribuito come descritto.
João Pinto,

7
"In genere l'accesso è concesso a singoli non computer, la creazione di una chiave per ogni potenziale computer client che si collega al server è irragionevole" Ci sono molte opzioni e penso che descrivere come trasferire in modo sicuro una chiave privata su ogni client sembri al di fuori dell'ambito di questa domanda . Non sto presentando tutte le opzioni, solo una semplice che penso che le persone possano capire. "... dovrebbe essere usato su base individuale, non in modo distribuito come descritto" Questo sembra contraddire la tua precedente affermazione e non ho descritto nulla come distribuito.
Asa Ayers,

5
"impossibile" sta forse esagerando un po '.
Thorbjørn Ravn Andersen,

9
Questo è il motivo per cui dico "impossibile". Nessuno ha un computer così veloce così piccolo o così tanto tempo. "Immagina un computer delle dimensioni di un granello di sabbia in grado di testare le chiavi su alcuni dati crittografati. Immagina anche di poter testare una chiave per il tempo impiegato dalla luce per attraversarla. Quindi considera un gruppo di questi computer, così tanti che se li coprissi con la terra, coprirebbero l'intero pianeta fino all'altezza di 1 metro. Il gruppo di computer creerebbe in media una chiave a 128 bit in 1.000 anni. "
Asa Ayers,

@ ThorbjørnRavnAndersen "Impossible" non lo sta davvero esagerando, purché usi una chiave forte. Non riesco a trovare un preventivo in questo momento, ma con l'attuale lunghezza dei tasti, gli attacchi di forza bruta sono impossibili "fino a quando i computer non sono composti da qualcosa di diverso dalla materia e occupano qualcosa di diverso dallo spazio".
Maximillian Laumeister,

72

Suggerirei:

  • Utilizzo di fail2ban per impedire tentativi di accesso con forza bruta.

  • Disabilitazione dell'accesso come root tramite SSH. Ciò significa che un utente malintenzionato ha dovuto capire sia il nome utente che la password rendendo un attacco più difficile.

    Aggiungi PermitRootLogin noal tuo /etc/ssh/sshd_config.

  • Limitare gli utenti che possono SSH al server. O per gruppo o solo utenti specifici.

    Aggiungi AllowGroups group1 group2o AllowUsers user1 user2limita chi può SSH sul server.


2
I AllowUsers e AllowGroups non accetta una virgola , come delimitatore. Assicurati di non provarlo da remoto. Continuo a essere bloccato fuori dal mio NAS facendo questo in modo errato.
rumore senza arte

4
Verificare sempre che la sshdconfigurazione sia corretta prima di riavviare sshd, per evitare di bloccarsi fuori dalla macchina. Consulta questo blog per i dettagli: esegui subito sshd -Tuna modifica alla configurazione prima di riavviare il principale sshd. Inoltre, avere una sessione SSH aperta sul computer quando si apporta la modifica della configurazione e non chiuderla fino a quando non si è convalidata la configurazione come indicato e forse non è stato eseguito un accesso SSH di prova.
RichVel,

24

Altre risposte forniscono sicurezza, ma c'è una cosa che puoi fare che renderà i tuoi registri più silenziosi e renderà meno probabile che sarai bloccato dal tuo account:

Spostare il server dalla porta 22 a un'altra. O sul tuo gateway o sul server.

Non aumenta la sicurezza, ma significa che tutti gli scanner casuali di Internet non ingombreranno i tuoi file di registro.


1
Per coloro che credono nella sicurezza per oscurità ( en.wikipedia.org/wiki/Security_through_obscurity ) ha molto senso usare un'altra porta. Non credo però ...
LassePoulsen,

32
Non si tratta di Security Through Obscurity (sebbene l'oscurità possa avere un effetto marginale positivo). Si tratta di ridurre il rumore di fondo di infiniti tentativi di forza bruta. Non è possibile controllare in modo utile i registri degli errori di accesso se sono pieni di attacchi automatici; fail2ban non riduce abbastanza il volume dato il numero di aggressori e la prevalenza di attacchi distribuiti (botnet) e strozzati. Con ssh su una porta insolita, sai che gli attacchi che vedi nei registri provengono da un vero attaccante interessato alla tua scatola. Lo consiglio vivamente.
Bobince,

Dal momento che è possibile eseguire query su servizi Internet come shodan per server ssh rivolti al web, o l'utilizzo di nmap e banner capture rende praticamente inutile cambiare la porta predefinita. lo sconsiglio.
SLow Loris,

Shodan non afferra tutte le porte a 65k, quindi passare a una porta alta probabilmente lo rimuoverà dalle loro scansioni. Inoltre, se ti sposti su una porta alta casuale, l'attaccante dovrà probabilmente eseguire scansioni TCP 65K (molto rumorose) per trovare il tuo servizio per iniziare ad attaccarlo. Entrambe sono vincite dal punto di vista della sicurezza, quindi spostarsi in un porto alto è generalmente un buon piano. Un altro è che spostandosi su una porta più alta puoi avere un'idea migliore che qualcuno che ti sta attaccando sta
prendendo di

23

Abilita l'autenticazione a due fattori con HOTP o TOTP . Questo è disponibile dal 13.10 in poi.

Ciò include l'uso dell'autenticazione con chiave pubblica rispetto all'autenticazione tramite password come in un'altra risposta qui, ma richiede anche all'utente di provare di possedere il suo dispositivo di secondo fattore oltre alla sua chiave privata.

Sommario:

  1. sudo apt-get install libpam-google-authenticator

  2. Chiedi a ciascun utente di eseguire il google-authenticatorcomando, che genera ~/.google-authenticatore aiuta a configurare i dispositivi a due fattori (ad es. L'app Android Google Authenticator).

  3. Modifica /etc/ssh/sshd_confige imposta:

    ChallengeResponseAuthentication yes
    PasswordAuthentication no
    AuthenticationMethods publickey,keyboard-interactive
    
  4. Esegui sudo service ssh reloadper ritirare le modifiche a /etc/ssh/sshd_config.

  5. Modifica /etc/pam.d/sshde sostituisci la riga:

    @include common-auth
    

    con:

    auth required pam_google_authenticator.so
    

Maggiori dettagli su diverse opzioni di configurazione sono il mio post sul blog dello scorso anno: migliore autenticazione ssh a due fattori su Ubuntu .


21

Rendere gli IP del client sshd block che non sono riusciti a fornire le informazioni di accesso corrette " DenyHØsts " può svolgere questo lavoro in modo abbastanza efficace. L'ho installato su tutti i miei box Linux che sono in qualche modo raggiungibili dall'esterno.

Questo farà in modo che gli attacchi di forza sull'SSHD non siano efficaci, ma ricorda (!) In questo modo puoi finire per bloccarti se dimentichi la password. Questo può essere un problema su un server remoto a cui non hai accesso.


2
C'è qualche opzione come 10 tentativi di accesso falliti prima di vietare l'indirizzo IP?
Sayantankhan,

20

Ecco una cosa semplice da fare: installare ufw (il "firewall semplice") e usarlo per limitare le connessioni in entrata.

Da un prompt dei comandi, digitare:

$ sudo ufw limit OpenSSH 

Se ufw non è installato, farlo e riprovare:

$ sudo aptitude install ufw 

Molti aggressori cercheranno di utilizzare il server SSH per le password a forza bruta. Ciò consentirà solo 6 connessioni ogni 30 secondi dallo stesso indirizzo IP.


+1 L'uso del limite può essere buono. Tuttavia, dovrei sottolineare che ho riscontrato problemi durante l'utilizzo del server sftp integrato in quanto limita le connessioni anche per questo.
Mark Davidson,

2
@Mark - buon punto, ma non sembra un client SFTP scritto male? Perché dovrebbero continuare a riconnettersi alla porta SSH quando potrebbero semplicemente aprire più canali SSH?
mpontillo,

12

Se voglio avere un po 'di sicurezza in più o devo accedere ai server SSH in profondità all'interno di una rete aziendale, installo un servizio nascosto usando il software di anonimizzazione Tor .

  1. Installa Tor e configura il server SSH stesso.
  2. Assicurati che sshd ascolti solo localhost.
  3. Aprire /etc/tor/torrc. Imposta HiddenServiceDir /var/lib/tor/sshe HiddenServicePort 22 127.0.0.1:22.
  4. Guarda var/lib/tor/ssh/hostname. C'è un nome come d6frsudqtx123vxf.onion. Questo è l'indirizzo del servizio nascosto.
  5. Apri $HOME/.ssh/confige aggiungi alcune righe:

    Host myhost
    HostName d6frsudqtx123vxf.onion
    ProxyCommand socat STDIO SOCKS4A:127.0.0.1:%h:%p,socksport=9050
    

Inoltre ho bisogno di Tor sul mio host locale. Se è installato, posso accedere ssh myhoste SSH apre una connessione tramite Tor. Il server SSH dall'altra parte apre la sua porta solo su localhost. Quindi nessuno può collegarlo tramite "Internet normale".


10
Sicurezza dall'oscurità avanzata, ma molto interessante.
Johannes,

8

C'è un articolo di Debian Administration su questo argomento. Copre la configurazione di base del server SSH e anche le regole del firewall. Questo potrebbe essere interessante anche per rafforzare un server SSH.

Vedi l'articolo qui: Protezione dell'accesso SSH .


3
Un po 'in ritardo, ma per favore, quando rispondi alle domande, copia le parti importanti da un link in modo che se il link decade, le informazioni sono ancora qui.
umop aplsdn,

1
Buona idea. Anche se sto attraversando un periodo con molto meno tempo per partecipare. La mia risposta è una "community wiki", quindi sentiti libero di aggiungere le informazioni sul link se hai tempo.
Huygens,

6

Il mio approccio all'indurimento SSH è ... complesso. I seguenti elementi sono in termini di come lo faccio, dal bordo più esterno della mia rete (s) ai server stessi.

  1. Filtraggio a livello di frontiera del traffico tramite IDS / IPS con scanner e firme di servizi noti nella block list. Lo raggiungo con Snort tramite il mio firewall di confine (questo è il mio approccio, un'appliance pfSense). A volte, tuttavia, non posso farlo, ad esempio con i miei VPS.

  2. Filtro firewall / rete delle porte SSH. Autorizzo esplicitamente solo alcuni sistemi a raggiungere i miei server SSH. Questo viene fatto tramite un firewall pfSense al confine della mia rete, oppure i firewall su ciascun server vengono esplicitamente configurati. Ci sono casi in cui non riesco a farlo, tuttavia (il che non è quasi mai il caso, tranne che in ambienti privati ​​di test con penna o test di sicurezza in cui i firewall non aiutano a testare le cose).

  3. In combinazione con my pfSense, o un firewall di confine NAT, che collega la rete interna e si separa da Internet e dai sistemi, l' accesso ai server solo VPN . Devo VPN nelle mie reti per accedere ai server, perché non ci sono porte rivolte a Internet in quanto tali. Questo sicuramente non funziona per tutti i miei VPS, ma in combinazione con il n. 2, posso avere un VPS come "gateway" tramite VPN su quel server e quindi consentire i suoi IP alle altre caselle. In questo modo, so esattamente cosa può o non può essere SSH - la mia unica casella che è la VPN. (Oppure, nella mia rete domestica dietro pfSense, la mia connessione VPN e sono l'unico con accesso VPN).

  4. Laddove il n. 3 non è possibile, fail2ban, configurato per bloccare dopo 4 tentativi falliti e bloccare gli IP per un'ora o più è una protezione decente contro le persone che attaccano costantemente con il bruteforcing: basta bloccarli automaticamente sul firewall con fail2ban e meh. Configurare fail2ban è una seccatura però ...

  5. Offuscamento della porta modificando la porta SSH. Tuttavia, questa NON è una buona idea da fare senza ulteriori misure di sicurezza : il mantra di "Sicurezza attraverso l'oscurità" è già stato confutato e contestato in molti molti casi. L'ho fatto insieme a IDS / IPS e al filtro di rete, ma è ancora MOLTO scarso da fare da solo.

  6. Autenticazione a due fattori OBBLIGATORIA, tramite le soluzioni di autenticazione a due fattori di Duo Security . Ognuno dei miei server SSH ha Duo configurato su di esso, in modo tale che, anche per entrare, avvengano i messaggi 2FA e devo confermare ogni accesso. (Questa è la massima funzionalità utile - perché anche se qualcuno ha la mia passphrase o si rompe, non può superare i plugin Duo PAM). Questa è una delle maggiori protezioni sui miei server SSH dall'accesso non autorizzato: ogni accesso utente DEVE ricollegarsi a un utente configurato in Duo e poiché ho un set restrittivo, nessun nuovo utente può essere registrato nel sistema.

I miei due centesimi per proteggere SSH. O almeno i miei pensieri sull'approccio.


1

Potresti voler controllare l'app FreeOTP da RedHat invece di utilizzare Google Authenticator. A volte durante l'aggiornamento dell'app, ti bloccano! ;-)

Se si desidera utilizzare altri token hardware come Yubikey o eToken PASS o NG o se si hanno molti utenti o molti server, è possibile utilizzare un back-end di autenticazione a due fattori opensource.

Ultimamente ho scritto un howto su questo .


0

Ho scritto un piccolo tutorial su come farlo di recente. Fondamentalmente, è necessario utilizzare PKI e il mio tutorial mostra anche come utilizzare l'autenticazione a due fattori per una sicurezza ancora maggiore. Anche se non usi nessuna di queste cose, ci sono anche alcuni suggerimenti su come proteggere il server rimuovendo le suite di cifratura deboli e altre basi. https://joscor.com/blog/hardening-openssh-server-ubuntu-14-04/


0

Per un gran numero di utenti / certificati considerare l'integrazione LDAP. Le grandi organizzazioni utilizzano LDAP come repository per le credenziali utente e i certificati archiviati su badge o portamonete, indipendentemente dal fatto che i certificati vengano utilizzati per l'autenticazione o la firma di e-mail. Gli esempi includono openLDAP, openDJ, Active Directory, Oracle Universal Directory, IBM Directory Server, snareWorks ...

Computer e gruppi possono anche essere gestiti in LDAP fornendo una gestione delle credenziali centralizzata. In questo modo i banchi di assistenza possono avere uno sportello unico per gestire grandi popolazioni.

Ecco un link per l'integrazione di centOS: http://itdavid.blogspot.com/2013/11/howto-configure-openssh-to-fetch-public.html


0

È inoltre possibile bloccare in base al paese di origine utilizzando il database geoIP.

Fondamentalmente se vivi negli Stati Uniti, non c'è motivo per qualcuno in Russia di connettersi al tuo SSH, quindi verranno automaticamente bloccati.

Lo script può essere trovato qui: https://www.axllent.org/docs/view/ssh-geoip/

Puoi anche aggiungere i comandi iptables (l'ho fatto per i miei droplet) per eliminare automaticamente tutto il traffico verso / da quegli IP.


1
A volte i database di GeoIP possono essere sbagliati - mi è stato chiesto se ero a Mosca ieri ... eh no! :)
Sean,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.