Come Spostare i Dati del Database di Audit su AWS S3 e Leggerli Utilizzando il Servizio AWS Athena
Archivio di Audit è una funzionalità opzionale del compito di Pulizia del Database di Audit in DataSunrise Sicurezza nel Database. Questa funzionalità consente a un amministratore dell’installazione di DataSunrise di rimuovere dati di audit meno recenti per memorizzarli nel servizio AWS S3, offrendo un modo migliore ed economico di memorizzare i dati scaduti. Con l’utilizzo del Servizio AWS Athena, il Team di Sicurezza e Revisori Esterni sono in grado di esaminare i dati storici necessari per audit e indagini sugli incidenti. Inoltre, usare l’Archivio di Audit consente ai clienti di DataSunrise di mantenere grandi set di dati di eventi auditati senza memorizzare tutto in un unico database di memoria di audit e riscontrare tempi di generazione dei rapporti aumentati. Inoltre, usare S3 per i dati freddi è una soluzione più economica, che può aiutare a ottimizzare il budget del progetto mantenendo sotto controllo la dimensione del database di audit.
Per l’Archivio di Audit, il team di DataSunrise fornisce lo script dedicato per i deployment su Linux che può essere regolato per inserire i dati rimossi in una posizione S3 personalizzabile. Fa parte del pacchetto di installazione predefinito di DataSunrise, quindi non è necessario scaricarlo da nessun altro luogo.
Questo articolo ti guiderà attraverso il processo di configurazione del compito di Pulizia dell’Audit, il caricamento dei dati rimossi nella posizione del bucket S3 di tua scelta e configurazione dell’ambiente in AWS Athena per le indagini.
Configurare un Compito di Pulizia dei Dati di Audit con l’opzione Archivio di Audit
- Apri l’interfaccia Web di DataSunrise e naviga su Configurazione → Compiti Periodici. Clicca sul pulsante Nuovo Compito e fornisci le informazioni generali come Nome, Tipo di Compito (es: Pulizia Dati di Audit) e seleziona il server su cui eseguire il compito nel caso stai usando un Cluster di nodi DataSunrise.
- Imposta le Opzioni dell’Archivio nella sezione Pulizia dei Dati di Audit:
- Seleziona l’opzione Archivia Dati Rimossi prima della Pulizia.
- Specifica il percorso della Cartella dell’Archivio dove i dati di audit dovrebbero essere memorizzati temporaneamente prima di essere spostati su S3.
- Specifica il percorso dello script che carica i dati su AWS S3 utilizzando il campo “Esegui Comando Dopo l’Archiviazione”. Percorso predefinito – /opt/datasunrise/scripts/aws/cf_upload_ds_audit_to_aws_s3.sh
(necessario) - Fornisci parametri extra per lo script per regolare il comportamento (vedi sotto per gli argomenti dello script delle opzioni)
- Regola la Frequenza del Compito nella sezione “Frequenza d’Avvio”, puoi impostare la frequenza con cui il compito deve essere eseguito (es: quotidianamente, settimanalmente, mensilmente) in base alle esigenze di ritenzione e archiviazione dei dati di audit dell’organizzazione.
- Salva il compito dopo aver configurato tutte le impostazioni necessarie.
- Avvia il compito manualmente o automaticamente. Se l’utente ha configurato il compito per essere avviato manualmente, può avviarlo selezionando il compito e cliccando su Avvia Ora. Se è impostato per essere avviato in base a un programma, verrà eseguito automaticamente agli orari specificati.
- Dopo aver eseguito il compito, verrà creata una cartella di archivio sul file system del server DataSunrise dove è stato eseguito il compito (sulle distribuzioni Linux, il percorso predefinito sarà /opt/datasunrise/).

Immagine 1. Impostazioni Generali

Immagine 2. Compito Periodico di Pulizia dei Dati di Audit
Nota: se esegui DataSunrise su AWS ECS Fargate, usa il ecs_upload_ds_audit_to_aws_s3.sh invece, situato nella stessa directory.

Immagine 3. Comandi Extra per il Compito di Pulizia dei Dati di Audit

