Migliori pratiche di sicurezza


37

Ho intenzione di introdurre Ansible nel mio data center e sto cercando alcune best practice sulla sicurezza su dove individuare la macchina di controllo e su come gestire le chiavi SSH.

Domanda 1: la macchina di controllo

Naturalmente abbiamo bisogno di una macchina di controllo. La macchina di controllo ha le chiavi SSH pubbliche salvate su di essa. Se un utente malintenzionato ha accesso alla macchina di controllo, potenzialmente ha accesso all'intero data center (o ai server gestiti da Ansible). Quindi è meglio avere una macchina di controllo dedicata nel data center o una macchina di controllo remoto (come il mio laptop collegato in remoto al data center)?

Se la migliore pratica è usare il mio laptop (che potrebbe essere rubato, ovviamente, ma potrei avere le mie chiavi pubbliche salvate in modo sicuro online nel cloud o offline su un dispositivo crittografato portatile), cosa succede se ho bisogno di usare alcune interfacce web con Ansible, come Ansible Tower, Semaphore, Rundeck o Foreman, che deve essere installato su una macchina centralizzata nel datacenter? Come proteggerlo ed evitarlo per diventare un "unico punto di attacco"?

Domanda 2: le chiavi SSH

Supponiamo di dover utilizzare Ansible per eseguire alcune attività che richiedono l'esecuzione da parte di root (come l'installazione di pacchetti software o qualcosa del genere). Penso che la migliore pratica non sia usare l'utente root su server controllati, ma aggiungere un utente normale per Ansible con permessi sudo. Ma, se Ansible deve eseguire quasi tutte le attività, deve avere accesso a tutti i comandi tramite sudo. Quindi, qual è la scelta migliore:

  • lascia che Ansible usi l'utente root (con la sua chiave pubblica salvata in ~/.ssh/authorized_keys
  • creare un utente senza privilegi dedicato ad Ansible con accesso sudo
  • consentire all'utente Ansible di eseguire tutti i comandi tramite sudo specificando una password (che è unica deve essere conosciuta da ogni amministratore di sistema che utilizza Ansible per controllare quei server)
  • consente all'utente Ansible di eseguire tutti i comandi tramite sudo senza specificare alcuna password
  • altri suggerimenti?

vuoi una sottorete di gestione dedicata (o VLAN). il tuo computer di controllo sensibile si trova su quella sottorete. Se è necessario comunicare con il computer di controllo, la VPN in quella sottorete. Non lasciare che Ansible sia root
Neil McGuigan,

1
L'host di controllo Ansible sarà nella LAN interna e non sarà accessibile dall'esterno, ma penso che questo non sia sufficiente.
Mat

Risposte:


15

L'host bastion (il centro di controllo ansible) appartiene a una sottorete separata. Non dovrebbe essere direttamente accessibile dall'esterno, non dovrebbe essere direttamente accessibile dai server gestiti!

Il tuo laptop è il dispositivo meno sicuro di tutti. Una stupida mail, una stupida vulnerabilità flash, uno stupido ospite Wifi e viene pubblicizzato.

Per i server, non consentire affatto l'accesso root tramite ssh. Molti audit lo deridono.

Per rispondere, lascia che ogni amministratore utilizzi il proprio account personale su ciascun server di destinazione e lascia che sudo con le password. In questo modo nessuna password è condivisa tra due persone. Puoi controllare chi ha fatto cosa su ciascun server. Dipende da te se gli account personali consentono l'accesso con password, solo chiave ssh o richiedono entrambi.

Per chiarire ansible non è necessario utilizzare un solo nome di accesso target . Ogni amministratore può e deve avere un nome di accesso di destinazione personale.

Una nota a margine: prova a non creare mai un account chiamato una parola (come "ansible" o "admin" o "cluster" o "management" o "operator") se ha una password. L'unico buon nome per account che ha una password è il nome di un essere umano, come "jkowalski". Solo un essere umano può essere responsabile delle azioni compiute tramite l'account e responsabile della protezione impropria della propria password, "ansible" no.


Grazie, mi hai convinto a utilizzare un host bastion centralizzato in una sottorete separata nel data center. Sono anche consapevole che è meglio usare un utente personale per ogni amministratore di sistema, ma ora ho un'altra domanda (forse sarebbe meglio su una domanda Serverfault separata): come centralizzare gli utenti e le chiavi SSH su host Linux senza usare NIS, NFS condivisioni o qualcosa del genere? Si noti che ho già Active Directory per server Windows.
Mat

Ok, meglio pensare alla mia domanda, ho due possibili risposte: usa l'archiviazione della chiave LDAP o Userify (vedi due risposte sotto). Ma ... ne ho davvero bisogno? No, se uso il mio utente per distribuire nuovi utenti e chiavi tramite Ansible stesso! :-)
Mat

