Come posso implementare con password sicure per-host, in modo sicuro?

Vorrei usare il potenziale per gestire un gruppo di server esistenti. Ho creato un file di ansible_hosts e testato con successo (con l'opzione -K ) con comandi che mirano solo ad un singolo host

 ansible -i ansible_hosts host1 --sudo -K # + commands ... 

Il mio problema è ora che le password utente di ciascun host sono diverse, ma non riesco a trovare un modo per gestirlo in Ansible.

  • Sicurezza server remoto: gestire gli strumenti di compilazione
  • Come navigare in modo sicuro da un computer pubblico pubblico?
  • Se utilizzo iptables per connettere connessioni TCP solo da un IP specifico, può essere falso?
  • Limitazione dell'accesso di networking del contenitore Docker
  • Trovare gli ultimi login effettivi e tentativi falliti di un server CentOS
  • Come monitorare le modifiche del Registro di sistema del server Windows
  • Utilizzando -K , mi viene sollecitato solo una singola sudo password, che sembra essere provata per tutti gli host successivi senza richiedere:

     host1 | ... host2 | FAILED => Incorrect sudo password host3 | FAILED => Incorrect sudo password host4 | FAILED => Incorrect sudo password host5 | FAILED => Incorrect sudo password 

    Ricerca finora:

    • una domanda di StackOverflow con una risposta scorretto ("uso -K ") e una risposta dall'autore dicendo "Trovato ho bisogno di un sudo passwordless"

    • i documenti Ansible , che dicono che "l'utilizzo di sudo password non consente di automatizzare le cose, ma non è necessario ." (enfasi mia)

    • questa domanda di sicurezza di StackExchange che la legge come NOPASSWD

    • articolo "Scalable and Understandable Provisioning …" che dice:

      "il sudo di esecuzione può richiedere la digitazione di una password, che è un modo sicuro di bloccare Ansible forever. Una correzione semplice è eseguire visudo sull'host di destinazione e assicurarsi che l'utente Ansible utilizzerà per l'accesso non deve digitare una password"

    • articolo "Basic Playable Books" , che dice

      "Ansible potrebbe entrare nel server di destinazione come root e evitare la necessità di sudo, o lasciare che l'utente potenziale abbia sudo senza una password, ma il pensiero di fare o rende la mia milza minacciosa di saltare la mia gola e bloccare il mio ventre, quindi non"

      I miei pensieri esattamente, ma allora come estendere oltre un singolo server?

    • # 1227 , "Forse dovrebbe chiedere la password sudo per tutti gli utenti in un playbook", che è stato chiuso un anno fa da mpdehaan con il commento "Non ho visto molta richiesta per questo, penso che la maggior parte delle persone sudoing da un solo l'account utente o utilizzando le chiavi per la maggior parte del tempo ".

    Quindi … come sono le persone che usano l'Ansible in situazioni come queste? Impostando NOPASSWD in /etc/sudoers , riutilizzando la password tra gli host o abilitando l'accesso SSH root, tutti sembrano riduzioni piuttosto drastiche della sicurezza.

  • Quanto è sicuro Virtualmin?
  • Perché "AcceptEnv *" è considerato insicuro?
  • Buona idea? Rifiuti i email in arrivo con il nostro dominio finale? (perché devono essere falsi)
  • C'è un buon modo per garantire l'accesso a un integer server di gestione temporanea?
  • Bambini + vecchi computer + la nostra networking in ufficio: Rischio di sicurezza?
  • Dove gestisce credenziali Credential Manager nel file system?
  • 6 Solutions collect form web for “Come posso implementare con password sicure per-host, in modo sicuro?”

    Hai certamente fatto la tua ricerca …

    Da tutta la mia esperienza con ciò che stai cercando di realizzare, non è supportta. Come hai accennato, afferma che non richiede sudo password senza password e tu sei corretto, non lo fa. Ma devo ancora vedere un metodo di utilizzo di più password del sudo all'interno di un evento, senza ovviamente eseguire più configurazioni.

    Quindi, non posso offrire la soluzione esatta che stai cercando, ma hai chiesto …

    "Quindi … come si usa l'utente in situazioni come queste? L'impostazione di NOPASSWD in / etc / sudoers, riutilizzare la password tra gli host o abilitare l'accesso SSH di root sembrano sembrare piuttosto drastiche riduzioni della sicurezza".

    Posso darti una visione su questo. Il mio caso d'uso è i nodes 1k in più centri di dati che supportno una società globale di SaaS in cui devo progettare / implementare alcuni controlli di sicurezza insanamente stretti a causa della natura del nostro business. La sicurezza è sempre in equilibrio, più usabilità less sicurezza, questo process non è diverso se si esegue 10 server o 1.000 o 100.000.

    È assolutamente corretto non utilizzare le registrazioni di root tramite password o chiavi ssh. Infatti, il login root deve essere distriggersto interamente se i server hanno un cavo di networking collegato a loro.

    Consente di parlare di riutilizzo della password in una grande impresa, è ragionevole chiedere a sysadmin di avere password diverse per each nodo? forse per un paio di nodes, ma i miei amministratori / ingegneri avrebbero ammutinato se wheressero avere password diverse su 1000 nodes. L'implementazione che sarebbe quasi imansible, inoltre, each utente dovrebbe memorizzare le proprie password proprio da qualche parte, si spera un keypass, non un foglio di calcolo. Ogni volta che metti una password in una posizione in cui può essere estratta in text semplice, hai notevolmente ridotto la tua sicurezza. Mi piacerebbe piuttosto che sapessero, a memory, una o due password veramente forti di wherere consultare un file di keypass each volta che wherevano accedere o invocare sudo su una macchina.

    Quindi il risistemazione della password e la standardizzazione sono qualcosa che è completamente accettabile e standard anche in un ambiente sicuro. In caso contrario, ldap, keystone e altri servizi directory non dovrebbero esistere.

    Quando ci trasferiamo agli utenti automatizzati, le chiavi ssh funzionano ottimamente per farti entrare, ma devi ancora passare attraverso il sudo. Le tue scelte sono una password standardizzata per l'utente automatizzato (che è accettabile in molti casi) o per abilitare NOPASSWD come indicato. La maggior parte degli utenti automatizzati eseguono solo alcuni comandi, quindi è abbastanza ansible e certamente auspicabile abilitare NOPASSWD, ma solo per i comandi pre-approvati. Suggerisco di utilizzare la tua gestione di configuration (in questo caso) per gestire il file sudoers in modo da poter aggiornare facilmente l'elenco dei comandi senza password.

    Ora, ci sono alcuni passi che puoi intraprendere una volta iniziato a scalare per isolare ulteriormente il rischio. Mentre abbiamo 1000 nodes, non tutti sono server di produzione, alcuni sono ambienti di prova, ecc. Non tutti gli amministratori possono accedere ai server di produzione, quelli che possono utilizzare il loro stesso utente / passkey SSO come avrebbero altrove . Ma gli utenti automatizzati sono un po 'più sicuri, ad esempio uno strumento automatizzato che gli amministratori non di produzione possono accedere, dispone di utenti e credenziali che non possono essere utilizzati nella produzione. Se si desidera avviare la conoscenza su tutti i nodes, è necessario farlo in due lotti, una volta per non produzione e una volta per la produzione.

    Utilizziamo anche il burattino poiché è uno strumento di gestione della configuration che impone, quindi la maggior parte delle modifiche a tutti gli ambienti verrebbe spinta via.

    Ovviamente, se la richiesta di carattere che hai citato viene riaperta / completata, ciò che stai cercando di fare sarà completamente supportto. Anche allora la sicurezza è un process di valutazione del rischio e compromesso. Se hai solo pochi nodes per ricordare le password senza ricorrere a una nota post-it, le password separate sarebbero leggermente più sicure. Ma per la maggior parte di noi, non è un'opzione fattibile.

    Dal 1.5 ansible, è ansible utilizzare una coda di crittografia per host_vars e altre variables. Questo consente alless di memorizzare in modo sicuro una variabile per-host (o per gruppo) di ansible_sudo_pass . Purtroppo, il --ask-vault-pass solo una sola password di vault per invocazione pertinente, quindi sei ancora vincolato a una sola password di volta per tutti gli host che userai insieme.

    Tuttavia, per alcuni utilizzi questo può essere un miglioramento rispetto all'utilizzo di una singola password sudo in più host, in quanto un utente malintenzionato senza accesso alle host_vars crittografate avrebbe ancora bisogno di una password separata sudo per each macchina (o gruppo di macchine) che attacca.

    Con l'Ansible 1.5, è ansible impostare la variabile ansible_sudo_pass usando la lookup('password', …) :

     ansible_sudo_pass: "{{ lookup('password', 'passwords/' + inventory_hostname) }}" 

    Trovo più conveniente che usare file in host_vars/ per diversi motivi:

    • In realtà uso with_password: "passwords/{{ inventory_hostname}} encrypt=sha256_crypt" per fornire le password per l'utente remoto deploy (che è quindi necessario per il sudo ), per cui sono già presenti nei file (anche se questi look chiaramente persi perdono il valore del sale memorizzato nel file quando viene generato il valore di rasatura).

    • Questo mantiene solo le password nel file (no ansible_sudo_pass: noto text chiaro) per un certo aumento di epsilon nella protezione crittografica. Più significativamente, significa che non state crittando tutte le altre variables specifiche dell'host, in modo che possano essere lette senza la password del vault.

    • Mettendo le password in una directory separata rende più semplice mantenere i file fuori dal controllo di origine o utilizzare uno strumento come il git-crypt per memorizzarli in forma crittografata (puoi utilizzare questo con Ansible precedente che manca la function di volta). Io uso la cripta di git e dal momento che ho solo controllare il repository in forma decriptata su filesystem crittografati, non mi preoccupo della volta e quindi non ho bisogno di digitare una password di vault. (L'utilizzo di entrambi sarebbe naturalmente più sicuro.)

    È anche ansible utilizzare la function di ricerca con ansible_ssh_pass ; questo può anche essere ansible con versioni precedenti di Ansible che non dispongono di ansible_sudo_pass .

    L'utilizzo del pass è un metodo semplice per fornire informazioni sudo password. pass memorizza una password per file che rende facile condividere le password tramite git o altri methods. È anche sicuro (utilizzando GnuPG) e se stai utilizzando gpg-agent, ti permette di usare il significato senza immettere una password in each utilizzo.

    Per fornire la password memorizzata come servers/foo per il server foo , è ansible utilizzarlo in un file di inventario come questo:

     [servers] foo ansible_sudo=True \ ansible_sudo_pass="{{ lookup('pipe', 'pass servers/foo') }}" 

    Dato che hai sbloccato la chiave per gpg-agent in precedenza, questo verrà eseguito senza la necessità di inserire password.

    Questo è un filone piuttosto vecchio, comunque:

    • Usiamo due diversi sisthemes di authentication in-house, la gestione delle macchine avviene tramite workstation locali del mio team.
    • Ho scritto un vars_plugin per Ansible (una implementazione piuttosto completa può essere trovata all'indirizzo https://gist.github.com/mfriedenhagen/e488235d732b7becda81 ) che differenzia diversi sisthemes di authentication:
    • Il nome del sistema di authentication è specifico del gruppo.
    • L'utente di login / sudo utilizzato è gruppo e admin specifiche.
    • Quindi richiamo l'utente dall'ambiente dell'amministratore e dalla corrispondente password tramite la libreria di portchiavi di Python da una password (usiamo il keychain di Mac OS X, ma dalla documentazione che kwallet Gnome e _win_crypto sono supportti).
    • Ho impostato le autorizzazioni sulle password nel keychain di Mac OS X per informarmi sul fatto che la protezione del programma di row di command richiede l'accesso a una password per each sistema di authentication utilizzato dagli host, quindi eseguo "all-p ping" e ricevere due richieste (uno per each sistema di authentication) where premo la barra spaziatrice e il responsabile prende le password.

    Un ansible modo per farlo è quello di utilizzare variables ambientali.

    per esempio

     pass1=foo pass2=bar ansible-playbook -i production servers.xml 

    Quindi, nelle riproduzioni, è ansible cercare la password sudo utilizzando:

     lookup('env', 'pass1') lookup('env', 'pass2') 
    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.