2011-01-21 1 views
4

우리 데이터베이스에는 감사 테이블이 있습니다. 이 테이블에 대한 레코드는 트리거를 사용하여 수행됩니다.감사 테이블 변조 방지

현재 사용자가 데이터베이스 서버에 로그온하고 관리 스튜디오에서 테이블을 열고 감사 테이블에서 데이터를 변경할 수 없도록하는 방법은 없습니다.

감사 데이터 변조를 방지하거나 (적어도 감지 할 수있는) 가능한 메커니즘은 무엇입니까?

감사 테이블에 해당 행에 입력 된 값을 기반으로 계산 된 일부 해시를 포함해야하는 하나의 열을 추가하려고합니다. 그러나 트리거를 사용하여 감사가 수행되므로 악의적 인 사용자는 트리거를 열어이 해시가 계산되는 논리를 볼 수 있습니다.

편집 :

충분히 명확하지 않았습니다. 응용 프로그램 사용자는 데이터베이스에 액세스 할 수 없습니다. DB에 대한 적절한 권한을 가진 DB 관리자와 같은 사용자를 언급했습니다. 그래도이 DB 관리자가 로그인하여 감사 테이블에 기질을 떨칠 수있는 권한이있는 경우이 변경을 감지 할 수있는 메커니즘이 필요합니다.

+2

악성 사용자에게 해당 테이블에 대한 쓰기 권한을 부여하지 않는 것은 어떻습니까? 또는 데이터베이스에 테이블을 사용하는 대신 액세스 할 수있는 사람이 거의없는 다른 컴퓨터로 편집증을 보내십시오. – CodesInChaos

+2

특정 로그인에만 해당 테이블에 대한 삽입/업데이트/삭제 권한이 있도록 사용 권한을 제한하면됩니다. – LukeH

+0

관리자는 Windows에 관리자로 로그인하는 등의 방법으로 명시 적 또는 묵시적으로 sysadmin으로 로그인하는 경우에만 Management Studio를 사용하여 사용 권한을 무시할 수 있습니다. 강력한 SQL 보안은 좋은 네트워크 보안 습관에 달려 있습니다. – Bruce

답변

1

"감사 테이블에서 감사"의 종류가되도록 변경 내용 추적을 활성화 할 수 있습니다.

인프라가 적절히 관리되는 경우 사용자에게 sa 권한이없고 Management Studio를 사용하여 해당 Windows 계정으로 로그인하는 데이터베이스를 볼 수 있습니다.이 경우 감사 테이블에서 sa 및 기타 만 보안을 설정할 수 있습니다 관리 계정은 콘텐츠를 변경할 수 있지만 일반 사용자/개발자 계정은 변경할 수 없습니다.

희망이 도움이됩니다.

+0

답장을 보내 주셔서 감사합니다. 좀 더 정확하게 내 질문을 편집했습니다. 물론 일반 응용 프로그램 사용자에게는 DB 액세스 권한이 없습니다. – buhtla

0

설명하는 문제는 시스템 아키텍처에 심각한 문제가 있음을 나타낼 수 있습니다. 일반적으로 사용자는 데이터베이스를 실행하는 시스템에 직접 액세스하지 않아야합니다.

데이터베이스 시스템이 비즈니스 논리 시스템과 분리되어 있고 해당 시스템에만 액세스 할 수있는 아키텍처를 고려할 수 있습니다.

사용자가 클라이언트를 통하지 않고 서버에 액세스하려고 결정한 경우 사용자가 공개하기로 결정한 잘 정의 된 웹 서비스에 도달해야합니다.

사용자가 DB 시스템에 액세스하거나 데이터베이스에 쓸 수있는 계정의 자격 증명을 가질 수있는 이유가 없습니다. 감사 정보를 변조하는 것에 대해 걱정하는 것 같습니다. 악의적 인 사용자가 테이블을 삭제하거나 기능 데이터를 변조하지 못하도록하는 것은 무엇입니까?

+0

안녕하세요, 제 질문을 편집했지만 용어가 명확하지 않았습니다. 우리는 DB와 비즈니스 로직을위한 별도의 기계를 가지고 있습니다. – buhtla

7

SQL 관리자를 통해 데이터베이스에 액세스하는 다른 사람이 내용을 변경하지 못하게 할 수있는 방법이 없습니다. 당신은 그것을 분명히 함부로 만들 수 있습니다.

