SQL Server: comment créer un utilisateur avec accès uniquement à partir d'adresses HOSTNAME ou IP spécifiques


8

J'ai une application stupide sur laquelle je me fie, qui contient une chaîne de connexion codée en dur.

Pour augmenter la sécurité de mon serveur SQL, j'aimerais rendre les utilisateurs SQL identiques à une seule application codée en dur, mais je veux autoriser cet utilisateur à utiliser SQL Server uniquement à partir de certains hôtes (adresse IP).

Réponses:


6

Vous pouvez utiliser un déclencheur d'ouverture de session pour cela.

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

Si vous essayez de vous connecter à partir d'une adresse IP non autorisée, vous obtiendrez une erreur:

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

N'oubliez pas que les déclencheurs de connexion sont potentiellement malveillants et peuvent également finir par bloquer tout le monde hors de l'instance. Faites attention!

Cependant, je pense que vous n'avez pas vraiment besoin de faire cela. Si vous souhaitez activer les connexions à partir d'une liste d'adresses connues, un pare-feu est l'outil le plus approprié pour le travail . La pire chose qui puisse arriver est le mauvais utilisateur se connectant à partir d'une adresse IP connue, ce qui est peu probable si les utilisateurs conservent soigneusement leurs informations d'identification.

Tenez également compte du fait que les adresses IP peuvent être usurpées, donc je ne sais pas quel degré de sécurité supplémentaire vous fourniriez.


2
Comme @spaghettidba l'a dit, les déclencheurs de connexion sont potentiellement de très mauvaises nouvelles. Si vous rencontrez des problèmes, lisez ce sqlstudies.com/2014/05/19/escaping-from-a-runaway-logon-trigger . J'ai passé en revue les méthodes permettant de contourner le déclencheur, de le trouver et de le désactiver.
Kenneth Fisher

1
Il peut souhaiter autoriser toute personne autre que l'utilisateur de l'application à se connecter à partir de n'importe quelle adresse, mais l'application ne peut s'exécuter qu'à partir d'un serveur afin que l'utilisateur de l'application ne puisse se connecter qu'à partir de cette adresse. Peu de pare-feu peuvent gérer cela.
Ross Presser

4

Vous pouvez y parvenir en utilisant le déclencheur d'ouverture de session comme suit

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

Une fois le déclencheur créé, vous pouvez le trouver sous Objets serveur -> onglet Déclencheurs

Depuis mon blog connectsql.com

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.