
In ambienti di sviluppo o home labs potrebbe risultare utile installare un server KMS su Linux per licenziare Windows ed Office in modo automatico, senza la necessità di acquistare un volume licensing.
Su GitHub si trovano diverse versioni di KMS open source installabili anche su Linux, in queste guida prenderemo in cosiderazione PyKMS che è stato sviluppato in Python e verrà mostrato come effettuarne il deploy su Docker.
Infine, verrà mostrata la configurazione del server DNS necessaria per rendere automatizzata la distribuzione delle licenze.
PREREQUISITI
PyKMS può essere installato su qualsiasi sistema compatibile con Python, in questa guida verranno mostati gli step di deploy su Docker.
Docker può essere eseguito sulla maggioranza dei sistemi operativi moderni, per testare la procedura è stato utilizzato un server Debian 13.
INSTALLAZIONE DI DOCKER SU DEBIAN
Questa guida non tratterà in modo approfondito l’installazione e la configurazione di Docker, ma verranno mostrati solo gli step “base”.
Aggiornare i repositories ed installare i pacchetti necessari:
|
0 1 |
sudo apt-get update sudo apt-get install -y ca-certificates curl |
Aggiungere la chiave GPG dei repositories di Docker:
|
0 1 2 |
sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc sudo chmod a+r /etc/apt/keyrings/docker.asc |
Aggiungere i repositories di Docker:
|
0 1 2 3 4 |
echo \ "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update |
Installare Docker con il comando:
|
0 |
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin |
Abilitare il servizio con il comando:
|
0 |
sudo systemctl enable --now docker.service |
CLONARE IL REPOSITORY E COMPILARE IL DOCKERFILE
In questo paragrafo verranno mostrati gli step per clonare il repository PyKMS da GitHub e per compilare l’immagine Docker.
Sarebbe possibile utilizzare un’immagine salvata su un repository remoto (tipo su Harbor) per non dover compilare localmente l’immagine, ma è al di fuori dello scopo di questa guida.
Installare git con il comando:
|
0 |
sudo apt-get install -y git |
Clonare il repository con il comando:
|
0 |
git clone https://github.com/itsarts1/PyKMS.git |
Navigare nella directory appena clonata:
|
0 |
cd ./PyKMS |
Al fine di non aggiornare inavvertitamente l’immagine Docker è consigliato puntare ad un tag, in questo caso il tag della versione “1.0”:
|
0 |
git checkout tags/1.0 |
Compilare l’immagine Docker:
|
0 |
docker build -t py-kms:1.0 . |
Se si utilizzasse un tag diverso da 1.0 sarebbe necessario sostituirlo in entrambi i comandi precedenti e nel file docker-compose.yaml che verrà mostrato nei prossimi steps.
DEPLOY CON DOCKER COMPOSE
Al fine di semplificare la gestione del container Docker è auspicabile creare un file docker-compose.yaml ed effettuare il deploy mediante esso.
Uscire dalla directory precedente ed opzionalmente creare una nuova directory:
|
0 1 2 |
cd .. mkdir -p ./composes/PyKMS cd ./composes/PyKMS |
Creare un file denominato docker-compose.yaml con il seguente contenuto:
|
0 1 2 3 4 5 6 7 8 |
--- services: py-kms: image: py-kms:1.0 container_name: py-kms ports: - "1688:1688" restart: unless-stopped #command: ["python", "/kms/server.py", "--verbose"] |
La direttiva command è commentata poichè non è necessaria, però può essere utilizzata per sovrascrivere il comando di avviamento del container (“CMD” nel DockerFile) in modo da specificare degli argomenti, come ad esempio –verbose per avere un output più dettagliato sullo stdout.
Per validare la sintassi del file è possibile utilizzare yamllint:
|
0 |
yamllint docker-compose.yaml |
Per installarlo eseguire:
|
0 |
sudo apt-get install -y yamllint |
Per effettuare il deploy eseguire nella directory dove si ha creato il file docker-compose.yaml:
|
0 |
docker compose up -d |
Invece, per rimuovere il container eseguire:
|
0 |
docker compose down |
Per verificare lo stato dei containers in esecuzione:
|
0 |
docker ps |
Per visualizzare i logs di PyKMS:
|
0 |
docker logs py-kms |
Se non si attiva il flag –-verbose l’output dovrebbe essere:
|
0 |
TCP server listening at 0.0.0.0 on port 1688. |
NOTA BENE: La direttiva restart con modalità unless-stopped prevede che il container venga avviato al boot del server, per rimuoverlo utilizzare docker compose down.
CONFIGURAZIONE DEL SERVER DNS
È possibile creare un record SRV sul server DNS, per fa sì che l’attivazione con KMS avvenga mediante autodiscovery (automaticamente).
L’attivazione con autodiscovery funziona solo sui servers con search domain uguale alla zona in cui si crea il record, perciò i server senza join ad Active Directory potrebbero necessitare di uno step manuale che verrà mostrato nei prossimi capitoli.
Aprire lo snap-in DNS con un’utenza con privilegi sufficienti, collegarsi ad un server DNS ed accedere alla zona DNS in cui si vuole creare il record (è consigliato utilizzare la zona che corrisponde al dominio AD a cui vengono aggiunti i dispositivi da licenziare).
Facendo click destro in una zona senza record DNS (ad esempio a destra dell’ultima colonna) viene aperto un menù su cui è necessario selezionare Other New Records…:
Selezionare Service Location (SRV) e cliccare su Create Record…:
Compilare come segue e confermare cliccando su OK:
Service: _vlmcs
Protocol: _tcp
Priority: 0
Weight: 0
Port number: 1688
Host offering this service: RECORD-DNS-SERVER-KMS.
Sostituire RECORD-DNS-SERVER-KMS con un record A o con un record CNAME che punti al server KMS (ad esempio: kms.pizza.local).
Fare attenzione a mantenere il punto alla fine di Host offering this service (ad esempio: kms.pizza.local.).
Se non lo si ha creato prima è necessario creare il record DNS che punta al server KMS che nel nostro caso ha l’IP del server Docker.
Esempio con record A (10.10.10.10 sarebbe l’IP del server Docker):
Per visualizzare i records SRV, navigare su _tcp all’interno della zona DNS:
ATTIVAZIONE AUTOMATICA DI WINDOWS CON KMS
Dal momento che si ha creato il record SRV i servers sanno chi contattare per effettuare l’attivazione della licenza, ma non lo faranno se non gli viene agiunta la licenza generica.
La licenza generica cambia per ogni versione di Windows ed è possibile recuperare i codici dal seguente link: KMS Activation Keys
Inserire la licenza generica non significa licenziare il sistema operativo, senza KMS la macchina risultarà comunque ancora da attivare.
È possibile inserire la licenza generica mediante scripts, oppure in caso di macchine virtuali, direttamente nel template, in modo da non dover effettuare questo step manualmente.
Su Windows Server 2025 (step analoghi sono possibili su tutte le versioni di Windows), navigare nelle Impostazioni su System, poi su About ed infine su Product key and activation.
La finestra dovrebbe mostrarsi come segue, cliccare su Change:
Inserire la product key reperita sul sito Microsoft e cliccare su Next:
Dovrebbe venir mostrata una finestra come la seguente per avvertirci che verrà contattato il KMS, cliccare su Activate:
Se la procedura è andata a buon fine viene mostrata una finestra come la seguente:
Se invece ci fossero problemi di comunicazione con il KMS, ad esempio perchè il server non appartiene al dominio in cui è stato creato il record SRV o per problemi di network, verrebbe mostrato il seguente errore:
ATTIVAZIONE MANUALE DI WINDOWS CON KMS
Mediante CMD o PowerShell è possibile forzare la registrazione del dispositivo con il KMS, ad esempio nei casi in cui l’autodiscovery non funziona.
Per effettuare il reset dei parametri eseguire il comando:
|
0 |
slmgr /ckms |
Per configurare il server KMS eseguire (sostituire RECORD-DNS-SERVER-KMS con il record A o CNAME del KMS, ad esempio: kms.pizza.local):
|
0 |
slmgr /skms RECORD-DNS-SERVER-KMS:1688 |
Se la configurazione avviene correttamente viene mostrato il seguente avviso:
Per forzare la registrazione con il server KMS (sia se configurato manualmente con il comando precedente che tramite autodiscovery):
|
0 |
slmgr /ato |
Se l’attivazione avviene con successo viene mostrato il seguente avviso:
Se non è stata aggiunta la licenza generica (vedi capitolo precedente) viene mostrato il seguente errore:
In questi casi procedere ad aggiungere la licenza generica ed eseguire slmgr /ato nuovamente.

0 commenti