기본적으로 열쇠가있는 해시 인 HMACs을 사용해야합니다. 불행하게도 이것은 키가 트리거에서 가능하지 않을 수도있는 비밀을 유지할 수 있도록 키 관리를 필요로합니다. 우리는 키 관리를 제공하기 위해 암호화 서비스를 사용하지만 이것은 코드에서 액세스됩니다.

사용자는 내용을 변경하지 않고 레코드를 삭제할 수있는 능력에 대해서 생각해 볼 필요가 있습니다. 우리는 2 개의 HMAC를 만들었습니다. 하나는 레코드의 내용을 사용하여 계산되었고 (레코드를 변경하기 위해), 두 번째 레코드는 현재 레코드 HMAC와 이전 라인의 HMAC를 사용하여 임의의 라인 삭제를 명백히합니다.

그런 다음 처음 또는 마지막 x 레코드를 삭제하는 것에 대해 걱정할 필요가 있습니다. 이를 위해 항상 같은 내용을 가진 예고편 및 머리글 레코드를 사용합니다. 표제가 없으면 표의 맨 위나 맨 아래가 삭제됩니다. 머리글의 결합 된 HMAC는 이전 레코드가 아닌 레코드 다음에 레코드를 사용합니다 (레코드가 없기 때문에).

물론 저장하려는 데이터의 양을 관리하기 위해 이전 레코드를 삭제하려는 경우 삭제 후에 새 헤더 레코드를 추가하는 메커니즘이 필요합니다.

+0

이것은 복잡하지만 거의 총알이없는 개념처럼 보입니다. :). 코드 또는 트리거를 통해 감사를 수행합니까? 나는 당신이 코드에서 감사를하고 있다고 추정한다. 그렇게하면 사용자가 코드에서 감사하는 일부 테이블의 데이터를 변경하지 못하며 감사 테이블에 증거가 남지 않게됩니다. – buhtla

+0

코드에서 감사합니다. 공격자가 서버에서 임의의 코드를 실행할 수 있었고 암호 서비스 등을 액세스하는 방법을 이해 했더라도 서버에서 실행중인 코드 (예 : 코드)에서 변경할 수 없습니다. 감사 테이블. 물론 공격자가 서버에 대한 해당 수준의 액세스 권한을 갖고 있고 시간을 감사 테이블을 어지럽히는 데 사용하면 데이터를 훔칠 수있는 귀중한 기회를 낭비하게됩니다. – Patrick

+0

예, 실제로 :). 답변 주셔서 감사합니다. 매우 도움이되었습니다. – buhtla

2

는 여기에 몇 가지 가능성이 있습니다 :

  • 당신은 예방하거나 시스템 관리자 (SA) 권한을 가진 누군가에 의해 조작 감지 할 수 없습니다. 시스템 관리자를 신뢰할 수 없다면이 특정 관리자보다 더 심각한 문제가있을 것입니다.
  • 도메인 또는 로컬 관리자가 변조를 방지하거나 감지하는 것은 어렵습니다. 이러한 사용자는 SQL Server를 단일 사용자 모드로 다시 시작하고 SQL을 사용하여 sysadmin으로 액세스 할 수 있습니다.
  • 데이터베이스 소유자 (dbo)에 의한 변조를 검색하려면 SQL Server 2008에서 Server Audit을 사용하거나 이전 버전의 SQL Server에서 서버 쪽 SQL Trace을 사용할 수 있습니다.
  • 관련 트리거 및 감사 테이블에 대한 사용 권한을 제한하여 다른 사용자의 변조를 방지 할 수 있습니다. 당신이 염려 사용자가 해당 스키마에 액세스 할 수없는 것을
+0

+1 "이 특정 것보다 나쁜 문제 *"; 오늘 나는 이것에 관해 토론을했습니다. – Dan

0
  1. 분리 한 후 감사의 자신의 스키마에 데이터 및 권한을 설정 같은.

  2. 다른 컴퓨터에있을 수도있는 완전히 다른 데이터베이스를 사용하십시오.

    종종 관계형 데이터베이스에서 감사 데이터를 게시 한 다음 감사 데이터를 감사 저장소에 비동기 적으로 쓰는 데 사용되는 일부 유형의 게시/구독 모델이 있습니다.

    아마도 트리거를 사용하여 감사 데이터를 대기열에 쓸 수 있습니다. 그런 다음 몇 분마다 실행되는 예약 된 작업을 통해 대기열에서 감사 데이터를 가져 와서 감사 저장소에 기록 할 수 있습니다.