web-dev-qa-db-ja.com

SQL Server:特定のホスト名またはIPアドレスからのみアクセスできるユーザーを作成する方法

依存している愚かなアプリが1つあり、その中に接続文字列がハードコードされています。

SQL Serverのセキュリティを高めるために、SQLユーザーをアプリ内にハードコーディングされたものと同じにしたいのですが、そのユーザーが特定のホスト(IPアドレス)からのみSQL Serverを使用できるようにしたいと思います。

8
adopilot

そのためにログオントリガーを使用できます。

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

不正なIPから接続しようとすると、エラーが発生します。

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

ログオントリガーは潜在的に悪質であり、インスタンスから全員をロックしてしまう可能性があることを忘れないでください。注意してください!

しかし、あなたは本当にそれをする必要はないと思います。既知のアドレスのリストからの接続を有効にする場合は、ファイアウォールがジョブに最適なツールです。発生する可能性のある最悪の事態は、既知のIPアドレスから接続しているユーザーが間違っていることです。これは、ユーザーが資格情報を慎重に保持している場合はほとんどありません。

また、IPアドレスが偽装される可能性があることを考慮に入れて、追加のセキュリティをどの程度提供するかはわかりません。

6
spaghettidba

次のようにログオントリガーを使用してこれを達成できます

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

トリガーが作成されると、[サーバーオブジェクト]-> [トリガー]タブに表示されます。

私のブログからconnectsql.com

4
aasim.abdullah