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.

Ansible version


Managed Node

Questo termine indica i computer (nodi) che saranno gestiti mediante Ansible. Nel nostro esempio i nodi sono indicati nella Tabella1:

HOSTNAMEINDIRIZZO IP
server1192.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

ssh keygen

Effetuiamo il Keyscan

Copiano la chiave SSH pubblica sul managed node “server1”

ssh-copy-id 192.168.56.103

ssh key exchange

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.

Ansible ping module

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.