Service Broker 대화 보안
대화 보안은 특정 대화에 대한 암호화, 원격 인증 및 원격 권한 부여를 제공합니다. 대화에서 대화 보안을 사용할 경우 Service Broker는 SQL Server 인스턴스 외부로 보낸 모든 메시지를 암호화합니다. Service Broker 대화에서는 기본적으로 대화 보안을 사용합니다.
대화 보안 기본 사항
Service Broker 대화 보안을 사용하면 응용 프로그램이 개별 대화에 대한 인증, 권한 부여 또는 암호화를 사용할 수 있습니다. 기본적으로 모든 대화에는 대화 보안이 사용됩니다. 대화를 시작할 때 BEGIN DIALOG CONVERSATION 문에 ENCRYPTION = OFF 절을 포함하여 대화 보안 없이도 대화가 진행될 수 있도록 명시적으로 허용할 수 있습니다. 그러나 대화의 대상이 되는 서비스에 원격 서비스 바인딩이 존재하면 ENCRYPTION = OFF인 경우에도 대화에 보안이 사용됩니다.
보안을 사용하는 대화의 경우 Service Broker는 SQL Server 인스턴스 외부로 보낸 모든 메시지를 암호화합니다. SQL Server 인스턴스 내에 남아 있는 메시지는 암호화되지 않습니다. 대화 보안에서는 시작 서비스를 호스팅하는 데이터베이스와 대상 서비스를 호스팅하는 데이터베이스만이 보안에 사용되는 인증서에 액세스할 수 있어야 합니다. 즉, 메시지 전달을 수행하는 인스턴스는 인스턴스가 전달하는 메시지 암호를 해독할 수 있는 기능이 없어도 됩니다.
Service Broker는 높은 수준의 보안과 익명 보안의 두 가지 대화 보안 유형을 제공합니다. 대화 보안을 사용하는 대화의 경우 Service Broker는 대화의 원격 측을 로컬 사용자에 매핑할 수 있는 원격 권한 부여를 제공합니다.
대화에 높은 수준의 보안이나 익명 보안이 사용되면 네트워크에서 메시지가 암호화됩니다. 그러나 대상 데이터베이스에서 유효한 권한과 메시지 암호화에 사용되는 전략은 두 가지 방법 간에 약간의 차이가 있습니다.
대화에 높은 수준의 보안이 사용되는지 익명 보안이 사용되는지에 관계없이 메시지 본문은 특정 대화에 대해 생성되는 대칭 세션 키로 암호화됩니다. 대화 보안용으로 제공된 인증서를 사용하는 개인 키 암호화는 키에만 수행됩니다. Service Broker는 메시지 손상이나 변조와 같은 문제 검색을 돕기 위한 메시지 무결성 검사도 수행합니다.
SQL Server는 대화 보안을 사용하는 대화에 대한 세션 키를 만듭니다. 세션 키가 데이터베이스에 저장되는 동안 세션 키를 보호하기 위해 Service Broker는 데이터베이스의 마스터 키를 사용하여 세션 키를 암호화합니다. 데이터베이스 마스터 키를 사용할 수 없으면 데이터베이스 마스터 키가 생성되거나 대화의 시간이 초과될 때까지 대화에 대한 메시지는 오류가 발생한 상태로 transmission_status에 남아 있습니다. 그러므로 대화에 참가하는 두 데이터베이스가 동일한 인스턴스에서 호스팅되는 경우라도 두 데이터베이스 모두에 마스터 키가 있어야 합니다. 시작 데이터베이스에 마스터 키가 없으면 대화가 실패합니다. 대상 데이터베이스에 마스터 키가 없으면 메시지는 시작 데이터베이스의 전송 큐에 그대로 남습니다. 이러한 메시지에 대한 마지막 전송 오류는 메시지를 배달하지 못한 원인을 보여 줍니다. ENCRYPTION = OFF 매개 변수를 사용하여 암호화되지 않은 대화를 만들거나 다음 명령을 사용하여 데이터베이스 마스터 키를 만드십시오.
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>'
편의상 Service Broker는 데이터베이스에 마스터 키가 있는지와 관계없이 단일 데이터베이스 내에 남아 있는 보안 대화를 진행할 수 있도록 합니다. 대화의 유효 기간 동안 두 가지 데이터베이스가 서로 다른 SQL Server 인스턴스로 이동될 수 있지만 단일 데이터베이스 내의 대화는 항상 해당 데이터베이스 내에 남아 있기 때문에 대화가 진행될 수 있습니다.
높은 수준의 보안
높은 수준의 보안은 시작 서비스에서 트러스트되지 않은 데이터베이스로 메시지를 보내지 못하도록 하며 대상 서비스가 트러스트되지 않은 데이터베이스로부터 메시지를 수신하지 않도록 합니다. Service Broker는 대화에서 높은 수준의 보안을 사용할 경우 네트워크에서 전송되는 메시지를 암호화합니다.
높은 수준의 보안은 시작 서비스와 대상 서비스 모두에 대한 식별을 제공합니다. 높은 수준의 보안에서는 시작 서비스가 대상 서비스를 트러스트해야 하며 대상 서비스도 시작 서비스를 트러스트해야 합니다. 예를 들어 공급업체로부터 부품을 주문하는 서비스의 경우 주문 응용 프로그램이 공급업체 서비스를 트러스트해야 하며 공급업체 서비스는 주문 응용 프로그램을 트러스트해야 합니다.
데이터베이스 관리자는 공개 키가 포함된 인증서를 교환하여 트러스트를 설정합니다. 높은 수준의 대화 보안에서는 대화의 양측에 로컬 사용자에 대한 개인 키와 원격 사용자에 대한 공개 키가 각각 포함됩니다. 시작 서비스를 호스팅하는 데이터베이스에는 원격 서비스 바인딩이 포함됩니다. 이 원격 서비스 바인딩은 원격 데이터베이스의 개인 키에 해당하는 인증서를 소유한 로컬 사용자를 지정합니다. 따라서 시작 서비스를 대신하여 수행되는 작업은 대상 데이터베이스에서 지정된 사용자로 실행됩니다.
대상 데이터베이스에는 사용자가 포함되어 있습니다. 이 사용자는 시작 서비스를 소유하는 사용자가 소유한 개인 키에 해당하는 인증서를 소유합니다. 따라서 대상 서비스를 대신하여 수행되는 작업은 시작 데이터베이스에서 시작 서비스를 소유하는 사용자로 실행됩니다.
높은 수준의 보안을 사용하는 대화의 경우 대화의 양측에서 세션 키를 각각 생성합니다. 각 방향의 첫 번째 메시지에는 인증서 및 Service Broker에 설명된 대로 키 교환 키로 암호화된 세션 키가 있습니다.
익명 보안
익명 보안은 시작 서비스에서 트러스트되지 않은 데이터베이스로 메시지를 보내지 못하도록 합니다. Service Broker는 대화에서 익명 보안을 사용할 경우 네트워크에서 전송되는 메시지를 암호화합니다.
익명 보안은 시작 서비스에 대해 대상 서비스를 식별하지만 대상 서비스에 대해 시작 서비스를 식별하지는 않습니다.
예를 들어 작업 주문을 전송하는 응용 프로그램은 작업 주문을 받는 사람이 원하는 대상이 확실함을 보장해야 하지만, 대상 데이터베이스는 작업 주문을 전송하는 서비스에 어떤 특별한 권한도 제공할 필요가 없습니다. 이 경우 시작 서비스가 포함된 데이터베이스에는 대상 서비스에 대한 원격 서비스 바인딩이 포함되어야 합니다.
대상 서비스는 시작 서비스의 ID를 확인할 수 없으므로 시작 서비스를 대신하여 수행되는 작업은 대상 데이터베이스에서 고정 데이터베이스 역할 public의 멤버로 실행됩니다. 대상 데이터베이스는 대화를 시작한 사용자에 대한 정보를 받지 않습니다. 대상 데이터베이스에는 대화를 시작하는 사용자에 대한 인증서가 없어도 됩니다.
익명 보안을 사용하는 대화의 경우 대화의 양측이 시작 데이터베이스가 생성한 세션 키를 사용합니다. 대상 데이터베이스는 시작 데이터베이스에 세션 키를 반환하지 않습니다.
대화 보안에 대한 보안 컨텍스트
Service Broker 원격 권한 부여는 개별 서비스에 대한 원격 액세스를 제어합니다. 원격 권한 부여는 SQL Server 인스턴스에 들어오는 메시지가 서비스로 전달되는 보안 컨텍스트를 결정합니다.
Service Broker는 전적으로 SQL Server 인스턴스 내에서 실행되지 않는 보안 대화에 대해 항상 원격 권한 부여를 사용합니다. 대화에 대해 구성된 대화 보안에 따라 Service Broker가 원격 권한 부여에 사용하는 보안 컨텍스트가 결정됩니다.
Service Broker는 대화가 SQL Server 인스턴스 내에 남아 있을 때 원격 권한 부여가 구성되었더라도 원격 권한 부여를 사용하지 않습니다. 인스턴스 내 대화의 경우 SQL Server 보안 주체가 이미 SQL Server에 대해 사용 가능한 상태이므로 원격 권한 부여를 사용하여 Service Broker 작업의 올바른 보안 컨텍스트를 결정할 필요가 없습니다. 그러나 이 항목의 앞부분에서 설명한 바와 같이 Service Broker는 대화 도중 데이터베이스 중 하나가 다른 인스턴스로 이동되더라도 대화가 진행될 수 있도록 세션 키를 만듭니다.
익명 보안을 사용하는 대화의 경우 대상 데이터베이스에서 고정 데이터베이스 역할 public의 멤버로 연결이 실행됩니다. 이 경우 고정 데이터베이스 역할 public에는 서비스에 메시지를 보낼 수 있는 권한이 있어야 합니다. 그러나 이 역할에 데이터베이스의 다른 권한은 필요하지 않습니다.
높은 수준의 보안을 사용하는 대화의 경우 원격 서비스 바인딩에 지정된 사용자의 권한으로 대화의 양측에서 연결이 작동합니다. 예를 들어 원격 서비스 바인딩이 서비스 이름 InventoryService를 InventoryServiceRemoteUser 사용자와 연결하면 SQL Server는 InventoryServiceRemoteUser에 대한 보안 컨텍스트를 사용하여 InventoryService 응용 프로그램에 대한 메시지를 대상 서비스의 큐에 넣습니다.
보안 향상을 위해 서비스에 대한 개인 키를 소유하는 사용자는 일반적으로 활성화를 위해 지정된 사용자와는 다른 사용자가 됩니다. 개인 키를 소유한 사용자는 큐에 메시지를 추가할 수 있는 권한, 즉 큐를 사용하는 서비스에 대한 SEND 권한만 필요합니다. 반면에 활성화를 위해 지정된 사용자는 요청한 작업을 수행하고 응답을 보내는 데 필요한 권한을 갖습니다. 위 예에서 InventoryServiceRemoteUser는 재고 테이블을 쿼리하거나 반환 메시지를 보낼 수 있는 권한이 필요하지 않습니다. 이 사용자는 InventoryService가 사용하는 큐에 메시지를 보낼 수 있는 권한만 필요합니다. 저장 프로시저 활성화는 큐에서 지정하는 자격 증명으로 다른 세션에서 발생합니다. 메시지를 큐에 저장하는 세션과 메시지를 처리하는 세션 간에 자격 증명을 공유할 필요는 없습니다.
보안 대화 만들기
Service Broker에서 두 데이터베이스 사이의 대화를 설정하는 경우 시작 서비스는 대상 큐에 메시지를 추가할 수 있도록 대상 데이터베이스에 사용자 컨텍스트를 설정해야 합니다. 이러한 사용자 컨텍스트는 시작 서비스에 대상에 대한 대화를 열 권한이 있는지 여부를 확인합니다.
이러한 작업을 수행하는 가장 유연한 방법은 인증서 및 원격 서비스 바인딩을 만드는 것입니다. 인증서를 만드는 방법은 CREATE CERTIFICATE(Transact-SQL)를 참조하십시오. 원격 서비스 바인딩을 만드는 방법은 CREATE REMOTE SERVICE BINDING(Transact-SQL)을 참조하십시오.
인증서 및 원격 서비스 바인딩을 만드는 다른 방법은 SQL Server 보안을 사용하여 두 데이터베이스 사이에 트러스트 관계를 설정하는 것입니다. 그러면 시작 서비스의 소유자가 대상 서비스의 사용자를 가장합니다. 이를 위해 시작 데이터베이스의 TRUSTWORTHY 데이터베이스 속성을 ON으로 설정하고 대상 데이터베이스의 사용자에게 인증 권한을 부여해야 할 수 있습니다. 자세한 내용은 EXECUTE AS를 사용하여 데이터베이스 가장 확장을 참조하십시오.
[!참고]
보안 컨텍스트를 제대로 설정하지 않으면 대화를 통해 전송된 메시지가 시작 서비스의 sys.transmission_queue에 머무르게 되며 transmission_status 열에 "현재 보안 컨텍스트로는 서버 보안 주체 '%.*ls'이(가) 데이터베이스 '%.*ls'에 액세스할 수 없습니다"라는 오류 메시지가 표시됩니다.