Como inspecionar as configurações de segurança de um ponto de extremidade do SQL Server?

10

Estou no processo de criação de um ambiente de TESTE para nossa equipe de desenvolvimento do SQL Server.

Na produção, temos 3 SQL Servers, SQL01contém vários bancos de dados espelhados SQL02. SQL03atua como testemunha em uma "alta segurança com failover automático" ou configuração síncrona.

Usei o VMWare P2V para virtualizar todas as três máquinas em hardware separado, reconfigurando os SIDs das máquinas e perfurando os endereços IP de nossos servidores de produção a partir dessas novas máquinas.

Eu havia me esquecido de perfurar a máquina testemunha de produção, de modo que os bancos de dados nas máquinas TEST ainda estavam usando a SQL03máquina como testemunha. Percebendo o problema, decidi reconfigurar os bancos de dados no TEST para apontar para a testemunha TEST recentemente virtualizada, chame-o TEST03.

Para reconfigurar o banco de dados para usar a nova testemunha, digitei o seguinte comando no servidor Principal TEST01:

ALTER DATABASE [TestDB] SET WITNESS = 'TCP://TEST03.domain.inet:5022';

A resposta foi inesperada:

The ALTER DATABASE command could not be sent to the remote server instance
'TCP://TEST03.domain.inet:5022'.  The database mirroring configuration was
not changed.  Verify that the server is connected, and try again.

Fiquei muito perplexo com essa mensagem de erro, pois a configuração funciona nas máquinas de produção e não foi modificada de nenhuma maneira nas máquinas de teste.

Para que isso funcionasse, eu precisava criar uma LOGINtestemunha no teste:

CREATE LOGIN [DOMAIN\SQLServiceAccount] FOR WINDOWS WITH DEFAULT_DATABASE [Master];

e GRANTele CONNECTdireitos sobre o desfecho em questão:

GRANT CONNECT ON ENDPOINT::Mirroring TO [DOMAIN\SQLServiceAccount];

Consegui apontar com êxito os bancos de dados espelhados no ambiente TEST para a nova testemunha de teste.

Como posso inspecionar o terminal de testemunha de produção para ver qual segurança está associada a ele?

Suponho que deve haver algum catálogo do sistema que eu possa inspecionar, no entanto, o Books-on-Line não parece ter nada específico para os Endpoints, e o Bing está bem, o Bingless ...


Informação adicional:

SELECT ep.endpoint_id, p.class_desc, p.permission_name, ep.name, sp.name 
FROM sys.server_permissions p
    INNER JOIN sys.endpoints ep ON p.major_id = ep.endpoint_id
    INNER JOIN sys.server_principals sp ON p.grantee_principal_id = sp.principal_id
WHERE class = '105';

retorna:

endpoint_id class_desc  permission_name endpoint_name   principal_name
2           ENDPOINT    CONNECT TSQL    Local Machine   public
3           ENDPOINT    CONNECT TSQL    Named Pipes     public
4           ENDPOINT    CONNECT TSQL    Default TCP     public
5           ENDPOINT    CONNECT TSQL    Default VIA     public

E:

SELECT name, endpoint_id, protocol_desc, type_desc, role_desc 
FROM sys.database_mirroring_endpoints;

Devoluções:

name        endpoint_id  protocol_desc  type_desc           role_desc 
Mirroring   65536        TCP            DATABASE_MIRRORING  WITNESS

Parece não haver entrada sys.server_permissionspara o objeto do ponto final de espelhamento. Nenhum major_ide nenhum minor_idcorresponde a 65536. Além disso, nenhum banco de dados do sistema contém qualquer referência ao terminal.

Estou perdida.

Max Vernon
fonte

Respostas:

7

Depois de passar uma parte do dia lidando com a transferência de bancos de dados espelhados de servidor para servidor em nosso ambiente DEV, em preparação para a mudança para o SQL Server 2012, deparei-me com este documento do MSDN que explica que a segurança ENDPOINT é determinada exclusivamente com base no tipo de conta O SQL Server está sendo executado em. Se o SQL Server estiver usando uma conta de domínio, essa conta terá acesso automaticamente ao terminal. Se o SQL Server estiver usando uma conta interna, como [Serviço de Rede] ou [Sistema Local] etc., o ponto de extremidade deverá ser configurado com um certificado de segurança, e somente os titulares do certificado poderão acessar o ponto de extremidade.

A seção relevante do documento:

Determinando o tipo de autenticação para um ponto de extremidade de espelhamento de banco de dados

É importante entender que as contas de serviço do SQL Server das instâncias do servidor determinam que tipo de autenticação você pode usar para os pontos de extremidade de espelhamento de banco de dados, da seguinte maneira:

Se todas as instâncias do servidor estiverem sendo executadas em uma conta de serviço de domínio, você poderá usar a Autenticação do Windows para os pontos de extremidade de espelhamento de banco de dados. Se todas as instâncias do servidor forem executadas com a mesma conta de usuário do domínio, os logins corretos do usuário existirão automaticamente nos dois bancos de dados principais. Isso simplifica a configuração de segurança dos bancos de dados de disponibilidade e é recomendado.

