> 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!