News

Protezione del software

In questo ciclo di 2 articoli affronterò le 2 modalità di protezione del software utilizzabili ( hardware e software ) , cercando di analizzarne pregi e difetti.

Parlerò di 2 prodotti particolari ( facendo presente anche i motivi per cui ne ho scartati altri, dopo averli valutati )

Nei miei prodotti li utilizzo entrambi, perchè, come spesso succede, i pro ed i contro sono anche il gradimento dei clienti e la loro modalità di utilizzo del prodotto, per cui ci possono essere degli impedimenti all'utilizzo di una delle 2 soluzioni o magari qualche preconcetto che fanno sì che una delle 2 non sia gradita ( magari qualche esperienza pregressa non positiva, come spesso accade, ma spesso si tratta di cattive implementazioni e non di veri e propri problemi )

Un software è generalmente composto da più features, che possono essere installate ( e licenziate ) separatamente ; in genere un prodotto software consiste di una main feature ( il core del prodotto ), e di una serie di features accessorie ; in un programma di setup ( cfr: https://docs.microsoft.com/it-it/windows/desktop/Msi/feature-table ) sono spesso disponibili separatamente per l'installazione 

 

Le chiavette USB (modalità hardware)

 

Questa è sicuramente la soluzione più vecchia presente sul mercato ; prima di USB , si usavano magari chiavi che si connettevano alla porta parallela.

Le chiavette non richiedono drivers e vengono quindi viste senza problema dai moderni sistemi operativi.

Le chiavette possono essere programmate per aggiungere dei dati al suo interno ( leggibili dall'applicazione ), e anche fare dei calcoli di verifica ; è anche possibile scrivere dei dati sulla chiave, in zone diverse (una accessibile solo al programmatore della chiave, l'altra ad uso dell'applicazione e che si può ad esempio utilizzare per salvare la data di primo utilizzo , o altro , dando quindi la possibilità di implementare qualsiasi funzionalità richiesta da un prodotto di gestione licenze ) 

Una possibile implementazione potrebbe essere quella di abilitare la main feature se la chiavetta USB è presente, mentre si può scrivere l'elenco delle features attivate in un frammento XML, in maniera tale che da applicazione si può verificare l'attivazione di una particolare feature andando a processare questo frammento XML ; per la limitata capacità di questa zona di memoria è comunque consigliabile usare un formato più breve ( ad esempio, un elenco separato da virgole )

Da notare che per la scrittura di questa zona di memoria sono richieste chiavi aggiuntive rispetto a quelle richieste per la lettura , quindi l'utilizzatore finale non sarà in genere abilitato a modificarle ; nondimeno, possiamo realizzare dei piccoli software da inviare la cliente e tramite i quali riscrivere questa zona ( per abilitare nuove features, ad esempio , o comunque variare le licenze )

Per le versioni di prova , è possibile scrivere la data di primo utilizzo e/o il numero di utilizzi , tramite il quale limitare l'utilizzo del prodotto ; da notare che comunque l'attivazione di una versione di prova richiede una chiave hardware ( che ha un costo, se acquistata da un fornitore , di circa 50 euro , e poi comunque è problematico distribuirle a chiunque )

Un vantaggio di questa soluzione è che funziona ( bene ) anche su macchine virtuali ; mentre vedremo che una soluzione software , pur potendo funzionare anche in ambiente virtuale , in realtà funzionando in questo modo la protezione può essere aggirata, e quindi in genere per un ambiente virtuale si sconsiglia l'implementazione di una protezione software e l'unica soluzione praticabile è quella hardware

Una chiavetta USB può anche essere prodotta in casa con una scheda arduino ( presenterò in seguito un progetto per una protezione USB basata su Arduino )

 

Questa è la chiavetta USB che ho di norma utilizzato : https://rockey.it/rockey2/ 

 

 

Dns dinamico con godaddy

In questo articolo mostrerò come realizzare un dns dinamico tramite uno script python e le api sviluppatore di godaddy su un server macOS

Il servizio di ip dinamico viene offerto a pagamento da vari fornitori , es : https://dyndns.it , spesso viene offerta una sorta di demo gratuita che però ha varie limitazioni; il servizio serve ad accedere ad un server a casa , in cui viene utilizzato un provider che non offre un servizio di ip fisso , tramite nome dns ; l'utilizzo dei dns di godaddy non ha limitazioni , è molto più efficiente, ed è anche gratuito ( il che non guasta )

 

lo script python originale e stato scaricato da qui :

 

https://github.com/CarlEdman/godaddy-ddns

 

dovrebbe supportare sia versione 2.7 che 3 di python, in realtà su macOS non andava per cui ho utilizzato le librerie requests in luogo della Request utilizzate nell'esempio;

 

per installare requests, va prima installato pip , e poi si utilizza pip per installare il resto ( entrambe le operazioni vanno fatte con proivilegio di root )

>easy_install pip

>pip install requests

 

Nel dettaglio, queste sono le modifiche apportate allo script python :

 

#if sys.version_info > (3,):
# from urllib.request import urlopen, Request
# from urllib.error import URLError, HTTPError
#else:
# from urllib2 import urlopen, Request
# from urllib2 import URLError, HTTPError

import requests
from urllib2 import URLError, HTTPError

...

 

questa è la parte che determina l'ip da assegnare poi al record dns :

req = requests.get("http://ipv4.icanhazip.com/")
args.ip = req.content.strip()

 

e questa è la parte che richiama l'api di godaddy per cambiare il record dns :

url = 'https://api.godaddy.com/v1/domains/{}/records/A/{}'.format('.'.join(hostnames[1:]),hostnames[0])
data = json.dumps([ { "data": args.ip, "ttl": args.ttl, "name": hostnames[0], "type": "A" } ])
if sys.version_info > (3,): data = data.encode('utf-8')
headers = {"content-type": "application/json", "Authorization": "sso-key {}:{}".format(args.key,args.secret),
     "Accept":"application/json" }
req = requests.put(url, data=data, headers=headers)

per richiamare l'api di godaddy è necessaria una KEY e un SECRET , per ottenere i quali bisogna registrarsi come sviluppatore su :

developer.godaddy.com

 

per richiamare lo script python ho utilizzato un semplice script di una riga in bash :

python /Users/alessandrotrebbi/Desktop/godaddy-ddns/godaddy_ddns.py --key 9QC......Nue --secret 8V....1Hi --ttl 600 $HOSTNAME.3bsoft.com 

( modifico il record $HOSTNAME , nello specifico aleforever , del dominio 3bsoft.com ; provatelo anche manualmente per verificare di avere installato correttamente la libreria requests di python ) 

 

questo script l'ho schedulato per richiamarlo ogni 10 minuti , per fare questo in macos si utilizza un file plist da copiare in una specifica directory ( ce ne sono diverse ), in particolare ho utilizzato la directory :

/Library/LaunchDaemons

perchè il job dovrà funzionare anche ad utente non loggato 

attenzione al nome del plist ( per evitare conflitti , scegliere un nome con namespace , es : com.bbbsoft.godaddy-ddns.plist

usare poi full path per ProgramArguments , StandardErrorPath e StandardOutPath

)

 

Alla fine , attivare ed avviare il servizio con :

launchctl load com.bbbsoft.godaddy-ddns.plist

( il comando unload serve invece per disattivarlo , in questo caso va dato però il full path del plist )

 

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">

<plist version="1.0">

<dict>

  <key>Label</key>

  <string>com.bbbsoft.godaddy-ddns</string>

  <key>ProgramArguments</key>

  <array>

    <string>/Users/alessandrotrebbi/Desktop/godaddy-ddns/mydns.sh</string>

  </array>

  <key>Nice</key>

  <integer>1</integer>

  <key>StartInterval</key>

  <integer>3600</integer>

  <key>RunAtLoad</key>

  <true/>

  <key>StandardErrorPath</key>

  <string>/Users/alessandrotrebbi/Desktop/godaddy-ddns/mydns.err</string>

  <key>StandardOutPath</key>

  <string>//Users/alessandrotrebbi/Desktop/godaddy-ddns/mydns.out</string>

</dict>

</plist>

 

 

 

 

 

Video demo Oil And Gas Pipeline Design

 

Nel video seguente, i passaggi per stampare le tavole di un progetto di pipeline partendo da un file excel

 

 

Java a pagamento

E così, dal 2019 le aziende che vorranno usare gratis java dovranno pagare :

https://java.com/it/download/release_notice.jsp

potrete continuare ad usarlo liberamente se non a scopo di lucro, potrete usarlo come sviluppatore ; ma se vorrete usarlo in una azienda, le nuove versioni dovrete pagarle ( quanto non è dato saperlo ); quelle rilasciate da gennaio 2019

Oracle passerà ad un modello di licenze lts ( long term support ), per cui da qui a java 11 ( prevista tra 3 anni ) l'unica versione su cui continueranno a correggere bug e fare patch sarà java 8 , ma le patch non saranno accessibili a tutti

Potrebbe essere l'ennesimo tentativo di Oracle di affossare java , che dall'acquisto di Sun ha mostrato di mal digerire ( anche se alla fine gli ha reso parecchio , solo di royalties e cause legali vinte ha già incassato più di quanto apgato a suo tempo per Sun, e l'acquisto era stato fatto per acquisire Solaris, senza alcun interesse in Java ; Solaris nel frattempo è stato abbandonato, Oracle si è sviluppato la sua ( ottima ) distribuzione Linux

Il legame di Oracle con Java è sempre stato bipolare :

Con Oracle 8 Java fu introdotto nel dbms di Oracle , sembrava che di lì a poco avrebbe soppiantato plsql : Oracle, con IBM e Sun , al tempo era anche una delle aziende che aveva avviato un programma di certificazione per Java ... Poi, in silenzio, il programma di certificazione sparì dal sito di Oracle ( e non solo ), Java sul dbms Oracle non fu più aggiornato ( ed oggi, se proprio lo si vuole usare , bisogna utilizzare Java 1.3 , ormai obsoleta , e fare praticamente tutto in maniera manuale , di fatto viene mantenuta per quei pochi clienti che al tempo provarono ad usarlo e far funzionare ancora il software a suo tempo realizzato )

Concludendo, direi che è il momento buono di cercare serie alternative a Java ; ormai , i vantaggi sono rimasti pochi ( anche .net è multipiattaforma ), svantaggi invece sono tanti, ed a questi si aggiunge anche un costo che presumo non sarà da poco ( Oracle da questo punto di vista non scherza )