Fare in modo che il motore di ricerca interno restituisca risultati conformi alle autorizzazioni locali su un'applicazione Web interna

0

Ho un motore di ricerca ElasticSearch e un'applicazione web interna. Prima di applicare il modello di sicurezza, i risultati di ricerca erano molto veloci. Il modello di sicurezza impedisce ad alcuni utenti di accedere a determinate pagine. Abbiamo 7 "tipi" di pagine.

Il nostro processo è attualmente questo:

  1. Il motore di ricerca interroga tutti i record
  2. Per ogni tipo di risultato, ottengo tutti i recordId di quel tipo dal database a cui l'utente è autorizzato ad accedere. Ciò garantisce che richiami il database solo fino a 7 volte (una volta per tipo)
  3. Faccio un incrocio tra i record a cui l'utente può accedere e la ricerca dei record sta tornando

L'approccio sopra descritto non è abbastanza veloce. Ho una ricerca automatica e ogni query richiede fino a 2 secondi.

Che cosa è un modo tipico per far sì che un motore di ricerca restituisca risultati conformi alla sicurezza? Un altro sviluppatore ha raccomandato di archiviare le autorizzazioni di sicurezza direttamente in ElasticSearch stesso (essenzialmente il mirroring di ciò che ha il nostro server sql).

Modifica: ogni record ha una pagina. Possiamo assumere 200-500 utenti e 25000+ record.

    
posta Brandon 27.08.2014 - 16:16
fonte

3 risposte

1

Se ho capito bene, in precedenza i risultati della ricerca dal motore erano veloci. Ora lo fai, ma in seguito filtri ulteriormente i risultati con un massimo di 7 query DB e filtri intersezione.

Ovviamente, il problema sta nelle query DB o nell'ordinamento e nel filtraggio delle intersezioni!

La prossima domanda è - che è lento? Il DB è un riquadro lento, stai eseguendo il filtraggio una volta per ogni query del DB? Di solito ci sono molti modi per ottimizzare questo tipo di attività, in questo caso i piani di esecuzione sono tuoi amici.

Se il problema è il DB, la cache potrebbe essere una risposta - se le politiche di sicurezza sono relativamente statiche, è possibile recuperare le restrizioni del filtro una volta e salvarle per utente quando l'utente esegue il login. Se il filtro è lento sul DB, quindi prova ad applicare il filtro sul server web, una ricerca hashmap dato che ogni pagina dei risultati originali può essere molto veloce.

    
risposta data 27.08.2014 - 17:36
fonte
1

Non sono del tutto sicuro di averlo capito correttamente, ma penso che puoi ridurre i tuoi 7 accessi al database a 1.

  1. Codifica ogni livello di sicurezza come un bit in un numero intero. Memorizza il livello di sicurezza con ogni record.
  2. Stabilire quali livelli di sicurezza è consentito a un utente di vedere - codificarlo come un intero simile.
    1. Durante la ricerca di record, includere un requisito che AND bit a bit di questi due valori sia diverso da zero.

Se i livelli di sicurezza sono strettamente gerarchici, (ad esempio TOP SECRET, SECRET, RISERVATO, RISERVATO, NON CLASSIFICATO), questo può essere ulteriormente semplificato assegnando TOP SECRET = 4, SECRET = 3, CONFIDENTIAL = 2, RESTRICTED = 1, NON CLASSIFICATO = 0. Memorizza questo con il record come campo security_level

Quindi un utente con autorizzazione RISERVATA può richiedere risultati con security_level <= 2 , ecc.

    
risposta data 27.08.2014 - 23:20
fonte
0

Una pratica che uso per implementare la sicurezza nello scenario di ricerca è come questa. Definire gruppi di utenti e utilizzare questi gruppi per definire l'accesso ai record. Quando si crea l'indice per la ricerca, includere l'accesso per ciascun gruppo nell'indice (in pratica si tratta dell'ACL per il record).

Dovresti quindi avere un repository che memorizza quali utenti sono membri di quali gruppi. Puoi quindi facilmente recuperare le appartenenze ai gruppi per un utente, ad esempio al login.

Al momento della query includeresti solo le appartenenze ai gruppi nella tua query in modo che fosse necessario che almeno uno dei gruppi di cui l'utente è membro.

In pratica il repository con le appartenenze al gruppo tende ad essere più complesso, a causa dell'appartenenza al gruppo ricorsiva.

Per riassumere:

  1. Lavora con i gruppi
  2. Avere un repository di informazioni sulla sicurezza
  3. Indicizza i tuoi ACL
  4. Query con appartenenze ai gruppi di utenti

HTH.

    
risposta data 12.11.2015 - 14:35
fonte

Leggi altre domande sui tag