Immagine 4. Avvia il Compito
Nota: I passaggi sopra possono essere utilizzati anche per gestire la retensione dei dati di audit in DataSunrise. Gli utenti possono utilizzare la funzione “Pulizia Periodica dell’Audit” per rimuovere regolarmente i dati di audit obsoleti. Questo assicura l’efficienza del server DataSunrise prevenendo il sovraccarico di archiviazione con dati obsoleti.
Lo Script per il Caricamento dei Dati di Audit Archiviati
Per caricare la cartella dell’archivio in un bucket AWS S3, utilizza il script fornito da DataSunrise situato nella cartella
Per personalizzare la procedura, puoi utilizzare i seguenti flag opzionali:
- –-archive-folder: annulla la cartella predefinita sul server DataSunrise per posizionare i file di dati di audit archiviati. Per impostazione predefinita, la cartella dell’archivio audit ds verrà creata alla posizione /opt/datasunrise/.
- –folder-in-bucket: fornisci il tuo prefisso per inserire i dati auditati. Per impostazione predefinita lo script scarica i dati nel prefisso
/ds-audit-archive. - –predefined-credentials: Nel caso in cui stai eseguendo DataSunrise al di fuori di AWS, per poter caricare i dati su S3, avrai bisogno di un file di credenziali o della coppia di chiavi ACCESSO/SEGRETO per l’utente IAM autorizzato ad accedere al bucket S3 desiderato. Non richiede input.
Nota: La dimensione della cartella è monitorata durante il caricamento dei dati di audit, e quando supera una certa soglia, il comando viene eseguito. Se non è specificato alcuno script, si verifica un errore quando la soglia viene superata. La soglia è impostata utilizzando il Parametro Addizionale “AuditArchiveFolderSizeLimit”, con un valore predefinito di 1 GB. Un utente può pre-pulire una cartella di archivio utilizzando l’opzione “Pulisci una cartella di archivio prima dell’archiviazione”.
Considerazioni
- Il nome del bucket per caricare i dati archiviati deve essere fornito senza lo schema s3://
Struttura della Cartella dell’Archivio di Audit
La struttura della cartella dell’archivio dove DataSunrise memorizza i dati di audit segue tipicamente un formato gerarchico che è organizzato per data. Questa organizzazione aiuta a gestire i dati in modo efficiente e facilita il reperimento di record di audit specifici in base alla data. Ecco una panoramica generale di quello che potrebbe essere la struttura:
Modello Generale della Struttura della Cartella
Directory Base: /opt/datasunrise/ds-audit-archive/ └── Anno: {YYYY}/ └── Mese: {MM}/ └── Giorno: {DD}/ └── File di Audit: audit_data_{YYYY}-{MM}-{DD}.csv.gz
Nota: I file saranno in forma compressa e devono essere decompressi per leggere le informazioni (ad esempio, gli utenti possono utilizzare il comando gunzip).
Una volta che i dati di audit sono caricati su S3, la struttura viene preservata nello stesso modo in cui era memorizzata sul server DataSunrise:

