<?xml version="1.0" encoding="UTF-8" standalone="no"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" version="2.0">

<channel>
	<title>RaffaeleChiatto.com</title>
	<atom:link href="https://www.raffaelechiatto.com/feed/" rel="self" type="application/rss+xml"/>
	<link>https://www.raffaelechiatto.com</link>
	<description>Il Blog di Informatica a 360°</description>
	<lastBuildDate>Thu, 04 Jun 2026 06:26:33 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.0</generator>

<image>
	<url>https://www.raffaelechiatto.com/wp-content/uploads/2025/05/favicon-150x150.png</url>
	<title>RaffaeleChiatto.com</title>
	<link>https://www.raffaelechiatto.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<itunes:explicit>no</itunes:explicit><itunes:subtitle>Il Blog di Informatica a 360°</itunes:subtitle><itunes:category text="Technology"><itunes:category text="Gadgets"/></itunes:category><item>
		<title>Installazione e Configurazione Base di PatchMon v2 su Ubuntu Server 26.04</title>
		<link>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-patchmon-v2-su-ubuntu-server-26-04/</link>
					<comments>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-patchmon-v2-su-ubuntu-server-26-04/#respond</comments>
		
		<dc:creator><![CDATA[Raffaele Chiatto]]></dc:creator>
		<pubDate>Thu, 04 Jun 2026 06:26:33 +0000</pubDate>
				<category><![CDATA[PatchMon]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[powershell]]></category>
		<guid isPermaLink="false">https://www.raffaelechiatto.com/?p=1123679</guid>

					<description><![CDATA[&#160; Mantenere i propri server aggiornati è una delle pratiche fondamentali per garantire sicurezza e stabilità in qualsiasi infrastruttura, che si tratti di un homelab casalingo o di un ambiente di produzione. Sapere in tempo reale quali pacchetti necessitano di aggiornamento, quali patch di sicurezza sono disponibili e avere una visione centralizzata dello stato dei [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" class="size-full wp-image-1091058 alignnone" src="https://www.raffaelechiatto.com/wp-content/uploads/2020/12/ADVANCED-BAR.png" alt="" width="679" height="89" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2020/12/ADVANCED-BAR.png 679w, https://www.raffaelechiatto.com/wp-content/uploads/2020/12/ADVANCED-BAR-480x63.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 679px, 100vw" /></p>
<p>&nbsp;</p>
<p>Mantenere i propri server aggiornati è una delle pratiche fondamentali per garantire sicurezza e stabilità in qualsiasi infrastruttura, che si tratti di un homelab casalingo o di un ambiente di produzione.</p>
<p>Sapere in tempo reale quali pacchetti necessitano di aggiornamento, quali patch di sicurezza sono disponibili e avere una visione centralizzata dello stato dei propri sistemi Linux è qualcosa che, fino a poco tempo fa, richiedeva script personalizzati o soluzioni enterprise costose.</p>
<p>PatchMon v2 si propone come una soluzione open source elegante e leggera per il monitoraggio degli aggiornamenti su sistemi Debian/Ubuntu, offrendo una dashboard web intuitiva, notifiche configurabili e un&#8217;API REST che si integra facilmente con i principali strumenti di automazione e orchestrazione.</p>
<p>In questa guida vedremo come installare e configurare PatchMon v2 da zero su Ubuntu Server 26.04 LTS, la nuova release a supporto prolungato che introduce diverse ottimizzazioni lato sicurezza e gestione dei pacchetti. Partiremo dai prerequisiti di sistema, passeremo attraverso l&#8217;installazione del servizio e la sua configurazione base, fino ad avere un&#8217;istanza perfettamente funzionante e pronta all&#8217;uso.</p>
<p>Che tu stia gestendo un singolo server o una piccola flotta di macchine, al termine di questa guida avrai un sistema di monitoraggio delle patch affidabile, sempre sotto controllo.</p>
<h3><strong>PREREQUISITI</strong></h3>
<p>Ubuntu Server 26.04 LTS (Resolute Raccoon)</p>
<p>Architettura amd64/arm64</p>
<p>Utente con privilegi sudo o root</p>
<p>&nbsp;</p>
<h3><strong>AGGIORNAMENTO DEL SISTEMA</strong></h3>
<p>Aggiornare il sistema con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt update &amp;&amp; sudo apt upgrade -y</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>RIMOZIONE DEI PACCHETTI DOCKER CONFLITTUALI</strong></h3>
<p>Prima di installare Docker Engine, devi rimuovere eventuali pacchetti non ufficiali che potrebbero creare conflitti: Docker</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt remove docker.io docker-compose docker-compose-v2 docker-doc podman-docker containerd runc -y</pre><p>Non preoccuparti se alcuni pacchetti non risultano installati è normale.</p>
<p>&nbsp;</p>
<h3><strong>INSTALLAZIONE DOCKER CE DAL REPOSITORY UFFICIALE</strong></h3>
<p>Per avere sempre le ultime patch di sicurezza, aggiungi il repository ufficiale Docker alle sorgenti APT: iRexta</p>
<p>Installare i prerequisiti con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt install ca-certificates curl -y</pre><p>Aggiungere la GPG key ufficiale di Docker con i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo install -m 0755 -d /etc/apt/keyrings

sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc

sudo chmod a+r /etc/apt/keyrings/docker.asc</pre><p>Aggiungere il repository (usa automaticamente il codename &#8220;resolute&#8221;) con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release &amp;&amp; echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list &gt; /dev/null</pre><p>Aggiornare l&#8217;indice e installare Docker con i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt update

sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>VERIFICARE DOCKER E ABILITARE L&#8217;AVVIO AUTOMATICO</strong></h3>
<p>Verificare e abilitare Docker con i seguenti comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo systemctl enable --now docker

sudo systemctl status docker</pre><p>Dovremmo vedere Active: active (running).</p>
<p>&nbsp;</p>
<h3><strong>AGGIUNGERE IL TUO UTENTE AL GRUPPO DOCKER (OPZIONALE MA CONSIGLIATO)</strong></h3>
<p>Per eseguire i comandi Docker senza sudo aggiungere il tuo utente al gruppo docker con i seguenti comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo usermod -aG docker $USER

newgrp docker</pre><p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>ATTENZIONE</strong>: questo equivale a privilegi root sull&#8217;host. Fallo solo con utenti fidati.</p>
<p>&nbsp;</p>
<h3><strong>VERIFICA DEL DOCKER</strong></h3>
<p>Per verificare che Docker funzioni esseguire il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">docker run hello-world</pre><p>Dovremmo visualizzare il seguente output:</p><pre class="urvanov-syntax-highlighter-plain-tag">Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
4f55086f7dd0: Pull complete
d5e71e642bf5: Download complete
Digest: sha256:f9078146db2e05e794366b1bfe584a14ea6317f44027d10ef7dad65279026885
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/

For more examples and ideas, visit:
https://docs.docker.com/get-started/</pre><p>Quindi verificare la versione di Docker Compose installata con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">docker compose version</pre><p>Dovremmo visualizzare il seguente output:</p><pre class="urvanov-syntax-highlighter-plain-tag">Docker Compose version v5.1.3</pre><p>&nbsp;</p>
<h3></h3>
<h3><strong>INSTALLAZIONE DI PATCHMON V2</strong></h3>
<p>Eseguire lo script di setup da una directory vuota.</p>
<p>Scaricherà automaticamente docker-compose.yml e env.example, genererà tutti i secret necessari e ti guiderà nella configurazione dell&#8217;URL e del fuso orario in modo interattivo.</p>
<p>Eseguire i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">mkdir ~/patchmon &amp;&amp; cd ~/patchmon

bash -c "$(curl -fsSL https://raw.githubusercontent.com/PatchMon/PatchMon/refs/heads/main/docker/setup-env.sh)"</pre><p>Lo script chiederà le seguenti cose:</p><pre class="urvanov-syntax-highlighter-plain-tag">Will you be accessing PatchMon via a reverse proxy (nginx, Caddy, etc.)? (y/n) [n]: n

Do you want to change the timezone from UTC? (y/n) [n]: y

PatchMon runs on port 3000 by default. Include the port in your URL unless you are
terminating it at a reverse proxy on a standard port (e.g. https://patchmon.example.com).
Examples: http://192.168.1.10:3000 https://patchmon.local:3000 https://patchmon.example.com

What URL will you use to access PatchMon? [http://localhost:3000]: http://miodominio.lab:3000

Add (a), Remove (r), or Done (d) [d]: d</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>AVVIARE IL CONTAINER</strong></h3>
<p>Eseguire il comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">docker compose up -d</pre><p>Verificare che tutti i servizi siano Up:</p><pre class="urvanov-syntax-highlighter-plain-tag">[+] up 48/48
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Image postgres:17-alpine Pulled 10.6s
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Image redis:7-alpine Pulled 4.3s
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Image guacamole/guacd:latest Pulled 10.3s
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Image ghcr.io/patchmon/patchmon-server:latest Pulled 22.2s
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Network patchmon_patchmon-internal Created 0.0s
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Volume patchmon_postgres_data Created 0.0s
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Volume patchmon_redis_data Created 0.0s
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Container patchmon-database-1 Healthy 9.6s
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Container patchmon-redis-1 Healthy 10.1s
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Container patchmon-guacd-1 Healthy 11.6s
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Container patchmon-server-1 Started 5.5s</pre><p>Eseguire il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">docker compose ps</pre><p>Dovremmo vedere 4 container attivi: server, database (PostgreSQL), redis e guacd.</p><pre class="urvanov-syntax-highlighter-plain-tag">NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
patchmon-database-1 postgres:17-alpine "docker-entrypoint.s…" database 38 seconds ago Up 31 seconds (healthy) 5432/tcp
patchmon-guacd-1 guacamole/guacd:latest "/opt/guacamole/entr…" guacd 38 seconds ago Up 31 seconds (healthy) 4822/tcp
patchmon-redis-1 redis:7-alpine "docker-entrypoint.s…" redis 38 seconds ago Up 31 seconds (healthy) 6379/tcp
patchmon-server-1 ghcr.io/patchmon/patchmon-server:latest "./entrypoint.sh" server 32 seconds ago Up 25 seconds (healthy) 0.0.0.0:3000-&gt;3000/tcp, [::]:3000-&gt;3000/tcp</pre><p>&nbsp;</p>
<h3><strong>WIZARD DI PRIMO ACCESSO TRAMITE WEBGUI</strong></h3>
<p>Aprire il browser e richiamare l&#8217;URL che abbiamo configurato (es. <strong>http://miodominio.lab:3000</strong>).</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-01.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123680 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-01-1024x509.png" alt="" width="1024" height="509" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-01-980x487.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-01-480x238.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Inserire tutte le info richieste quindi cliccare <strong>Next</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-02.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123681 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-02-1024x508.png" alt="" width="1024" height="508" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-02-980x487.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-02-480x238.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Scegliere ser attivare l&#8217;MFA subito oppure se farlo dopo quindi cliccare <strong>Next</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-03.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123682 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-03-1024x508.png" alt="" width="1024" height="508" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-03-980x486.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-03-480x238.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Confermare l&#8217;<strong>URL del Server</strong> e valutare se abilitare il <strong>Certificato Self Signed</strong>. Cliccare <strong>Next</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-04.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123683 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-04-1024x509.png" alt="" width="1024" height="509" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-04-980x487.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-04-480x238.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Cliccare <strong>Next</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-05.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123684 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-05-1024x509.png" alt="" width="1024" height="509" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-05-980x487.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-05-480x238.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Cliccare su <strong>Access Dashboard</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-06.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123686 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-06-1024x510.png" alt="" width="1024" height="510" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-06-980x488.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-06-480x239.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Se è tutto OK dovremmo visualizzare la <strong>Dashboard di Patchmon</strong> come mostrato nell&#8217;immagine sovrastante</p>
<h3></h3>
<h3><strong>AGGIUNTA DI UN SERVER WINDOWS A PATCHMON</strong></h3>
<p>Dalla Dashboard</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-07.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123687 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-07-1024x511.png" alt="" width="1024" height="511" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-07-980x489.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-07-480x239.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Cliccare su <strong>Host</strong> dal menu laterale quindi <strong>Add Host</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-08.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123688 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-08-1024x493.png" alt="" width="1024" height="493" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-08-980x472.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-08-480x231.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Selezionare <strong>Windows</strong> come tipolgia di server quindi cliccare <strong>Next</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-09.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123689 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-09-1024x492.png" alt="" width="1024" height="492" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-09-980x471.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-09-480x230.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Inserire il nome quindi cliccare <strong>Next</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-10.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123691 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-10-1024x495.png" alt="" width="1024" height="495" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-10-980x474.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-10-480x232.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Copiare il comando da eseguire sul server da monitorare</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-11.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123692 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-11-1024x599.png" alt="" width="1024" height="599" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-11-980x573.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-11-480x281.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Sul server da monitorare aprire un <strong>Powershell</strong> con diritti amministrativi quindi incollare il comando</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-12.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123694 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-12-1024x494.png" alt="" width="1024" height="494" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-12-980x472.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-12-480x231.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Sulla <strong>Console PatchMon</strong> dovremmo vedere <strong>Waiting for Connection</strong></p>
<p>Sul Server da monitorare se è andato tutto a buon fine dovremmo visualizzare il seguente output del Powershell:</p><pre class="urvanov-syntax-highlighter-plain-tag">Encoding UTF8; &amp; "$env:TEMP\patchmon-install.ps1"
Fetching credentials from PatchMon server...
Credentials received successfully.
PatchMon Agent Installation for Windows
=======================================
Downloading agent from PatchMon server: http://192.168.80.34:3000/api/v1/hosts/agent/download?arch=amd64&amp;os=windows
Architecture: amd64
Install Path: C:\Program Files\PatchMon
Config Path: C:\ProgramData\PatchMon

Creating installation directory...
Creating configuration directory...
Downloading PatchMon agent...
Download completed.
Installing agent to C:\Program Files\PatchMon\patchmon-agent.exe...
Creating default configuration file...
Adding PatchMon to system PATH...
Configuring API credentials...
Credentials configured successfully.

Testing installation...
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> API credentials are valid
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Connectivity test successful
Installation test successful!

Setting up Windows Service...
Creating Windows Service...
Service created successfully.
Starting service...
Service started successfully!

PatchMon Agent installation completed successfully!

Installation Summary:
â¢ Configuration directory: C:\ProgramData\PatchMon
â¢ Agent binary installed: C:\Program Files\PatchMon\patchmon-agent.exe
â¢ Architecture: amd64
â¢ Windows Service: configured and running
â¢ API credentials configured and tested
â¢ Logs: C:\ProgramData\PatchMon\patchmon-agent.log

Management Commands:
â¢ Test connection: patchmon-agent ping
â¢ Manual report: patchmon-agent report
â¢ Check status: patchmon-agent diagnostics
â¢ Service status: Get-Service -Name PatchMonAgent
â¢ Service logs: Get-Content "C:\ProgramData\PatchMon\patchmon-agent.log" -Tail 50 -Wait
â¢ Restart service: Restart-Service -Name PatchMonAgent

Your system is now being monitored by PatchMon!</pre><p>&nbsp;</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-13.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123695 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-13-1024x491.png" alt="" width="1024" height="491" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-13-980x470.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-13-480x230.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Sulla Console PatchMon dovremmo visualizzare il server appena aggiunto</p>
<p>&nbsp;</p>
<h3><strong>AGGIUNTA DI UN SERVER LINUX A PATCHMON</strong></h3>
<p>Dalla Dashboard</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-14.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123696 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-14-1024x511.png" alt="" width="1024" height="511" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-14-980x489.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-14-480x239.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Cliccare su <strong>Host</strong> dal menu laterale quindi <strong>Add Host</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-15.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123697 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-15-1024x493.png" alt="" width="1024" height="493" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-15-980x471.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-15-480x231.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Selezionare Linux come tipologia di server quindi cliccare <strong>Next</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-16.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123699 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-16-1024x492.png" alt="" width="1024" height="492" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-16-980x471.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-16-480x231.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Inserire il nome quindi cliccare <strong>Next</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-17.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123700 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-17-1024x493.png" alt="" width="1024" height="493" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-17-980x472.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-17-480x231.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Copiare il comando da eseguire sul server Linux da monitorare</p>
<p>Dopo aver eseguito il comando sul server da monitorare se è tutto OK dovremmo visualizzare il seguente output:</p><pre class="urvanov-syntax-highlighter-plain-tag">INFO: Installing curl...
SUCCESS: All required packages are already installed

SUCCESS: Dependencies installation completed

INFO: Setting up configuration directory...
INFO: Creating new configuration directory...
INFO: Checking if agent is already configured...
SUCCESS: Agent not yet configured - proceeding with installation

INFO: Creating configuration files...
INFO: Downloading PatchMon agent binary...
INFO: Agent version: Unknown
INFO: Setting up log directory...
INFO: Testing API credentials and connectivity...
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> API credentials are valid
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Connectivity test successful
SUCCESS: TEST: API credentials are valid and server is reachable
INFO: Setting up systemd service...
Created symlink /etc/systemd/system/multi-user.target.wants/patchmon-agent.service → /etc/systemd/system/patchmon-agent.service.
SUCCESS: PatchMon Agent service started successfully
INFO: WebSocket connection established
SUCCESS: PatchMon Agent installation completed successfully!

Installation Summary:
• Configuration directory: /etc/patchmon
• Agent binary installed: /usr/local/bin/patchmon-agent
• Architecture: amd64
• Dependencies installed: curl
• Systemd service configured and running
• API credentials configured and tested
• WebSocket connection established
• Logs directory: /etc/patchmon/logs

Management Commands:
• Test connection: /usr/local/bin/patchmon-agent ping
• Manual report: /usr/local/bin/patchmon-agent report
• Check status: /usr/local/bin/patchmon-agent diagnostics
• Service status: systemctl status patchmon-agent
• Service logs: journalctl -u patchmon-agent -f
• Restart service: systemctl restart patchmon-agent

SUCCESS: Your system is now being monitored by PatchMon!</pre><p>&nbsp;</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-18.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123701 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-18-1024x494.png" alt="" width="1024" height="494" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-18-980x473.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-patchmon-ubuntu-18-480x232.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Se è andato tutto a buon fine sulla console di PatchMon dovremmo visualizzare il server aggiunto</p>
<h3></h3>
<h3><strong>DISINSTALLAZIONE DELL&#8217;AGENT PATCHMON DA UN HOST WINDOWS</strong></h3>
<p>Su un server Windows eseguire con una console Powershell con diritti amministrativi eseguire i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag"><strong># 1. Ferma il servizio</strong>
Stop-Service -Name "patchmon-agent" -Force -ErrorAction SilentlyContinue

<strong># 2. Rimuovi il servizio Windows</strong>
sc.exe delete "patchmon-agent"

<strong># 3. Rimuovi il binario e i file dell'agente</strong>
Remove-Item -Path "C:\Program Files\patchmon-agent\*" -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item -Path "C:\Program Files\patchmon-agent" -Recurse -Force -ErrorAction SilentlyContinue

<strong># 4. Rimuovi la configurazione e le credenziali</strong>
Remove-Item -Path "C:\ProgramData\patchmon\*" -Recurse -Force -ErrorAction SilentlyContinue
Remove-Item -Path "C:\ProgramData\patchmon" -Recurse -Force -ErrorAction SilentlyContinue

<strong># 5. Verifica che il servizio sia stato rimosso</strong>
Get-Service -Name "patchmon-agent" -ErrorAction SilentlyContinue</pre><p>&nbsp;</p>
<p><strong>NOTA BENE</strong>: rimuovere l&#8217;agente dall&#8217;host non lo elimina automaticamente dalla dashboard di PatchMon. Ricordati di cancellare l&#8217;host anche dalla UI per tenerla pulita</p>
<p>&nbsp;</p>
<h3><strong>DISINSTALLAZIONE DELL&#8217;AGENT PATCHMON DA UN HOST LINUX</strong></h3>
<p>Su un server Linux eseguire l&#8217;agente include un comando di disinstallazione integrato:</p><pre class="urvanov-syntax-highlighter-plain-tag"><strong># Rimozione base (binario + crontab)</strong>
sudo patchmon-agent uninstall

<strong># Rimozione completa (binario + config + log)</strong>
sudo patchmon-agent uninstall --remove-all

<strong># Rimozione silenziosa senza conferma</strong>
sudo patchmon-agent uninstall -af</pre><p>Se il server non è raggiungibile, puoi rimuovere l&#8217;agente manualmente:</p><pre class="urvanov-syntax-highlighter-plain-tag"><strong># 1. Ferma e disabilita il servizio (systemd)</strong>

sudo systemctl stop patchmon-agent
sudo systemctl disable patchmon-agent
sudo rm -f /etc/systemd/system/patchmon-agent.service
sudo systemctl daemon-reload

<strong># 2. Termina eventuali processi residui</strong>

sudo pkill -f patchmon-agent

<strong># 3. Rimuovi il binario</strong>

sudo rm -f /usr/local/bin/patchmon-agent
sudo rm -f /usr/local/bin/patchmon-agent.backup.*

<strong># 4. Rimuovi configurazione e log</strong>

sudo rm -rf /etc/patchmon/

<strong># 5. Rimuovi eventuali entry crontab</strong>

crontab -l 2&gt;/dev/null | grep -v "patchmon-agent" | crontab -

<strong># 6. Verifica la rimozione completa</strong>

which patchmon-agent # deve restituire vuoto
ls /etc/patchmon/ 2&gt;/dev/null # deve dire "No such file or directory"
systemctl status patchmon-agent 2&gt;&amp;1 | head -1 # deve dire "not found"
Per Alpine Linux (OpenRC) al posto dei comandi systemd usa:
bashsudo rc-service patchmon-agent stop
sudo rc-update del patchmon-agent default
sudo rm -f /etc/init.d/patchmon-agent</pre><p>&nbsp;</p>
<p><strong>NOTA BENE</strong>: rimuovere l&#8217;agente dall&#8217;host non lo elimina automaticamente dalla dashboard di PatchMon. Ricordati di cancellare l&#8217;host anche dalla UI per tenerla pulita</p>
<p>&nbsp;</p>
<h3><strong>AGGIORNAMENTO DI PATCHMON</strong></h3>
<p>Per aggiornare PatchMon eseguire i comandi elencati di seguito:</p><pre class="urvanov-syntax-highlighter-plain-tag">cd ~/patchmon

docker compose pull

docker compose up -d</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>CONFIGURAZIONE DI PATCHMON DIETRO REVERSE PROXY</strong></h3>
<p>La configurazione si articola in due parti: il file .env di PatchMon e il Proxy Host in NPM.</p>
<h4><strong>Parte 1 — Modificare il file .env di PatchMon</strong></h4>
<p>Questo è il passaggio più importante. Apri il file .env nella directory di PatchMon:</p><pre class="urvanov-syntax-highlighter-plain-tag">nano ~/patchmon/.env</pre><p>Individuare e modificare le seguenti variabili:</p><pre class="urvanov-syntax-highlighter-plain-tag">env# URL pubblico del tuo server PatchMon
SERVER_PROTOCOL=https
SERVER_HOST=patchmon.tuodominio.it
SERVER_PORT=443
CORS_ORIGIN=https://patchmon.tuodominio.it

# OBBLIGATORIO con NPM o qualsiasi reverse proxy
TRUST_PROXY=true

# Abilita HSTS in produzione con HTTPS
ENABLE_HSTS=true</pre><p>&nbsp;</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>TRUST_PROXY</strong> ora è true per default in v2. La maggior parte degli utenti usa PatchMon dietro un reverse proxy (<strong>Traefik, Caddy, Nginx, NPM</strong>); il precedente default false causava problemi di login OIDC e perdita degli IP reali dei client. Se esponi PatchMon direttamente su IP pubblico senza proxy, imposta esplicitamente <strong>TRUST_PROXY=false</strong>.</p>
<p>Dopo aver salvato, riavvia i container con i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">cd ~/patchmon
docker compose down &amp;&amp; docker compose up -d</pre><p>&nbsp;</p>
<h4><strong>Parte 2 — Configurare il Proxy Host in NPM</strong></h4>
<p>Accedere alla dashboard di NPM (http://IP-NPM:81)<br />
Andare su Proxy Hosts → Add Proxy Host<br />
Compila la scheda Details così:</p>
<p><strong>Domain Names</strong>: patchmon.tuodominio.it</p>
<p><strong>Scheme</strong>: http</p>
<p><strong>Forward Hostname / IP</strong>: IP del server PatchMon (es. 192.168.1.100)</p>
<p><strong>Forward Port:</strong> 3000</p>
<p><strong>Cache Assets</strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Off</p>
<p><strong>Block Common Exploits</strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> On</p>
<p><strong>Websockets Support</strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> On ← fondamentale</p>
<p>Nella scheda SSL:</p>
<ul>
<li>Selezionare o richiedere un certificato Let&#8217;s Encrypt</li>
<li>Abilitare Force SSL</li>
<li>Abilitare HTTP/2 Support</li>
</ul>
<p>Nella scheda <strong>Advanced</strong>, incollare queste direttive custom per garantire il corretto passaggio degli header ai WebSocket:</p>
<p><strong>nginxproxy_set_header Host $host;</strong><br />
<strong>proxy_set_header X-Real-IP $remote_addr;</strong><br />
<strong>proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;</strong><br />
<strong>proxy_set_header X-Forwarded-Proto $scheme;</strong></p>
<p><strong># WebSocket</strong><br />
<strong>proxy_http_version 1.1;</strong><br />
<strong>proxy_set_header Upgrade $http_upgrade;</strong><br />
<strong>proxy_set_header Connection &#8220;upgrade&#8221;;</strong><br />
<strong>proxy_read_timeout 3600s;</strong><br />
<strong>proxy_send_timeout 3600s;</strong></p>
<p>Cliccare <strong>Save</strong></p>
<h4><strong>Perché i WebSocket sono critici</strong></h4>
<p>TLS in produzione: usa sempre HTTPS e WSS. L&#8217;agente assume WSS quando l&#8217;URL del server inizia con https://. Quando sei dietro Nginx (o simili), assicurati che l&#8217;header X-Forwarded-Proto: https venga inviato correttamente al backend, in modo che rilevi la connessione sicura.</p>
<p>Gli agenti usano HTTPS per i report e la configurazione, e WSS (WebSocket over TLS) per eventi in tempo reale come lo streaming live delle patch e lo stato Docker. Assicurati che i WebSocket siano supportati dal proxy quando inoltri il traffico al container PatchMon sulla porta 3000.</p>
<h4><strong>Verifica finale</strong></h4>
<p>Dopo aver salvato tutto, controlla che la connessione sia corretta accedendo a https://patchmon.tuodominio.it.</p>
<p>Nella dashboard, gli agenti connessi dovrebbero mostrare lo stato WSS (verde) e non WS (non sicuro).</p>
<p>Se un agente già installato usa il vecchio URL HTTP, aggiorna la sua configurazione</p>
<p>&nbsp;</p>
<h3><strong>NOTE IMPORTANTI</strong></h3>
<p><strong>UFW e Docker:</strong> Ubuntu 26.04 usa UFW come firewall, ma Docker manipola iptables direttamente, bypassando UFW. Se esponi una porta tramite Docker, questa rimane aperta al pubblico anche se bloccata in UFW. Per mitigare, fai bind solo su localhost e usa un reverse proxy (Nginx, Caddy, NPM) per l&#8217;accesso esterno.</p>
<p>Reverse proxy e WebSocket: assicurati che il tuo proxy supporti i WebSocket, poiché gli agenti li usano per eventi in tempo reale (WSS su porta 443).</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-patchmon-v2-su-ubuntu-server-26-04/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Installazione e Configurazione Base di OpenGRC su Ubuntu Server 26.04</title>
		<link>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-opengrc-su-ubuntu-server-26-04/</link>
					<comments>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-opengrc-su-ubuntu-server-26-04/#respond</comments>
		
		<dc:creator><![CDATA[Raffaele Chiatto]]></dc:creator>
		<pubDate>Mon, 01 Jun 2026 11:59:54 +0000</pubDate>
				<category><![CDATA[OpenGRC]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[GDPR]]></category>
		<category><![CDATA[Laravel]]></category>
		<category><![CDATA[NodeJS]]></category>
		<category><![CDATA[NPM]]></category>
		<guid isPermaLink="false">https://www.raffaelechiatto.com/?p=1123642</guid>

					<description><![CDATA[&#160; La gestione della Governance, Risk and Compliance (GRC) è spesso percepita come un&#8217;attività riservata alle grandi organizzazioni con budget dedicati e piattaforme enterprise dai costi proibitivi. OpenGRC ribalta questa prospettiva: si tratta di un&#8217;applicazione web open-source progettata specificamente per piccoli team e PMI che hanno la necessità di strutturare il proprio programma di sicurezza [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" class="size-full wp-image-1091058 alignnone" src="https://www.raffaelechiatto.com/wp-content/uploads/2020/12/ADVANCED-BAR.png" alt="" width="679" height="89" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2020/12/ADVANCED-BAR.png 679w, https://www.raffaelechiatto.com/wp-content/uploads/2020/12/ADVANCED-BAR-480x63.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 679px, 100vw" /></p>
<p>&nbsp;</p>
<p>La gestione della Governance, Risk and Compliance (GRC) è spesso percepita come un&#8217;attività riservata alle grandi organizzazioni con budget dedicati e piattaforme enterprise dai costi proibitivi.</p>
<p>OpenGRC ribalta questa prospettiva: si tratta di un&#8217;applicazione web open-source progettata specificamente per piccoli team e PMI che hanno la necessità di strutturare il proprio programma di sicurezza senza rinunciare alla semplicità d&#8217;uso.</p>
<p>In questa guida vedremo come installare e configurare OpenGRC su Ubuntu Server 26.04 LTS, dalla preparazione dell&#8217;ambiente fino al primo accesso all&#8217;interfaccia web.</p>
<p>Costruito su PHP e il framework Laravel OpenGRC permette di gestire controlli di sicurezza, framework di compliance, audit, rischi e vendor management da un&#8217;unica interfaccia intuitiva, con il vantaggio di essere completamente self-hosted.</p>
<p>Licenza: OpenGRC è distribuito sotto licenza Creative Commons Attribution-NonCommercial-ShareAlike 4.0. È consentito l&#8217;uso commerciale interno, ma non la rivendita del software né l&#8217;hosting per clienti terzi.</p>
<p>Che tu stia cercando di avvicinarti per la prima volta al mondo della GRC o di sostituire un foglio Excel con qualcosa di più strutturato OpenGRC potrebbe essere esattamente ciò di cui hai bisogno.</p>
<p>OpenGRC è un&#8217;applicazione web open-source per la Governance, Risk and Compliance (GRC) pensata per piccoli team e PMI.</p>
<p>&nbsp;</p>
<h3><strong>PREREQUISITI</strong></h3>
<p>Prima di iniziare verificare che il sistema soddisfi i requisiti minimi:</p>
<ul>
<li>PHP8.X</li>
<li>Composer2.5</li>
<li>Node.js18.0</li>
<li>NPM8.0</li>
<li>MySQL 5.7+ / MariaDB 10.3+ / SQLite 3</li>
</ul>
<p>&nbsp;</p>
<h3><strong>AGGIORNAMENTO DEL SISTEMA</strong></h3>
<p>Aggiornare i pacchetti del sistema prima di procedere con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt update &amp;&amp; sudo apt upgrade -y</pre><p>&nbsp;</p>
<h3><strong>INSTALLAZIONE DI PHP E RELATIVE ESTENSIONI</strong></h3>
<p>Procedere all&#8217;installazione di PHP con i seguenti comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt install -y software-properties-common

sudo add-apt-repository ppa:ondrej/php -y

sudo apt update</pre><p>Installare il PHP con tutte le estensioni necessarie con il seguente comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt install -y \
php \
php-cli \
php-common \
php-fpm \
php-mbstring \
php-xml \
php-curl \
php-zip \
php-gd \
php-bcmath \
php-intl \
php-sqlite3 \
php-mysql \
unzip \
git \
curl</pre><p>Verificare la versione installata:</p><pre class="urvanov-syntax-highlighter-plain-tag">php -v</pre><p>Dovremmo visualizzare il seguente output:</p><pre class="urvanov-syntax-highlighter-plain-tag">PHP 8.5.4 (cli) (built: Apr 1 2026 09:36:11) (NTS)
Copyright (c) The PHP Group
Built by Ubuntu
Zend Engine v4.5.4, Copyright (c) Zend Technologies
with Zend OPcache v8.5.4, Copyright (c), by Zend Technologies</pre><p>&nbsp;</p>
<h3></h3>
<h3><strong>INSTALLAZIONE DEL COMPOSER</strong></h3>
<p>Installare il Composer con i seguenti comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">curl -sS https://getcomposer.org/installer | php

sudo mv composer.phar /usr/local/bin/composer

sudo chmod +x /usr/local/bin/composer</pre><p>Verificare la versione installata con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">composer --version</pre><p>Se è tutto OK dovremmo visualizzare il seguente output:</p><pre class="urvanov-syntax-highlighter-plain-tag">Composer version 2.9.7 2026-04-14 13:31:52
PHP version 8.5.4 (/usr/bin/php8.5)
Run the "diagnose" command to get more detailed diagnostics output.</pre><p>&nbsp;</p>
<h3></h3>
<h3><strong>INSTALLAZIONE DI NODE.JS E NPM</strong></h3>
<p>Usa NodeSource per installare Node.js 20 LTS:</p><pre class="urvanov-syntax-highlighter-plain-tag">curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -

sudo apt install -y nodejs</pre><p>Verificare la versione di Node.Js con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">node -v</pre><p>Se è tutto OK dovremmo visualizzare il seguente output:</p><pre class="urvanov-syntax-highlighter-plain-tag">v20.20.2</pre><p>Verificare la versione di NPM con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">npm -v</pre><p>Se è tutto OK dovremmo visualizzare il seguente output:</p><pre class="urvanov-syntax-highlighter-plain-tag">10.8.2</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>CONFIGURAZIONE DEL DATABASE MYSQL</strong></h3>
<p>Se si preferisce usare SQLite (consigliato per ambienti di test o installazioni leggere), puoi saltare questo step.</p>
<p>L&#8217;installer di OpenGRC configura SQLite automaticamente senza ulteriori setup.</p>
<p>Per un ambiente di produzione consiglio l&#8217;installazione di MySQL:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt install -y mysql-server

sudo systemctl enable --now mysql

sudo mysql_secure_installation</pre><p>Creare il database e l&#8217;utente dedicato con i seguenti comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo mysql -u root -p</pre><p>Quindi Creare il DB con relativa utenza con i seguenti comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">CREATE DATABASE opengrc CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

CREATE USER 'opengrc'@'localhost' IDENTIFIED BY 'password_sicura';

GRANT ALL PRIVILEGES ON opengrc.* TO 'opengrc'@'localhost';

FLUSH PRIVILEGES;

EXIT;</pre><p><strong>ATTENZIONE</strong>: Se si usa MySQL il database deve essere creato prima di eseguire l&#8217;installer.</p>
<p>&nbsp;</p>
<h3></h3>
<h3><strong>INSTALLAZIONE DI APACHE E CONFIGURAZIONE DEL VIRTUAL HOST</strong></h3>
<p>Installare Apache e il modulo per PHP-FPM con i seguenti comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt install -y apache2 libapache2-mod-fcgid

sudo a2enmod rewrite proxy_fcgi setenvif

sudo a2enconf php8.5-fpm

sudo systemctl enable --now apache2</pre><p>Creare la directory di installazione con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo mkdir -p /var/www/html</pre><p>&nbsp;</p>
<h3></h3>
<h3><strong>CLONAZIONE DEL REPOSITORY DI OPERNGRC</strong></h3>
<p>Posizionarsi nella cartella html con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">cd /var/www/html</pre><p>Quindi clonare il repository con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo git clone https://github.com/LeeMangold/OpenGRC.git

cd OpenGRC</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>ESECUZIONE DELL&#8217;INSTALLER</strong></h3>
<p>L&#8217;installer interattivo si occupa di tutto: dipendenze, database, chiave applicativa, utente admin e asset frontend.</p>
<p>Eseguire il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo bash install.sh</pre><p>&nbsp;</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-01.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123643 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-01-1024x542.png" alt="" width="1024" height="542" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-01-980x519.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-01-480x254.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Premere un qualsiasi tasto per proseguire</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-02.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123644 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-02-1024x549.png" alt="" width="1024" height="549" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-02-980x525.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-02-480x257.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Selezionare <strong>MySQL</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-03.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123645 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-03-1024x549.png" alt="" width="1024" height="549" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-03-980x525.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-03-480x257.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Inserire l&#8217;IP del database MySQL (nel mio caso è localhost)</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-04.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123646 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-04-1024x548.png" alt="" width="1024" height="548" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-04-980x524.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-04-480x257.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Inserire la porta del Database</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-05.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123647 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-05-1024x549.png" alt="" width="1024" height="549" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-05-980x525.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-05-480x257.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Inserire il nome del Database</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-06.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123649 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-06-1024x549.png" alt="" width="1024" height="549" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-06-980x525.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-06-480x257.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Inserire l&#8217;utente per l&#8217;accesso al Database</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-07.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123650 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-07-1024x548.png" alt="" width="1024" height="548" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-07-980x524.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-07-480x257.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Inserire la password dell&#8217;utente</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-08.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123651 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-08-1024x549.png" alt="" width="1024" height="549" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-08-980x525.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-08-480x257.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Inserire la mail dell&#8217;utente admin</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-09.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123652 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-09-1024x548.png" alt="" width="1024" height="548" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-09-980x525.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-09-480x257.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Inserire la password di accesso</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-10.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123654 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-10-1024x549.png" alt="" width="1024" height="549" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-10-980x525.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-10-480x257.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Inserire il nome del Site</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-11.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123655 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-11-1024x547.png" alt="" width="1024" height="547" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-11-980x524.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-11-480x257.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Inserire il Site URL</p>
<p>Se è andato tutto a buon fine dovremmo visualizzare il seguente output:</p>
<p><strong>########################################</strong><br />
<strong>OpenGRC has been installed successfully!</strong><br />
<strong>########################################</strong></p>
<p><strong>ALTERNATIVA</strong>: Installazione non interattiva (SQLite + credenziali di default)<br />
Se vuoi installare rapidamente con i valori predefiniti (SQLite, utente admin@example.com / password password) eseguire i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">composer update

php artisan opengrc:install --unattended</pre><p><strong>NOTA BENE</strong>: Dopo l&#8217;installazione se devi eseguire nuovamente l&#8217;installer devi prima eliminare il file databases/opengrc.sqlite (per SQLite) oppure eliminare e ricreare il database MySQL.</p>
<h3></h3>
<h3><strong>IMPOSTAZIONE DEI PERMESSI CORRETTI</strong></h3>
<p>Posizionarsi nella cartella OpenGRC con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">cd /var/www/html/OpenGRC</pre><p>Quindi configurare i permessi con i seguenti comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo chown -R www-data:www-data /var/www/html/OpenGRC/vendor

sudo chmod -R 775 storage bootstrap/cache</pre><p>E&#8217; possibile rivedere i permessi eseguendo lo script incluso nel progetto con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">cat set_permissions</pre><p>E&#8217; possibile modificare i permessi (se necessario) eseguendo il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo bash set_permissions</pre><p>&nbsp;</p>
<h3></h3>
<h3><strong>CONFIGURAZIONE DEL VIRTUAL HOST DI APACHE</strong></h3>
<p>Creare il file di configurazione del sito con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo nano /etc/apache2/sites-available/opengrc.conf</pre><p>Incollare la seguente configurazione (sostituire tuodominio.it con il tuo dominio o IP):</p><pre class="urvanov-syntax-highlighter-plain-tag">apache&lt;VirtualHost *:80&gt;
ServerName tuodominio.it
DocumentRoot /var/www/html/OpenGRC/public

&lt;Directory /var/www/html/OpenGRC/public&gt;
Options -Indexes +FollowSymLinks
AllowOverride All
Require all granted
&lt;/Directory&gt;

ErrorLog ${APACHE_LOG_DIR}/opengrc_error.log
CustomLog ${APACHE_LOG_DIR}/opengrc_access.log combined
&lt;/VirtualHost&gt;</pre><p>Salvare e chiudere il file di configurazione.</p>
<p>Abilitare il sito e ricaricare Apache con i seguenti comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo a2dissite 000-default.conf

sudo a2ensite opengrc.conf

sudo systemctl reload apache2</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>CONFIGURAZIONE DEL QUEUE WORKER CON SUPERVISOR</strong></h3>
<p>OpenGRC usa il sistema di code di Laravel per elaborare task in background (email, import, report, ecc.).</p>
<p>Senza un queue worker attivo, queste funzionalità non operano correttamente.</p>
<p>Installare Supervisor con i seguenti comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt install -y supervisor

sudo systemctl enable --now supervisor</pre><p>Creare la configurazione del worker con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo nano /etc/supervisor/conf.d/opengrc-worker.conf</pre><p>Quindi incollare la seguente configurazione:</p><pre class="urvanov-syntax-highlighter-plain-tag">[program:opengrc-worker]
process_name=%(program_name)s_%(process_num)02d
command=php /var/www/html/OpenGRC/artisan queue:work --sleep=3 --tries=3 --max-time=3600
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=www-data
numprocs=1
redirect_stderr=true
stdout_logfile=/var/www/html/OpenGRC/storage/logs/worker.log
stopwaitsecs=3600</pre><p>Salvare e chiudere il file di configurazione</p>
<p><strong>ATTENZIONE</strong>: Il worker deve girare con lo stesso utente del web server (www-data). In caso contrario si verificheranno errori di permessi su cache, log e storage.</p>
<p>Avviare il worker con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo supervisorctl reread</pre><p>Dovremmo visualizzare il seguente output:</p><pre class="urvanov-syntax-highlighter-plain-tag">opengrc-worker: available</pre><p></p><pre class="urvanov-syntax-highlighter-plain-tag">sudo supervisorctl update</pre><p>Dovremmo visualizzare il seguente output:</p><pre class="urvanov-syntax-highlighter-plain-tag">opengrc-worker: added process group</pre><p></p><pre class="urvanov-syntax-highlighter-plain-tag">sudo supervisorctl start opengrc-worker:*</pre><p>Dovremmo visualizzare il seguente output:</p><pre class="urvanov-syntax-highlighter-plain-tag">opengrc-worker:opengrc-worker_00: started</pre><p>Verificare lo stato con i seguenti comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo supervisorctl status opengrc-worker:*</pre><p>Se è tutto OK dovremmo visualizzare il seguente output:</p><pre class="urvanov-syntax-highlighter-plain-tag">opengrc-worker:opengrc-worker_00 RUNNING pid 30413, uptime 0:00:28

tail -f /var/www/html/OpenGRC/storage/logs/worker.log</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>PRIMO ACCESSO ALLA WEB GUI E CONFIGURAZIONE BASE</strong></h3>
<p>Aprire il browser e aprire l&#8217;indirizzo del server:</p>
<p><strong>http://tuodominio.it</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-12.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123656 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-12-1024x491.png" alt="" width="1024" height="491" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-12-980x470.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-12-480x230.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Se è tutto Ok dovremmo visualizzare la pagina di accesso di OpenGRC</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-13.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123657 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-13-1024x488.png" alt="" width="1024" height="488" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-13-980x467.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-13-480x229.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Inserire le credenziali censite in prencedenza quindi cliccare <strong>Sign In</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-14.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123659 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-14-1024x494.png" alt="" width="1024" height="494" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-14-980x473.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/install-opengrc-ubuntu-14-480x232.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Dovremmo visualizzare la Dashboard di OpenGRC come mostrato nell&#8217;immagine sovrastante</p>
<p>&nbsp;</p>
<h3><strong>CONFIGURAZIONE BASE TRAMITE INTERFACCIA WEB</strong></h3>
<p>Dopo il primo login andare in Settings per configurare:</p>
<ul>
<li>Nome organizzazione</li>
<li>fuso orario</li>
<li>MailServer SMTP per l&#8217;invio di notifiche email</li>
<li>Politiche password</li>
<li>timeout sessione</li>
<li>Authentication SSO (Microsoft Azure, Okta, Google, Auth0)</li>
<li>Storage locale o AWS S3 per i file allegati</li>
<li>Portale pubblico per la trasparenza verso clienti</li>
</ul>
<p>&nbsp;</p>
<h3><strong>AGGIORNAMENTI DI OPENGRC</strong></h3>
<p>Per aggiornare OpenGRC a una nuova versione eseguire i seguenti comandi riportati di seguito:</p><pre class="urvanov-syntax-highlighter-plain-tag">cd /var/www/html/OpenGRC

git pull origin main

composer install --no-dev

npm install

npm run build

php artisan migrate --force

php artisan config:cache

php artisan route:cache

php artisan view:cache

php artisan queue:restart

sudo chown -R www-data:www-data storage bootstrap/cache</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>TROUBLESHOOTING</strong></h3>
<p>Errori di permessi</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo chown -R www-data:www-data /var/www/html/OpenGRC/storage
sudo chown -R www-data:www-data /var/www/html/OpenGRC/bootstrap/cache
sudo chmod -R 775 /var/www/html/OpenGRC/storage
sudo chmod -R 775 /var/www/html/OpenGRC/bootstrap/cache</pre><p>Il queue worker non processa i job</p>
<p>bash# Controlla lo stato di Supervisor</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo supervisorctl status</pre><p>Verifica il file .env</p><pre class="urvanov-syntax-highlighter-plain-tag">grep QUEUE_CONNECTION /var/www/html/OpenGRC/.env</pre><p># Deve essere: QUEUE_CONNECTION=database (non sync)</p>
<p>Controllare i job falliti</p><pre class="urvanov-syntax-highlighter-plain-tag">cd /var/www/html/OpenGRC
php artisan queue:failed
Pagina bianca o errori 500</pre><p></p><pre class="urvanov-syntax-highlighter-plain-tag">tail -f /var/www/html/OpenGRC/storage/logs/laravel.log

tail -f /var/log/apache2/opengrc_error.log</pre><p>Assicurarsi anche che la chiave applicativa sia impostata nel file .env:</p><pre class="urvanov-syntax-highlighter-plain-tag">grep APP_KEY /var/www/html/OpenGRC/.env</pre><p># Se vuota, rigenera con:</p><pre class="urvanov-syntax-highlighter-plain-tag">php artisan key:generate</pre><p>Per Creare un nuovo utente</p><pre class="urvanov-syntax-highlighter-plain-tag">cd /var/www/html/OpenGRC
php artisan opengrc:create-user</pre><p>Per reimpostare la password di un utente</p><pre class="urvanov-syntax-highlighter-plain-tag">php artisan opengrc:reset-password</pre><p>&nbsp;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-opengrc-su-ubuntu-server-26-04/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Automatizzare l’inventario delle licenze Microsoft 365: export utenti e assegnazioni con Microsoft Graph API</title>
		<link>https://www.raffaelechiatto.com/automatizzare-linventario-delle-licenze-microsoft-365-export-utenti-e-assegnazioni-con-microsoft-graph-api/</link>
					<comments>https://www.raffaelechiatto.com/automatizzare-linventario-delle-licenze-microsoft-365-export-utenti-e-assegnazioni-con-microsoft-graph-api/#respond</comments>
		
		<dc:creator><![CDATA[Raffaele Chiatto]]></dc:creator>
		<pubDate>Thu, 28 May 2026 06:27:25 +0000</pubDate>
				<category><![CDATA[Microsoft 365]]></category>
		<category><![CDATA[Microsoft Graph API]]></category>
		<category><![CDATA[Microsoft Licenze]]></category>
		<guid isPermaLink="false">https://www.raffaelechiatto.com/?p=1123529</guid>

					<description><![CDATA[&#160; Chiunque abbia mai gestito un tenant Microsoft 365 con qualche centinaio di utenti conosce bene la sensazione: aprire l&#8217;interfaccia di amministrazione, navigare tra pannelli e sottomenu e cercare di capire (in tempi ragionevoli) chi ha quale licenza, quante ne sono state assegnate e quante restano disponibili. Un&#8217;operazione all&#8217;apparenza banale che ripetuta ogni mese o [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" class="size-full wp-image-1091057 alignnone" src="https://www.raffaelechiatto.com/wp-content/uploads/2020/12/DIFFICULT-BAR.png" alt="" width="679" height="89" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2020/12/DIFFICULT-BAR.png 679w, https://www.raffaelechiatto.com/wp-content/uploads/2020/12/DIFFICULT-BAR-480x63.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 679px, 100vw" /></p>
<p>&nbsp;</p>
<p>Chiunque abbia mai gestito un tenant Microsoft 365 con qualche centinaio di utenti conosce bene la sensazione: aprire l&#8217;interfaccia di amministrazione, navigare tra pannelli e sottomenu e cercare di capire (in tempi ragionevoli) chi ha quale licenza, quante ne sono state assegnate e quante restano disponibili.</p>
<p>Un&#8217;operazione all&#8217;apparenza banale che ripetuta ogni mese o ogni volta che arriva una richiesta dall&#8217;ufficio acquisti diventa rapidamente una fonte di frustrazione silenziosa.</p>
<p>Il problema non è la complessità tecnica in sé ma la mancanza di automazione. Il portale di amministrazione è pensato per operazioni puntuali non per estrarre dati strutturati in modo ripetibile e affidabile.</p>
<p>Esportare manualmente un elenco di utenti con le relative assegnazioni di licenze significa tempo sprecato, rischio di errori e soprattutto un processo che non scala.</p>
<p>È qui che entra in gioco Microsoft Graph API: un&#8217;interfaccia unificata e potente che consente di interrogare l&#8217;intero ecosistema Microsoft 365 a livello programmatico ottenendo in pochi secondi le stesse informazioni che il portale restituisce in molti clic.</p>
<p>Con le giuste chiamate API è possibile costruire un inventario completo e aggiornato di tutti gli utenti del tenant corredato delle SKU di licenza assegnate dei service plan attivi e dello stato di ogni sottoscrizione.</p>
<p>In questo articolo vedremo come automatizzare l&#8217;intero processo dall&#8217;autenticazione tramite un&#8217;applicazione registrata su Azure Active Directory fino alla generazione di un export strutturato e pronto per essere analizzato o integrato nei propri strumenti di reporting.</p>
<p>Niente più copia-incolla dal portale: solo dati, script e un inventario sempre aggiornato con un singolo comando.</p>
<p>&nbsp;</p>
<h3><strong>PREREQUISITI</strong></h3>
<p>Sul PC da cui si eseguirà lo script:</p>
<ul>
<li>Windows con PowerShell 5.1 o superiore (già incluso in Windows 10/11)</li>
<li>Connessione internet</li>
<li>Modulo Microsoft.Graph installato</li>
</ul>
<p>Su Azure / Microsoft 365:</p>
<ul>
<li>Accesso al portale Azure (portal.azure.com) con un account Global Admin o Application Admin</li>
<li>Un&#8217;App Registration creata in Azure AD con:
<ul>
<li>Le permission di tipo Application (non Delegated) per User.Read.All, Directory.Read.All e Organization.Read.All</li>
<li>L&#8217;Admin Consent concesso per tutte e tre le permission</li>
<li>Un Client Secret generato e copiato</li>
<li>I tre valori disponibili: Tenant ID, Client ID e Client Secret</li>
</ul>
</li>
</ul>
<p>Permessi minimi sull&#8217;account che crea l&#8217;App Registration:</p>
<ul>
<li>Ruolo Global Administrator oppure Application Administrator nel tenant M365</li>
</ul>
<h3></h3>
<h3><strong>CREAZIONE E CONFIGURAZIONE DELL&#8217;APP SUL TENANT AZURE</strong></h3>
<p>Richiamare da un qualsiasi browser <a href="https://portal.azure.com" target="_blank" rel="noopener">portal.azure.com</a></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-00.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123534 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-00-1024x508.png" alt="" width="1024" height="508" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-00-980x486.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-00-480x238.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Cercare <strong>App Registration</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-01.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123535 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-01-1024x508.png" alt="" width="1024" height="508" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-01-980x486.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-01-480x238.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Cliccare su <strong>New Registration</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-02.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123536 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-02-1024x509.png" alt="" width="1024" height="509" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-02-980x487.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-02-480x238.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Dare un nome all&#8217;App (Es: <strong>ExportLicense</strong>) quindi cliccare su <strong>Register</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-03.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123537 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-03-1024x508.png" alt="" width="1024" height="508" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-03-980x486.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-03-480x238.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Copiare l&#8217;<strong>Application (client) ID</strong> e il <strong>Directory (tenant) ID</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-04.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123538 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-04-1024x508.png" alt="" width="1024" height="508" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-04-980x486.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-04-480x238.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Cliccare su <strong>Add a certificate or secret</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-05.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123539 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-05-1024x509.png" alt="" width="1024" height="509" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-05-980x487.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-05-480x238.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Cliccare su <strong>Certificates &amp; Secrets</strong> quindi <strong>New Client Secret</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-06.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123540 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-06-1024x509.png" alt="" width="1024" height="509" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-06-980x487.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-06-480x238.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Inserire la<strong> Descrizione</strong> e la <strong>Scadenza</strong> quindi cliccare al fondo della pagina <strong>Add</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-07.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123542 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-07-1024x509.png" alt="" width="1024" height="509" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-07-980x487.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-07-480x239.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Copiare il <strong>Value</strong> della Secret</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-08.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123543 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-08-1024x507.png" alt="" width="1024" height="507" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-08-980x485.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-08-480x238.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Cliccare su <strong>API Permissions</strong> quindi <strong>Add a Permissions</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-09.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123544 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-09-1024x509.png" alt="" width="1024" height="509" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-09-980x487.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-09-480x238.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Selezionare <strong>Microsoft Graph</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-10.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123545 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-10-1024x509.png" alt="" width="1024" height="509" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-10-980x487.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-10-480x238.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Cliccare su <strong>Application Permissions</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-11.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123546 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-11-1024x509.png" alt="" width="1024" height="509" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-11-980x487.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-11-480x239.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Cercare il valore <strong>User.Read.All</strong> quindi selezionarlo</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-12.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123547 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-12-1024x508.png" alt="" width="1024" height="508" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-12-980x486.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-12-480x238.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Cercare il valore <strong>Directory.Read.All</strong> quindi selezionarlo</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-13.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123549 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-13-1024x507.png" alt="" width="1024" height="507" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-13-980x485.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-13-480x238.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Cercare il valore <strong>Organization.Read.Al</strong> quindi selezionarlo</p>
<p>Al fondo della pagina cliccare su <strong>Add Permissions</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-14.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123550 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-14-1024x509.png" alt="" width="1024" height="509" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-14-980x487.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-14-480x238.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Da questa schermata è possibile notare che le permissions non sono state <strong>Consentite</strong> da Admin</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-15.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123551 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-15-1024x510.png" alt="" width="1024" height="510" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-15-980x488.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-15-480x239.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Cliccare su <strong>Grant Admin Consent</strong> quindi accertiarsi che tutte le permissions abbiano lo stato<strong> Granted col bollino verde</strong></p>
<p>&nbsp;</p>
<h3><strong>INSTALLAZIONE DEL MODULO MICROSOFT GRAPH</strong></h3>
<p>Per poter utilizzare lo script è necessario installare il modulo Microsoft.Graph dalla gallery ufficiale di Microsoft (PowerShell Gallery) con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">install-Module Microsoft.Graph -Scope CurrentUser -Force</pre><p>In pratica senza questo comando i cmdlet come <strong>Connect-MgGraph</strong>, <strong>Get-MgUser</strong>, <strong>Get-MgSubscribedSku</strong> non esisterebbero in PowerShell e lo script non potrebbe girare.</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4a1.png" alt="💡" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Si tratta di un&#8217;operazione sicura e ufficiale: il modulo è pubblicato e mantenuto direttamente da Microsoft. Scarica circa 200 MB di file nella cartella profilo dell&#8217;utente (C:\Users\tuonomeutente\Documents\PowerShell\Modules), senza modificare file di sistema.</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Potrebbero volerci anche 10/15 minuti al termine dell&#8217;installazione. Non chiudere o bloccare la finestra Powershell</p>
<p>&nbsp;</p>
<h3><strong>SCRIPT PER IL REPERIMENTO DELLE SKU DEL TENANT</strong></h3>
<p>La prima cosa da fare è eseguire uno script rapido che interroga il tuo tenant e restituisce tutte le SKU con il loro codice tecnico da aggiungere allo script successivo.</p>
<p>Lo script fa due cose:</p>
<p>Mostra una tabella con tutte le SKU (codice, GUID, totali, usate)</p>
<p>Genera automaticamente il blocco $skuNames pronto da copiare in Export-M365Licenses.ps1 con i codici tecnici come placeholder — dovrai solo sostituire il valore a destra con il nome leggibile che preferisci per quelle SKU che non riconosci.</p>
<p>Di seguito il listato dello script Powershell:</p><pre class="urvanov-syntax-highlighter-plain-tag"># ============================================================
# Get-TenantSKUs.ps1
# Elenca tutte le SKU presenti nel tenant
# ============================================================

# =====================================================================
# CONFIGURA QUI LE TUE CREDENZIALI (da Azure App Registration)
# =====================================================================
$TenantId = "INSERISCI-IL-TUO-TENANT-ID"
$ClientId = "INSERISCI-IL-TUO-CLIENT-ID"
$ClientSecret = "INSERISCI-IL-TUO-CLIENT-SECRET"
# =====================================================================

Import-Module Microsoft.Graph.Authentication -ErrorAction Stop
Import-Module Microsoft.Graph.Identity.DirectoryManagement -ErrorAction Stop

# Autenticazione
$tokenBody = @{
grant_type = "client_credentials"
client_id = $ClientId
client_secret = $ClientSecret
scope = "https://graph.microsoft.com/.default"
}
$tokenResponse = Invoke-RestMethod `
-Uri "https://login.microsoftonline.com/$TenantId/oauth2/v2.0/token" `
-Method POST `
-ContentType "application/x-www-form-urlencoded" `
-Body $tokenBody

$secureToken = $tokenResponse.access_token | ConvertTo-SecureString -AsPlainText -Force
Connect-MgGraph -AccessToken $secureToken -NoWelcome

# Recupero SKU
$skus = Get-MgSubscribedSku -All | Sort-Object SkuPartNumber

Write-Host "`n=== SKU presenti nel tenant ($($skus.Count) trovate) ===`n" -ForegroundColor Cyan

# Mostra tabella a schermo
$skus | Format-Table @(
@{Label="Codice SKU"; Expression={$_.SkuPartNumber}; Width=45},
@{Label="SkuId (GUID)"; Expression={$_.SkuId}; Width=38},
@{Label="Totali"; Expression={$_.PrepaidUnits.Enabled}; Width=8},
@{Label="Usate"; Expression={$_.ConsumedUnits}; Width=8}
) -AutoSize

# Genera il blocco $skuNames da copiare nello script principale
Write-Host "`n--- COPIA IL BLOCCO SEGUENTE IN Export-M365Licenses.ps1 ---`n" -ForegroundColor Yellow
Write-Host '$skuNames = @{' -ForegroundColor Green
foreach ($sku in $skus) {
$padding = " " * [Math]::Max(1, 45 - $sku.SkuPartNumber.Length)
Write-Host " `"$($sku.SkuPartNumber)`"$padding= `"$($sku.SkuPartNumber)`"" -ForegroundColor Green
}
Write-Host "}" -ForegroundColor Green
Write-Host "`n--- Fine blocco ---`n" -ForegroundColor Yellow

Disconnect-MgGraph</pre><p>Salvare il file col nome <strong>Get-TenantSKUs.ps1</strong></p>
<p>Sostituire le seguenti righe con i codici presi in precedenza:</p>
<p><strong>$TenantId = &#8220;INSERISCI-IL-TUO-TENANT-ID&#8221;</strong><br />
<strong>$ClientId = &#8220;INSERISCI-IL-TUO-CLIENT-ID&#8221;</strong><br />
<strong>$ClientSecret = &#8220;INSERISCI-IL-TUO-CLIENT-SECRET&#8221;</strong></p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Il secret è visibile solo al momento della creazione. Se non l&#8217;hai copiato, dovrai eliminarlo e crearne uno nuovo.</p>
<p>&nbsp;</p>
<h3><strong>COPIA DELLE SKU NELLO SCRIPT</strong></h3>
<p>Di seguito un output che potremmo vedere dopo aver eseguito il Powershell <strong>Get-TenantSKUs.ps1</strong>:</p><pre class="urvanov-syntax-highlighter-plain-tag">--- COPIA IL BLOCCO SEGUENTE IN Export-M365Licenses.ps1 ---

$skuNames = @{
"CCIBOTS_PRIVPREV_VIRAL" = "CCIBOTS_PRIVPREV_VIRAL"
"CPC_E_8C_32GB_512GB​" = "CPC_E_8C_32GB_512GB​"
"D365_SALES_ENT_ATTACH" = "D365_SALES_ENT_ATTACH"
"DYN365_BUSCENTRAL_DEVICE" = "DYN365_BUSCENTRAL_DEVICE"
"DYN365_BUSCENTRAL_ESSENTIAL" = "DYN365_BUSCENTRAL_ESSENTIAL"
"DYN365_BUSCENTRAL_TEAM_MEMBER" = "DYN365_BUSCENTRAL_TEAM_MEMBER"
"DYN365_ENTERPRISE_P1_IW" = "DYN365_ENTERPRISE_P1_IW"
"DYN365_ENTERPRISE_SALES" = "DYN365_ENTERPRISE_SALES"
"DYN365_TEAM_MEMBERS" = "DYN365_TEAM_MEMBERS"
"Dynamics_365_Sales_Premium_Viral_Trial" = "Dynamics_365_Sales_Premium_Viral_Trial"
"EMSPREMIUM" = "EMSPREMIUM"
"EXCHANGEENTERPRISE" = "EXCHANGEENTERPRISE"
"EXCHANGESTANDARD" = "EXCHANGESTANDARD"
"FLOW_FREE" = "FLOW_FREE"
"FLOW_PER_USER" = "FLOW_PER_USER"
"IDENTITY_THREAT_PROTECTION" = "IDENTITY_THREAT_PROTECTION"
"MCOCAP" = "MCOCAP"
"MCOEV" = "MCOEV"
"MCOPSTN_5" = "MCOPSTN_5"
"MCOPSTN2" = "MCOPSTN2"
"Microsoft_365_Copilot" = "Microsoft_365_Copilot"
"MICROSOFT_BUSINESS_CENTER" = "MICROSOFT_BUSINESS_CENTER"
"Microsoft_Cloud_for_Sustainability_vTrial" = "Microsoft_Cloud_for_Sustainability_vTrial"
"Microsoft_Entra_Suite" = "Microsoft_Entra_Suite"
"Microsoft_Teams_EEA_New" = "Microsoft_Teams_EEA_New"
"Microsoft_Teams_Premium" = "Microsoft_Teams_Premium"
"Microsoft_Teams_Rooms_Pro" = "Microsoft_Teams_Rooms_Pro"
"Microsoft_Teams_Rooms_Pro_without_Audio_Conferencing" = "Microsoft_Teams_Rooms_Pro_without_Audio_Conferencing"
"O365_BUSINESS_ESSENTIALS" = "O365_BUSINESS_ESSENTIALS"
"O365_BUSINESS_PREMIUM" = "O365_BUSINESS_PREMIUM"
"O365_w/o Teams Bundle_M3" = "O365_w/o Teams Bundle_M3"
"O365_w/o_Teams_Bundle_M5" = "O365_w/o_Teams_Bundle_M5"
"PBI_PREMIUM_PER_USER" = "PBI_PREMIUM_PER_USER"
"PHONESYSTEM_VIRTUALUSER" = "PHONESYSTEM_VIRTUALUSER"
"Power_Automate_per_process" = "Power_Automate_per_process"
"POWER_BI_PRO_DEPT" = "POWER_BI_PRO_DEPT"
"POWER_BI_STANDARD" = "POWER_BI_STANDARD"
"Power_Pages_vTrial_for_Makers" = "Power_Pages_vTrial_for_Makers"
"Power_Virtual_Agents" = "Power_Virtual_Agents"
"POWERAPPS_DEV" = "POWERAPPS_DEV"
"POWERAPPS_PER_USER" = "POWERAPPS_PER_USER"
"POWERAPPS_VIRAL" = "POWERAPPS_VIRAL"
"POWERAUTOMATE_ATTENDED_RPA" = "POWERAUTOMATE_ATTENDED_RPA"
"POWERAUTOMATE_ATTENDED_RPA_DEPT" = "POWERAUTOMATE_ATTENDED_RPA_DEPT"
"PROJECT_P1" = "PROJECT_P1"
"PROJECTPREMIUM" = "PROJECTPREMIUM"
"PROJECTPROFESSIONAL" = "PROJECTPROFESSIONAL"
"Remote_Help_AddOn" = "Remote_Help_AddOn"
"SPE_E3" = "SPE_E3"
"SPE_E5" = "SPE_E5"
"STANDARDPACK" = "STANDARDPACK"
"STREAM" = "STREAM"
"THREAT_INTELLIGENCE" = "THREAT_INTELLIGENCE"
"UNIVERSAL_PRINT" = "UNIVERSAL_PRINT"
"VIRTUAL_AGENT_USL" = "VIRTUAL_AGENT_USL"
"VISIOCLIENT" = "VISIOCLIENT"
"WINDOWS_STORE" = "WINDOWS_STORE"
}

--- Fine blocco ---</pre><p>A questo punto prima di copiare le SKU nello script modificarle mettendo a destra dell&#8217;uguale una descrizione parlante del software:</p><pre class="urvanov-syntax-highlighter-plain-tag">"CCIBOTS_PRIVPREV_VIRAL" = "Copilot Studio - Preview virale gratuita"
"CPC_E_8C_32GB_512GB" = "Windows 365 Enterprise (8 vCPU, 32GB RAM, 512GB)"
"D365_SALES_ENT_ATTACH" = "Dynamics 365 Sales Enterprise (Attach)"
"DYN365_BUSCENTRAL_DEVICE" = "Dynamics 365 Business Central - Licenza Dispositivo"
"DYN365_BUSCENTRAL_ESSENTIAL" = "Dynamics 365 Business Central Essentials"
"DYN365_BUSCENTRAL_TEAM_MEMBER" = "Dynamics 365 Business Central - Team Member"
"DYN365_ENTERPRISE_P1_IW" = "Dynamics 365 Customer Engagement Plan"
"DYN365_ENTERPRISE_SALES" = "Dynamics 365 Sales Enterprise"
"DYN365_TEAM_MEMBERS" = "Dynamics 365 Team Members"
"Dynamics_365_Sales_Premium_Viral_Trial" = "Dynamics 365 Sales Premium - Trial virale"
"EMSPREMIUM" = "Enterprise Mobility + Security E5"
"EXCHANGEENTERPRISE" = "Exchange Online (Piano 2)"
"EXCHANGESTANDARD" = "Exchange Online (Piano 1)"
"FLOW_PER_USER" = "Power Automate per Utente"
"IDENTITY_THREAT_PROTECTION" = "Microsoft Entra ID P2 + Defender for Identity"
"MCOCAP" = "Microsoft Teams Shared Devices (CAP)"
"MCOPSTN_5" = "Teams Calling Plan per zona (Pay-as-you-go)"
"MCOPSTN2" = "Teams Calling Plan Internazionale"
"Microsoft_365_Copilot" = "Microsoft 365 Copilot"
"MICROSOFT_BUSINESS_CENTER" = "Microsoft Business Center"
"Microsoft_Cloud_for_Sustainability_vTrial" = "Microsoft Cloud for Sustainability - Trial"
"Microsoft_Entra_Suite" = "Microsoft Entra Suite"
"Microsoft_Teams_EEA_New" = "Microsoft Teams (Area Economica Europea)"
"Microsoft_Teams_Premium" = "Microsoft Teams Premium"
"Microsoft_Teams_Rooms_Pro" = "Microsoft Teams Rooms Pro"
"Microsoft_Teams_Rooms_Pro_without_Audio_Conferencing" = "Microsoft Teams Rooms Pro (senza Audioconferenza)"
"O365_w/o Teams Bundle_M3" = "Microsoft 365 E3 senza Teams"
"O365_w/o_Teams_Bundle_M5" = "Microsoft 365 E5 senza Teams"
"PBI_PREMIUM_PER_USER" = "Power BI Premium per Utente"
"PHONESYSTEM_VIRTUALUSER" = "Teams Phone - Utente virtuale (gratuito)"
"Power_Automate_per_process" = "Power Automate per Processo"
"POWER_BI_PRO_DEPT" = "Power BI Pro (Dipartimentale)"
"Power_Pages_vTrial_for_Makers" = "Power Pages - Trial per sviluppatori"
"Power_Virtual_Agents" = "Copilot Studio (ex Power Virtual Agents)"
"POWERAPPS_DEV" = "Power Apps per Sviluppatori (gratuito)"
"POWERAPPS_PER_USER" = "Power Apps per Utente"
"POWERAPPS_VIRAL" = "Power Apps - Trial virale gratuita"
"POWERAUTOMATE_ATTENDED_RPA" = "Power Automate con RPA Attended"
"POWERAUTOMATE_ATTENDED_RPA_DEPT" = "Power Automate con RPA Attended (Dipartimentale)"
"PROJECT_P1" = "Project Plan 1"
"Remote_Help_AddOn" = "Intune Remote Help (Add-on)"
"SPE_E3" = "Microsoft 365 E3 (Suite)"
"SPE_E5" = "Microsoft 365 E5 (Suite)"
"STREAM" = "Microsoft Stream (Piano classico)"
"THREAT_INTELLIGENCE" = "Microsoft Defender for Office 365 (Piano 2)"
"UNIVERSAL_PRINT" = "Universal Print"
"VIRTUAL_AGENT_USL" = "Copilot Studio - Sessioni aggiuntive"
"WINDOWS_STORE" = "Microsoft Store for Business"</pre><p>&nbsp;</p>
<h3><strong>SCRIPT CHE ESPORTA LE LICENZE CON LE RELATIVE UTENZE ASSEGNATARIE</strong></h3>
<p>Di seguito lo script PowerShell che usa Microsoft Graph per estrarre tutte le licenze del tenant con gli utenti associati e li esporta in CSV (apribile direttamente in Excel).</p>
<p>E&#8217; possibile eseguire lo script nelle due modalità di seguito:</p><pre class="urvanov-syntax-highlighter-plain-tag"># Esegui con percorso predefinito (crea un file con data/ora automatica)
.\Export-M365Licenses.ps1</pre><p></p><pre class="urvanov-syntax-highlighter-plain-tag"># Oppure specifica dove salvare il file
.\Export-M365Licenses.ps1 -OutputPath "C:\Report\licenze.csv"</pre><p>Il File CSV contiene:</p>
<p><strong>Nome Utente / UPN</strong>: Identità dell&#8217;utente<br />
<strong>Account Abilitato</strong>: Se l&#8217;account è attivo<br />
<strong>Reparto / Mansione</strong>: Info organizzative<br />
<strong>Licenza / Codice SKU</strong>: Nome leggibile e codice tecnico<br />
<strong>Company Name</strong>: Azienda<br />
<strong>Totali / Consumate / Disponibili</strong>: Contatori per ogni SKU nel tenant</p>
<p>Una riga per ogni combinazione utente–licenza: se un utente ha 3 licenze, avrà 3 righe. Così è possibile filtrare e pivotare facilmente in Excel.</p>
<p>Di seguito lo script Powershell:</p><pre class="urvanov-syntax-highlighter-plain-tag"># ============================================================
# Export-M365Licenses.ps1 (v1)
# Compatibile con tutte le versioni del modulo Microsoft.Graph
# ============================================================

param(
[string]$OutputPath = ".\M365_Licenze_$(Get-Date -Format 'yyyyMMdd_HHmm').csv"
)

# =====================================================================
# CONFIGURA QUI LE TUE CREDENZIALI (da Azure App Registration)
# =====================================================================
$TenantId = "INSERISCI-IL-TUO-TENANT-ID"
$ClientId = "INSERISCI-IL-TUO-CLIENT-ID"
$ClientSecret = "INSERISCI-IL-TUO-CLIENT-SECRET"
# =====================================================================

# ── 0. VERIFICA MODULO ───────────────────────────────────────
Write-Host "`n[0/4] Verifica modulo Microsoft.Graph..." -ForegroundColor Cyan

if (-not (Get-Module -ListAvailable -Name Microsoft.Graph.Authentication)) {
Write-Host " Modulo non trovato. Installazione in corso..." -ForegroundColor Yellow
Install-Module Microsoft.Graph -Scope CurrentUser -Force -AllowClobber
}

Import-Module Microsoft.Graph.Authentication -ErrorAction Stop
Import-Module Microsoft.Graph.Users -ErrorAction Stop
Import-Module Microsoft.Graph.Identity.DirectoryManagement -ErrorAction Stop

Write-Host " Moduli caricati." -ForegroundColor Green

# ── 1. CONNESSIONE con TOKEN OAUTH DIRETTO ───────────────────
Write-Host "[1/4] Richiesta token OAuth a Microsoft..." -ForegroundColor Cyan

try {
$tokenBody = @{
grant_type = "client_credentials"
client_id = $ClientId
client_secret = $ClientSecret
scope = "https://graph.microsoft.com/.default"
}

$tokenResponse = Invoke-RestMethod `
-Uri "https://login.microsoftonline.com/$TenantId/oauth2/v2.0/token" `
-Method POST `
-ContentType "application/x-www-form-urlencoded" `
-Body $tokenBody `
-ErrorAction Stop

$secureToken = $tokenResponse.access_token | ConvertTo-SecureString -AsPlainText -Force
Connect-MgGraph -AccessToken $secureToken -NoWelcome -ErrorAction Stop

Write-Host " Connessione riuscita!" -ForegroundColor Green
}
catch {
Write-Host "`n ERRORE di autenticazione:" -ForegroundColor Red
Write-Host " $($_.Exception.Message)" -ForegroundColor Red
exit 1
}

# ── 2. MAPPA SKU → NOME LEGGIBILE ───────────────────────────
Write-Host "[2/4] Recupero catalogo licenze..." -ForegroundColor Cyan

$skuNames = @{
"AAD_PREMIUM" = "Azure AD Premium P1"
"AAD_PREMIUM_P2" = "Azure AD Premium P2"
"ATP_ENTERPRISE" = "Microsoft Defender for Office 365 (Plan 1)"
"ENTERPRISEPACK" = "Microsoft 365 E3"
"ENTERPRISEPREMIUM" = "Microsoft 365 E5"
"ENTERPRISEPREMIUM_NOPSTNCONF" = "Microsoft 365 E5 (senza audioconferenza)"
"FLOW_FREE" = "Microsoft Power Automate Free"
"INTUNE_A" = "Microsoft Intune"
"M365EDU_A3_FACULTY" = "Microsoft 365 A3 (Docenti)"
"M365EDU_A3_STUDENT" = "Microsoft 365 A3 (Studenti)"
"M365EDU_A5_FACULTY" = "Microsoft 365 A5 (Docenti)"
"MCOEV" = "Microsoft Teams Phone Standard"
"MCOMEETADV" = "Microsoft 365 Audio Conferencing"
"MCOSTANDARD" = "Skype for Business Online (Plan 2)"
"O365_BUSINESS_ESSENTIALS" = "Microsoft 365 Business Basic"
"O365_BUSINESS_PREMIUM" = "Microsoft 365 Business Standard"
"OFFICESUBSCRIPTION" = "Microsoft 365 Apps for Enterprise"
"POWER_BI_PRO" = "Power BI Pro"
"POWER_BI_STANDARD" = "Power BI (gratuito)"
"PROJECTPREMIUM" = "Project Plan 5"
"PROJECTPROFESSIONAL" = "Project Plan 3"
"SPB" = "Microsoft 365 Business Premium"
"STANDARDPACK" = "Microsoft 365 E1 (Office 365 E1)"
"VISIOCLIENT" = "Visio Plan 2"
"VISIOONLINE_PLAN1" = "Visio Plan 1"
"WIN10_PRO_ENT_SUB" = "Windows 10/11 Enterprise E3"
"CCIBOTS_PRIVPREV_VIRAL" = "Copilot Studio - Preview virale gratuita"
"CPC_E_8C_32GB_512GB" = "Windows 365 Enterprise (8 vCPU, 32GB RAM, 512GB)"
"D365_SALES_ENT_ATTACH" = "Dynamics 365 Sales Enterprise (Attach)"
"DYN365_BUSCENTRAL_DEVICE" = "Dynamics 365 Business Central - Licenza Dispositivo"
"DYN365_BUSCENTRAL_ESSENTIAL" = "Dynamics 365 Business Central Essentials"
"DYN365_BUSCENTRAL_TEAM_MEMBER" = "Dynamics 365 Business Central - Team Member"
"DYN365_ENTERPRISE_P1_IW" = "Dynamics 365 Customer Engagement Plan"
"DYN365_ENTERPRISE_SALES" = "Dynamics 365 Sales Enterprise"
"DYN365_TEAM_MEMBERS" = "Dynamics 365 Team Members"
"Dynamics_365_Sales_Premium_Viral_Trial" = "Dynamics 365 Sales Premium - Trial virale"
"EMSPREMIUM" = "Enterprise Mobility + Security E5"
"EXCHANGEENTERPRISE" = "Exchange Online (Piano 2)"
"EXCHANGESTANDARD" = "Exchange Online (Piano 1)"
"FLOW_PER_USER" = "Power Automate per Utente"
"IDENTITY_THREAT_PROTECTION" = "Microsoft Entra ID P2 + Defender for Identity"
"MCOCAP" = "Microsoft Teams Shared Devices (CAP)"
"MCOPSTN_5" = "Teams Calling Plan per zona (Pay-as-you-go)"
"MCOPSTN2" = "Teams Calling Plan Internazionale"
"Microsoft_365_Copilot" = "Microsoft 365 Copilot"
"MICROSOFT_BUSINESS_CENTER" = "Microsoft Business Center"
"Microsoft_Cloud_for_Sustainability_vTrial" = "Microsoft Cloud for Sustainability - Trial"
"Microsoft_Entra_Suite" = "Microsoft Entra Suite"
"Microsoft_Teams_EEA_New" = "Microsoft Teams (Area Economica Europea)"
"Microsoft_Teams_Premium" = "Microsoft Teams Premium"
"Microsoft_Teams_Rooms_Pro" = "Microsoft Teams Rooms Pro"
"Microsoft_Teams_Rooms_Pro_without_Audio_Conferencing" = "Microsoft Teams Rooms Pro (senza Audioconferenza)"
"O365_w/o Teams Bundle_M3" = "Microsoft 365 E3 senza Teams"
"O365_w/o_Teams_Bundle_M5" = "Microsoft 365 E5 senza Teams"
"PBI_PREMIUM_PER_USER" = "Power BI Premium per Utente"
"PHONESYSTEM_VIRTUALUSER" = "Teams Phone - Utente virtuale (gratuito)"
"Power_Automate_per_process" = "Power Automate per Processo"
"POWER_BI_PRO_DEPT" = "Power BI Pro (Dipartimentale)"
"Power_Pages_vTrial_for_Makers" = "Power Pages - Trial per sviluppatori"
"Power_Virtual_Agents" = "Copilot Studio (ex Power Virtual Agents)"
"POWERAPPS_DEV" = "Power Apps per Sviluppatori (gratuito)"
"POWERAPPS_PER_USER" = "Power Apps per Utente"
"POWERAPPS_VIRAL" = "Power Apps - Trial virale gratuita"
"POWERAUTOMATE_ATTENDED_RPA" = "Power Automate con RPA Attended"
"POWERAUTOMATE_ATTENDED_RPA_DEPT" = "Power Automate con RPA Attended (Dipartimentale)"
"PROJECT_P1" = "Project Plan 1"
"Remote_Help_AddOn" = "Intune Remote Help (Add-on)"
"SPE_E3" = "Microsoft 365 E3 (Suite)"
"SPE_E5" = "Microsoft 365 E5 (Suite)"
"STREAM" = "Microsoft Stream (Piano classico)"
"THREAT_INTELLIGENCE" = "Microsoft Defender for Office 365 (Piano 2)"
"UNIVERSAL_PRINT" = "Universal Print"
"VIRTUAL_AGENT_USL" = "Copilot Studio - Sessioni aggiuntive"
"WINDOWS_STORE" = "Microsoft Store for Business"
}

$subscribedSkus = Get-MgSubscribedSku -All
$skuMap = @{}
foreach ($sku in $subscribedSkus) {
$friendlyName = if ($skuNames.ContainsKey($sku.SkuPartNumber)) {
$skuNames[$sku.SkuPartNumber]
} else {
$sku.SkuPartNumber
}
$skuMap[$sku.SkuId] = @{
Nome = $friendlyName
Codice = $sku.SkuPartNumber
Totali = $sku.PrepaidUnits.Enabled
Consumate = $sku.ConsumedUnits
Disponibili = $sku.PrepaidUnits.Enabled - $sku.ConsumedUnits
}
}

# ── 3. RECUPERO UTENTI E LICENZE ────────────────────────────
Write-Host "[3/4] Recupero utenti e licenze assegnate..." -ForegroundColor Cyan

$users = Get-MgUser -All -Property `
"Id,DisplayName,UserPrincipalName,AccountEnabled,CompanyName,Department,JobTitle,AssignedLicenses,UsageLocation"

$results = [System.Collections.Generic.List[PSCustomObject]]::new()

foreach ($user in $users) {
if ($user.AssignedLicenses.Count -eq 0) {
$results.Add([PSCustomObject]@{
"Nome Utente" = $user.DisplayName
"UPN" = $user.UserPrincipalName
"Account Abilitato" = $user.AccountEnabled
"Azienda" = $user.CompanyName
"Reparto" = $user.Department
"Mansione" = $user.JobTitle
"Paese Utilizzo" = $user.UsageLocation
"Licenza" = "(nessuna)"
"Codice SKU" = ""
"Totali Tenant" = ""
"Consumate" = ""
"Disponibili" = ""
})
continue
}

foreach ($lic in $user.AssignedLicenses) {
$skuInfo = $skuMap[$lic.SkuId]
$results.Add([PSCustomObject]@{
"Nome Utente" = $user.DisplayName
"UPN" = $user.UserPrincipalName
"Account Abilitato" = $user.AccountEnabled
"Azienda" = $user.CompanyName
"Reparto" = $user.Department
"Mansione" = $user.JobTitle
"Paese Utilizzo" = $user.UsageLocation
"Licenza" = if ($skuInfo) { $skuInfo.Nome } else { $lic.SkuId }
"Codice SKU" = if ($skuInfo) { $skuInfo.Codice } else { "" }
"Totali Tenant" = if ($skuInfo) { $skuInfo.Totali } else { "" }
"Consumate" = if ($skuInfo) { $skuInfo.Consumate } else { "" }
"Disponibili" = if ($skuInfo) { $skuInfo.Disponibili } else { "" }
})
}
}

# ── 4. ESPORTAZIONE CSV ──────────────────────────────────────
Write-Host "[4/4] Esportazione in CSV..." -ForegroundColor Cyan

$results | Export-Csv -Path $OutputPath -NoTypeInformation -Encoding UTF8 -Delimiter ";"

Write-Host "`n Esportazione completata!" -ForegroundColor Green
Write-Host " File salvato in : $OutputPath"
Write-Host " Righe esportate : $($results.Count)"
Write-Host " Utenti trovati : $($users.Count)"
Write-Host " SKU nel tenant : $($subscribedSkus.Count)`n"

Disconnect-MgGraph</pre><p>&nbsp;</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-16.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123553 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-16-1024x711.png" alt="" width="1024" height="711" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-16-980x681.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-16-480x333.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Se tutto è andato a buon fine dovremmo vedere una schermata come quella dell&#8217;immagine sovrastante</p>
<h3><strong>ANALISI DEL FILE CSV</strong></h3>
<p>Nel file CSV trovi una riga per ogni combinazione utente-licenza. Le colonne sono:</p>
<p><strong>Nome Utente</strong>: Mario Rossi<br />
<strong>UPN</strong>: mario.rossi@azienda.com<br />
<strong>Account Abilitato</strong>: True / False<br />
<strong>Azienda</strong>: Società 1<br />
<strong>Reparto</strong>: IT<br />
<strong>Mansione</strong>: System Administrator<br />
<strong>Paese Utilizzo</strong>: IT<br />
<strong>Licenza</strong>: Microsoft 365 E3<br />
<strong>Codice SKU</strong>: ENTERPRISEPACK<br />
<strong>Totali Tenant</strong>: 50<br />
<strong>Consumate</strong>: 43<br />
<strong>Disponibili</strong>: 7</p>
<p>Di seguito uno screenshot del file excel</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-17.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123554 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-17-1024x102.png" alt="" width="1024" height="102" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-17-980x98.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/export-license-microsoft-azure-17-480x48.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>&nbsp;</p>

<a data-e-Disable-Page-Transition="true" class="download-link download-button aligncenter" title="Versione 1.0" href="https://www.raffaelechiatto.com/download/1123571/?tmstv=1780557015" rel="nofollow" id="download-link-1123571" data-redirect="false">
	Download &ldquo;Export-M365Licenses.zip&rdquo;	<small>Export-M365Licenses.zip		&ndash; Scaricato 454 volte		&ndash; 3,68 KB</small>
</a>

<p>&nbsp;</p>

<a data-e-Disable-Page-Transition="true" class="download-link download-button aligncenter" title="Versione 1.0" href="https://www.raffaelechiatto.com/download/1123574/?tmstv=1780557015" rel="nofollow" id="download-link-1123574" data-redirect="false">
	Download &ldquo;Get-TenantSKUs.zip&rdquo;	<small>Get-TenantSKUs.zip		&ndash; Scaricato 459 volte		&ndash; 1,19 KB</small>
</a>

]]></content:encoded>
					
					<wfw:commentRss>https://www.raffaelechiatto.com/automatizzare-linventario-delle-licenze-microsoft-365-export-utenti-e-assegnazioni-con-microsoft-graph-api/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			<enclosure length="3765" type="application/zip" url="https://www.raffaelechiatto.com/download/1123571/?tmstv=1780557015"/><itunes:explicit>no</itunes:explicit><itunes:subtitle>&amp;#160; Chiunque abbia mai gestito un tenant Microsoft 365 con qualche centinaio di utenti conosce bene la sensazione: aprire l&amp;#8217;interfaccia di amministrazione, navigare tra pannelli e sottomenu e cercare di capire (in tempi ragionevoli) chi ha quale licenza, quante ne sono state assegnate e quante restano disponibili. Un&amp;#8217;operazione all&amp;#8217;apparenza banale che ripetuta ogni mese o [&amp;#8230;]</itunes:subtitle><itunes:summary>&amp;#160; Chiunque abbia mai gestito un tenant Microsoft 365 con qualche centinaio di utenti conosce bene la sensazione: aprire l&amp;#8217;interfaccia di amministrazione, navigare tra pannelli e sottomenu e cercare di capire (in tempi ragionevoli) chi ha quale licenza, quante ne sono state assegnate e quante restano disponibili. Un&amp;#8217;operazione all&amp;#8217;apparenza banale che ripetuta ogni mese o [&amp;#8230;]</itunes:summary><itunes:keywords>Microsoft 365, Microsoft Graph API, Microsoft Licenze</itunes:keywords></item>
		<item>
		<title>Installazione e Configurazione Base di Ubuntu Server 26.04 – Resolute Raccoon</title>
		<link>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-ubuntu-server-26-04-resolute-raccoon/</link>
					<comments>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-ubuntu-server-26-04-resolute-raccoon/#respond</comments>
		
		<dc:creator><![CDATA[Raffaele Chiatto]]></dc:creator>
		<pubDate>Mon, 25 May 2026 06:28:47 +0000</pubDate>
				<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Resolute Raccoon]]></category>
		<category><![CDATA[Ubuntu Server 26.04 LTS]]></category>
		<guid isPermaLink="false">https://www.raffaelechiatto.com/?p=1123526</guid>

					<description><![CDATA[&#160; Ogni nuova versione di Ubuntu Server porta con sé una promessa: infrastrutture più stabili, strumenti più moderni e un&#8217;esperienza di amministrazione progressivamente più raffinata. Ubuntu Server 26.04 LTS — Resolute Raccoon non fa eccezione. Con il suo ciclo di supporto a lungo termine e le novità introdotte nel kernel, nei servizi di rete e [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" class="size-full wp-image-1091059 alignnone" src="https://www.raffaelechiatto.com/wp-content/uploads/2020/12/BEGINNER-BAR.png" alt="" width="679" height="89" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2020/12/BEGINNER-BAR.png 679w, https://www.raffaelechiatto.com/wp-content/uploads/2020/12/BEGINNER-BAR-480x63.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 679px, 100vw" /></p>
<p>&nbsp;</p>
<p>Ogni nuova versione di Ubuntu Server porta con sé una promessa: infrastrutture più stabili, strumenti più moderni e un&#8217;esperienza di amministrazione progressivamente più raffinata.</p>
<p>Ubuntu Server 26.04 LTS — Resolute Raccoon non fa eccezione.</p>
<p>Con il suo ciclo di supporto a lungo termine e le novità introdotte nel kernel, nei servizi di rete e nella gestione dei pacchetti, rappresenta oggi una delle basi più solide su cui costruire ambienti server in produzione, in laboratorio o in cloud.</p>
<p>Ma ogni grande sistema parte da un primo passo: l&#8217;installazione.</p>
<p>Questo articolo nasce con un obiettivo preciso: guidarti passo dopo passo attraverso l&#8217;installazione e la configurazione base di Ubuntu Server 26.04, partendo dall&#8217;immagine ISO fino ad avere un sistema funzionante, aggiornato e pronto per essere personalizzato secondo le proprie esigenze.</p>
<p>Niente assunzioni implicite, niente salti logici: ogni scelta sarà spiegata, non solo mostrata.</p>
<p>&nbsp;</p>
<h3><strong>PREREQUISITI</strong></h3>
<p>A seconda dell&#8217;uso specifico, i requisiti possono lievitare sensibilmente. Per ambienti di produzione è consigliabile avere: Laser Office</p>
<ul>
<li><strong>CPU</strong>: processore a 64 bit (supporto 32 bit rimosso da Ubuntu 18.04)</li>
<li><strong>RAM</strong>: 3+ GB (più per carichi applicativi intensi)</li>
<li><strong>Disco</strong>: 10–20+ GB a seconda dei servizi installati</li>
<li><strong>Rete</strong>: connessione per aggiornamenti e installazione pacchetti</li>
</ul>
<p>&nbsp;</p>
<h3><strong>INSTALLAZIONE DI UBUNTU</strong></h3>
<p>Agganciare la ISO di Ubuntu Server 26.04 LTS quindi avviare il server</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-01.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123596 size-full" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-01.png" alt="" width="909" height="682" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-01.png 909w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-01-480x360.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 909px, 100vw" /></a></p>
<p>Selezionare <strong>Try or Install Ubuntu Server</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-02.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123597 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-02-1024x639.png" alt="" width="1024" height="639" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-02-1024x639.png 1024w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-02-980x611.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-02-480x299.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Selzionare la lingua di installazione</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-03.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123598 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-03-1024x642.png" alt="" width="1024" height="642" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-03-1024x642.png 1024w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-03-980x614.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-03-480x301.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Selezionare la lingua della tastiera quindi cliccare <strong>Done</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-04.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123599 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-04-1024x638.png" alt="" width="1024" height="638" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-04-1024x638.png 1024w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-04-980x611.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-04-480x299.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Lasciare invariato e cliccare <strong>Done</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-05.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123600 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-05-1024x643.png" alt="" width="1024" height="643" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-05-1024x643.png 1024w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-05-980x615.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-05-480x301.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Configurare la rete quindi cliccare <strong>Done</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-06.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123601 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-06-1024x638.png" alt="" width="1024" height="638" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-06-1024x638.png 1024w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-06-980x611.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-06-480x299.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Se non si utilizzano proxy per la navigazione cliccare <strong>Done</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-07.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123602 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-07-1024x640.png" alt="" width="1024" height="640" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-07-1024x640.png 1024w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-07-980x612.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-07-480x300.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Attendere il termine dei test dei mirror. Quindi cliccare <strong>Done</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-08.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123604 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-08-1024x639.png" alt="" width="1024" height="639" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-08-1024x639.png 1024w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-08-980x612.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-08-480x300.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Cliccare <strong>Done</strong> per utuilizzare tutto il disco</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-09.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123605 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-09-1024x640.png" alt="" width="1024" height="640" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-09-1024x640.png 1024w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-09-980x612.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-09-480x300.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Se è tutto Ok cliccare <strong>Done</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-10.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123606 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-10-1024x640.png" alt="" width="1024" height="640" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-10-1024x640.png 1024w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-10-980x613.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-10-480x300.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Cancellare i dischi premendo <strong>Continue</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-11.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123607 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-11-1024x640.png" alt="" width="1024" height="640" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-11-1024x640.png 1024w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-11-980x613.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-11-480x300.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Inserire <strong>Nome</strong>, <strong>Nome del Server</strong>, <strong>Username</strong> e <strong>Password</strong> quindi cliccare <strong>Done</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-12.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123608 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-12-1024x638.png" alt="" width="1024" height="638" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-12-1024x638.png 1024w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-12-980x611.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-12-480x299.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Selezionare <strong>Skip for Now</strong> per non abilitare Ubuntu Pro quindi cliccare <strong>Continue</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-13.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123609 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-13-1024x638.png" alt="" width="1024" height="638" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-13-1024x638.png 1024w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-13-980x611.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-13-480x299.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Selezionare <strong>Install OpenSSH Server</strong> quindi cliccare <strong>Done</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-14.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123610 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-14-1024x640.png" alt="" width="1024" height="640" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-14-1024x640.png 1024w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-14-980x613.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-14-480x300.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Cliccare <strong>Done</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-15.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123611 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-15-1024x637.png" alt="" width="1024" height="637" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-15-1024x637.png 1024w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-15-980x610.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-15-480x299.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Attendere il termine dell&#8217;installazione</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-16.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123613 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-16-1024x639.png" alt="" width="1024" height="639" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-16-1024x639.png 1024w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-16-980x612.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-16-480x300.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Smontare la ISO quindi cliccare su <strong>Reboot Now</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-17.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123614 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-17-1024x643.png" alt="" width="1024" height="643" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-17-1024x643.png 1024w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-17-980x616.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/05/inst-ubuntu26-17-480x301.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Al termine del reboot dovremmo visualizzare la versione <strong>Ubuntu Server 26.04 LTS</strong> installata.</p>
<h3></h3>
<h3><strong>NOVITA&#8217; DI UBUNTU 26.04</strong></h3>
<p>Ecco le principali novità di Ubuntu 26.04 LTS &#8220;Resolute Raccoon&#8221;, rilasciato il 23 aprile 2026:</p>
<h4></h4>
<h4><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f5a5.png" alt="🖥" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Desktop e interfaccia</strong></h4>
<ul>
<li>GNOME 50 è il nuovo ambiente desktop predefinito, un salto di quattro versioni rispetto a GNOME 46 di Ubuntu 24.04. Phoronix</li>
<li>X11/Xorg è stato definitivamente rimosso dalla sessione GNOME: il desktop funziona ora esclusivamente su Wayland.</li>
<li>Il scaling frazionario e il variable refresh rate sono diventati funzioni stabili. It&#8217;s FOSS</li>
<li>Cinque nuove app predefinite: Ptyxis (terminale), Loupe (visualizzatore immagini) e Showtime (player video, che sostituisce Totem).</li>
<li>Le icone delle cartelle hanno un nuovo look vivace che eredita il colore d&#8217;accento del desktop.</li>
</ul>
<h4></h4>
<h4><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f512.png" alt="🔒" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Sicurezza</strong></h4>
<ul>
<li>La cifratura completa del disco con TPM è passata da sperimentale a disponibilità generale. It&#8217;s FOSS</li>
<li>Il supporto alla crittografia post-quantistica è incluso tramite OpenSSH 10.2, con l&#8217;algoritmo di scambio chiavi mlkem768x25519-sha256 attivo di default. Il supporto DSA è stato rimosso.</li>
<li>sudo è ora fornito da sudo-rs, scritto in Rust, con feedback visivo della password (asterischi) abilitato di default.</li>
</ul>
<h4></h4>
<h4><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2699.png" alt="⚙" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Sotto il cofano</strong></h4>
<ul>
<li>Il kernel è Linux 7.0, che porta migliore supporto hardware, specialmente per i nuovi processori Intel Core Ultra Series 3 (Panther Lake).</li>
<li>Il compilatore di sistema è GCC 15.2. Phoronix</li>
<li>I driver GPU open source Mesa 26.0.x sono inclusi, con driver NVIDIA proprietari che ora puntano alla serie 595.x di default.</li>
<li>Il sistema usa ora Dracut per generare l&#8217;initramfs durante il boot.</li>
<li>Il firmware è stato suddiviso in pacchetti distinti per produttore, invece del precedente pacchetto unico linux-firmware, riducendo le dimensioni degli aggiornamenti.</li>
</ul>
<h4></h4>
<h4><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4e6.png" alt="📦" class="wp-smiley" style="height: 1em; max-height: 1em;" /> App e pacchetti</strong></h4>
<ul>
<li>Firefox aggiornato alla versione 150, LibreOffice alla 25.8, Thunderbird alla 140 &#8220;Eclipse&#8221; e GIMP alla 3.2.</li>
<li>Nuovi provider di ricerca nell&#8217;overview di GNOME, con risultati dall&#8217;App Center e ricerca rapida su Google tramite Firefox.</li>
<li>DocumentDB è ora disponibile nei repository Ubuntu: un database documentale open source compatibile con MongoDB, basato su PostgreSQL.</li>
</ul>
<h4></h4>
<h4><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f4cb.png" alt="📋" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Requisiti di sistema</strong></h4>
<ul>
<li>Ubuntu Desktop 26.04 richiede un processore dual-core da 2 GHz, almeno 6 GB di RAM e 25 GB di spazio libero.</li>
</ul>
<h4></h4>
<h4><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f422.png" alt="🐢" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Kernel e hardware</strong></h4>
<ul>
<li>Ubuntu 26.04 include Linux 7.0 con miglior supporto per i processori Intel Core Ultra Series 3 (Panther Lake), con grafica Xe3 e prestazioni NPU migliorate.</li>
</ul>
<h4></h4>
<h4><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/1f5d3.png" alt="🗓" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Supporto</strong></h4>
<ul>
<li>Ubuntu 26.04 LTS sarà supportato fino ad aprile 2031 (5 anni), con possibilità di estendere a 10 anni tramite Ubuntu Pro.</li>
</ul>
<p><strong>ATTENZIONE</strong>: per chi aggiorna da 24.04 LTS: gli aggiornamenti diretti da Ubuntu 24.04 LTS a 26.04 LTS non saranno abilitati fino a luglio, con il rilascio della prima point release Ubuntu 26.04.1 LTS.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-ubuntu-server-26-04-resolute-raccoon/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Installazione e Configurazione Base di Arcane (Docker Management UI) su Ubuntu Server 24.04</title>
		<link>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-arcane-docker-management-ui-su-ubuntu-server-24-04/</link>
					<comments>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-arcane-docker-management-ui-su-ubuntu-server-24-04/#respond</comments>
		
		<dc:creator><![CDATA[Raffaele Chiatto]]></dc:creator>
		<pubDate>Wed, 20 May 2026 06:21:16 +0000</pubDate>
				<category><![CDATA[Arcane]]></category>
		<category><![CDATA[Container]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Docker Management U]]></category>
		<guid isPermaLink="false">https://www.raffaelechiatto.com/?p=1123002</guid>

					<description><![CDATA[&#160; La gestione dei container Docker può diventare rapidamente complessa, soprattutto in ambienti server dove è fondamentale avere controllo, visibilità e semplicità operativa. Arcane (Docker Management UI) nasce proprio con questo obiettivo: fornire un’interfaccia web intuitiva per amministrare container, immagini, volumi e reti in modo rapido ed efficace. In questa guida vedremo passo dopo passo [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" class="size-full wp-image-1091058 alignnone" src="https://www.raffaelechiatto.com/wp-content/uploads/2020/12/ADVANCED-BAR.png" alt="" width="679" height="89" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2020/12/ADVANCED-BAR.png 679w, https://www.raffaelechiatto.com/wp-content/uploads/2020/12/ADVANCED-BAR-480x63.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 679px, 100vw" /></p>
<p>&nbsp;</p>
<p>La gestione dei container Docker può diventare rapidamente complessa, soprattutto in ambienti server dove è fondamentale avere controllo, visibilità e semplicità operativa.</p>
<p>Arcane (Docker Management UI) nasce proprio con questo obiettivo: fornire un’interfaccia web intuitiva per amministrare container, immagini, volumi e reti in modo rapido ed efficace.</p>
<p>In questa guida vedremo passo dopo passo come installare e configurare Arcane su Ubuntu Server 24.04 LTS, partendo dai prerequisiti fino al primo accesso all’interfaccia web.</p>
<p>L’obiettivo è ottenere un ambiente di gestione Docker pronto all’uso, sicuro e facilmente integrabile nella tua infrastruttura.</p>
<p>Che tu stia configurando un home lab, un server di test o un ambiente di produzione leggero, questa procedura ti permetterà di mettere in funzione Arcane in pochi minuti.</p>
<p>&nbsp;</p>
<h3><strong>INSTALLAZIONE DI DOCKER</strong></h3>
<p>Prima di installare Docker rimuovere le vecchie versioni che potrebbero causare conflitti con il seguente comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt remove docker docker-engine docker.io containerd runc</pre><p>&nbsp;</p>
<h3><strong>INSTALLAZIONE DELLE DIPENDENZE CHIAVE</strong></h3>
<p>Eseguire i comandi in sequenza:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt update

sudo apt install -y ca-certificates curl gnupg

sudo install -m 0755 -d /etc/apt/keyrings

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release &amp;&amp; echo "$VERSION_CODENAME") stable" | sudo tee /etc/apt/sources.list.d/docker.list &gt; /dev/null</pre><p>&nbsp;</p>
<h3><strong>INSTALLAZIONE DEL MOTORE E DEI PLUGIN COMPOSE</strong></h3>
<p>Eseguire i comandi in sequenza:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt update

sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin</pre><p>&nbsp;</p>
<h3><strong>ESECUZIONE DI DOCKER SENZA SUDO (OPZIONALE)</strong></h3>
<p>Eseguire i comandi in sequenza:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo usermod -aG docker $USER

newgrp docker

docker version</pre><p>Dovremmo visualizzare il seguente output:</p><pre class="urvanov-syntax-highlighter-plain-tag">Client: Docker Engine - Community
Version: 29.2.1
API version: 1.53
Go version: go1.25.6
Git commit: a5c7197
Built: Mon Feb 2 17:17:26 2026
OS/Arch: linux/amd64
Context: default

Server: Docker Engine - Community
Engine:
Version: 29.2.1
API version: 1.53 (minimum version 1.44)
Go version: go1.25.6
Git commit: 6bc6209
Built: Mon Feb 2 17:17:26 2026
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: v2.2.1
GitCommit: dea7da592f5d1d2b7755e3a161be07f43fad8f75
runc:
Version: 1.3.4
GitCommit: v1.3.4-0-gd6d73eb8
docker-init:
Version: 0.19.0
GitCommit: de40ad0</pre><p>&nbsp;</p>
<h3><strong>DISTRIBUZIONE DI ARCANE CON DOCKER COMPOSE</strong></h3>
<p>Crea una cartella progetto con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">mkdir -p ~/arcane &amp;&amp; cd ~/arcane</pre><p>Generare i secrets con i seguenti comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">openssl rand -base64 32 # ENCRYPTION_KEY</pre><p>Dovremmo visualizzare un output simile al seguente:</p><pre class="urvanov-syntax-highlighter-plain-tag">df6gAVQ7kAxYD6N6QRPmeky/7PZGt7Yud3ihLlC6RSI=</pre><p>Quindi eseguire il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">openssl rand -base64 32 # JWT_SECRET</pre><p>Dovremmo visualizzare un output simile al seguente:</p><pre class="urvanov-syntax-highlighter-plain-tag">l5vb4U1e8v2DBP2NRjRukdDsabY90IgzCZlirsRy5vU=</pre><p>Creare il file compose.yml con il coamndo:</p><pre class="urvanov-syntax-highlighter-plain-tag">nano compose.yml</pre><p>Inserire all&#8217;interno del file creato il seguente output:</p>
<p><strong>ATTENZIONE</strong>: inserire le chiavi <strong>JWT_SECRET</strong> e <strong>ENCRYPTION_KEY</strong></p><pre class="urvanov-syntax-highlighter-plain-tag">services:
arcane:
image: ghcr.io/ofkm/arcane:latest
container_name: arcane
ports:
- "3552:3552"
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- arcane-data:/app/data
- ./projects:/app/data/projects
environment:
- APP_URL=http://localhost:3552
- PUID=1000
- PGID=1000
- ENCRYPTION_KEY=df6gAVQ7kAxYD6N6QRPmeky/7PZGt7Yud3ihLlC6RSI=
- JWT_SECRET=l5vb4U1e8v2DBP2NRjRukdDsabY90IgzCZlirsRy5vU=
restart: unless-stopped

volumes:
arcane-data:</pre><p>Salvare chiudere il file di configurazione</p>
<p>Avviare Docker con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">docker compose up -d</pre><p>Dovremmo visualizzare il seguente output:</p><pre class="urvanov-syntax-highlighter-plain-tag">[+] up 12/12
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Image ghcr.io/ofkm/arcane:latest Pulled 4.4s
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Network arcane_default Created 0.0s
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Volume arcane_arcane-data Created 0.0s
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Container arcane Created 0.8s</pre><p>&nbsp;</p>
<h3><strong>ACCESSO AD ARCANE VIA WEB</strong></h3>
<p>Da un qualsiasi browser richiamare il seguente link:</p>
<p><strong>http://INDIRIZZO_IP_O_FQDN:3552</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/02/install-arcane-ubuntu-01.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123008 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/02/install-arcane-ubuntu-01-1024x491.png" alt="" width="1024" height="491" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/02/install-arcane-ubuntu-01-980x470.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/02/install-arcane-ubuntu-01-480x230.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Se è andato tutto a buon fine dovremmo visualizzare un immagine come quella sovrastante</p>
<p>Per accedere inserire le credenziali di default:</p>
<p><strong>USER:</strong> arcane</p>
<p><strong>PASSWORD:</strong> arcane-admin</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/02/install-arcane-ubuntu-02.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123009 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/02/install-arcane-ubuntu-02-1024x488.png" alt="" width="1024" height="488" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/02/install-arcane-ubuntu-02-980x467.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/02/install-arcane-ubuntu-02-480x229.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Inserire la nuova password quindi cliccare su <strong>Change Password</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/02/install-arcane-ubuntu-03.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123010 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/02/install-arcane-ubuntu-03-1024x491.png" alt="" width="1024" height="491" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/02/install-arcane-ubuntu-03-980x469.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/02/install-arcane-ubuntu-03-480x230.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Dovremmo visualizzare la Dashboard di Arcane</p>
<p>&nbsp;</p>
<h3><strong>AGGIORNAMENTO DI ARCANE</strong></h3>
<p>Per aggiornare Arcane basta eseguire i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">docker compose pull

docker compose up -d</pre><p>&nbsp;</p>
<h3><strong>BACKUP E RESTORE DI ARCANE</strong></h3>
<p>Per effettuare il backup della configurazione di Arcane eseguire il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">docker run --rm -v arcane-data:/data -v "$PWD":/backup busybox sh -c 'cd /data &amp;&amp; tar czf /backup/arcane-backup.tgz .'</pre><p>Per effettuare il ripristino della configurazione di Arcane eseguire il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">docker run --rm -v arcane-data:/data -v "$PWD":/backup busybox sh -c 'cd /data &amp;&amp; tar xzf /backup/arcane-backup.tgz'</pre><p>&nbsp;</p>
<h3><strong>CONSIDERAZIONI FINALI</strong></h3>
<p>Arcane si presenta come una soluzione interessante per la gestione di ambienti Docker tramite interfaccia grafica, soprattutto per chi desidera semplificare operazioni che da riga di comando possono risultare ripetitive o complesse.</p>
<p>La sua leggerezza e rapidità di deploy lo rendono particolarmente adatto a server Ubuntu minimal o ambienti self-hosted.</p>
<p>&nbsp;</p>
<h4><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> PRO</strong></h4>
<ul>
<li>Interfaccia intuitiva: permette di gestire container, immagini e volumi senza ricorrere continuamente alla CLI.</li>
<li>Installazione semplice: deploy rapido tramite Docker o Docker Compose.</li>
<li>Riduzione errori operativi: utile per chi non ha grande esperienza con i comandi Docker.</li>
<li>Adatto a piccoli ambienti e homelab: perfetto per test, sviluppo o infrastrutture leggere.</li>
<li>Accesso centralizzato via web: gestione remota comoda e immediata.</li>
</ul>
<p>&nbsp;</p>
<h4><strong><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/274c.png" alt="❌" class="wp-smiley" style="height: 1em; max-height: 1em;" /> CONTRO</strong></h4>
<ul>
<li>Funzionalità avanzate limitate rispetto a piattaforme enterprise più mature.</li>
<li>Dipendenza dall’interfaccia web: in ambienti altamente critici, la CLI rimane spesso preferibile.</li>
<li>Sicurezza da configurare manualmente: HTTPS, autenticazione avanzata e reverse proxy richiedono setup aggiuntivo.</li>
<li>Scalabilità non ideale per cluster complessi o ambienti orchestrati di grandi dimensioni.</li>
</ul>
<p>&nbsp;</p>
<h4><strong>CONCLUSIONI</strong></h4>
<p>Arcane è una soluzione pratica e veloce per chi cerca un pannello di gestione Docker semplice ed efficace su Ubuntu Server 24.04.</p>
<p>Non sostituisce strumenti di orchestrazione avanzata, ma rappresenta un valido supporto per amministrare container in modo più visuale e immediato.</p>
<p>Per ambienti di piccole e medie dimensioni è una scelta solida.</p>
<p>Per infrastrutture enterprise complesse potrebbe invece essere necessario affiancarlo o valutare soluzioni più strutturate.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-arcane-docker-management-ui-su-ubuntu-server-24-04/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Come monitorare la scadenza dei certificati SSL dei siti web con LibreNMS</title>
		<link>https://www.raffaelechiatto.com/come-monitorare-la-scadenza-dei-certificati-ssl-dei-siti-web-con-librenms/</link>
					<comments>https://www.raffaelechiatto.com/come-monitorare-la-scadenza-dei-certificati-ssl-dei-siti-web-con-librenms/#respond</comments>
		
		<dc:creator><![CDATA[Raffaele Chiatto]]></dc:creator>
		<pubDate>Mon, 18 May 2026 06:23:16 +0000</pubDate>
				<category><![CDATA[LibreNMS]]></category>
		<category><![CDATA[SSL]]></category>
		<guid isPermaLink="false">https://www.raffaelechiatto.com/?p=1123335</guid>

					<description><![CDATA[&#160; I certificati SSL sono un elemento fondamentale per garantire la sicurezza dei siti web e la fiducia degli utenti. Una loro scadenza non monitorata può causare interruzioni di servizio, avvisi di sicurezza nei browser e potenziali problemi di reputazione. Per questo motivo è importante adottare strumenti che permettano di controllare in modo proattivo lo [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" class="size-full wp-image-1091056 alignnone" src="https://www.raffaelechiatto.com/wp-content/uploads/2020/12/INTERMEDIATE-BAR.png" alt="" width="679" height="89" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2020/12/INTERMEDIATE-BAR.png 679w, https://www.raffaelechiatto.com/wp-content/uploads/2020/12/INTERMEDIATE-BAR-480x63.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 679px, 100vw" /></p>
<p>&nbsp;</p>
<p>I certificati SSL sono un elemento fondamentale per garantire la sicurezza dei siti web e la fiducia degli utenti. Una loro scadenza non monitorata può causare interruzioni di servizio, avvisi di sicurezza nei browser e potenziali problemi di reputazione. Per questo motivo è importante adottare strumenti che permettano di controllare in modo proattivo lo stato dei certificati e ricevere avvisi prima che si verifichino criticità.</p>
<p>In questo articolo vedremo come utilizzare LibreNMS per monitorare la scadenza dei certificati SSL dei siti web così da avere sotto controllo le date di rinnovo e intervenire tempestivamente.</p>
<p>Analizzeremo i passaggi necessari per configurare il monitoraggio e impostare notifiche efficaci in modo semplice e centralizzato.</p>
<p>&nbsp;</p>
<h3><strong>ABILITAZIONE DELLA FUNZIONE SSL</strong></h3>
<p>Collegarsi in console sul server LibreNMS quindi eseguire i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">cd /opt/librenms
sudo -u librenms php artisan config:set ssl_certificates.auto_discover true</pre><p>Oppure utilizzare con il comando lnms:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo -u librenms lnms config:set ssl_certificates.auto_discover true</pre><p>L’opzione <strong>ssl_certificates.auto_discover</strong> abilita il job schedulato che prova a connettersi ai device attivi sulla porta 443 e memorizza il certificato presentato.</p>
<p>&nbsp;</p>
<h3><strong>VERIFICA DEI JOB SCHEDULATI</strong></h3>
<p>LibreNMS usa due task distinti:</p>
<ul>
<li><strong>lnms maintenance:discover-ssl-certificates</strong> per la discovery</li>
<li><strong>lnms maintenance:refresh-ssl-certificates</strong> per il refresh periodico dei certificati già noti</li>
</ul>
<p>Se il tuo scheduler LibreNMS è configurato correttamente, questi task vengono eseguiti automaticamente.</p>
<p>Per provarli subito a mano eseguire i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo -u librenms php artisan maintenance:discover-ssl-certificates

sudo -u librenms php artisan maintenance:refresh-ssl-certificates</pre><p>&nbsp;</p>
<h3><strong>VERIFICA DEI CERTIFICATI SCOPERTI</strong></h3>
<p>Collegarsi alla Web UI di LibreNMS</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/04/mon-ssl-librenms-01.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123341 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/04/mon-ssl-librenms-01-1024x494.png" alt="" width="1024" height="494" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/04/mon-ssl-librenms-01-980x473.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/04/mon-ssl-librenms-01-480x232.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Quindi cliccare su <strong>Overview → Tools → SSL Certificates</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/04/mon-ssl-librenms-02.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123342 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/04/mon-ssl-librenms-02-1024x493.png" alt="" width="1024" height="493" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/04/mon-ssl-librenms-02-980x472.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/04/mon-ssl-librenms-02-480x231.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Dovremmo visualizzare una schermata con tutti i certificati discoverati.</p>
<p>Da questa pagina è possibile:</p>
<ul>
<li>vedere i certificati scoperti</li>
<li>aggiungere voci manualmente come host + porta</li>
<li>mettere in pausa o riattivare il monitoraggio</li>
<li>rimuovere una voce</li>
</ul>
<p>&nbsp;</p>
<h3><strong>AGGIUNTA MANUALE DEI SITI WEB DA MONITORARE</strong></h3>
<p>Questo è il passaggio più utile se vuoi controllare siti web pubblici o nomi DNS specifici.</p>
<p>Nella schermata <strong>SSL Certificates</strong> aggiungere manualmente:</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/04/mon-ssl-librenms-03.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123343 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/04/mon-ssl-librenms-03-1024x489.png" alt="" width="1024" height="489" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/04/mon-ssl-librenms-03-980x468.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/04/mon-ssl-librenms-03-480x229.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Host: ad esempio www.tuodominio.it<br />
Port: normalmente 443</p>
<p>Cliccare su <strong>Add Certificate</strong></p>
<p>Per host HTTPS standard è sufficiente così. LibreNMS supporta proprio l’aggiunta manuale di host e porta da UI.</p>
<p>&nbsp;</p>
<h3><strong>ESCLUDERE HOST CHE NON SI VUOL MONITORARE</strong></h3>
<p>Se si vuole evitare check automatici su certi host impostare <strong>ssl_certificates.skip_hosts</strong> con lista di hostname o IP.</p>
<p>L’esclusione vale sia per discovery sia per refresh.</p>
<p>Esempio di comando per esclusione:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo -u librenms lnms config:set ssl_certificates.skip_hosts '["lb01.example.local","10.10.10.5"]'</pre><p>&nbsp;</p>
<h3><strong>ATTIVAZIONE DELL&#8217;ALERT</strong></h3>
<p>LibreNMS indica che esiste una regola di alert già disponibile chiamata <strong>Expiring SSL Certificates</strong> che avvisa quando il certificato scadrà entro 14 giorni.</p>
<p>Aprire la Web UI quindi <strong>Alerts → Alert Rules</strong></p>
<p>Verificare che la regola <strong>Expiring SSL Certificates</strong> sia presente e abilitata.</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/04/mon-ssl-librenms-04.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123344 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/04/mon-ssl-librenms-04-1024x491.png" alt="" width="1024" height="491" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/04/mon-ssl-librenms-04-980x470.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/04/mon-ssl-librenms-04-480x230.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Nel caso la regola non fosse presente aggiungerla cliccando su <strong>Create rule from collection</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/04/mon-ssl-librenms-05.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123345 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/04/mon-ssl-librenms-05-1024x494.png" alt="" width="1024" height="494" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/04/mon-ssl-librenms-05-980x472.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/04/mon-ssl-librenms-05-480x231.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Nel campo cerca scrivere SSL in modo che compaia la regola <strong>Expiring SSL Certificates</strong> quindi cliccare <strong>Select</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/04/mon-ssl-librenms-06.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1123346 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/04/mon-ssl-librenms-06-1024x495.png" alt="" width="1024" height="495" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/04/mon-ssl-librenms-06-980x474.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/04/mon-ssl-librenms-06-480x232.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Impostare l&#8217;alert come da immagine sovrastante impostando il numero di giorni a proprio piacimento.</p>
<p>Cliccare su <strong>Save Rule</strong></p>
<p>Associare quindi il transport che usi già come per esempio:</p>
<p>Email<br />
Telegram<br />
Teams<br />
Slack<br />
webhook</p>
<p>&nbsp;</p>
<h3><strong>CONSIDERAZIONI FINALI</strong></h3>
<p>Questo metodo è perfetto quando si usa la funzione nativa se si vuole:</p>
<ul>
<li>monitorare la scadenza del certificato</li>
<li>vedere un elenco centralizzato dei certificati</li>
<li>ricevere alert “sta per scadere”</li>
<li>aggiungere manualmente host web esterni o interni su host/porta</li>
<li>Limite importante da sapere</li>
</ul>
<p>La funzione nativa fa bene il monitoraggio della scadenza del certificato presentato dal server, ma se vuoi controlli più “applicativi” del tipo:</p>
<ul>
<li>HTTP 200/301 atteso</li>
<li>contenuto pagina</li>
<li>timeout applicativo</li>
<li>warning/critical personalizzati, ad esempio 30/14 giorni</li>
<li>casi particolari con reverse proxy e virtual host</li>
</ul>
<p>allora conviene usare anche i Services con plugin Nagios.</p>
<p>LibreNMS supporta i Service Checks tramite Nagios plugins e i servizi devono sempre essere associati a un device.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.raffaelechiatto.com/come-monitorare-la-scadenza-dei-certificati-ssl-dei-siti-web-con-librenms/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>