Elastic sotto chiave: attiviamo le opzioni di sicurezza del cluster Elasticsearch per l'accesso interno ed esterno

Elastic sotto chiave: attiviamo le opzioni di sicurezza del cluster Elasticsearch per l'accesso interno ed esterno

Elastic Stack è uno strumento ben noto nel mercato dei sistemi SIEM (in effetti, non solo per loro). Può raccogliere una grande varietà di dati, sia sensibili che meno. Non è del tutto corretto se l'accesso agli stessi elementi Elastic Stack non è protetto. Di default, tutti gli elementi di base Elastic (Elasticsearch, Logstash, Kibana e i collezionisti Beats) operano su protocolli aperti. E in Kibana l'autenticazione è disabilitata. Tutte queste interazioni possono essere protette e in questo articolo spiegheremo come farlo. Per comodità, abbiamo diviso il racconto in 3 blocchi tematici:

  • Modello di accesso ai dati
  • Sicurezza dei dati all'interno del cluster Elasticsearch
  • Sicurezza dei dati al di fuori del cluster Elasticsearch

Dettagli sotto il TAG.

Modello di accesso ai dati

Se si installa Elasticsearch senza alcuna ottimizzazione, l'accesso a tutti gli indici sarà aperto a chiunque lo desideri. O per lo meno a coloro che sanno utilizzare curl. Per evitare ciò, Elasticsearch offre un modello di accesso basato sui ruoli, disponibile a partire dall'abbonamento di livello Basic (che è gratuito). Appare schematicamente in questo modo:

Elastic sotto chiave: attiviamo le opzioni di sicurezza del cluster Elasticsearch per l'accesso interno ed esterno

Cosa si vede nell'immagine

  • Gli utenti sono tutti quelli che possono autenticarsi utilizzando le proprie credenziali.
  • Il ruolo è un insieme di diritti.
  • I diritti sono un insieme di privilegi.
  • I privilegi sono permessi per scrivere, leggere, eliminare, ecc. (Elenco completo dei privilegi)
  • Le risorse sono indici, documenti, campi, utenti e altri soggetti del repository (il modello di accesso per alcune risorse è disponibile solo con abbonamenti a pagamento).

In Elasticsearch, di default, ci sono utenti di base, ai quali sono associati ruoli di base. Dopo aver abilitato le impostazioni di sicurezza, possono essere utilizzati immediatamente.

Per attivare la sicurezza nelle impostazioni di Elasticsearch, è necessario aggiungere nel file di configurazione (di default è elasticsearch/config/elasticsearch.yml) una nuova riga:

xpack.security.enabled: true

Dopo aver modificato il file di configurazione, avviamo o riavviamo Elasticsearch affinché le modifiche abbiano effetto. Il passo successivo è assegnare le password agli utenti di base. Faremo questo interattivamente con il comando sottostante:

[elastic@node1 ~]$ .\/elasticsearch\/bin\/elasticsearch-setup-passwords interactive
Inizio della configurazione delle password per gli utenti riservati elastic, apm_system, kibana, logstash_system, beats_system, remote_monitoring_user.
Ti verrà chiesto di inserire le password man mano che il processo avanza.
Confermi di voler continuare [y\/N]y


Inserisci la password per [elastic]:
Reinserisci la password per [elastic]:
Inserisci la password per [apm_system]:
Reinserisci la password per [apm_system]:
Inserisci la password per [kibana]:
Reinserisci la password per [kibana]:
Inserisci la password per [logstash_system]:
Reinserisci la password per [logstash_system]:
Inserisci la password per [beats_system]:
Reinserisci la password per [beats_system]:
Inserisci la password per [remote_monitoring_user]:
Reinserisci la password per [remote_monitoring_user]:
Password cambiata per l'utente [apm_system]
Password cambiata per l'utente [kibana]
Password cambiata per l'utente [logstash_system]
Password cambiata per l'utente [beats_system]
Password cambiata per l'utente [remote_monitoring_user]
Password cambiata per l'utente [elastic]

Controlliamo:

