EXECUTE AS USER와 EXECUTE AS LOGIN의 차이점은 무엇입니까?


10

최근에 EXECUTE AS LOGIN을 사용하여 특정 사람이 데이터베이스 중 하나에서 테이블 함수를 사용할 수 있는지 여부를 확인했습니다. 테스트 결과 그가 할 수는 있지만 실패를 반복해서보고했습니다.

그 사람은 로그인 'WEB'을 사용하여 데이터베이스에 연결하고 로그인 'WEB'과 관련된 해당 데이터베이스에 사용자 'WEB'이 있으므로 다음 스크립트를 시도했습니다.

-- part 1
EXECUTE AS USER = 'WEB'
GO
SELECT 
    USER_NAME() AS 'user_name'
    ,SUSER_NAME() AS 'suser_name'
    ,SUSER_SNAME() AS 'suser_sname'
    ,SYSTEM_USER AS 'system_user'
GO
REVERT
GO

-- part 2
EXECUTE AS LOGIN = 'WEB'
GO
SELECT 
    USER_NAME() AS 'user_name'
    ,SUSER_NAME() AS 'suser_name'
    ,SUSER_SNAME() AS 'suser_sname'
    ,SYSTEM_USER AS 'system_user'
GO
REVERT
GO

첫 번째 부분은 다음과 같은 결과로 좋았습니다.

웹 | 웹 | 웹 | 편물

그러나 두 번째 결과는 약간 혼란 스러웠습니다.

dbo | 웹 | 웹 | 편물

EXECUTE AS USER와 EXECUTE AS LOGIN의 차이점은 무엇입니까? 물론 첫 번째 것은 데이터베이스 수준이고 두 번째는 서버 수준 가장이며, 내가 알고 있고 여기에서 상황을 설명하지는 않습니다.


두 번째는 "실패"하지 않고 로그인에 서버 역할 (sysadmin)이 할당되어 있음을 나타냅니다. 사용자가 요청한 스키마를 확인 했습니까? dbo 기본 스키마가 개발자가 기대했던 것이 아닌 dbo 기본 스키마가 있기 전에. 테이블을 완전히 참조하여 코드에서 더 나은 수정
Stuart Moore

답변:


7

데이터베이스에 명시적인 사용자가 있더라도 sysadmin그룹 의 구성원 은 항상에 매핑 dbo됩니다. 따라서 로그인 WEB이의 멤버 인 것처럼 보이 sysadmin므로 두 번째 경우 USER_NAME()올바르게 반환 dbo됩니다.


확인하고 확인했습니다. 실제로 sysadmin의 멤버였습니다. 이 보고서는 다른 개발자 중 하나에 도달했으며 올바른 솔루션 대신 단순히 로그인 sysadmin 역할을 할당 한 것으로 나타났습니다. 나는 그 일에 대해 생각조차하지 않을 것입니다. 나는 정말로 실망했습니다. 그가 돌아올 때 우리는 진지한 이야기를 할 것입니다. 오늘 새로운 것을 배웠습니다. 감사합니다.
gemisigo

또한 응용 프로그램 (보고서?)에 sysadmin 구성원에 대한 가장 권한이 있음을 의미합니다. 권한 계층 구조에서 이것이 정확히 어떻게 부여되는지 살펴보십시오. 원하는 경우에도 보고서가 다른 sysadmin구성원을 가장 할 수 있으므로보고 응용 프로그램은 사실상 sysadmin입니다. 즉. ia 가능한 권한 상승 공격 경로. 해커 나 직원이 더 많이 사용할 수 있습니다.
Remus Rusanu

repor 앱에 IMPERSONATE 권한이 WEB있고 WEB제거 된 sysadmin경우 도어가 닫힙니다. 그러나 덜 점검 할 가치가 있습니다.
Remus Rusanu

그렇습니다. 우리는 권리에 영향을 미치는 모든 것을 다시 한 번 확인하여이 방법으로 "고정 된"다른 문제가 있는지 확인해야합니다. 지금 매우 행복하지 못했습니다 :( 다시 한 번 감사드립니다, 레무스.
gemisigo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.