MISP – Malware Information Sharing Platform – Installazione

In vista dei prossimi corsi MISP che si terranno a Roma, in AgID e Banca D’Italia fra la fine di Maggio e l’inizio di Giugno, mi è sembrato utile condividere alcuni appunti sparsi sulla piattaforma e di farlo prevalentemente in Italiano. In questa prima puntata sarà riportata la procedura di installazione di MISP in ambiente Ubuntu 16.04 LTS. Si tratta di una riproposizione quasi fedele della guida pubblicata dagli stessi sviluppatori di MISP, con qualche piccola personalizzazione dettata più dal vezzo personale che da altro.

1 Aggiornamento sistema

Una volta installato il sistema base Ubuntu 16.04 LTS Server effettuare un aggiornamento di sistema, per assicurarsi di aver installato le ultime patch di sicurezza ed aggiornamenti software generici.

:~$ sudo apt-get update --fix-missing
:~$ sudo apt-get upgrade

2 Installazione Postfix

Si procede all’installazione di postfix.

:~$ sudo apt-get install postfix

Lo si configuri come “Sistema satellite“.

Configurazione postfix
Configurazione postfix

Questa guida non si occupa della configurazione di postfix. Al momento si configurerà “example.com” come relayhost del mail server. Sarà cura dell’utente terminare la corretta configurazione di postfix, in funzione delle proprie esigenze e vincoli.

:~$ sudo postconf -e 'relayhost = example.com'
:~$ sudo postfix reload

3 Installazione pacchetti e librerie necessarie

Di seguito si installeranno i vari pacchetti, interpreti, librerie necessarie al corretto funzionamento di MISP, che per garantire le prestazioni di sharing multipiattaforma che si prefigge, ha necessità di un certo numero e di una certa qualità di applicativi da utilizzare.

:~$ sudo apt-get install curl gcc git gnupg-agent make python python3 openssl redis-server sudo vim zip

4 Installazione MariaDB

Sarà ora necessario installare MariaDB, un fork del più famoso MySQL, utilizzato dagli stessi sviluppatori di MISP.

:~$ sudo apt-get install mariadb-client mariadb-server
:~$ sudo mysql_secure_installation

Non ci si scordi mai di mettere in sicurezza l’installazione del database server.

5 Installazione e prima configurazione di Apache

Si eseguano i comandi di seguito riportati.

:~$ sudo apt-get install apache2 apache2-utils 
:~$ sudo a2enmod ssl
:~$ sudo a2enmod rewrite
:~$ sudo a2enmod headers
:~$ sudo a2dissite 000-default
:~$ sudo a2ensite default-ssl
:~$ sudo service apache2 restart

Nei fatti, oltre all’installazione del webserver si abilitano i moduli ssl, rewrite e headers. Dopo di che si disabilita il virtualhost 000-default per attivare il default-ssl. Anche se questo verrà disattivato in un successivo passaggio, tenerlo attivo ci consente di testare il corretto funzionamento del webserver sotto SSL.

6 Installazione PHP e librerie necessarie

:~$ sudo apt-get install libapache2-mod-php php php-cli php-crypt-gpg php-dev php-json php-mysql php-opcache php-readline php-redis php-xml
:~$ sudo service apache2 restart

7 Codice MISP

Adesso è possibile procedere all’installazione di MISP da codice sorgente. Questi verranno gestiti direttamente tramite Git e la piattaforma GitHub. È possibile anche scaricare manualmente i sorgenti e procedere ad installazione manuale. Ma in questo caso il processo di aggiornamento del software richiederebbe molto più effort, dovendo di volta in volta aggiornare manualmente la piattaforma. Utilizzando Git in questa fase dell’installazione ci si assicura il mantenimento di MISP a medio/lungo termine a costi relativamente bassi.

Si crei una nuova cartella in /var/www che ospiterà la piattaforma MISP

:~$ sudo mkdir /var/www/MISP

Si assegni la nuova directory all’utenza di default del webserver, che negli ambienti Debian/Ubuntu è www-data

:~$ sudo chown www-data:www-data /var/www/MISP

A questo punto possiamo scaricare i sorgenti di MISP, utilizzando git come gestore di versione.