[elastic@node1 ~]$ curl -u elastic 'node1:9200\/\_cat\/nodes?pretty'
Inserisci la password host per l'utente 'elastic':
192.168.0.2 23 46 14 0.28 0.32 0.18 dim * node1

Puoi darti una pacca sulla spalla: la configurazione lato Elasticsearch è completata. Ora è il turno di impostare Kibana. Se la avvii ora, appariranno errori, quindi è importante creare un keystore. Questo si fa in due comandi (utente kibana e la password inserita nel passaggio di creazione delle password in Elasticsearch):

[elastic@node1 ~]$ .\/kibana\/bin\/kibana-keystore add elasticsearch.username
[elastic@node1 ~]$ .\/kibana\/bin\/kibana-keystore add elasticsearch.password

Se tutto è corretto, Kibana inizierà a chiedere il login e la password. Con un abbonamento di livello Basic è disponibile un modello di ruolo basato su utenti interni. A partire da Gold è possibile integrare sistemi di autenticazione esterni - LDAP, PKI, Active Directory e sistemi di Single sign-on.

Elastic sotto chiave: attiviamo le opzioni di sicurezza del cluster Elasticsearch per l'accesso interno ed esterno

È possibile limitare anche i diritti di accesso agli oggetti all'interno di Elasticsearch. Tuttavia, per fare lo stesso per documenti o campi, sarà necessario un abbonamento a pagamento (questa opzione inizia dal livello Platinum). Queste impostazioni sono disponibili nell'interfaccia di Kibana o tramite Security API. Puoi verificare tramite il menu Dev Tools che già conosci:

Creazione ruolo

PUT \_security\/role\/ruslan_i_ludmila_role
{
  "cluster": [],
  "indices": [
    {
      "names": [ "ruslan_i_ludmila" ],
      "privileges": ["read", "view_index_metadata"]
    }
  ]
}

Creazione dell'utente

POST \_security\/user\/pushkin
{
  "password" : "nataliaonelove",
  "roles" : [ "ruslan_i_ludmila_role", "kibana_user" ],
  "full_name" : "Alexander Pushkin",
  "email" : "pushkin@lyceum.edu",
  "metadata" : {
    "hometown" : "San Pietroburgo"
  }
}

Sicurezza dei dati all'interno del cluster Elasticsearch

Quando Elasticsearch è in funzione in un cluster (e questo è comune), diventano importanti le impostazioni di sicurezza all'interno del cluster. Per un'interazione sicura tra i nodi, Elasticsearch utilizza il protocollo TLS. Per configurare un'interazione sicura tra di loro, è necessario un certificato. Generiamo un certificato e una chiave privata in formato PEM:

[elastic@node1 ~]$ .\/elasticsearch\/bin\/elasticsearch-certutil ca --pem

Dopo l'esecuzione del comando sopra, nella directory /../elasticsearch apparirà un archivio elastic-stack-ca.zip. Al suo interno troverai un certificato e una chiave privata con le estensioni crt e key rispettivamente. È consigliabile caricarli su una risorsa condivisa, a cui tutte le nodi del cluster devono avere accesso.

Ora ogni nodo necessita dei propri certificati e chiavi private basati su quelli presenti nella directory condivisa. Durante l'esecuzione del comando verrà richiesta una password. Si possono aggiungere opzioni aggiuntive —ip e —dns per la completa verifica delle nodi in interazione.

