"개체에 대한 SELECT 권한이 거부되었습니다"받기


11

저는 dba가 아닌 프로그래머입니다 ... 나는 위험 할 정도로 충분히 알고 있습니다.

데이터베이스의 db_owner 인 레거시 사용자로 데이터베이스를 상속했습니다. 비즈니스상의 이유로 기존 테이블, 스키마 등에 대한이 사용자의 권한을 조정할 수는 없지만 일부 새 테이블이 작성되고 있으며이 사용자에게만 SELECT 액세스 권한을 갖기를 원합니다.

GRANT로 설정된 SELECT를 제외한 모든 것이 거부되도록이 테이블에 대해이 사용자에 대한 권한이 설정되었습니다.

그러나이 사용자 (dbadmin)가이 테이블 중 하나 (AccountingAudit)에서 SELECT를 수행하려고하면이 오류가 발생합니다.

The SELECT permission was denied on the object 'AccountingAudit', database 'billing', schema 'dbo'.

이 SQL을 실행 하여이 테이블 / 사용자에 대해 어떤 권한이 설정되어 있는지 확인하십시오.

select object_name(major_id) as object,
 user_name(grantee_principal_id) as grantee,
 user_name(grantor_principal_id) as grantor,
 permission_name,
 state_desc
from sys.database_permissions

그리고 이것은 내가 다시 얻는 것입니다.

AccountingAudit dbadmin dbo ALTER   DENY
AccountingAudit dbadmin dbo CONTROL DENY
AccountingAudit dbadmin dbo DELETE  DENY
AccountingAudit dbadmin dbo INSERT  DENY
AccountingAudit dbadmin dbo REFERENCES  DENY
AccountingAudit dbadmin dbo SELECT  GRANT
AccountingAudit dbadmin dbo TAKE OWNERSHIP  DENY
AccountingAudit dbadmin dbo UPDATE  DENY
AccountingAudit dbadmin dbo VIEW DEFINITION DENY
AccountingAudit dbadmin dbo VIEW CHANGE TRACKING    DENY

제대로 작동하는 것 같습니다.

내가 만들고있는 SELECT 호출은 SSMS 내에서 매우 기본적인 SELECT * FROM AccountingAudit입니다. 나는 특별한 sp_executesql이나 그와 비슷한 것을하고 있지 않습니다.

명시 적으로 권한 부여를 시도했습니다.

GRANT SELECT ON [dbo].AccountingAudit TO dbadmin

이것은 효과가 없습니다 (왜 위의 쿼리는 이미 부여되었음을 보여줍니다! ;-)

stackoverflow.com 및 다른 곳을 검색했지만 아직 시도하지 않은 것을 찾을 수 없습니다. 스키마 설정 방법과 관련이 있는지 궁금합니다. (이 시점에서 나는 스키마에 대해 거의 알지 못한다.)

어떤 아이디어? 감사!

답변:


10

나는 확실하지 않지만 팔다리로 나갈 것입니다. 귀하의 문제는 귀하의 DENY CONTROL기록 과 관련이 있다고 생각합니다 . 페이지 절반 아래에 대해 여기 를 참조 하십시오 .

데이터베이스에 대한 CONTROL 권한을 거부하면 데이터베이스에 대한 CONNECT 권한이 내재적으로 거부됩니다. 데이터베이스에 대한 CONTROL 권한이 거부 된 보안 주체는 해당 데이터베이스에 연결할 수 없습니다.

나는 그 예가 데이터베이스를위한 것이라는 것을 알고 있지만 그것을 더 세분화합니다. DENY CONTROL테이블의 A 는 그것에 대한 모든 권한을 거부 합니다 . 이를 REVOKE CONTROL제거하고 문제가 해결되는지 확인하십시오.

그렇다면 사용자를 데이터베이스 역할에 배치하거나 테이블에 대한 명시 적 권한을 거부해야합니다.


1
감사합니다! 처음 실험에서 나는 CONTROL이 거부되지 않으면 SELECT 할 수 있음을 발견했습니다. 그러나 BOL을 읽을 때 사용자에게 테이블을 완전히 제어 할 수 있음을 의미하는 것으로 잘못 해석했습니다. CONTROL을 거부하지 않는 한 여전히 다른 권한 (INSERT, DELETE 등)을 DENY 수준으로 유지하고 원하는 권한 수준을 달성 할 수 있습니다. 감사!
Mason G. Zhwiti

