Nell’articolo precedente abbiamo parlato di Ansible e di Security automation. In questo post andremo nel dettaglio dei principi di funzionamento di Ansible e inizieremo a muovere i primi passi utilizzando questa soluzione con lo scopo di realizzare un laboratorio per fare pratica con i penetration test.
Per capire come funziona Ansible e la sua architettura faremo riferimento al disegno architetturale di copertina passando in rassegna ogni singolo componente.
Management Node
La macchina con a bordo installato Ansible. Da essa è possibile comandare e orchestrare tutte le operazioni da eseguire sui nodi da gestire (managed node). Nel nostro laboratorio di esempio la macchina avrà indirizzo IP 192.168.56.100.
Installare Ansible
Per installare Ansible sul management node (sistema operativo Ubuntu) è necessario utilizzare i seguenti comandi:
#Ansible per python2 pip install ansible –system #Ansible per python3 pip3 install ansible –system #Installare la versione 2.9.1 pip install ansible==2.9.1 -system
Al termine dell’installazione si consiglia di utilizzare il comando di seguito per verificarne il corretto funzionamento.
Managed Node
Questo termine indica i computer (nodi) che saranno gestiti mediante Ansible. Nel nostro esempio i nodi sono indicati nella Tabella1:
HOSTNAME | INDIRIZZO IP |
server1 | 192.168.56.103 |
server2 | 192.168.56.104 |
attackvm | 192.168.56.102 |
web1 | 192.168.56.200 |
web2 | 192.168.56.201 |
Inventory
L’inventory è un file che contiene la lista dei nodi che saranno gestiti mediante Ansible in sostanza è la rappresentazione della Tabella1. I nodi oltre ad essere indicati singolarmente possono essere anche inglobati in gruppi (es. servers) per fornire l’opportunità di lanciare agevolmente operazioni su più nodi in contemporanea. Seguendo il disegno architetturale dell’immagine di copertina l’inventory è formato da 5 macchine e i gruppi logici in cui esse sono dislocate sono 3 (server, attack machine, prod) .
[server] 192.168.56.103 192.168.56.104 [attack machine] 192.168.56.102 [prod] 192.168.56.200 192.168.56.201
Ansible è in grado di utilizzare inventory file redatti sia in stile INI (come l’esempio sopra riportato) sia in formato YAML.
Moduli
I moduli rappresentano funzioni già implementate che sono in grado di eseguire un particolare task sulle macchine gestite mediante Ansible (managed node). Volendo fare un parallelismo (un po’ forzato) con il mondo della programmazione rappresentano delle funzioni raccolte in librerie.
Ad esempio il modulo Ansible apt è utilizzato per gestire le installazioni dei pacchetti su macchine Linux con distribuzione Ubuntu/Debian o derivate.
Il seguente script Ansible permette di installare il pacchetto apache2 su tali distribuzioni.
La documentazione ufficiale contiene la lista dei moduli Ansible suddivisi per categoria.
TASKS
Le singole operazioni che Ansible esegue su un nodo tramite un modulo. Usando il parallelismo con la programmazione rappresentano l’implementazione delle funzioni. Il task di seguito controlla che il servizio Apache è attivo.
name: make sure apache is running service: name: httpd state:started
Playbook
Un playbook è un insieme di task ovvero un insieme di operazioni da eseguire sui nodi. Le operazioni vengono svolte in maniera sequenziale.
I playbook sono l’equivalente di un intero programma sviluppato con un linguaggio di programmazione. Al loro interno è possibile dichiarare delle variabili.
Con quale linguaggio vengono scritti i Playbook?
CONFIGURAZIONE NODI
Una volta effettuate le installazioni di base sarà necessario eseguire delle operazioni sul nodo Ansible e sui nodi da gestire affinchè essi possano dialogare. Nel laboratorio che ci apprestiamo a realizzare ho utilizzato tutte macchine basate su Ubuntu pertanto anche i comandi faranno riferimento a questa distribuzione.
Configurazione managed node
Per eseguire le operazioni sulle macchine creiamo un utente specifico denominato provision
Permettere l’utilizzo di sudo senza password per l’utente provision creando il file /etc/sudoers.d/provision contenente le seguenti righe
sudo adduser –shell /bin/bash –gecos ‘’ provision
Anche sul management node effettueremo delle operazioni in modo che Ansible possa accedere alle macchine da gestire mediante chiave SSH e senza l’immissione di password.
Generare una chiave
Effetuiamo il Keyscan
Copiano la chiave SSH pubblica sul managed node “server1”
ssh-copy-id 192.168.56.103
Le due operazioni dovranno essere effettuate su ogni macchina che si vuole gestire.
A questo punto ci sono tutti i presupposti per operare. Possiamo usare il modulo ping per controllare che la macchina Ansible riesca correttamente a raggiungere i managed node.
Ora siamo in grado di orchestrare tutte le operazioni da effettuare su un parco macchine da un unico nodo rappresentato dalla macchina Ansible.
Nel prossimo post vedremo come realizzare un laboratorio di penetration test con davvero poco sforzo, nello specifico vedremo come installare Owasp Mutillidae.
Trackback/Pingback