@Mat, concordato completamente - come ho detto sotto, non hai davvero bisogno di Userify o di strumenti simili fino a quando il tuo team non diventa più grande. (Lo rende molto più carino.) LDAP è un po 'una seccatura da installare (ricerca pam_ldap e nss_ldap), ma abbiamo incorporato strumenti per integrarli in pochi secondi con Ansible, Chef, Puppet, ecc. Inoltre, è gratuito per <20 server.
Jamieson Becker,

16

> Domanda 1: la macchina di controllo

Su Userify (informativa completa: in realtà offriamo software per gestire le chiavi ssh), ci occupiamo di tutto questo tempo, dal momento che gestiamo anche il più grande magazzino di chiavi SSH. In genere consigliamo l'installazione locale invece di utilizzare il cloud, poiché hai un maggiore controllo, riduci la tua superficie, puoi davvero bloccarlo su reti conosciute affidabili.

La cosa importante da ricordare è che, in un sistema correttamente costruito come questo, realtà non dovrebbero esserci segreti significativi che possano essere divulgati a un aggressore. Se qualcuno guida un carrello elevatore nel tuo datacenter e se ne va con il tuo server, non otterrà molto se non per alcune password con hash pesanti, probabilmente alcuni file fortemente crittografati e alcune chiavi pubbliche senza le relative chiavi private. In altre parole, non molto.

Come fai notare, i vettori di minacce reali qui sono ciò che accade se un utente malintenzionato acquisisce il controllo di quella macchina e la utilizza per distribuire i propri account utente e chiavi (pubbliche). Questo è un rischio praticamente per ogni piattaforma cloud (es: Linode). Dovresti concentrarti maggiormente sulla prevenzione dell'accesso al piano di controllo, il che significa ridurre al minimo la superficie di attacco (esponendo solo alcune porte e bloccando il più possibile quelle porte) e preferibilmente utilizzando un software che è indurito contro l'escalation dei privilegi e vari attacchi ( Iniezione SQL, XSS, CSRF, ecc.) Abilita l'accesso 2FA / MFA al piano di controllo e concentrati sul blocco di quel piano di controllo il più possibile.

Quindi è meglio avere una macchina di controllo dedicata nel data center o una macchina di controllo remoto (come il mio laptop collegato in remoto al data center)?

È sicuramente meglio avere una macchina di controllo dedicata in un datacenter sicuro, perché è possibile isolarla e bloccarla per prevenire / ridurre al minimo il rischio di furto o accesso non autorizzato.

Se la migliore pratica è usare il mio laptop (che potrebbe essere rubato, ovviamente, ma potrei avere le mie chiavi pubbliche salvate in modo sicuro online nel cloud o offline su un dispositivo crittografato portatile), cosa succede se ho bisogno di usare alcune interfacce web con Ansible, come Ansible Tower, Semaphore, Rundeck o Foreman, che deve essere installato su una macchina centralizzata nel datacenter?