Se alguma instância do servidor que hospeda as réplicas de disponibilidade para um grupo de disponibilidade for executada como contas diferentes, o logon em cada conta deverá ser criado no mestre na outra instância do servidor. Em seguida, esse logon deve ter permissões CONNECT para conectar-se ao terminal de espelhamento de banco de dados dessa instância do servidor.

Se as instâncias do servidor usarem a Autenticação do Windows, você poderá criar pontos de extremidade de espelhamento de banco de dados usando Transact-SQL, PowerShell ou o Assistente para Novo Grupo de Disponibilidade.

Nota:

Se uma instância do servidor que hospeda uma réplica de disponibilidade não possui um ponto de extremidade de espelhamento de banco de dados, o Assistente para Novo Grupo de Disponibilidade pode criar automaticamente um ponto de extremidade de espelhamento de banco de dados que usa a Autenticação do Windows.

Se alguma instância do servidor estiver sendo executada em uma conta interna, como Sistema Local, Serviço Local ou Serviço de Rede ou uma conta que não seja de domínio, você deverá usar certificados para autenticação do terminal. Se você estiver usando certificados para os pontos de extremidade de espelhamento de banco de dados, o administrador do sistema deverá configurar cada instância do servidor para usar certificados nas conexões de saída e de entrada.

Não há método automatizado para configurar a segurança do espelhamento de banco de dados usando certificados. Você precisará usar a instrução CREATE ENDPOINT Transact-SQL ou o cmdlet New-SqlHadrEndpoint PowerShell. Para obter mais informações, consulte CREATE ENDPOINT (Transact-SQL).

Remus Rusanu (em sua resposta) identificou corretamente como determinar a segurança em vigor em um endpoint de espelhamento; como em:

SELECT ep.name, sp2.name AS Grantee, sp.name AS Grantor, p.permission_name, ep.state_desc
FROM sys.server_permissions p 
    INNER JOIN sys.endpoints ep ON p.major_id = ep.endpoint_id
    INNER JOIN sys.server_principals sp ON p.grantor_principal_id = sp.principal_id
    INNER JOIN sys.server_principals sp2 ON p.grantee_principal_id = sp2.principal_id
WHERE p.class_desc = 'ENDPOINT' AND ep.type_desc = 'DATABASE_MIRRORING'

No entanto, no meu caso no SQL Server 2005, os pontos de extremidade de espelhamento originais não aparecem nos resultados desta consulta - presumo que isso ocorra porque a segurança padrão permite que o CONNECT acesse a conta em que o SQL Server está sendo executado (conforme explicado acima).

Portanto, a resposta canônica da pergunta, como você sabe quem tem acesso CONNECT a um ENDPOINT, é a soma da consulta acima e a conta que o SQL Server está usando, juntamente com todos os certificados possíveis que você configurou com acesso ao terminal .

Max Vernon
fonte
4

Por acaso, eu configurei isso para um banco de dados em produção e fiquei pensando a mesma coisa, porque eu precisava comparar a configuração com outra sessão de espelhamento para garantir que eu correspondesse corretamente.

sys.dm_db_mirroring_connectionsdeve fornecer a você o que você deseja. Ele contém o principal_nameque é:

Nome do logon que foi validado para permissões de conexão. Para autenticação do Windows, esse valor é o nome de usuário remoto. Para autenticação de certificado, esse valor é o proprietário do certificado.

Se você estiver trabalhando com uma sessão em pausa, embora eu não tenha certeza de que isso ainda retornaria as informações, acredite que ele tenha apenas conexões ativas.


fonte
Obrigado, Shaun. Isso certamente mostra o nome do usuário remoto realmente conectado ao nó de extremidade, no entanto, ele realmente não responde à pergunta sobre qual configuração de segurança está permitindo que o usuário se conecte na produção, mas não no teste. Agradeço a ajuda de qualquer maneira!
Max Vernon
3

Consulte a documentação do Books Online para sys.database_mirroring_endpoints

Para permissões de objeto de servidor, você olha para o local usual sys.server_permissions,. Como em todos os casos em que a segurança do Windows está envolvida, as coisas ficam mais complicadas devido à associação aos grupos do Windows, e você também precisa considerar a hierarquia de permissões .

Remus Rusanu
fonte
Eu olhei para isso, no entanto, o que eu preciso é de uma lista de logons que tenham acesso CONNECT ao terminal. sys.database_mirroring_endpoints não parece mostrar isso - a menos que esteja faltando alguma coisa!
Max Vernon
11
Para permissões de objeto de servidor, você olha para o local usual sys.server_permissions,. Como em todos os casos em que a segurança do Windows está envolvida, as coisas são mais complicadas devido à associação aos grupos do Windows, e você também deve considerar a hierarquia de permissões .
Remus Rusanu 29/11
3
Alguma chance de você elaborar um pouco isso na própria resposta?
jcolebrand