:~$ sudo -u www-data git clone https://github.com/MISP/MISP.git /var/www/MISP
Cloning into '/var/www/MISP'...
remote: Counting objects: 56839, done.
remote: Compressing objects: 100% (149/149), done.
remote: Total 56839 (delta 234), reused 304 (delta 210), pack-reused 56480
Ricezione degli oggetti: 100% (56839/56839), 43.75 MiB | 3.25 MiB/s, done.
Risoluzione dei delta: 100% (42306/42306), done.
Checking connectivity... fatto.

Effettuare il checkout della versione all’ultima disponibile.

:~$ sudo -u www-data git checkout tags/$(git describe --tags `git rev-list --tags --max-count=1`)
Note: checking out 'tags/v2.4.91'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b <new-branch-name>
HEAD si trova ora a 4ad7a4a... Merge branch '2.4' of github.com:MISP/MISP into 2.4

Alla data del presente articolo, la versione di checkout disponibile è la 2.4.91. Se si desidera effettuare un ulteriore controllo, è possibile visitare la home page del repository MISP su GitHub.

Versione MISP
Versione MISP

Infire configureremo git per ignorare le differenze fra permessi di file locali e remoti.

:~$ sudo -u www-data git config core.filemode false

8 Installare STIX

MISP è STIX compliance per molti aspetti relativi alla gestione degli IoC. Gestisce sia il formato STIX 1.x che il formato 2.x, ma necessita delle librerie ufficiali. Di seguito si procederà ad installarle ad uso e consumo dell’applicativo.

:~$ sudo apt-get install python-dev python-pip python3-pip libxml2-dev libxslt1-dev zlib1g-dev python-setuptools
:~$ cd /var/www/MISP/app/files/scripts
:~$ sudo -u www-data git clone https://github.com/CybOXProject/python-cybox.git
:~$ sudo -u www-data git clone https://github.com/STIXProject/python-stix.git
:~$ cd /var/www/MISP/app/files/scripts/python-cybox:
:~$ sudo python setup.py install
:~$ cd /var/www/MISP/app/files/scripts/python-stix
:~$ sudo python setup.py install

Installare mixbox in quanto nuova dipendenza per STIX.

:~$ cd /var/www/MISP/app/files/scripts/
:~$ sudo -u www-data git clone https://github.com/CybOXProject/mixbox.git
:~$ cd /var/www/MISP/app/files/scripts/mixbox
:~$ sudo python setup.py install

Infine, installare STIX2 (richiesto python3)

:~$ pip3 install stix2

9 Installare CakePHP

CakePHP è il framework di sviluppo su cui si basa gran parte dell’applicativo. Oltre a gestire l’interfaccia utente, CakePHP è in grado di gestire i job del server, fondamentali per la sincronizzazione fra diverse istanze MISP. Di seguito si procederà dando per scontato che si utilizzeranno tutte le configurazioni proposte dal team ufficiale di MISP.

:~$ cd /var/www/MISP
:~$ sudo -u www-data git submodule init
:~$ sudo -u www-data git submodule update
:~$ sudo -u www-data git submodule foreach git config core.filemode false

I pacchetti di seguito installati via composer del PHP sono necessari proprio per la funzionalità di gestione job e code, deputata al framework CakePHP.

:~$ cd /var/www/MISP/app
:~$ sudo -u www-data php composer.phar require kamisama/cake-resque:4.1.2
:~$ sudo -u www-data php composer.phar config vendor-dir Vendor
:~$ sudo -u www-data php composer.phar install

Abilitare CakeResque con PHP-Redis

:~$ sudo phpenmod redis

Infine copiare il relativo file di configurazione nella directory applicativa di seguito riportata.

:~$ sudo -u www-data cp -fa /var/www/MISP/INSTALL/setup/config.php /var/www/MISP/app/Plugin/CakeResque/Config/config.php

Infine, settare correttamente i permessi delle directory di lavoro.

:~$ sudo chown -R www-data:www-data /var/www/MISP
:~$ sudo chmod -R 750 /var/www/MISP
:~$ sudo chmod -R g+ws /var/www/MISP/app/tmp
:~$ sudo chmod -R g+ws /var/www/MISP/app/files
:~$ sudo chmod -R g+ws /var/www/MISP/app/files/scripts/tmp

10 Creazione e configurazione database