Immagine 5. Dati nel Bucket Amazon S3
Uso di AWS Athena per leggere i Dati dell’Archivio di Audit Da S3
Una volta che i dati di audit sono caricati su S3, puoi creare lo schema del Database di Audit nel Servizio AWS Athena per ulteriori analisi. Procedi ad AWS Athena nella Console di Gestione AWS per configurare un Database e oggetti Tabella Esterna per leggere i tuoi dati archiviati.
Creare Tabelle dell’Archivio di Audit in AWS Athena
Gli script SQL presuppongono quanto segue per la clausola LOCATION delle query CREATE EXTERNAL TABLE:
- Il nome del bucket S3 è datasunrise-audit
Il file SQL DDL per le tabelle di Archiviazione Audit AWS Athena è disponibile anche nella distribuzione di DataSunrise con il percorso predefinito /opt/datasunrise/scripts/aws/aws-athena-create-audit-archive-tables.sql.
-- La prossima query crea un database in Athena CREATE DATABASE IF NOT EXISTS datasunrise_audit; --------------------------------------------------------------------- CREATE EXTERNAL TABLE IF NOT EXISTS datasunrise_audit.audit_archive ( operations__id STRING, operations__session_id STRING, operations__begin_time STRING, operations__end_time STRING, operations__type_name STRING, operations__sql_query STRING, operations__exec_count STRING, sessions__user_name STRING, sessions__db_name STRING, sessions__service_name STRING, sessions__os_user STRING, sessions__application STRING, sessions__begin_time STRING, sessions__end_time STRING, connections__client_host_name STRING, connections__client_port STRING, connections__server_port STRING, connections__sniffer_id STRING, connections__proxy_id STRING, connections__db_type_name STRING, connections__client_host STRING, connections__server_host STRING, connections__instance_id STRING, connections__instance_name STRING, operation_rules__rule_id STRING, operation_rules__rule_name STRING, operation_rules__chain STRING, operation_rules__action_type STRING, operation_exec__row_count STRING, operation_exec__error STRING, operation_exec__error_code STRING, operation_exec__error_text STRING, operation_group__query_str STRING, operations__operation_group_id STRING, operations__all_exec_have_err STRING, operations__total_affected_rows STRING, operations__duration STRING, operations__type_id STRING, connections__db_type_id STRING ) PARTITIONED BY ( `year` STRING, `month` STRING, `day` STRING ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ( 'separatorChar' = ',', 'quoteChar' = '\"', 'escapeChar' = '\\' ) LOCATION 's3://datasunrise-audit/audit-archive/' -- path to S3 folder TBLPROPERTIES ('has_encrypted_data'='false', 'skip.header.line.count'='1');
-- La prossima query carica le partizioni per poter interrogarne i dati. MSCK REPAIR TABLE datasunrise_audit.audit_archive; --------------------------------------------------------------------- CREATE EXTERNAL TABLE IF NOT EXISTS datasunrise_audit.sessions ( partition_id STRING, id STRING, connection_id STRING, host_name STRING, user_name STRING, scheme STRING, application STRING, thread_id STRING, process_id STRING, begin_time STRING, end_time STRING, error_str STRING, params STRING, db_name STRING, service_name STRING, os_user STRING, external_user STRING, domain STRING, realm STRING, sql_state STRING ) PARTITIONED BY ( `year` STRING, `month` STRING, `day` STRING ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ( 'separatorChar' = ',', 'quoteChar' = '\"', 'escapeChar' = '\\' ) LOCATION 's3://datasunrise-audit/sessions/' -- path to S3 folder TBLPROPERTIES ('has_encrypted_data'='false','skip.header.line.count'='1');
-- La prossima query carica le partizioni per poter interrogarne i dati. MSCK REPAIR TABLE datasunrise_audit.sessions; --------------------------------------------------------------------- CREATE EXTERNAL TABLE IF NOT EXISTS datasunrise_audit.connections ( partition_id STRING, id STRING, interface_id STRING, client_host STRING, client_port STRING, begin_time STRING, end_time STRING, client_host_name STRING, instance_id STRING, instance_name STRING, proxy_id STRING, sniffer_id STRING, server_host STRING, server_port STRING, db_type_id STRING, db_type_name STRING ) PARTITIONED BY ( `year` STRING, `month` STRING, `day` STRING ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ( 'separatorChar' = ',', 'quoteChar' = '\"', 'escapeChar' = '\\' ) LOCATION 's3://datasunrise-audit/connections/' -- path to S3 folder TBLPROPERTIES ('has_encrypted_data'='false', 'skip.header.line.count'='1');
-- La prossima query carica le partizioni per poter interrogarne i dati. MSCK REPAIR TABLE datasunrise_audit.connections; -------------------------------------------------------------------------------- CREATE EXTERNAL TABLE IF NOT EXISTS datasunrise_audit.operation_sub_query ( operation_sub_query__operation_id STRING, operation_sub_query__session_id STRING, operation_sub_query__type_name STRING, operations__begin_time STRING, operation_sub_query__type_id STRING ) PARTITIONED BY ( `year` STRING, `month` STRING, `day` STRING ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ( 'separatorChar' = ',', 'quoteChar' = '\"', 'escapeChar' = '\\' ) LOCATION 's3://datasunrise-audit/operation-sub-query/' -- path to S3 folder TBLPROPERTIES ('has_encrypted_data'='false', 'skip.header.line.count'='1');
-- La prossima query carica le partizioni per poter interrogarne i dati. MSCK REPAIR TABLE datasunrise_audit.operation_sub_query; --------------------------------------------------------------------- CREATE EXTERNAL TABLE IF NOT EXISTS datasunrise_audit.session_rules ( session_id STRING, rule_id STRING, rule_name STRING, chain STRING, action_type STRING, sessions__begin_time STRING ) PARTITIONED BY ( `year` STRING, `month` STRING, `day` STRING ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ( 'separatorChar' = ',', 'quoteChar' = '\"', 'escapeChar' = '\\' ) LOCATION 's3://datasunrise-audit/session-rules/' -- path to S3 folder TBLPROPERTIES ('has_encrypted_data'='false', 'skip.header.line.count'='1');
-- La prossima query carica le partizioni per poter interrogarne i dati. MSCK REPAIR TABLE datasunrise_audit.session_rules; -------------------------------------------------------------------------------- CREATE EXTERNAL TABLE IF NOT EXISTS datasunrise_audit.col_objects ( operation_id STRING, session_id STRING, obj_id STRING, name STRING, tbl_id STRING, operations__begin_time STRING ) PARTITIONED BY ( `year` STRING, `month` STRING, `day` STRING ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ( 'separatorChar' = ',', 'quoteChar' = '\"', 'escapeChar' = '\\' ) LOCATION 's3://datasunrise-audit/col-objects/' -- path to S3 folder TBLPROPERTIES ('has_encrypted_data'='false', 'skip.header.line.count'='1');
-- La prossima query carica le partizioni per poter interrogarne i dati. MSCK REPAIR TABLE datasunrise_audit.col_objects; --------------------------------------------------------------------- CREATE EXTERNAL TABLE IF NOT EXISTS datasunrise_audit.tbl_objects ( tbl_objects__operation_id STRING, tbl_objects__session_id STRING, tbl_objects__obj_id STRING, tbl_objects__sch_id STRING, tbl_objects__db_id STRING, tbl_objects__tbl_name STRING, tbl_objects__sch_name STRING, tbl_objects__db_name STRING, operations__begin_time STRING ) PARTITIONED BY ( `year` STRING, `month` STRING, `day` STRING ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde' WITH SERDEPROPERTIES ( 'separatorChar' = ',', 'quoteChar' = '\"', 'escapeChar' = '\\' ) LOCATION 's3://datasunrise-audit/tbl-objects/' -- path to S3 folder TBLPROPERTIES ('has_encrypted_data'='false', 'skip.header.line.count'='1'); -- La prossima query carica le partizioni per poter interrogarne i dati. MSCK REPAIR TABLE datasunrise_audit.tbl_objects;
Interroga i dati nella Console di AWS Athena utilizzando query SQL standard:
--esecuzione di SELECT contro la tabella audit_archive con i filtri per anno, mese e giorno SELECT * FROM audit_archive WHERE year = '2024' and month = '05' and day = '16'; --selezionando dati da tabelle multiple attraverso JOIN clause SELECT r.operations__type_name, s.operation_sub_query__type_name, r.operations__sql_query FROM audit_archive AS r JOIN operation_sub_query AS s ON r.operations__id = s.operation_sub_query__operation_id AND r.operations__session_id = s.operation_sub_query__session_id; –-esecuzione di SELECT semplice che interroga tutte le tabelle senza applicare filtri select * from audit_archive;

Immagine 6. Archivio Audit
Conclusione
Un lungo periodo di ritenzione dei dati per dati sensibili come gli eventi auditati può essere una vera sfida e un carico aggiuntivo sul budget per mantenere set di dati grandi all’interno dei file del database. Archivio dei Dati di Audit di DataSunrise fornisce una soluzione efficiente e sicura per mantenere leggibili i dati più vecchi, scaricando lo strato di Memoria del Database e permettendo ai nostri clienti una soluzione resiliente ed economica basata sui Servizi AWS S3 Athena per mantenere i dati vecchi all’interno della propria Organizzazione e accessibili per auditing e conformità.