SQL Server: come creare un utente con accesso solo da specifici HOSTNAME o indirizzi IP


8

Ho un'app stupida su cui faccio affidamento, che ha una stringa di connessione codificata all'interno.

Per aumentare la sicurezza del mio SQL Server mi piacerebbe rendere gli utenti SQL uguali a quelli di un'app hardcoded all'interno, ma desidero consentire a quell'utente di poter utilizzare SQL Server solo da un determinato host (indirizzo IP).

Risposte:


6

A tale scopo è possibile utilizzare un trigger di accesso.

CREATE TRIGGER TR_check_ip_address
ON ALL SERVER
FOR LOGON
AS 
BEGIN

    DECLARE @ip_addr varchar(48)

    SELECT @ip_addr = client_net_address
    FROM sys.dm_exec_connections
    WHERE session_id = @@SPID

    IF ORIGINAL_LOGIN() = 'bob' AND @ip_addr <> '127.0.0.1'
        ROLLBACK;

END

Se provi a connetterti da un IP non autorizzato, visualizzerai un errore:

Logon failed for login 'bob' due to trigger execution.

Ricorda che i trigger di accesso sono potenzialmente malvagi e potrebbero anche finire per bloccare tutti fuori dall'istanza. Stai attento!

Tuttavia, penso che non sia necessario farlo. Se si desidera abilitare le connessioni da un elenco di indirizzi noti, un firewall è lo strumento più adatto per il lavoro . La cosa peggiore che potrebbe accadere è l'utente errato che si connette da un indirizzo IP noto, il che è abbastanza improbabile se gli utenti conservano attentamente le proprie credenziali.

Inoltre, tieni presente che gli indirizzi IP possono essere falsificati, quindi non sono sicuro di quale grado di sicurezza aggiuntiva forniresti.


2
Come ha detto @spaghettidba, i trigger di accesso sono potenzialmente una brutta notizia. In caso di problemi, leggere questo sqlstudies.com/2014/05/19/escaping-from-a-runaway-logon-trigger . Ho esaminato i metodi per bypassare il trigger, trovarlo e disabilitarlo.
Kenneth Fisher,

1
Potrebbe voler consentire a chiunque non sia l'utente dell'app di accedere da qualsiasi indirizzo, ma l'applicazione può essere eseguita solo da un server in modo che l'utente dell'app possa accedere solo da quell'indirizzo. Pochi firewall possono gestirlo.
Ross Presser,

4

È possibile ottenere ciò utilizzando il trigger di accesso come segue

USE master
GO
-- Create table to hold valid IP values
CREATE TABLE ValidIPAddress (IP NVARCHAR(15)
CONSTRAINT PK_ValidAddress PRIMARY KEY)

-- Declare local machine as valid one
INSERT INTO ValidIPAddress
SELECT '<local machine>'
-- Create Logon Trigger to stop logins from invalid IPs
CREATE TRIGGER tr_LogOn_CheckIP ON ALL SERVER
    FOR LOGON
AS
    BEGIN
        DECLARE @IPAddress NVARCHAR(50) ;
        SET @IPAddress = EVENTDATA().value('(/EVENT_INSTANCE/ClientHost)[1]',
                                           'NVARCHAR(50)') ;
        IF NOT EXISTS ( SELECT  IP
                        FROM    master..ValidIPAddress
                        WHERE   IP = @IPAddress )
            BEGIN
            -- If login is not a valid one, then undo login process
                SELECT  @IPAddress
                ROLLBACK --Undo login process
            END

    END

Una volta creato il trigger, è possibile trovarlo in Oggetti server -> scheda Trigger

Dal mio blog connectql.com

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.