A questo punto ci occuperemo di configurare il database e prepararlo per poter ospitare gli eventi MISP. Per questa fase servirà l’utilizzo della password di root del database sql creata al precedente punto 4.

:~$ sudo mysql -u root -p
MariaDB [(none)]> create database misp;
MariaDB [(none)]> grant usage on *.* to misp@localhost identified by 'password';
MariaDB [(none)]> grant all privileges on misp.* to misp@localhost;
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> \q

È stato creato il database “misp” a cui ha accesso l’utente “misp” a cui è stata assegnata la password “password” (per ambienti di produzione sarà richiesta una certa complessità della password).

Sarà ora possibile importare una schema database vuoto.

:~$ sudo -u www-data sh -c "mysql -u misp -p misp < /var/www/MISP/INSTALL/MYSQL.sql"

11 Configurazione webserver Apache2

Per la configurazione del webserver Apache, si userà il FQDN “misp.local”. Come prima cosa si dovrà controllare la versione del webserver installata.

:~$ sudo apache2 -v
Server version: Apache/2.4.18 (Ubuntu)

Qualora non si abbia altra disponibilità, sarà necessario generare un certificato SSL self signed. Procedere come di seguito specificato.

:~$ sudo openssl req -newkey rsa:4096 -days 365 -nodes -x509 -keyout /etc/ssl/private/misp.local.key -out /etc/ssl/private/misp.local.crt
Generating a 4096 bit RSA private key
........................++
.......................++
writing new private key to '/etc/ssl/private/misp.local.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:IT
State or Province Name (full name) [Some-State]:Italy
Locality Name (eg, city) []:Rome
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyCompany
Organizational Unit Name (eg, section) []:SecUnit
Common Name (e.g. server FQDN or YOUR name) []:misp.local
Email Address []:misp@misp.local

Creare e modificare un nuovo file di configurazione VirtualHost di Apache2.

:~$ sudo nano /etc/apache2/sites-available/misp-ssl.conf

Come configurazione del VirtualHost si propone la seguente.

<VirtualHost *:80>
ServerName misp.local
Redirect permanent / https://misp.local
LogLevel warn
ErrorLog /var/log/apache2/misp.local_error.log
CustomLog /var/log/apache2/misp.local_access.log combined
ServerSignature Off
</VirtualHost>
<VirtualHost *:443>
ServerAdmin misp@misp.local
ServerName misp.local
DocumentRoot /var/www/MISP/app/webroot
<Directory /var/www/MISP/app/webroot>
Options -Indexes
AllowOverride all
Require all granted
</Directory>
SSLEngine On
SSLCertificateFile /etc/ssl/private/misp.local.crt
SSLCertificateKeyFile /etc/ssl/private/misp.local.key
LogLevel warn
ErrorLog /var/log/apache2/misp.local_error.log
CustomLog /var/log/apache2/misp.local_access.log combined
ServerSignature Off
Header set X-Content-Type-Options nosniff
Header set X-Frame-Options DENY
</VirtualHost>

Disabilitare il VHost defailt-ssl.conf ed abilitare il nuovo dedicato a MISP.

:~$ sudo a2dissite default-ssl
:~$ sudo a2ensite misp-ssl
:~$ sudo service apache2 restart

Se lo si ritiene necessario, è anche possibile utilizzare una configurazione di log rotation disponibile nelle directory di installo di MISP.

:~$ sudo cp /var/www/MISP/INSTALL/misp.logrotate /etc/logrotate.d/misp

12 Configurazione applicativa di MISP

Questa fase risulta molto delicata. Seppur qualsiasi errore è in qualche modo rimediabile, quanto configurato qui avrà impatto sull’utilizzo stesso della piattaforma e modifiche a posteriori potrebbero risultare in una pardita di informazioni, anche se mai possono risultare in una perdita di dati. Quanto stabilito in questa fase, seppur di stampo prettamente sistemistico avrà impatto operativo notevole. Si consiglia di approfondire questa fase attingendo ad informazioni dettagliate disponibili nel sito del CIRCL.LU.

Effettuare la copia dei seguenti file.