이것은 내 문제를 해결하지는 못했지만 대부분 간과 할 것이라고 생각하는 미묘한 생각입니다. 별도로, Active Directory 그룹을 사용하는 경우 그룹 구성원을 변경 한 경우 repadmin / syncall이 반드시 문제를 해결할 필요는 없으며 서버를 재부팅하면 문제가 해결 된 것으로 나타났습니다. 그래도 슬레지 해머 (sledgehammer) 접근 방식을 덜 찾고 있습니다.
John Zabroski

0
  1. Ken Fisher의 sp_DBPermissions저장 프로 시저를 사용하여 권한을 확인하십시오.

    1. 만들기는 확실히 DENY CONTROL일반적인 이외에 테이블에 적용되지 않습니다 DENY SELECT, DENY INSERT, DENY UPDATE, DENY DELETEDENY REFERENCES.
    2. 는 IF SELECT문이 테이블 반환 함수를 포함하고 있는지 어느 쪽이 만드는 EXECUTE AS OWNER테이블 반환 함수 또는에 GRANT EXECUTE거기에 (없이 DENY EXECUTE!). 이 경우 테이블에서 SELECT 권한이 거부되었다고 말하는 대신 EXECUTE가 거부되었다는 오류 메시지를 자세히 읽으십시오.
  2. 사용자가 AD 사용자 또는 그룹 인 경우 다음 스크립트를 사용하여 사용자를 결정하십시오 login_token.

EXECUTE AS LOGIN = 'EXAMPLEDOMAIN\JOHN.DOE';
SELECT * FROM sys.login_token;
REVERT;
  1. 실제 실행 계획을보십시오. 오류가으로 저장 프로 시저 내에있는 SET NOCOUNT ON;경우 실제 실행 계획은 "행 영향을받는 행"이 제어 할 수 없으므로 SSMS의 메시지 탭을보고주의를 기울이지 않을 수있는 통찰력을 제공합니다.

    1. 트리거 또는 임시 테이블을 찾으십시오.
  2. SQL Server 개체 종속성을 찾기 위해 여러 가지 방법으로 Svetlana Golovko에서 설명한 트릭뿐만 아니라 저장 프로 시저 및 SSMS "개체 종속성보기"로 문을 컴파일 할 수 있습니다.

  3. SQL Server 프로파일 러 보안 이벤트 "감사 스키마 개체 액세스 이벤트"및 "TextData"및 "성공"열을 사용하여 SQL Server가 사용 권한을 평가하는 개체를 추적하십시오. -이 이벤트에 대해 두 개의 행이 생성되는 상황을 보았으며 한 값은 Success = 1이고 다른 값은 Success = 0입니다. 이 시나리오에서 내가 찾은 유일한 해결책은 서버를 재부팅하는 것입니다. 실행해도 repadmin /syncall문제가 해결되지 않았으며 응용 프로그램 (및 연결 풀)을 시작 및 중지하지도 않았습니다.

  4. 로그인에 대한 유효 권한을 결정하십시오.

-- '<domain>\<username>' is a domain user in the group you wish to test
EXECUTE AS LOGIN = '<domain>\<username>';
SELECT * FROM fn_my_permissions('Database.Schema.Table', 'OBJECT');
REVERT;
  1. 사용자가 AD 사용자 또는 그룹에 연결되어 있으면 repadmin /syncallActive Directory에서 변경 한 내용이 도메인 컨트롤러간에 동기화되도록 실행 을 고려 하십시오. -누군가 두 도메인 컨트롤러의 현재 값을 비교할 수있는 좋은 방법을 알고 있다면 알려주십시오.

  2. 전체 시스템의 하드 재부팅을 고려하기 전에 해당 사용자에 대한 모든 활성 연결을 종료하십시오. 그 이유는 사용자가 그룹을 포함하여 DC에서 Windows 토큰을 가져 오기 때문입니다. 사용자가 새 토큰을 얻을 때까지는 일반적으로 로그 오프 한 다음 다시 로그온하여 토큰이 업데이트되지 않습니다.

  3. 시스템을 강제 재부팅합니다. 그것은 나를 위해 일했다. 아직 100 % 확실하지 않은 이유. 가동 중지 시간을 극복 할 수있는 경우에만이 작업을 수행하십시오! 큰 거래가있을 때이 작업을 수행하는 데주의하십시오!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.