Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Banco de Dados SQL do Azure
Instância Gerenciada SQL do Azure
Este tutorial ilustra a assinatura de procedimentos armazenados usando um certificado gerado pelo SQL Server.
Observação
Para executar o código deste tutorial, deve ter tanto a segurança em Modo Misto configurada como a AdventureWorks2025 base de dados instalada.
Assinar procedimentos armazenados usando um certificado é útil quando se quer exigir permissões sobre o procedimento armazenado, mas não se pretende conceder explicitamente esses direitos a um utilizador. Embora possa realizar esta tarefa de outras formas, como usando a instrução EXECUTE AS, usar um certificado permite-lhe usar um rastreio para encontrar o chamador original do procedimento armazenado. Isto proporciona um elevado nível de auditoria, especialmente durante operações de segurança ou de Linguagem de Definição de Dados (DDL).
Pode criar um certificado na base de dados mestre para permitir permissões ao nível do servidor, ou pode criar um certificado em qualquer base de dados de utilizador para permitir permissões ao nível da base de dados. Neste cenário, um utilizador sem direitos sobre tabelas base deve aceder a um procedimento armazenado na AdventureWorks2025 base de dados, e deve auditar o trilho de acesso ao objeto. Em vez de usar outros métodos de cadeia de propriedade, irá criar uma conta de utilizador de servidor e base de dados sem direitos sobre os objetos base, e uma conta de utilizador de base de dados com direitos sobre uma tabela e um procedimento armazenado. Tanto o procedimento armazenado como a segunda conta de utilizador da base de dados serão protegidos com um certificado. A segunda conta de base de dados terá acesso a todos os objetos e concederá acesso ao procedimento armazenado à primeira conta de utilizador da base de dados.
Neste cenário, irá primeiro criar um certificado de base de dados, um procedimento armazenado e um utilizador, e depois testará o processo seguindo estes passos:
Cada bloco de código neste exemplo é explicado em linha. Para copiar o exemplo completo, veja Exemplo Completo no final deste tutorial.
Pré-requisitos
Para concluir este tutorial, você precisa do SQL Server Management Studio, acesso a um servidor que esteja executando o SQL Server e um banco de dados AdventureWorks.
- Instale o SQL Server Management Studio.
- Instale SQL Server 2017 Developer Edition.
- Baixe os bancos de dados de exemplo do AdventureWorks .
Para instruções sobre como restaurar uma base de dados no SQL Server Management Studio, consulte Restaurar uma base de dados.
1. Configurar o Ambiente
Para definir o contexto inicial do exemplo, no SQL Server Management Studio abre uma nova Consulta e executa o código seguinte para abrir a AdventureWorks2025 base de dados. Este código altera o contexto da base de dados para AdventureWorks2025 e cria um novo login do servidor e uma conta de utilizador da base de dados (TestCreditRatingUser), usando uma palavra-passe.
USE AdventureWorks2022;
GO
-- Set up a login for the test user
CREATE LOGIN TestCreditRatingUser
WITH PASSWORD = 'ASDECd2439587y'
GO
CREATE USER TestCreditRatingUser
FOR LOGIN TestCreditRatingUser;
GO
Para mais informações sobre a instrução CRIAR UTILIZADOR, consulte CRIAR UTILIZADOR (Transact-SQL). Para mais informações sobre a instrução CRIAR LOGIN, consulte CRIAR LOGIN (Transact-SQL).
2. Criar um certificado
Pode criar certificados no servidor usando a base de dados mestre como contexto, usando uma base de dados de utilizadores, ou ambos. Existem várias opções para obter o certificado. Para mais informações sobre certificados, consulte CRIAR CERTIFICADO (Transact-SQL).
Executa este código para criar um certificado de base de dados e protege-o usando uma palavra-passe.
CREATE CERTIFICATE TestCreditRatingCer
ENCRYPTION BY PASSWORD = 'pGFD4bb925DGvbd2439587y'
WITH SUBJECT = 'Credit Rating Records Access',
EXPIRY_DATE = '12/31/2022'; -- Error 3701 will occur if this date is not in the future
GO
3. Criar e assinar um procedimento armazenado usando o certificado
Use o código seguinte para criar um procedimento armazenado que seleciona dados da Vendor tabela no esquema da Purchasing base de dados, restringindo o acesso apenas às empresas com classificação de crédito 1. Note que a primeira secção do procedimento armazenado mostra o contexto da conta de utilizador a executar o procedimento armazenado, que serve apenas para demonstrar os conceitos. Não é obrigatório cumprir os requisitos.
CREATE PROCEDURE TestCreditRatingSP
AS
BEGIN
-- Show who is running the stored procedure
SELECT SYSTEM_USER 'system Login'
, USER AS 'Database Login'
, NAME AS 'Context'
, TYPE
, USAGE
FROM sys.user_token
-- Now get the data
SELECT AccountNumber, Name, CreditRating
FROM Purchasing.Vendor
WHERE CreditRating = 1
END
GO
Execute este código para assinar o procedimento armazenado com o certificado da base de dados, usando uma palavra-passe.
ADD SIGNATURE TO TestCreditRatingSP
BY CERTIFICATE TestCreditRatingCer
WITH PASSWORD = 'pGFD4bb925DGvbd2439587y';
GO
Para mais informações sobre procedimentos armazenados, consulte Procedimentos Armazenados (Motor de Base de Dados).
Para mais informações sobre como assinar procedimentos armazenados, consulte ADICIONAR SINATURA (Transact-SQL).
4. Criar uma conta de certificado usando o certificado
Execute este código para criar um utilizador de base de dados (TestCreditRatingcertificateAccount) a partir do certificado. Esta conta não tem login no servidor e, em última análise, controlará o acesso às tabelas subjacentes.
USE AdventureWorks2022;
GO
CREATE USER TestCreditRatingcertificateAccount
FROM CERTIFICATE TestCreditRatingCer;
GO
5. Conceder direitos à base de dados da conta de certificados
Execute este código para conceder TestCreditRatingcertificateAccount direitos à tabela base e ao procedimento armazenado.
GRANT SELECT
ON Purchasing.Vendor
TO TestCreditRatingcertificateAccount;
GO
GRANT EXECUTE
ON TestCreditRatingSP
TO TestCreditRatingcertificateAccount;
GO
Para mais informações sobre a concessão de permissões a objetos, consulte GRANT (Transact-SQL).
6. Mostrar o Contexto de Acesso
Para mostrar os direitos associados ao acesso ao procedimento armazenado, execute o seguinte código para conceder os direitos de execução do procedimento armazenado ao TestCreditRatingUser utilizador.
GRANT EXECUTE
ON TestCreditRatingSP
TO TestCreditRatingUser;
GO
De seguida, execute o seguinte código para executar o procedimento armazenado como o login DBO que usou no servidor. Verifique a saída da informação de contexto do utilizador. Vai mostrar a conta dbo como o contexto com os seus próprios direitos e não através de uma filiação a um grupo.
EXECUTE TestCreditRatingSP;
GO
Execute o seguinte código para usar a instrução EXECUTE AS para se tornar na conta TestCreditRatingUser e executar o procedimento armazenado. Desta vez, verá que o contexto do utilizador está definido como UTILIZADOR ASSOCIADO AO CONTEXTO DO CERTIFICADO. Note que esta opção não é suportada numa base de dados contida, nem na Azure SQL Database ou Azure Synapse Analytics.
EXECUTE AS LOGIN = 'TestCreditRatingUser';
GO
EXECUTE TestCreditRatingSP;
GO
Isto mostra-lhe a auditoria disponível porque assinou o procedimento armazenado.
Observação
Use EXECUTE AS para mudar de contexto dentro de uma base de dados.
7. Reiniciar o Ambiente
O código seguinte utiliza a instrução REVERT para devolver o contexto da conta atual para o dbo e reinicia o ambiente.
REVERT;
GO
DROP PROCEDURE TestCreditRatingSP;
GO
DROP USER TestCreditRatingcertificateAccount;
GO
DROP USER TestCreditRatingUser;
GO
DROP LOGIN TestCreditRatingUser;
GO
DROP CERTIFICATE TestCreditRatingCer;
GO
Para mais informações sobre a instrução REVERT, veja REVERT (Transact-SQL).
Exemplo completo
Esta secção mostra o código de exemplo completo.
/* Step 1 - Open the AdventureWorks2022 database */
USE AdventureWorks2022;
GO
-- Set up a login for the test user
CREATE LOGIN TestCreditRatingUser
WITH PASSWORD = 'ASDECd2439587y'
GO
CREATE USER TestCreditRatingUser
FOR LOGIN TestCreditRatingUser;
GO
/* Step 2 - Create a certificate in the AdventureWorks2022 database */
CREATE CERTIFICATE TestCreditRatingCer
ENCRYPTION BY PASSWORD = 'pGFD4bb925DGvbd2439587y'
WITH SUBJECT = 'Credit Rating Records Access',
EXPIRY_DATE = '12/31/2021'; -- Error 3701 will occur if this date is not in the future
GO
/* Step 3 - Create a stored procedure and
sign it using the certificate */
CREATE PROCEDURE TestCreditRatingSP
AS
BEGIN
-- Shows who is running the stored procedure
SELECT SYSTEM_USER 'system Login'
, USER AS 'Database Login'
, NAME AS 'Context'
, TYPE
, USAGE
FROM sys.user_token;
-- Now get the data
SELECT AccountNumber, Name, CreditRating
FROM Purchasing.Vendor
WHERE CreditRating = 1;
END
GO
ADD SIGNATURE TO TestCreditRatingSP
BY CERTIFICATE TestCreditRatingCer
WITH PASSWORD = 'pGFD4bb925DGvbd2439587y';
GO
/* Step 4 - Create a database user for the certificate.
This user has the ownership chain associated with it. */
USE AdventureWorks2022;
GO
CREATE USER TestCreditRatingcertificateAccount
FROM CERTIFICATE TestCreditRatingCer;
GO
/* Step 5 - Grant the user database rights */
GRANT SELECT
ON Purchasing.Vendor
TO TestCreditRatingcertificateAccount;
GO
GRANT EXECUTE
ON TestCreditRatingSP
TO TestCreditRatingcertificateAccount;
GO
/* Step 6 - Test, using the EXECUTE AS statement */
GRANT EXECUTE
ON TestCreditRatingSP
TO TestCreditRatingUser;
GO
-- Run the procedure as the dbo user, notice the output for the type
EXEC TestCreditRatingSP;
GO
EXECUTE AS LOGIN = 'TestCreditRatingUser';
GO
EXEC TestCreditRatingSP;
GO
/* Step 7 - Clean up the example */
REVERT;
GO
DROP PROCEDURE TestCreditRatingSP;
GO
DROP USER TestCreditRatingcertificateAccount;
GO
DROP USER TestCreditRatingUser;
GO
DROP LOGIN TestCreditRatingUser;
GO
DROP CERTIFICATE TestCreditRatingCer;
GO
Ver também
Centro de Segurança para SQL Server Database Engine e Azure SQL Database