:~$ sudo -u www-data cp -a /var/www/MISP/app/Config/bootstrap.default.php /var/www/MISP/app/Config/bootstrap.php
:~$ sudo -u www-data cp -a /var/www/MISP/app/Config/database.default.php /var/www/MISP/app/Config/database.php
:~$ sudo -u www-data cp -a /var/www/MISP/app/Config/core.default.php /var/www/MISP/app/Config/core.php
:~$ sudo -u www-data cp -a /var/www/MISP/app/Config/config.default.php /var/www/MISP/app/Config/config.php

Nel file “database.php” andrà configurato l’utente MariaDB creato nei punti precedenti.

:~$ sudo -u www-data nano /var/www/MISP/app/Config/database.php
Configurazione MariaDB
Configurazione MariaDB

Nel file “config.php” è necessario modificare il SALT di base dell’applicazione (che deve essere di 32 byte) ed altre opzioni, come il “baseurl” che descrive la URL di base dell’applicativo, l’opzione “org” con cui è possibile settare il nome dell’organizzazione di default e altro. Moltre di queste opzioni potranno poi essere gestite da pannello di controllo.

:~$ sudo -u www-data nano /var/www/MISP/app/Config/config.php
Configurazione MISP
Configurazione MISP

Infine si settano i permessi dei file correttamente.

:~$ sudo chown -R www-data:www-data /var/www/MISP/app/Config
:~$ sudo chmod -R 750 /var/www/MISP/app/Config

13 Chiave di cifratura GPG

Per consentire all’applicativo l’invio di email cifrate è necessario creare una coppia di chiavi GPG, avendo cura di generare la chiave per lo stesso indirizzo email configurato nel file “config.php”.

:~$ sudo -u www-data gpg --homedir /var/www/MISP/.gnupg --gen-key
gpg (GnuPG) 1.4.20; Copyright (C) 2015 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
gpg: portachiavi "/var/www/MISP/.gnupg/secring.gpg" creato
gpg: portachiavi "/var/www/MISP/.gnupg/pubring.gpg" creato
Selezionare il tipo di chiave:
(1) RSA e RSA (predefinito)
(2) DSA ed Elgaman
(3) DSA (solo firma)
(4) RSA (solo firma)
Selezione? 1
La lunghezza delle chiavi RSA è compresa tra 1024 e 4096 bit.
Quale dimensione impostare per la chiave? (2048) 4096
La dimensione chiave richiesta è 4096 bit
Specificare la durata di validità della chiave.
0 = la chiave non scade
<N> = la chiave scade dopo N giorni
<N>w = la chiave scade dopo N settimane
<N>m = la chiave scade dopo N mesi
<N>y = la chiave scade dopo N anni
Per quanto tempo deve essere valida la chiave? (0) 365
La chiave scade il mar 21 mag 2019 11:16:20 CEST
È tutto corretto? (s/N) s
È necessario un ID utente per identificare la propria chiave; il software
costruisce l'ID utente a partire da nome reale, commento e indirizzo email
in questa forma:
"Mario Rossi (commento) mario.rossi@example.net"
Nome reale: Misp Local
Indirizzo email: misp@misp.local
Commento: 
È stato selezionato questo USER-ID:
"Misp Local <misp@misp.local>"
Modificare (n)ome, (c)ommento, (e)mail oppure (o)k/(u)scire? o
È necessaria una passphrase per proteggere la proprio chiave segreta.
Passphrase:
gpg: /var/www/MISP/.gnupg/trustdb.gpg: creato il trustdb
gpg: chiave 24C4188D contrassegnata come completamente affidabile
chiavi pubbliche e segrete create e firmate.
gpg: controllo del trustdb
gpg: necessari: 3 marginali, 1 completi, modello di fiducia PGP
gpg: livello: 0 valido: 1 firmato: 0 fiducia: 0-, 0q, 0n, 0m, 0f, 1u
gpg: il prossimo controllo del trustdb sarà eseguito il 2019-05-21
pub 4096R/24C4188D 2018-05-21 [scadenza: 2019-05-21]
Impronta digitale della chiave = 0C94 3FD0 4E3C F36D C33C 0B03 82B1 3167 24C4 188D
uid Misp Local <misp@misp.local>
sub 4096R/C9565802 2018-05-21 [scadenza: 2019-05-21]

Esportare la chiave pubblica nella webroot.

:~$ sudo -u www-data sh -c "gpg --homedir /var/www/MISP/.gnupg --export --armor misp@misp.local > /var/www/MISP/app/webroot/gpg.asc"

