2013-08-12 39 views
9

Trong hành trình của tôi để nắm vững các sắc thái của mạo danh người dùng trong Windows, trước tiên tôi gặp phải vấn đề về việc mạo danh cơ sở dữ liệu từ xa (xem this SO question) nhưng cuối cùng tôi đã tìm ra điều đó. Rào cản tiếp theo của tôi là hoàn tác/hủy/hoàn nguyên (chọn động từ yêu thích của bạn) mạo danh.Windows Mạo danh: Một lỗ hổng trong thuốc mỡ

Tôi đã thử một vài thư viện mạo danh khác nhau mà có vẻ đáng tin cậy với tôi:

Kết quả là giống hệt nhau với cả hai thư viện. Các phương pháp hay nhất quyết định sử dụng loại đăng nhập LOGON32_LOGON_NEW_CREDENTIALS (xem API Windows LogonUser function) cho kết nối DB từ xa. Khi tôi làm điều đó ở đây là những gì mẫu mã của tôi sản xuất:

// SCENARIO A 
BEGIN impersonation. 
Local user = MyDomain\MyUser 
DB reports: MyDomain\ImpersonatedUser 
END impersonation. 
Local user = MyDomain\MyUser 
DB reports: MyDomain\ImpersonatedUser << NOT EXPECTED HERE!! 

Cách giải quyết duy nhất mà tôi đã tìm thấy là sử dụng các loại LOGON32_LOGON_INTERACTIVE đăng nhập và sau đó tôi có được điều này:

// SCENARIO B 
BEGIN impersonation. 
Local user = MyDomain\ImpersonatedUser << EXPECTED, BUT NOT WANTED! 
DB reports: MyDomain\ImpersonatedUser 
END impersonation. 
Local user = MyDomain\MyUser 
DB reports: MyDomain\MyUser 

Từ các mô tả ngắn gọn của phương pháp WindowsImpersonationContext.Undo có vẻ như nó đã hoạt động trong Kịch bản A.

Có thể hoàn nguyên bằng cách sử dụng loại đăng nhập LOGON32_LOGON_NEW_CREDENTIALS không?

+0

Đóng và mở lại kết nối với cơ sở dữ liệu. Cơ sở dữ liệu không nhận được thông báo khi bạn thay đổi cấp độ mạo danh. Tôi chỉ có thể đoán rằng trong kịch bản B, trình khách cơ sở dữ liệu tự động thiết lập một kết nối mới. –

+0

Cảm ơn nhận xét, @HarryJohnston; Tôi nên đã nói rằng tôi đã làm, trên thực tế, đóng kết nối SQL và bắt đầu một tươi. –

+0

Có lẽ máy khách cơ sở dữ liệu đang lưu vào bộ nhớ đệm kết nối SQL, hoặc nhiều khả năng là kết nối mạng bên dưới (một đường ống có tên?). Tùy chọn tốt nhất của bạn có lẽ là khởi chạy một tiến trình con (trong ngữ cảnh của mã thông báo mới) để thực hiện kết nối cơ sở dữ liệu giả mạo cho bạn. –

Trả lời

6

Nhờ đầu vào từ Harry Johnston (trong nhận xét gắn liền với câu hỏi) và Phil Harding (trong giao tiếp riêng), tôi đã có thể xác định rằng SQL Server connection pooling là thủ phạm ở đây. Vì việc gộp nhóm được xác định bởi tính duy nhất của chuỗi kết nối, bằng cách thay đổi chuỗi kết nối một chút (ví dụ: đảo ngược thứ tự các tham số bên trong hoặc thậm chí chỉ thêm dấu cách vào cuối), tôi đã quan sát các hành vi mà tôi mong đợi.

===== TEST WITH SAME CONN STRING: True 
BEGIN impersonation 
Local user: MyDomain\msorens 
DB reports: MyDomain\testuser 
END impersonation 
Local user: MyDomain\msorens 
DB reports: MyDomain\testuser <<<<< still impersonating !! 

===== TEST WITH SAME CONN STRING: False 
BEGIN impersonation 
Local user: MyDomain\msorens 
DB reports: MyDomain\testuser 
END impersonation 
Local user: MyDomain\msorens 
DB reports: MyDomain\msorens <<<<< this is what I wanted to get 
+0

Điều gì đó khác phải ở nơi làm việc. Trong chính liên kết mà bạn cung cấp, nó nói "Các kết nối được phân tách thành các nhóm bằng chuỗi kết nối, và theo nhận dạng Windows khi sử dụng bảo mật tích hợp.". Bạn có thể hiển thị một số mã không? –

+1

Giải thích của tôi trong câu lệnh đó là "Windows identity" nghĩa là 'System.Security.Principal.WindowsIdentity.GetCurrent(). Tên' trả về (cái tôi báo cáo là' Local user' trong câu trả lời ở trên). Đó là, khi sử dụng LOGON32_LOGON_NEW_CREDENTIALS nó là _not_ thay đổi nhận dạng cửa sổ và do đó, nhúng trong cùng một hồ bơi. Bạn có đồng ý không? –

+0

Tôi không nghĩ rằng đó là trường hợp, nhưng tôi sẽ làm một số thử nghiệm và tìm hiểu. Thật dễ dàng để xem thông tin đăng nhập trong lược tả SQL. –

5

Tôi đào vào phần bên trong của kết nối tổng hợp và hóa ra thông tin đăng nhập Windows không được coi là một phần của khóa tổng hợp kết nối. Chỉ những thông tin đăng nhập SQL mới được tính đến. Vì vậy, nếu có một kết nối có sẵn đã được mở dưới người dùng A và bạn hiện đang mạo danh người dùng B, nó vẫn sẽ sử dụng nó và SQL sẽ nhìn thấy bạn là người dùng A. Điều ngược lại cũng đúng.

Cách tiếp cận thay đổi chuỗi kết nối một chút cho hai người dùng khác nhau là tốt. Bạn có thể làm điều này nếu bạn có người dùng "bình thường" và sau đó bạn cần mạo danh một số người dùng "cao cấp". Tất nhiên, bạn không muốn một chuỗi khác cho mỗi người dùng ứng dụng của mình - nếu không bạn cũng có thể tắt hoàn toàn việc kết nối tổng hợp.

Khi tinh chỉnh chuỗi kết nối của bạn, bạn có thể xem xét thêm tên người dùng bị mạo danh vào các trường Application Name hoặc Workstation ID. Điều này sẽ có lợi ích khi thiết lập một hồ bơi riêng cho từng người dùng bị mạo danh.

Các vấn đề liên quan