Come consentire connessioni di database arbitrarie in base alle selezioni dell'utente?

0

Sto scrivendo un'applicazione che consente agli utenti di accedere ai database attraverso la rete. Attualmente l'utente inserisce i dettagli del database in un modulo che viene successivamente utilizzato per stabilire una connessione JDBC. I dettagli che ottengo sono (1) nome host del database, (2) username, (3) password, (4) alcuni altri parametri di configurazione. Oltre a questo, ci sarà una serie di query predefinite che verrebbero eseguite sul database richiesto dall'utente. Genero al volo la stringa di connessione jdbc, creo una connessione ed eseguo la query richiesta. Prima di iniziare a colpire, so che questa non è una buona pratica e molto poco sicura.

Non sono riuscito a trovare alcuna domanda che sia direttamente rilevante. Ho trovato questa risposta che dice ripete il mio pensiero ma non si occupa di questo scenario.

Ecco una spiegazione del problema (caso d'uso):

  1. Un utente con privilegi elevati può fornirmi i dettagli della connessione al database remoto / target che verrebbero crittografati.
  2. L'utente con privilegi regolari o con privilegi bassi non può aggiungere, vedere o modificare questi dettagli
  3. Ci saranno più database target . Il numero non può essere predeterminato.
  4. La logica del mio programma decide a quale DB inviare la query. Le query saranno solo select query.

Un altro potenziale problema è la gestione di più connettori jdbc (considerare oracle, mysql, mssql ecc.)

Quale soluzione proponesti che consente un modo efficace per connettersi a più database con i rispettivi driver jdbc senza compromettere la sicurezza dei database target ? C'è un modo per autenticare le applicazioni web come utilizzare OAuth o certificati?

    
posta Aditya 10.10.2018 - 17:42
fonte

2 risposte

1

Molti database consentono un'estesa personalizzazione del meccanismo di autenticazione. Per essere più specifici, molti hanno l'integrazione LDAP, il che rende le cose molto più semplici per te (o per l'amministratore di sistema), perché non è necessario avere account dedicati nel database e per i tuoi utenti (perché non devono fornire una password separata, sono autenticati automaticamente).

Alcuni database supportano anche l'autenticazione del certificato client TLS ( Oracle è uno di questi ). Tuttavia, non lo consiglierei nel tuo caso, poiché ciò richiederebbe molto lavoro sia all'amministratore di sistema che agli utenti, che dovranno gestire i certificati, non il compito più normale o intuitivo. Scadenza dei certificati da solo è una cosa così ingombrante che dovrebbe scoraggiarvi dal loro utilizzo nella vostra particolare situazione.

I certificati client sono utilizzati meglio in un contesto in cui il database è accessibile da più applicazioni, al contrario degli utenti. Ciascuna di queste applicazioni ha procedure di implementazione specifiche, configurazione personalizzata, chiavi API; qui, avere un certificato aggiuntivo non dovrebbe essere un problema. Anche se è leggermente più difficile da usare rispetto a una chiave API, è anche leggermente più sicuro, il che lo rende una buona alternativa.

    
risposta data 10.10.2018 - 18:48
fonte
1

allow users to access the databases over the network.

Quali database? Qualsiasi database? Altamente insicuro e rischioso.

Uno di un elenco predefinito di database - questo è un punto di partenza della batteria.

(1) database host name, (2) username, (3) password, (4) certain other config parameters.

Perché i tuoi utenti dovrebbero sapere (o cura ) dove è ospitato il loro database? Cosa succede se cambia? Gli utenti non possono improvvisamente accedere ai loro dati perché li hai [legittimamente] spostati altrove (e probabilmente su loro richiesta!).

I generate the jdbc connection string on the fly, create a connection, and run the required query.

E, direi, è assolutamente ragionevole.

Il punto è; quanto deve sapere / fornire l'utente per ottenere quello che vuole?

Dovrebbero selezionare un Database (con qualche descrizione significativa) e la tua Applicazione dovrebbe elaborare tutti gli altri "parametri di configurazione" basati su questo. Aggiungi il loro nome utente e password e hai tutto ciò che ti serve per fare ciò che già fai, ma in modo molto più sicuro. Non possono iniziare ad aprire le connessioni JDBC a qualsiasi vecchio database di cui sono a conoscenza perché non gli si offre la possibilità di sceglierlo.

Considerare inoltre se si desidera creare effettivi account di database per ogni singolo utente in ogni singolo database a cui questa applicazione può accedere. Inoltre, come gestisci le richieste di password scadute / dimenticate? Suggerirei di utilizzare un account "Applicazione" (di cui gli Utenti non sono a conoscenza) che abbia accesso a tutti i database e che gli Utenti siano gestiti all'interno dell'Applicazione stessa.

    
risposta data 11.10.2018 - 14:08
fonte

Leggi altre domande sui tag