14 Configurazione “workers”

Come ultimissima cosa, configuriamo i workers di MISP per avviarsi all’avvio del sistema. I workers permettono una moteplicità di operazioni alla piattaforma, molte delle quali critiche. Consentono ad esempio la gestione dei job di sincronizzazione fra più server MISP, la gestione delle code email, della cache applicativa e molto altro. È vivamente consigliata la configurazione come da manuale di questo elemento.

Per prima cosa, diamo allo script di avvio dei workers i permessi di esecuzione.

:~$ sudo chmod +x /var/www/MISP/app/Console/worker/start.sh

Di seguito modifichiamo il file /etc/rc.local per richiamare lo script all’avvio del sistema.

:~$ sudo nano /etc/rc.local
Configurazione workers
Configurazione workers

15 Riavvio e primo login

A questo punto è possibile riavviare il server e successivamente visitare la pagina web https://misp.local (sostituite la URL con il vosto FQDN scelto). E se le istruzioni sono andate a buon fine, vi troverete di fronte la form di login, in cui userete come prime e temporenee credenziali la coppia nome utente/password “admin@admin.test/admin“.

MISP Login
MISP Login

16 Hardening

È necessario procedere alla hardenizzazione di tutto quanto fin qui installato e configurato. In particolare:

  • Il sistema operativo;
  • Il webserver Apache;
  • MariaDB;
  • Altro…

17 Funzionalità opzionali

MISP utilizza ZeroMQ per alcuni importanti aspetti delle funzionalità di sottoscrizione e sharing. La funzionalità è presentata come opzionale dal team di MISP, in quanto ci sono diverse modalità di sottoscrizione e sharing utilizzando MISP. Tuttavia si consiglia vivamente di installare ed abilitare le funzionalità di ZeroMQ, al fine di non privarsi della potenza del software con piene funzionalità.

Eseguire i due comandi che seguono.

:~$ sudo pip install pyzmq
:~$ sudo pip install redis

Conclusioni

Il lettore più attento avrà notato come la procedura di installazione di MISP sia tutt’altro che banale. Questo perché MISP è una vera e propria “Piattaforma”. Ovvero un set di strumenti e servizi che consentono l’archiviazione, la correlazione, l’analisi e lo sharing di informazioni riguardanti in particolare aspetti vicini alla sicurezza informatica.

Comprendere la profonda interazione che si crea dall’uso di tali strumenti, serve ad un uso consapevole dell’applicativo e delle sue potenzialità. MISP offre un contesto operativo modulare ed estendibile. In grado di adattarsi ai diversi contesti operativi.

Mi riprometto di scrivere, tempo permettendo, altri post sull’argomento. HTH.

MISP: new misp_taxii_hook for MISP-TAXII-Server

I want to propose a new version of the “misp_taxii_hook” package included in the “MISP-TAXII-Server” available on the official MISP repository.

Preamble

The purpose is to improve the STIX import via TAXII on MISP. Actually the import system, before importing the IoC, checks for its existence in any event. If the item has been found, it will be discarded. If MISP receives the same IoC qualified for differents reasons in two or more STIX reports or if it has been imported before in others ways, it will be imported just the first time the system checks for it, and it will be discarded for the future in any other STIX report.

From a Security Analyst point of view, I think it’s better add the attribute, even if it has been yet imported by a previous import.

From a Data Analyst point of view, I don’t want to duplicate informations, because relationships check should result in deprecated performances and false positives.

The proposed “misp_taxii_hook” package (go to GitHub)

The new hook try to define a title and a correspondent filename for the STIX report (def detect_title) using the and the header’s elements.
If this operation successed, it performs a search to detect if the STIX file has been imported before. It searchs for a MISP event having the correspondent “title” and an attachment attribute named as the “filename”. It must have it boths!

If nothing found, a new event will be created with the previous defined title, attachment and the attributes included in the report.

New event for new STIX Report
New event for new STIX Report

But, if these search conditions (title and attachment) are true, the hook try to update the detected event. If new attributes are detected, it will be pushed and a the STIX report will be attached.

Updated event for updated STIX Report
Updated event for updated STIX Report

If the STIX report has no title and description in the stix_header element, the hook will import the file using the old hook code.

How to test it