[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-certutil cert --ca-cert /shared_folder/ca/ca.crt --ca-key /shared_folder/ca/ca.key

A seguito dell'esecuzione del comando otterremo un certificato e una chiave privata in formato PKCS#12, protetti da una password. Resta solo da spostare il file generato p12 nella directory di configurazione:

[elastic@node1 ~]$ mv elasticsearch/elastic-certificates.p12 elasticsearch/config

Aggiungiamo la password al certificato in formato p12 nel keystore e nel truststore di ogni nodo:

[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-keystore add xpack.security.transport.ssl.keystore.secure_password
[elastic@node1 ~]$ ./elasticsearch/bin/elasticsearch-keystore add xpack.security.transport.ssl.truststore.secure_password

Nell'ormai noto elasticsearch.yml rimane da aggiungere le righe con i dati sul certificato:

xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12

Avviamo tutti i nodi Elasticsearch e si esegue curl. Se tutto è stato eseguito correttamente, verrà restituita una risposta con diversi nodi:

[elastic@node1 ~]$ curl node1:9200/_cat/nodes -u elastic:password                                                                                    
172.18.0.3 43 75 4 0.00 0.05 0.05 dim * node2                                                                                                                     
172.18.0.4 21 75 3 0.00 0.05 0.05 dim - node3                                                                                                                     
172.18.0.2 39 75 4 0.00 0.05 0.05 dim - node1

C'è un'altra opzione di sicurezza — filtraggio degli indirizzi IP (disponibile in abbonamenti a partire dal livello Gold). Consente di creare liste bianche di indirizzi IP autorizzati a connettersi ai nodi.

Sicurezza dei dati al di fuori del cluster Elasticsearch

Fuori dal cluster significa collegare strumenti esterni: Kibana, Logstash, Beats o altri clienti esterni.

Elastic sotto chiave: attiviamo le opzioni di sicurezza del cluster Elasticsearch per l'accesso interno ed esterno

Per configurare il supporto https (invece di http), aggiungiamo nel elasticsearch.yml nuove righe:

xpack.security.http.ssl.enabled: true
xpack.security.http.ssl.keystore.path: elastic-certificates.p12
xpack.security.http.ssl.truststore.path: elastic-certificates.p12

Poiché il certificato è protetto da una password, aggiungiamola nel keystore e nel truststore di ogni nodo:

[elastic@node1 ~]$ .\/elasticsearch\/bin\/elasticsearch-keystore add xpack.security.http.ssl.keystore.secure_password
[elastic@node1 ~]$ .\/elasticsearch\/bin\/elasticsearch-keystore add xpack.security.http.ssl.truststore.secure_password

Dopo aver aggiunto le chiavi, i nodi Elasticsearch sono pronti per la connessione tramite https. Ora possono essere avviati.

Il passo successivo è creare una chiave per la connessione a Kibana e aggiungerla alla configurazione. Basandoci sul certificato già collocato nella directory condivisa, genereremo un certificato in formato PEM (PKCS#12 Kibana, Logstash e Beats non supportano ancora):

[elastic@node1 ~]$ .\/elasticsearch\/bin\/elasticsearch-certutil cert --ca-cert \/shared_folder\/ca\/ca.crt --ca-key \/shared_folder\/ca\/ca.key --pem

Rimane solo da estrarre le chiavi create nella cartella di configurazione di Kibana:

[elastic@node1 ~]$ unzip elasticsearch\/certificate-bundle.zip -d kibana\/config

Le chiavi sono pronte, ora dobbiamo modificare la configurazione di Kibana affinché cominci a utilizzarle. Nel file di configurazione kibana.yml cambiamo http in https e aggiungiamo le righe con le impostazioni della connessione SSL. Le ultime tre righe configurano l'interazione sicura tra il browser dell'utente e Kibana.

elasticsearch.hosts: ["https:\//${HOSTNAME}:9200"]
elasticsearch.ssl.certificateAuthorities: \/shared_folder\/ca\/ca.crt
elasticsearch.ssl.verificationMode: certificate
server.ssl.enabled: true
server.ssl.key: \/..\/kibana\/config\/instance\/instance.key
server.ssl.certificate: \/..\/kibana\/config\/instance\/instance.crt

In questo modo, le impostazioni sono state effettuate e l'accesso ai dati nel cluster Elasticsearch è crittografato.

Se avete domande sulle capacità di Elastic Stack con abbonamenti gratuiti o a pagamento, per questioni di monitoraggio o per la creazione di un sistema SIEM, lasciate una richiesta in modulo di contatto il nostro sito web.

Altri nostri articoli su Elastic Stack su Habr:

Approfondiamo il Machine Learning in Elastic Stack (alias Elasticsearch, alias ELK)

Sizing Elasticsearch

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster