Domanda

Ho un database chiamato MyDB in un'istanza espresso Microsoft SQL Server 2008 utilizzando l'autenticazione in modalità mista. L'applicazione utilizza il database attualmente MyDB connette tramite l'autenticazione di Windows, utilizzando le credenziali Windows dell'utente corrente. Questo accesso è un membro del ruolo del server 'pubblico', e ha un utente mappato ad esso nel database MyDB. Questo utente database è un membro dei ruoli di database db_datareader e db_datawriter.

Quello che vorrei è che quando il collega di applicazione, si dispone di autorizzazioni di lettura e scrittura in MyDB. Ma quando un altro collega di applicazioni usando la stessa login, dovrebbe essere consentito solo per leggere.

Il mio pensiero era che avrei creare un trigger di accesso, che controlla la parte del nome dell'applicazione della stringa di connessione, e sulla base di tale decidere se il contesto di esecuzione deve essere acceso. (Per la cronaca, io so che non è in alcun modo sicuro di fare affidamento sul nome dell'applicazione della stringa di connessione, e che è molto facile da aggirare. Lo scopo non è quello di proteggere il database, ma per aiutare gli utenti a evitare di cambiare dati quando questi si collegano utilizzando un'altra applicazione, ad esempio Microsoft Excel)

ho creato un nuovo login chiamato 'myapp_reader' associato a un utente nel database MyDB, che è un membro del db_datareader.

Ho poi cercato di creare un trigger di accesso con il seguente TSQL:

CREATE TRIGGER CheckUser
ON ALL SERVER
AFTER LOGON AS
BEGIN
IF APP_NAME() <> 'My Application Name'
    BEGIN
        EXECUTE AS LOGIN = 'myapp_reader' WITH NO REVERT
    END
END

Ma, purtroppo, non funziona. Quando provo a collegarlo ottengo il seguente errore:

  

Accesso non riuscito per l'accesso 'MyComputer \ MyWindowsUsername' a causa di esecuzione del trigger.
  contesto di database cambiato in 'master'.
  impostazione della lingua Cambiato a us_english. (Microsoft SQL Server, Errore: 17892)

E quando guardo nel log degli errori che dice:

  

Errore: 15590, gravità: 16, stato: 1.
  Può utilizzare solo il 'No Revert' o opzioni 'Cookie' con il 'Esegui come' affermazione a livello ad hoc.
  Errore: 17892, gravità: 20, stato: 1.
  Accesso non riuscito per l'accesso 'MyComputer \ MyWindowsUsername' a causa di esecuzione del trigger. [CLIENT: xxx.xxx.xxx.xxx]

significa questo errore non riesco a modificare in modo permanente il contesto di esecuzione nel trigger di accesso?

È stato utile?

Soluzione

Non credo che la sua possibile cambiare il contesto di esecuzione per l'intera sessione. Si potrebbe creare un trigger DML per INSERT, UPDATE e DELETE per ogni tabella / vista nel database che fa un rollback per un certo APP_NAME (). Si potrebbe scrivere una procedura per automatizzare la creazione di tutti questi grilletto.

In alternativa, se si ha la possibilità di avere applicazioni come Excel connettono tramite un server collegato allora si potrebbe modificare il contesto di esecuzione a questo punto. E creare un trigger di accesso che esegue il rollback della connessione se gli utenti tentano di collegare tramite Excel o altre applicazioni direttamente al server.

Altri suggerimenti

Supponendo di avere il controllo della domanda e può modificarlo, poi ruoli applicazione farà esattamente quello che vuoi. Vedere sp_setapprole nella documentazione in linea per iniziare.

Non si può fare questo in modo che si desidera.

  • Una connessione utente ha le stesse credenziali per tutto tranne che per alcuni specifici ambiti di utilizzo EXECUTE AS.
  • Avete capito che non si può contare su APP_NAME () o HOST_NAME () per rilevare quando si connette qualcuno in modo diverso, il che significa un trigger di rollback per ogni tabella non può contare su non
  • La vostra applicazione si basa su un accesso diretto tabella di scrittura

Alcune opzioni mi viene in mente ...

  • I tuoi usi app stored procedure, gli utenti hanno accesso in lettura solo alle tabelle
  • Usa SET CONTEXT_INFO nella tua app per impostare una chiave "segreta" per il rollback trigger
  • Cambia la tua app per utilizzare un account di servizio / è un servizio di Windows / etc e proxy il nome utente in (come una pagina web farebbe)
  • ... o alcune permutazioni LORO OMISSIONE

Hai davvero bisogno di portare la vostra mente su come organizzare e gestire le credenziali prima.

Se si utilizza sp_setapprole che aggirare l'autenticazione di Windows e consentire l'accesso attraverso quella app per qualsiasi utente. Se questo è ciò che si vuole veramente fare, allora, se l'applicazione è un server di creare account utente per tale applicazione ed eseguirlo con le credenziali di tale utente.

Se è un'applicazione client poi fare un servizio web che solo leggere e inviare i dati particolari che le esigenze di applicazioni ed eseguire tale servizio web con nuovo account. Poi, in IIS7 si può mettere un ACL sul servizio web stesso in modo che sia ancora protetto.

Anche se questa applicazione non è attendibile essere pulito e sapere cosa si sta facendo quindi richiedere che deve essere il codice recensione prima che sia permesso di toccare server SQL. Se è la vostra applicazione quindi avviare fiducia in voi stessi: -)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top