Raccogliere i log del contesto utente di Okta
Questo documento spiega come raccogliere i log del contesto utente di Okta configurando un feed Google Security Operations utilizzando l'API di terze parti.
Prima di iniziare
Assicurati di soddisfare i seguenti prerequisiti:
- Un'istanza Google SecOps
- Accesso privilegiato al tenant o alla console di amministrazione Okta
- Privilegi di creazione dei token API in Okta
Configurare la lista consentita IP
Prima di creare il feed, devi inserire gli intervalli IP di Google SecOps nella lista consentita nelle impostazioni di rete o del firewall di Okta.
Ottenere gli intervalli IP di Google SecOps
- Recupera gli intervalli IP dal file JSON degli intervalli di indirizzi IP di Google.
Aggiungere intervalli IP al contesto utente Okta
- Accedi alla console di amministrazione Okta.
- Vai a Sicurezza > Reti.
- Nella sezione Limitazioni indirizzo IP, fai clic su Modifica.
- Aggiungi ogni intervallo IP di Google SecOps in notazione CIDR agli indirizzi IP attendibili.
- Fai clic su Salva.
Configurare l'accesso all'API User Context di Okta
Per consentire a Google SecOps di estrarre i dati di contesto dell'utente, devi creare un token API con autorizzazioni di lettura.
Crea token API
- Accedi alla console di amministrazione Okta.
- Vai a Sicurezza > API.
- Seleziona la scheda Token.
- Fai clic su Crea token.
- Fornisci i seguenti dettagli di configurazione:
- Nome: inserisci un nome descrittivo (ad esempio,
Google SecOps Integration). - (Facoltativo) Descrizione: inserisci una descrizione.
- Nome: inserisci un nome descrittivo (ad esempio,
- Fai clic su Crea token.
Registra le credenziali API
Dopo aver creato il token API, riceverai le seguenti credenziali:
- Token API: il valore del token API (ad esempio,
00QCGr-1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1)
Autorizzazioni API richieste
Il token API richiede le seguenti autorizzazioni in Okta:
| Autorizzazione/Ruolo | Livello di accesso | Finalità |
|---|---|---|
| Amministratore di sola lettura | Leggi | Accedere ai dati del profilo utente |
| Super amministratore | Leggi | Accesso completo a tutti i dati utente |
Configurare i feed
Per configurare un feed:
- Vai a Impostazioni SIEM > Feed.
- Fai clic su Aggiungi nuovo feed.
- Nella pagina successiva, fai clic su Configura un singolo feed.
- Nel campo Nome feed, inserisci un nome per il feed (ad esempio,
Okta User Context). - Seleziona API di terze parti come Tipo di origine.
- Seleziona Contesto utente Okta come Tipo di log.
- Fai clic su Avanti.
Specifica i valori per i seguenti parametri di input:
Intestazione HTTP di autenticazione: inserisci le credenziali di autenticazione nel seguente formato:
Authorization:SSWS your-api-token- Ad esempio:
Authorization:SSWS 00QCGr-1d1d1d1d1d1d1d1d1d1d1d1d1d1d1d1
- Ad esempio:
Nome host API: il nome di dominio completo della tua istanza Okta (ad es. example.okta.com, non un dominio personalizzato che potrebbe essere configurato).
- Ad esempio:
company.okta.com
- Ad esempio:
Campo di riferimento ID gestore: ID richiesto quando utilizzi un ID non Okta per fare riferimento ai gestori (facoltativo).
Spazio dei nomi dell'asset: lo spazio dei nomi dell'asset.
Etichette di importazione: l'etichetta da applicare agli eventi di questo feed.
Fai clic su Avanti.
Controlla la nuova configurazione del feed nella schermata Finalizza e poi fai clic su Invia.
Dopo la configurazione, il feed inizia a recuperare i log dall'istanza del contesto utente di Okta in ordine cronologico.
Endpoint regionali
Okta utilizza endpoint API diversi in base alla regione della tua organizzazione:
| Regione | URL di base / nome host |
|---|---|
| Stati Uniti (predefinito) | {org-name}.okta.com |
| UE (EMEA) | {org-name}.okta-emea.com |
| APAC | {org-name}.okta.com.au |
| Anteprima (test) | {org-name}.oktapreview.com |
Utilizza il nome host corrispondente alla regione dell'istanza Okta.
Limiti di frequenza delle richieste API
L'API Okta presenta i seguenti limiti di frequenza:
- Limite di frequenza predefinito: 600 richieste al minuto per la maggior parte degli endpoint
- API System Log: 60 richieste al minuto
- Endpoint utente: 600 richieste al minuto
Google SecOps gestisce automaticamente la limitazione di frequenza con backoff esponenziale. Se riscontri problemi, contatta l'assistenza Okta per aumentare i limiti API.
Tabella di mappatura UDM
| Campo log | Mappatura UDM | Logic |
|---|---|---|
activated |
event.idm.entity.entity.labels |
Se activated esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "activated". |
created |
event.idm.entity.entity.labels |
Se created esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "created". |
profile.costCenter |
event.idm.entity.entity.labels |
Se profile.costCenter esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "costCenter". |
profile.Function |
event.idm.entity.entity.labels |
Se profile.Function esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "Function". |
statusChanged |
event.idm.entity.entity.labels |
Se statusChanged esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "statusChanged". |
type.id |
event.idm.entity.entity.labels |
Se type.id esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "type_id". |
profile.location |
event.idm.entity.entity.location.name |
Valore tratto da profile.location. |
profile.AD_ObjectGUID |
event.idm.entity.entity.user.attribute.labels |
Se profile.AD_ObjectGUID esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "AD_ObjectGUID". |
profile.ADpwdLastSet |
event.idm.entity.entity.user.attribute.labels |
Se profile.ADpwdLastSet esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "ADpwdLastSet". |
profile.AFF_Code |
event.idm.entity.entity.user.attribute.labels |
Se profile.AFF_Code esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "AFF_Code". |
profile.Desk_Location_WD |
event.idm.entity.entity.user.attribute.labels |
Se profile.Desk_Location_WD esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "Desk_Location_WD". |
profile.Mailing_Address_WD |
event.idm.entity.entity.user.attribute.labels |
Se profile.Mailing_Address_WD esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "Mailing_Address_WD". |
profile.Manager_UPN |
event.idm.entity.entity.user.attribute.labels |
Se profile.Manager_UPN esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "Manager_UPN". |
profile.PRIVATE_CONF_Profile |
event.idm.entity.entity.user.attribute.labels |
Se profile.PRIVATE_CONF_Profile esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "PRIVATE_CONF_Profile". |
profile.Region_WD |
event.idm.entity.entity.user.attribute.labels |
Se profile.Region_WD esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "Region_WD". |
profile.Subsidiary_Company |
event.idm.entity.entity.user.attribute.labels |
Se profile.Subsidiary_Company esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "Subsidiary_Company". |
profile.Telephone_Work |
event.idm.entity.entity.user.attribute.labels |
Se profile.Telephone_Work esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "Telephone_Work". |
profile.Temp_WD_Primary_Email |
event.idm.entity.entity.user.attribute.labels |
Se profile.Temp_WD_Primary_Email esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "Temp_WD_Primary_Email". |
profile.VMware_WS1_Username |
event.idm.entity.entity.user.attribute.labels |
Se profile.VMware_WS1_Username esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "VMware_WS1_Username". |
profile.Work_Street_Address_WD |
event.idm.entity.entity.user.attribute.labels |
Se profile.Work_Street_Address_WD esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "Work_Street_Address_WD". |
profile.Workato_WD_Primary_Email |
event.idm.entity.entity.user.attribute.labels |
Se profile.Workato_WD_Primary_Email esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "Workato_WD_Primary_Email". |
profile.Workday_ID |
event.idm.entity.entity.user.attribute.labels |
Se profile.Workday_ID esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "Workday_ID". |
profile.Worker_Type_WD |
event.idm.entity.entity.user.attribute.labels |
Se profile.Worker_Type_WD esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "Worker_Type_WD". |
profile.businessUnit |
event.idm.entity.entity.user.attribute.labels |
Se profile.businessUnit esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "businessUnit". |
profile.companyName |
event.idm.entity.entity.user.attribute.labels |
Se profile.companyName esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "companyName". |
profile.contingentSupplierName |
event.idm.entity.entity.user.attribute.labels |
Se profile.contingentSupplierName esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "contingentSupplierName". |
profile.conversationId |
event.idm.entity.entity.user.attribute.labels |
Se profile.conversationId esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "conversationId". |
profile.distinguishedName |
event.idm.entity.entity.user.attribute.labels |
Se profile.distinguishedName esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "distinguishedName". |
profile.division |
event.idm.entity.entity.user.attribute.labels |
Se profile.division esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "divisione". |
profile.emailPrefix |
event.idm.entity.entity.user.attribute.labels |
Se profile.emailPrefix esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "emailPrefix". |
profile.employeeType |
event.idm.entity.entity.user.attribute.labels |
Se profile.employeeType esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "employeeType". |
profile.homePostalAddress |
event.idm.entity.entity.user.attribute.labels |
Se profile.homePostalAddress esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "homePostalAddress". |
profile.isManager |
event.idm.entity.entity.user.attribute.labels |
Se profile.isManager esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "isManager". |
lastLogin |
event.idm.entity.entity.user.attribute.labels |
Se lastLogin esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "lastLogin". |
profile.leaveOfAbsence |
event.idm.entity.entity.user.attribute.labels |
Se profile.leaveOfAbsence esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "leaveOfAbsence". |
profile.managerDn |
event.idm.entity.entity.user.attribute.labels |
Se profile.managerDn esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "managerDn". |
profile.payGroup |
event.idm.entity.entity.user.attribute.labels |
Se profile.payGroup esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "payGroup". |
profile.wdemployeeID |
event.idm.entity.entity.user.attribute.labels |
Se profile.wdemployeeID esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "wdemployeeID". |
profile.zipCode |
event.idm.entity.entity.user.attribute.labels |
Se profile.zipCode esiste, il suo valore viene aggiunto come coppia chiave-valore con la chiave "zipCode". |
profile.userType |
event.idm.entity.entity.user.attribute.roles |
Se profile.userType esiste, il suo valore viene aggiunto a un array di ruoli. |
profile.organization, profile.company |
event.idm.entity.entity.user.company_name |
Valore estratto da profile.organization o profile.company se il primo non è presente. |
profile.department |
event.idm.entity.entity.user.department |
Valore tratto da profile.department. |
profile.email, profile.secondEmail, profile.login |
event.idm.entity.entity.user.email_addresses |
I valori di profile.email, profile.secondEmail e profile.login (se si tratta di un'email e non di un duplicato) vengono uniti in questo campo. |
profile.employeeNumber |
event.idm.entity.entity.user.employee_id |
Valore tratto da profile.employeeNumber. |
profile.firstName, profile.Preferred_First_Name |
event.idm.entity.entity.user.first_name |
Valore estratto da profile.firstName o profile.Preferred_First_Name se il primo non è presente. |
profile.EmployeeWorkGroup |
event.idm.entity.entity.user.group_identifiers |
Valore tratto da profile.EmployeeWorkGroup. |
profile.HireDate, profile.hiredate |
event.idm.entity.entity.user.hire_date |
Il valore viene analizzato da profile.HireDate o profile.hiredate se il primo non è presente. |
profile.lastName, profile.preferred_Last_Name |
event.idm.entity.entity.user.last_name |
Valore estratto da profile.lastName se esiste profile.lastName o profile.preferred_Last_Name. |
lastLogin |
event.idm.entity.entity.user.last_login_time |
Il valore viene analizzato da lastLogin. |
passwordChanged |
event.idm.entity.entity.user.last_password_change_time |
Il valore viene analizzato da passwordChanged. |
profile.manager, profile.managerEmail, profile.managerId |
event.idm.entity.entity.user.managers |
Compilato con un oggetto contenente user_display_name da profile.manager, email_addresses da profile.managerEmail e employee_id da profile.managerId. |
profile.city, profile.firstBaseCity |
event.idm.entity.entity.user.office_address.city |
Valore estratto da profile.city o profile.firstBaseCity se il primo non è presente. |
profile.countryCode, profile.country |
event.idm.entity.entity.user.office_address.country_or_region |
Valore estratto da profile.countryCode o profile.country se il primo non è presente. |
profile.streetAddress |
event.idm.entity.entity.user.personal_address.name |
Valore tratto da profile.streetAddress. |
profile.state |
event.idm.entity.entity.user.personal_address.state |
Valore tratto da profile.state. |
profile.primaryPhone, profile.mobilePhone, profile.mobile |
event.idm.entity.entity.user.phone_numbers |
I valori di profile.primaryPhone, profile.mobilePhone e profile.mobile vengono uniti in questo campo. |
profile.terminationDate, profile.terminationdate |
event.idm.entity.entity.user.termination_date |
Il valore viene analizzato da profile.terminationDate o profile.terminationdate se il primo non è presente. |
profile.title |
event.idm.entity.entity.user.title |
Valore tratto da profile.title. |
status |
event.idm.entity.entity.user.user_authentication_status |
Mappato da status: ACTIVE/RECOVERY/LOCKED_OUT/PASSWORD_EXPIRED -> ACTIVE; SUSPENDED -> SUSPENDED; DEPROVISIONED -> DELETED; altrimenti UNKNOWN_AUTHENTICATION_STATUS. |
profile.displayName |
event.idm.entity.entity.user.user_display_name |
Valore tratto da profile.displayName. |
profile.samAccountName, profile.samaccountname, profile.login, profile.ldapUid |
event.idm.entity.entity.user.userid |
Compilato con precedenza: profile.samAccountName, profile.samaccountname, profile.login (se non è un'email), profile.ldapUid (se profile.login non è un'email). |
event.idm.entity.metadata.entity_type |
Imposta su USER. |
|
id |
event.idm.entity.metadata.product_entity_id |
Valore tratto da id. |
event.idm.entity.metadata.product_name |
Imposta su Identity Cloud. |
|
event.idm.entity.metadata.vendor_name |
Imposta su Okta. |
Hai bisogno di ulteriore assistenza? Ricevi risposte dai membri della community e dai professionisti di Google SecOps.