依存している愚かなアプリが1つあり、その中に接続文字列がハードコードされています。
SQL Serverのセキュリティを高めるために、SQLユーザーをアプリ内にハードコーディングされたものと同じにしたいのですが、そのユーザーが特定のホスト(IPアドレス)からのみSQL Serverを使用できるようにしたいと思います。
そのためにログオントリガーを使用できます。
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アドレスが偽装される可能性があることを考慮に入れて、追加のセキュリティをどの程度提供するかはわかりません。
次のようにログオントリガーを使用してこれを達成できます
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