Non è necessario eseguire QUALSIASI interfaccia web o piano di controllo secondario per gestire le chiavi (anche Userify) fino a quando non si è abbastanza grandi da iniziare a entrare in problemi di gestione a causa di un numero maggiore di utenti e diversi livelli di autorizzazione tra server o necessità di extra tenuta in mano per i tuoi utenti che potrebbero non avere conoscenza o accedere a Ansible per aggiornare le chiavi. L'utente in un primo momento non era molto più di un mucchio di script di shell (oggi sarebbero Ansible, probabilmente!) E non c'è nulla di sbagliato in questo, fino a quando non si inizia a richiedere un controllo di gestione aggiuntivo e modi semplici per le persone di gestire / ruotare il proprio le proprie chiavi. (Ovviamente, dai un'occhiata a Userify se arrivi a quel punto!)

Come proteggerlo ed evitarlo per diventare un "unico punto di attacco"?

Bene, ovviamente controlla tutte le risorse in rete per bloccare le cose, ma soprattutto inizia con una base sicura:

1. Progetta la tua soluzione pensando alla sicurezza fin dall'inizio. Scegli la tecnologia (ad esempio, database o lingue) che tradizionalmente ha avuto meno problemi, quindi codifica con sicurezza in prima persona. Disinfetta tutti i dati in arrivo, anche da utenti fidati. La paranoia è una virtù.

2. Alla fine, tutto si rompe. Riduci al minimo il danno quando si verifica: come hai già sottolineato, cerca di ridurre al minimo la manipolazione di materiale segreto.

3. Mantenerlo semplice. Non fare le ultime cose esotiche a meno che tu non sia sicuro che aumenterà in modo misurabile e dimostrabile la tua sicurezza. Ad esempio, abbiamo selezionato X25519 / NaCl (libsodium) su AES per il nostro livello di crittografia (crittografiamo tutto, a riposo e in movimento), perché originariamente progettato e scritto da qualcuno di cui ci fidavamo (DJB et al) ed è stato recensito dal mondo ricercatori di fama internazionale come Schneier e il team di sicurezza di Google. Usa le cose che tendono alla semplicità se sono più recenti, poiché la semplicità rende più difficile nascondere bug profondi.

4. Soddisfa gli standard di sicurezza. Anche se non cadi in un regime di sicurezza come PCI o HIPAA Security Rule, leggi questi standard e scopri come soddisfarli o almeno controlli di compensazione molto forti. Ciò contribuirà a garantire che si rispettino veramente le "migliori pratiche".

5. Esegui test di penetrazione esterni / indipendenti ed esegui ricompense di bug per assicurarti di seguire quelle migliori pratiche su base continuativa. Tutto sembra fantastico fino a quando non ci si imbatte in persone intelligenti e fortemente motivate ... una volta finito, avrai molta fiducia nella tua soluzione.


Domanda 2: le chiavi SSH Qual è la scelta migliore: lascia che Ansible utilizzi l'utente root (con la sua chiave pubblica salvata in ~/.ssh/authorized_keys/ consenti all'utente Ansible di eseguire tutti i comandi tramite sudo specificando una password (che è unica deve essere conosciuta da ogni amministratore di sistema che utilizza Ansible per controllare quei server)

Cerca di evitare di usare mai le password sui server, anche per sudo. Ciò riguarda i segreti e alla fine minerà la tua sicurezza (non puoi davvero variare molto facilmente quella password sudo tra le macchine, devi memorizzarla da qualche parte, la password significa che non puoi davvero fare l'automazione da server a server che è esattamente di cosa si tratta. Inoltre, se si lascia SSH ai valori predefiniti, tali password possono essere forzate brutalmente, il che rende le chiavi in ​​qualche modo prive di significato. Inoltre, evitare l'uso dell'utente root per qualsiasi scopo, e in particolare l'accesso remoto.

Crea un utente senza privilegi dedicato ad Ansible con accesso sudo / consenti all'utente Ansible di eseguire tutti i comandi tramite sudo senza specificare alcuna password

Esattamente. Un utente senza privilegi che è possibile ricontrollare per rispondere, con ruoli sudo. Idealmente, creare un utente standard dedicato alle comunicazioni server-server / ansible con accesso sudo (senza password).

... NB, se stavi usando Userify, il modo in cui suggerirei di farlo sarebbe quello di creare un utente Userify per Ansible (puoi anche suddividerlo per progetto o anche gruppo di server se hai più macchine di controllo ansible), genera una chiave SSH sul server di controllo e fornire la sua chiave pubblica nella pagina del profilo Userify. (Questa casella di testo diventa essenzialmente /home/ansible/.ssh/authorized_keys). Dovresti tenere l'account di sistema di risposta separato dagli altri account di sistema da server a server come un account di backup remoto, gestione segreta, ecc. Quindi invita i tuoi umani e loro possono creare e gestire anche le proprie chiavi e tutto rimane separato. Ma, proprio come con il blocco di un server di controllo Ansible, prova a bloccare il tuo server Userify (o qualunque soluzione tu disponga) allo stesso modo.

altri suggerimenti?

Penso che tu stia sicuramente affrontando questo nel modo giusto e facendo le domande giuste. Se desideri discutere di questo genere di cose, inviami un'e-mail (nome del primo punto a userify) e sarei felice di avere una chat, indipendentemente dalla direzione che segui. In bocca al lupo!


5

Risposta 1: la macchina di controllo

Un po 'di entrambi, è possibile utilizzare il laptop per connettersi ai server tramite un host bastione. qualcosa di simile a:

Host private1
  IdentityFile ~/.ssh/rsa_private_key
  ProxyCommand ssh user@bastion -W %h:%p

Host bastion
  IdentityFile ~/.ssh/bastion_rsa_key

Altro sugli host bastion

Dove hai una chiave per il server bastione e quindi una chiave separata per l'host dietro di esso. (personalmente userei gpg-agent / ssh-agent)

Risposta 2: autenticazione

Non sono sicuro di come le migliori pratiche specifiche "rispondibili" differiscano dalle altre migliori pratiche di connessione ssh. Ma no, vuoi eseguire ansible come te stesso, non un account di servizio e non un account di root.

Una combinazione delle seguenti autenticazioni:

Altri pensieri:

  • Conservare sempre segreti / informazioni private in ansible-vault.
  • Ansible non richiede l'esecuzione di SUDO / Root, a meno che ciò che stai facendo non richieda sudo / root.
  • Ansible può elevare le autorizzazioni in molti modi diversi

Infine, non hai menzionato nulla di Windows. Quindi posso solo supporre che tu non lo stia usando. Tuttavia, in questo caso, utilizzerei l'opzione delegate per fare in modo che il laptop utilizzi l'host bastion (delegate_to bastion.hostname.fqdn:) e kerberos / winrm https con i biglietti Kerberos.

Nel caso in cui tu lo abbia perso, la migliore pratica per il calcolo, non fare mai nulla come root, usa sempre account con nome

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.