2

혼합 모드 인증을 사용하는 Microsoft SQL Server 2008 Express 인스턴스에 MyDB라는 데이터베이스가 있습니다. 현재 MyDB 데이터베이스를 사용하는 응용 프로그램은 현재 사용자의 Windows 자격 증명을 사용하여 Windows 인증을 사용하여 연결합니다. 이 로그인은 '공용'서버 역할의 구성원이며 사용자가 MyDB 데이터베이스에 매핑되어 있습니다. 이 데이터베이스 사용자는 db_datareader 및 db_datawriter 데이터베이스 역할의 구성원입니다.로그온 트리거 내에서 실행 컨텍스트 전환

응용 프로그램이 연결되면 MyDB에서 읽고 쓸 수있는 권한이 있습니다. 그러나 다른 응용 프로그램이 동일한 로그인을 사용하여 연결하면 읽을 수 있어야합니다.

내 생각에 연결 문자열의 응용 프로그램 이름 부분을 검사하고 실행 컨텍스트를 전환해야하는지 여부를 결정하는 로그온 트리거를 만들 것이라고 생각했습니다. (레코드의 경우 연결 문자열의 응용 프로그램 이름에 의존하는 것이 안전하지 않으며 회피하기가 매우 쉽다는 것을 알고 있습니다. 여기에있는 목적은 데이터베이스를 보호하는 것이 아니라 사용자가 데이터베이스를 보호하지 못하게하는 것입니다.

db_datareader의 구성원 인 MyDB 데이터베이스의 사용자에게 매핑 된 'myapp_reader'라는 새 로그인을 만들었습니다.

CREATE TRIGGER CheckUser 
ON ALL SERVER 
AFTER LOGON AS 
BEGIN 
IF APP_NAME() <> 'My Application Name' 
    BEGIN 
     EXECUTE AS LOGIN = 'myapp_reader' WITH NO REVERT 
    END 
END 

그러나 불행하게도, 그것은 작동하지 않습니다

나는 다음 TSQL로 로그온 트리거를 작성했습니다. 내가 연결하려고하면 나는 다음과 같은 오류 얻을 :

Logon failed for login 'MyComputer\MyWindowsUsername' due to trigger execution.
Changed database context to 'master'.
Changed language setting to us_english. (Microsoft SQL Server, Error: 17892)

을 내가 오류 로그에서 볼 때 그것은 말합니다 :

Error: 15590, Severity: 16, State: 1.
Can only use the 'No Revert' or 'Cookie' options with the 'Execute As' statement at the adhoc level.
Error: 17892, Severity: 20, State: 1.
Logon failed for login 'MyComputer\MyWindowsUsername' due to trigger execution. [CLIENT: xxx.xxx.xxx.xxx]

이 오류는 내가 영구적으로 로그온 트리거의 실행 컨텍스트를 변경할 수 없습니다 의미 하는가 ?

답변

1

전체 세션의 실행 컨텍스트를 변경할 수 있다고 생각하지 않습니다. 특정 app_name()에 대한 롤백을 수행하는 데이터베이스의 모든 테이블/뷰에 대해 INSERT, UPDATE 및 DELETE에 대한 DML 트리거를 만들 수 있습니다. 이러한 모든 트리거 생성을 자동화하는 절차를 작성할 수 있습니다.

또는 연결된 서버를 통해 Excel과 같은 응용 프로그램을 연결할 수있는 옵션이있는 경우이 시점에서 실행 컨텍스트를 변경할 수 있습니다. 사용자가 Excel 또는 다른 응용 프로그램을 통해 서버에 직접 연결하려고하면 연결을 롤백하는 로그온 트리거를 만듭니다.

1

응용 프로그램을 제어하고 수정할 수 있다고 가정하면 응용 프로그램 역할이 원하는대로 정확하게 수행됩니다. 시작하려면 온라인 설명서의 sp_setapprole을 참조하십시오.

+0

음,이 방법을 추구 할 것입니다. 감사! –

0

원하는대로 설정할 수 없습니다.

  • 사용자 연결에는 EXECUTE AS를 사용하는 특정 범위를 제외하고 전체적으로 동일한 자격 증명이 있습니다.
  • APP_NAME() 또는 HOST_NAME()을 사용하여 다른 사람이 다르게 연결했을 때이를 감지 할 수 없다는 것을 알았습니다. 즉 테이블 당 롤백 트리거가 여기에 의존 할 수 없음을 의미합니다.
  • 앱이 직접 테이블 쓰기 액세스

내가 생각할 수있는 몇 가지 옵션은 ...

테이블 만 A는 "비밀"롤백 키
  • 서비스 계정을 사용하도록 응용 프로그램을 변경 트리거 설정 앱에서
  • 사용 SET CONTEXT_INFO에
    • 앱이 저장 발동, 사용자가 읽고 사용합니다 액세스/Windows 서비스/등이며,
    • (할 것이다 웹 페이지로)의 이름을 프록시합니다 ... 또는
  • 0

    therof 일부 순열 당신은 정말 구성하고 관리하는 방법에 대한 생각을 할 필요가 자격 증명을 먼저

    sp_setapprole을 사용하면 Windows 인증을 우회하여 모든 사용자에 대해 해당 응용 프로그램을 통해 액세스 할 수 있습니다. 앱이 서버 인 경우 앱의 사용자 계정을 만들고 해당 사용자의 자격증 명에 따라 앱을 실행하면 앱에서 실제로 원하는 작업을 수행 할 수 있습니다.

    클라이언트 응용 프로그램 인 경우 응용 프로그램에서 필요로하는 특정 데이터를 읽고 보내고 새 계정으로 웹 서비스를 실행하는 웹 서비스를 만듭니다. 그런 다음 IIS7에서 웹 서비스 자체에 ACL을 추가하여 여전히 보호됩니다.

    또한 앱이 깨끗하고 자신이하는 일을 알지 못하는 경우 SQL 서버를 만지기 전에 코드 검토를 요청해야합니다. 자신의 응용 프로그램이라면 자신을 신뢰하십시오 :-)

    관련 문제