SQL Server: cách tạo người dùng chỉ có quyền truy cập từ địa chỉ HOSTNAME hoặc IP cụ thể


8

Tôi có một ứng dụng ngu ngốc mà tôi dựa vào, có chuỗi kết nối được mã hóa cứng bên trong.

Để tăng tính bảo mật cho Máy chủ SQL của tôi, tôi muốn tạo người dùng SQL giống như một mã hóa cứng trong ứng dụng, nhưng tôi muốn cho phép người dùng đó chỉ có thể sử dụng Máy chủ SQL từ một máy chủ nhất định (địa chỉ IP).

Câu trả lời:


6

Bạn có thể sử dụng Trình kích hoạt đăng nhập cho việc đó.

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

Nếu bạn cố gắng kết nối từ một IP trái phép, bạn sẽ gặp lỗi:

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

Hãy nhớ rằng Logon Triggers có khả năng xấu và cuối cùng cũng có thể khóa tất cả mọi người ra khỏi ví dụ. Hãy cẩn thận!

Tuy nhiên, tôi nghĩ bạn không thực sự cần phải làm điều đó. Nếu bạn muốn kích hoạt các kết nối từ danh sách các địa chỉ đã biết, tường lửa là công cụ phù hợp nhất cho công việc . Điều tồi tệ nhất có thể xảy ra là người dùng kết nối sai từ một địa chỉ IP đã biết, điều này khá khó xảy ra nếu người dùng giữ thông tin đăng nhập của họ một cách cẩn thận.

Ngoài ra, hãy tính đến việc các địa chỉ IP có thể bị giả mạo, vì vậy tôi không chắc bạn sẽ cung cấp mức độ bảo mật bổ sung nào.


2
Như @spaghettidba cho biết kích hoạt đăng nhập có khả năng là tin xấu. Nếu bạn gặp rắc rối, hãy đọc sqlstudies.com/2014/05/19/escaping-from-a-runaway-logon-trigger . Tôi đã tìm hiểu các phương pháp bỏ qua trình kích hoạt, tìm nó và vô hiệu hóa nó.
Kenneth Fisher

1
Anh ta có thể muốn cho phép bất kỳ ai khác ngoài người dùng ứng dụng đăng nhập từ bất kỳ địa chỉ nào, nhưng ứng dụng chỉ có thể chạy từ một máy chủ để người dùng ứng dụng chỉ có thể đăng nhập từ địa chỉ đó. Rất ít tường lửa có thể xử lý điều đó.
Ross Presser

4

Bạn có thể đạt được điều này bằng cách sử dụng kích hoạt đăng nhập như sau

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

Khi kích hoạt được tạo, bạn có thể tìm thấy nó trong Đối tượng máy chủ -> tab Kích hoạt

Từ blog của tôi, kết nối

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.