.. |GITHUBURL| replace:: https://raw.githubusercontent.com/r-map/rmap/master/server Server RMAP ===================================== Analisi funzionalità RMAP ------------------------- Introduzione ............ Le funzionalità offerte dal server RMAP (`https://rmap.cc `__) sono implementate usando i seguenti software e servizi (sono elencati solo quelli significativi): - Broker AMQP (RabbitMQ) per la distribuzione di dati in tempo reale attraverso un sistema di code, sia da stazione a server che da server a server. - Broker MQTT (Mosquitto) per l’invio di dati da stazioni al server. - Arkimet per l’archiviazione dei dati storici - DB-All.e per l’archiviazione dei dati recenti - Una singola applicazione web (Django web framework) che gestisce - Sistema di autenticazione - Visualizzazione dei dati - Registrazione utenti - Configurazione di metadati e firmware delle stazioni - Inserimento manuale dati e immagini georeferenziati - Visualizzazione personalizzata per RainBO |image0| Data ingestion .............. Il data ingestion riguarda principalmente l’accoglimento di dati da stazioni via MQTT e AMQP. I dati che arrivano via MQTT sono poi inoltrati al broker AMQP, che è il nucleo della movimentazione dei dati all’interno del sistema. I client che devono inviare dati via MQTT o AMQP devono passare da un sistema di autenticazione e autorizzazione, sostanzialmente per garantire che i dati siano inviati solo da utenti autenticati e che non vadano a sovrapporsi a dati altrui. Entrambi i broker interrogano il sistema di autenticazione\ **,** un servizio web che implementa gli endpoint richiesti da RabbitMQ e Mosquitto. Il servizio di autorizzazione su AMQP (cioè cosa può pubblicare un utente autenticato) è invece delegato al demone *identvalidationd*, che prende i dati dalla coda di ingresso dell’utente e passa alla coda di ingestion solo i dati per cui il campo ident è uguale al nome utente. I dati che passano quest’ultimo controllo sono poi inviati: - Ad altre code AMQP, ad esempio per forniture esterne o per altri processamenti. Su due di queste code sono inoltrati i dati per il SIMC (archiviati in Arkimet in formato VM2), una per le stazioni delle reti *claster* e *rmap* e l’altra per la rete *profe*. - Al database DB-All.e che contiene i dati recenti. Ci sono inoltre alcuni moduli per l’accoglimento di dati da sorgenti che non usano AMQP o non usano il formato BUFR (e.g. Luftdaten). |image1| Configurazione delle stazioni ............................. Questa funzionalità permette l’aggiornamento della configurazione e del firmware delle stazioni STIMA. L’aggiornamento può essere fatto via HTTP o AMQP, previa autenticazione presso il corrispondente servizio di autenticazione. |image2| Registrazione utenti .................... Questa funzionalità permette di registrare gli utenti attraverso un classico processo di iscrizione: l’utente compila una form e riceve una email per la conferma dell’avvenuta registrazione. Ovviamente, c’è un dialogo con il servizio di autenticazione. |image3| Visualizzazione dei dati ........................ Questo servizio permette di visualizzare i dati archiviati (DB-All.e e Arkimet) sia su mappa che su grafico. Non c’è servizio di autenticazione e autorizzazione perchè si presuppone che tutti i dati siano pubblici. Questo sistema è probabilmente necessario per i dati della rete amatoriale e quindi è necessario che il servizio corrispondente di data ingestion sia collegato all’importatore dei dati su DB-All.e e Arkimet. |image4| Cosudo ...... Cosudo permette di analizzare i dati osservati per identificare anomalie, confrontando i dati da stazione con dati radar, satellite e previsti. Inoltre, permette all’operatore di invalidare dei dati: tali invalidazioni sono poi inviate ai sistemi del SIMC per applicarle sull’archivio. È una applicazione che non necessita di accesso dall’esterno e deve avere a disposizione i dati dall’archivio del SIMC. Il sistema di autenticazione è necessario poiché, essendo ospitato sul server rmap.cc, deve essere reso privato. Non è ancora operativo e mancano i flussi di alimentazione dei dati. |image5| Inserimento manuale dei dati ............................ Questa funzionalità permette l’inserimento manuale, da parte di operatori, di dati e immagini via HTTP e AMQP. I dati attualmente sono le osservazioni della neve e del tempo (quest’ultimo all’interno del progetto RainBO). Si appoggia al sistema di autenticazione. |image6| RainBO ...... È l’interfaccia per un progetto, che permette la visualizzazione con delle viste personalizzate per i seguenti servizi: - Visualizzazione dei dati - Inserimento manuale dei dati - Registrazione utenti Interfaccia web ............... L’accesso da browser al sistema per alcune funzionalità, quali - Registrazione utente - Configurazione manuale delle stazioni - Visualizzazione dati - Inserimento manuale di dati Sono offerte da un sistema monolitico, in cui tutti i vari pezzi sono interconnessi. È possibile separarli, ma è richiesto un intervento non banale sul frontend che può essere eseguito solo a valle dell’organizzazione dei vari pezzi di RMAP su diversi host. Se una funzionalità usa varie app Django e deve quindi “assemblare” varie interfacce insieme, allora è necessario fare un repository per la singola funzionalità che dipende dalle app Django richieste. .. |image0| image:: flussodati.png :width: 16.51cm :height: 12.312cm .. |image1| image:: dataingestion.png :width: 16.51cm :height: 16.016cm .. |image2| image:: stationmanager.png :width: 16.51cm :height: 10.372cm .. |image3| image:: registrazione_utenti.png :width: 16.51cm :height: 12.136cm .. |image4| image:: borinud_showdata.png :width: 16.51cm :height: 7.938cm .. |image5| image:: cosudo.png :width: 16.51cm :height: 15.84cm .. |image6| image:: insertdata_geoimage.png :width: 16.51cm :height: 9.102cm Porte utilizzate ................ +---------+-------------------------------+-----------+----------------------------------------+------------+---------------------+--------------+ | porta | protocollo | server | servizio |RMAP server | RMAP data ingestion | RMAP backend | +=========+===============================+===========+========================================+============+=====================+==============+ | 80 | HTTP | apache | download conf e firmware (Stima V3) | X | | X | +---------+-------------------------------+-----------+----------------------------------------+------------+---------------------+--------------+ | 442 | HTTPS TLS con pre shared Key | stunnel | download conf e firmware (Stima v4) | X | | X | +---------+-------------------------------+-----------+----------------------------------------+------------+---------------------+--------------+ | 444 | HTTPS (SSL/TLS) | apache | gestione backend e visualizzazione dati| X | | X | +---------+-------------------------------+-----------+----------------------------------------+------------+---------------------+--------------+ | 5925 | HTTP | monit | monitoraggio daemoni RMAP | X | | X | +---------+-------------------------------+-----------+----------------------------------------+------------+---------------------+--------------+ | 1883 | MQTT | mosquitto | pubblicazioni dati stazione (Stima V3) | X | X | | +---------+-------------------------------+-----------+----------------------------------------+------------+---------------------+--------------+ | 5671 | AMQPS (SSL/TLS) | rabbit-mq | pubblicazione e distribuzione dati | X | X | | +---------+-------------------------------+-----------+----------------------------------------+------------+---------------------+--------------+ | 5672 | AMQP | rabbit-mq | pubblicazione e distribuzione dati | X | X | | +---------+-------------------------------+-----------+----------------------------------------+------------+---------------------+--------------+ | 8883 | MQTTS TLS con pre shared Key | mosquitto | pubblicazione stazioni (Stima V4) | X | X | | +---------+-------------------------------+-----------+----------------------------------------+------------+---------------------+--------------+ | 8884 | MQTTS (SSL/TLS) WEBSOCKET | mosquitto | monitoraggio MQTT da web | X | X | | +---------+-------------------------------+-----------+----------------------------------------+------------+---------------------+--------------+ | 15672 | HTTP | rabbit-mq | Management Plugin | X | X | X | +---------+-------------------------------+-----------+----------------------------------------+------------+---------------------+--------------+ Installazione server completo basato su Rocky Linux 8 ------------------------------------------------------ Installazione sistema operativo ............................... Installare Rocky Linux 8. Aggiunta repository e installazione pacchetti :: dnf -y install epel-release dnf install yum-plugin-copr dnf copr enable simc/stable dnf copr enable pat1/rmap dnf config-manager --set-enabled powertools dnf copr enable simc/cosudo dnf install python3-rmap python3-django-cors-headers dnf install python3-django-dynamic-map-borinud dnf install mosquitto mosquitto-auth-plug dnf install arkimet dnf install stunnel useradd rmap /etc/selinux/config:: SELINUX=disabled `/etc/tmpfiles.d/rmap.conf `_ :: mkdir /rmap chmod go+rx /rmap `/etc/sysconfig/crond `_ :: mkdir /var/log/rmap chown -R rmap:rmap /var/log/rmap postgresql .......... :: dnf module disable postgresql:10 dnf module enable postgresql:12 dnf install postgresql-server postgresql-contrib python3-psycopg2 :: mkdir /etc/systemd/system/postgresql.service.d/ `/etc/systemd/system/postgresql.service.d/rmap.conf `_ :: mkdir /rmap/pgsql/ chown postgres:postgres /rmap/pgsql/ postgresql-setup --initdb --unit postgresql `/rmap/pgsql/data/pg_hba.conf `_ `/rmap/pgsql/data/postgresql.conf `_ :: systemctl enable postgresql.service systemctl start postgresql.service su - postgres createuser -P -e rmapadmin createdb --owner=rmapadmin rmapadmin exit `/etc/rmap/rmap-site.cfg `_ `/etc/rmap/dashboard.conf `_ `/etc/rmap/graphTemplates.conf `_ :: rmapctrl --syncdb :: su - postgres createuser -P -e rmap createdb --owner=rmap report_fixed createdb --owner=rmap report_mobile createdb --owner=rmap sample_fixed createdb --owner=rmap sample_mobile exit :: dbadb wipe --dsn="postgresql://rmap:@localhost/report_fixed" dbadb wipe --dsn="postgresql://rmap:@localhost/report_mobile" dbadb wipe --dsn="postgresql://rmap:@localhost/sample_mobile" dbadb wipe --dsn="postgresql://rmap:@localhost/sample_fixed" apache ...... Collect static files from django apps: :: mkdir /root/global_static rmapctrl --collectstatic rmdir /root/global_static dnf install python3-mod_wsgi dnf install mod_security mod_security_crs useradd -r rmap mkdir /home/rmap chown rmap:rmap /home/rmap mkdir /rmap/cache chown rmap:rmap /rmap/cache mkdir /usr/share/rmap/media chown rmap:rmap /usr/share/rmap/media `/etc/httpd/conf.modules.d/00-mpm.conf `_ `/etc/httpd/conf.d/rmap.conf `_ `/etc/httpd/conf.d/rmap.inc `_ `/etc/httpd/modsecurity.d/crs-setup.conf `_ :: chkconfig httpd on`` service httpd start`` Stunnel ....... Create file with psk keys: :: rmapctrl --exportmqttpsk > /etc/stunnel/file.psk `/etc/stunnel/stunnel.conf `_ `/etc/cron.d/stunnel_presharedkey `_ :: chkconfig stunnel on`` service stunnel start`` Arkimet ....... :: dnf install arkimet arkimet-postprocessor-suite useradd -r arkimet mkdir /home/arkimet chown arkimet:arkimet /home/arkimet mkdir /rmap/arkimet/ chown -R arkimet:rmap /rmap/arkimet/ chmod -R g+w /rmap/arkimet/ mkdir /var/log/arkimet chown -R arkimet:arkimet /var/log/arkimet `/etc/sysconfig/arkimet `_ `/etc/arkimet/scan/bufr_generic_mobile_rmap.py `_ Replicate structure in: `/rmap/arkimet `_ :: systemctl daemon-reload chkconfig arkimet on service arkimet start Mosquitto ......... :: mkdir /etc/mosquitto/conf.d mkdir /rmap/mosquitto chown mosquitto:mosquitto /rmap/mosquitto `/etc/mosquitto/conf.d/rmap.conf `_ `/etc/mosquitto/aclfile `_ remove everythings and add in /etc/mosquitto/mosquitto.conf :: include_dir /etc/mosquitto/conf.d pid_file /var/run/mosquitto/mosquitto.pid :: touch /etc/mosquitto/pwfile chkconfig mosquitto on service mosquitto start if the package use systemV create: `/etc/monit.d/mosquitto `_ Rabbitmq ........ :: curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh |bash curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash dnf install rabbitmq-server `/etc/rabbitmq/enabled_plugins `_ `/etc/rabbitmq/rabbitmq-env.conf `_ `/etc/rabbitmq/rabbitmq.config `_ :: mkdir -p /rmap/rabbitmq/mnesia/ chown -R rabbitmq:rabbitmq /rmap/rabbitmq chkconfig rabbitmq-server on service rabbitmq-server start login at management interface with user "guest" and password "guest" on overview page use import definition to configure exchange, queue and users with the same management interface remove "guest" user and login with a new real user Per attivare uno showell: :: rabbitmqctl set_parameter shovel report_mobile '{"src-protocol": "amqp091", "src-uri": "amqp://rmap:@rmap.cc", "src-queue": "report_mobile_saved", "dest-protocol": "amqp091", "dest-uri": "amqp://rmap:@", "dest-queue": "report_mobile"}' problema non risolto: se si trasferiscono dati scritti da un utente autenticandosi con un altro utente la security su user_id lo vieta. https://www.rabbitmq.com/shovel-dynamic.html bisognerebbe riuscire a settare "user_id" tramite il parametro "dest-publish-properties" nel formato json sopra ma non funziona Monit ..... :: yum install monit `/etc/monitrc `_ `/etc/monit.d/rmap `_ :: chkconfig monit on service monit start Cron .... :: mkdir /rmap/dballe chown -R rmap:rmap /rmap/dballe `/etc/cron.d/arpae_aq_ckan `_ `/etc/cron.d/dballe2arkimet `_ `/etc/cron.d/luftdaten `_ `/etc/cron.d/makeexplorer `_ Sincronizzazione DB da un server ................................ Server di origine ~~~~~~~~~~~~~~~~~ :: rmapctrl --dumpdata > dumpdata.json rimuovere le prime righe che non sono json :: dbadb export --dsn="mysql:///report_fixed?user=rmap&password=****" > report_fixed.bufr dbadb export --dsn="mysql:///report_mobile?user=rmap&password=****" > report_mobile.bufr dbadb export --dsn="mysql:///sample_fixed?user=rmap&password=****" > sample_fixed.bufr dbadb export --dsn="mysql:///sample_mobile?user=rmap&password=****" > sample_mobile.bufr Server di destinazione ~~~~~~~~~~~~~~~~~~~~~~ Da interfaccia web admin rimuovere TUTTI gli utenti (compreso rmap) :: rmapctrl --loaddata=dumpdata.json :: dbadb import --wipe-first --dsn="postgresql://rmap:***@localhost/report_fixed" report_fixed.bufr dbadb import --wipe-first --dsn="postgresql://rmap:***@localhost/report_mobile" report_mobile.bufr dbadb import --wipe-first --dsn="postgresql://rmap:***@localhost/sample_mobile" sample_mobile.bufr dbadb import --wipe-first --dsn="postgresql://rmap:***@localhost/sample_fixed" sample_fixed.bufr :: cd /usr/share/rmap/ rsync -av utente@serverorigine:/usr/share/rmap/media . Arkiweb ....... AL MOMENTO NON DISPONIBILE ! :: dnf install arkiweb /etc/httpd/conf.d/arkiweb.conf :: ScriptAlias /services/arkiweb/ /usr/lib64/arkiweb/ Alias /arkiweb /var/www/html/arkiweb AllowOverride None Options +ExecCGI Order allow,deny Allow from all # ARKIWEB_CONFIG is mandatory! SetEnv ARKIWEB_CONFIG /rmap/arkimet/arkiweb.config Require all granted # Authentication (optional) # # Basic authentication example: # SetEnv ARKIWEB_RESTRICT REMOTE_USER # AuthType Basic # AuthUserFile /etc/arkiweb.passwords # require valid-user Alias /arkiwebjs/ /usr/share/arkiweb/public/ #Require all granted AllowOverride None Order allow,deny Allow from all Require all granted :: mkdir /var/www/html/arkiweb/ cp /usr/share/doc/arkiweb/html/example/index.html /var/www/html/arkiweb/index.html /rmap/arkimet/arkiweb.config Installazione server solo funzionalità DATA INGESTION basato su Rocky Linux 8 ------------------------------------------------------------------------------ Installazione sistema operativo ............................... Installare Rocky Linux 8. Aggiunta repository e installazione pacchetti :: dnf -y install epel-release dnf install yum-plugin-copr dnf copr enable simc/stable dnf copr enable pat1/rmap dnf config-manager --set-enabled powertools dnf install python3-rmap-core dnf install mosquitto mosquitto-auth-plug useradd rmap modificare il file /etc/selinux/config:: SELINUX=disabled scaricare il file `/etc/tmpfiles.d/rmap.conf `__ :: mkdir /rmap chmod go+rx /rmap :: mkdir /var/log/rmap chown -R rmap:rmap /var/log/rmap scaricare il file `/etc/rmap/rmap-site.cfg `__ cambiare la password dell'utente amministratore. Mosquitto ......... :: mkdir /etc/mosquitto/conf.d mkdir /rmap/mosquitto chown mosquitto:mosquitto /rmap/mosquitto scaricare il file `/etc/mosquitto/conf.d/rmap.conf `__ cancellare tutto il contenuto del file /etc/mosquitto/mosquitto.conf e sostituirlo con le seguenti righe: :: include_dir /etc/mosquitto/conf.d pid_file /var/run/mosquitto/mosquitto.pid :: systemctl enable mosquitto systemctl start mosquitto Rabbitmq ........ :: curl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh |bash curl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bash dnf install rabbitmq-server scaricare il file `/etc/rabbitmq/enabled_plugins `__ scaricare il file `/etc/rabbitmq/rabbitmq-env.conf `__ scaricare il file `/etc/rabbitmq/rabbitmq.config `__ Installare il certificato ssl/tls per il dominio del server in: :: /etc/arpaecert/arpae_it-rabbitmq.pem /etc/arpaecert/arpae_it-mosquitto.pem e impostare gli opportuni privilegi di lettura/scrittura. :: -rw------- 1 mosquitto mosquitto 6849 1 dic 14.23 arpae_it-mosquitto.pem -rw------- 1 rabbitmq rabbitmq 6849 20 nov 10.49 arpae_it-rabbitmq.pem :: mkdir -p /rmap/rabbitmq/mnesia/ chown -R rabbitmq:rabbitmq /rmap/rabbitmq systemctl enable rabbitmq-server systemctl start rabbitmq-server effettuare il login all'interfaccia di management web: con user "guest" e password "guest", quindi utilizzare la funzione "import definition" per caricare exchange, queue e users importando il seguente file: `rabbit_server_data_ingestion.json `_ dalla stessa interfaccia di management web impostare le password per tutti gli utenti, rimuovere l'utente "guest" e fare login con uno dei nuovi utenti definiti. Monit ..... :: yum install monit scaricare il file `/etc/monitrc `__ scaricare il file `/etc/monit.d/rmap `__ :: chmod 0700 /etc/monitrc /etc/monit.d/rmap chown root:root /etc/monitrc /etc/monit.d/rmap systemctl enable monit systemctl start monit Sincronizzazione file statici per autenticazione e autorizzazione da un server RMAP backend ........................................................................................... Server di origine ~~~~~~~~~~~~~~~~~ :: rmapctrl --exportsha > file.pwd rmapctrl --exportmqttsha >> file.pwd rmapctrl --exportmqttacl > aclfile rmapctrl --exportmqttpsk > file.psk eventualmente rimuovere le prime righe di messaggistica del logging Server di destinazione ~~~~~~~~~~~~~~~~~~~~~~ Trasferire i file in /etc/mosquitto/ sul nostro server per la data ingestion. Imparire il comando: :: /bin/systemctl reload mosquitto.service Installazione server RMAP solo funzionalità BACKEND basato su Rocky Linux 8 (a seervizio per la data ingestion su un'altra macchina) ------------------------------------------------------------------------------------------------------------------------------------ Questi file sono specializzati per un server di solo backend: `/etc/httpd/conf.d/rmap.inc `__ `/etc/httpd/modsecurity.d/crs-setup.conf `__ In questi due file sostituire la stringa con quanto indicato. `/etc/monit.d/rmap `__ Servizi ....... Disabilitare mosquitto.