Partiamo con una premessa, il machine learning è un campo che si occupa dell'apprendimento automatico di dati senza che la macchina sia esplicitamente programmata.
Invece di scrivere codice per eseguire specifiche operazioni, il machine learning usa algoritmi che possono analizzare grandi moli di dati per identificare modelli e fare previsioni o decisioni in base ad essi.
Esempio lampante sono le AI (intelligenze artificiali) che ora vanno molto di moda, le nostre potete trovarle in alto nell'apposita sezione dell'header.
Python è uno dei linguaggi di programmazione più utilizzati nel machine learning grazie alla sua sintassi chiara e sintetica, vastità di librerie per il data science e la sua facilità d'uso. Tra le librerie più utilizzate ci sono NumPy, Pandas, Scikit-learn, TensorFlow e Keras (vedi come creare un tua libreria personale).
Il machine learning Python viene utilizzato in molte applicazioni tra cui il generazione/riconoscimento di immagini, la generazione testuale, grafici, l'analisi di un business ecc...
Iniziamo con qualche esempio pratico vedendo nel dettaglio gli attacchi informatici:
Il rilevamento delle anomalie in un sistema ad esempio, utilizzando tecniche di clustering si può identificare i modelli di comportamento normali degli utenti su una rete o su un sistema e quindi rilevare eventuali attività sospette o non autorizzate che si discostano da il comportamento "basic" in un certo senso generalizzando.
Questo può essere fatto utilizzando la libreria Isolation Forest che funziona suddividendo i dati in sottoinsiemi casuali e utilizzando un albero di decisione per separare gli insiemi di dati.
L'idea è quindi che le anomalie sono più difficili da suddividere in un albero di decisione rispetto ai dati normali.
Ad esempio:
from sklearn.ensemble import IsolationForest
import pandas as pd
# dataset
df = pd.read_csv('dataset.csv')
# modello Isolation Forest
model = IsolationForest(n_estimators=100, max_samples='auto', contamination=float(0.1))
# allenamento sui dati
model.fit(df)
# anomalie
anomalies = model.predict(df)
# restituisci le anomalie
print(anomalies)
Entriamo ora in dettaglio sulla rete, in particolare l'analisi dei flussi di rete monitorando le connessioni e le comunicazioni tra i dispositivi su una rete e identificare eventuali attività sospette o non autorizzate. Per esempio un dispositivo che inizia a inviare grandi quantità di dati verso un server remoto (DoS).
Un esempio pratico può essere quello di analizzare i pacchetti quindi monitorare il traffico di rete sui singoli pacchetti.
Una libreria molto usata in questo ambito è Scapy, analizziamo i pacchetti nella porta 80 usando questa libreria:
from scapy.all import *
def packet_callback(packet):
if packet[TCP].dport == 80 and packet.haslayer(Raw):
print(packet[Raw].load)
sniff(filter='tcp', prn=packet_callback, store=0)
Un altro fattore di sicurezza è sicuramente quello dell'analisi dei log degli accessi, per esempio un utente che accede a un sistema con una password errata più volte di fila potrebbe essere considerato un tentativo di brute force.
Con Python ci sono diverse librerie per l'analisi dei dati strutturati come Pandas.
Un esempio banale per analizzare i log degli accessi a un server web:
import pandas as pd
# file di log
df = pd.read_csv('access_log.csv', sep=' ', header=None, names=['IP', 'date', 'method', 'url', 'status', 'bytes', 'referer', 'user_agent'])
# IP da segnalare
suspicious_ips = df.loc[df['status'] == 401, 'IP'].unique()
# restituisci IP segnalati
print(suspicious_ips)
Un altro esempio potrebbe essere l'installazione di programmi malizi da mobile, quindi ne deriva l'analisi delle attività sui dispositivi mobili, monitorando le attività degli utenti sui loro dispositivi mobili e rilevando eventuali attività sospette o non autorizzate come ad esempio l'installazione di applicazioni non autorizzate o l'accesso a siti web di phishing. Molto importante per un azienda visti gli innumerevoli casi che abbiamo citato negli scorsi mesi!
Tanto per citare il più lampante: Azienda Rovagnati! (Ransomware Lockbit).
Un esempio di monitoraggio potrebbe essere fatto con la libreria NLTK (Natural Language Toolkit) che permette l'analisi dei comportamenti degli utenti sui social network in particolare analisi del testo.
from nltk.tokenize import word_tokenize
from nltk.corpus import stopwords
from collections import Counter
# scarica stop words
stop_words = set(stopwords.words('english'))
# leggi i post
posts = [
"Mi sono iscritto a Ethical Hacking Forum oggi, che figata!",
"Buona questa pizza!",
"Top 10 località da visitare in Veneto."
]
# tokenizza i post
tokens = []
for post in posts:
tokens += word_tokenize(post)
# rimuovi le stop words e le parole con meno di 3 caratteri
tokens = [word.lower() for word in tokens if word.lower() not in stop_words and len(word) > 2]
# conta le parole più frequenti
word_count = Counter(tokens)
# stampa le parole più frequenti
print(word_count.most_common(10))
In questo caso viene prima scaricato l'elenco delle stop words (parole comuni che vengono spesso ignorate durante l'analisi del testo), i post vengono tokenizzati (divisi in singole parole). Vengono poi rimosse le stop words e le parole con meno di 3 caratteri e viene effettuata una conta delle parole più frequenti utilizzando la classe Counter di Python.