Module Signing (Database Engine)

Aplikacje baz danych często wymaga się, że dostęp do podstawowych tabel i obiektów znajdujących się w schemacie aplikacji mediated się za pomocą procedur wejścia poziom lub widoków.Opcje renderowania ma być w stanie udzielić dostępu użytkownikom końcowym w zapisie obiektów poziom, który następnie uzyskać dostęp do obiektów w imieniu użytkownika.Użytkownicy końcowi w ten sposób nie trzeba uzyskać dostęp do wszystkich obiektów w schemacie aplikacji.Ta metoda służy dwóch celach:

  • Ją upraszcza zarządzanie uprawnieniami w tym uprawnienia muszą być zarządzane tylko na mniejszy podzbiór obiektów, jak apposed do wszystkich obiektów w schemacie aplikacji.

  • Istnieje możliwość ukryć odpowiedniego układu schematu przed użytkownikiem końcowym, ponieważ są narażone tylko punkty wejścia.

Microsoft SQL Server zawiera wiele funkcji, które pomagają osiągnąć te scenariusze, takie jak własność tworzenie łańcuchów i za pomocą wykonać AS instrukcja.Zaczyna się od SQL Server 2005, SQL Server zapewnia także możliwość zarejestrowania modułów w bazie danych. Moduł podpisywania oferuje funkcje podobne, ale nie zmienia kontekst wykonania.Moduł, w tym kontekście odnosi się do procedura przechowywana, funkcja, wyzwalacza lub wirtualny plik dziennika.Aby uzyskać więcej informacji zobacz CREATE ROLE (Transact-SQL) i Using EXECUTE AS to Create Custom Permission Sets.

Moduł podpisy

SQL Server 2005 wprowadzono możliwość zarejestrowania modułów w bazie danych, takie jak procedury przechowywane, funkcje, wyzwalacze lub zespoły.Należy zauważyć, że wyzwala języka definicja danych (DDL) nie może zostać podpisany.Podpis cyfrowy jest szyfrowanie danych, zaszyfrowane przy użyciu klucz prywatnego osoby podpisującej.klucz prywatnego zapewnia, że podpis cyfrowy jest unikatowy okaziciela lub właściciela.

Do podpisywania danych, osoba podpisująca digests dane, szyfruje go za pomocą klucz prywatnego i dołącza wartość skrót zaszyfrowanych danych.Aby sprawdzić podpis, weryfikator używa klucz publicznego osoby podpisującej odszyfrować wartość Skrót zaszyfrowanego dołączonych do danych.Weryfikator porównuje następnie tę wartość odszyfrowanie szyfrowanego z wartością skrótu obliczone na danych pomocniczej.Jest ważne, że zarówno osoby podpisującej, a Weryfikator używać tej samej funkcja mieszania do szyfrowane dane.

Ostrzeżenie

Moduł podpisywania należy używać tylko do przyznawania uprawnień, nigdy nie do odmowy lub odwołać uprawnienia.

Scenariusz

Powiedz nam założono, że dostęp do sys.sysprocesses widoku powinny być mediated przez usp_sysprocesses procedura przechowywana.Użytkownicy mogą uzyskać dostęp do sys.sysprocesses informacji tylko wtedy, gdy pośrednictwa usp_sysprocesses procedurę.Ponieważ usp_sysprocesses and sys.sysprocesses obiekty mają różne właścicieli, tworzenie łańcucha własności nie ma zastosowania.

Po pierwsze, należy utworzyć certyfikat na serwerze z klucz parą za pomocą instrukcja CREATE certyfikat.Firma Microsoft następnie udziel certyfikat uprawnienia, aby wybrać z sys.sysprocesses tabela.Jednak ponieważ SQL Server tylko udziela uprawnienia, aby podmioty, czy najpierw należy utworzyć identyfikator logowania z certyfikat, za pomocą instrukcja CREATE LOGIN. Tego identyfikatora logowania nie jest konieczne łączenie uprawnień na serwerze, jak to tylko symbol zastępczy uprawnień i nie jest przeznaczony do łączenia się z wystąpienie serwera.Tego identyfikatora logowania mapowania certyfikat można następnie przyznać uprawnienia SELECT na sys.sysprocesses za pomocą instrukcja GRANT VIEW SERVER STATE do tabela. Po usp_sysprocesses przechowywane procedury jest tworzony, firma Microsoft może następnie zarejestrować procedura przechowywana o certyfikat (faktycznie prywatnego klucz odpowiednie do tego certyfikat) za pomocą instrukcja ADD podpisu.Nowa rola jest tworzony i przyznane wykonać uprawnienie usp_sysprocesses procedura przechowywana.Wszyscy użytkownicy, którzy są członkami tej roli, a następnie mają uprawnienia do wykonać usp_sysprocesses procedura przechowywana, a tym samym SELECT od sys.sysprocess widoku.Podczas wykonywania moduł podpisanych uprawnień głównej (za pomocą instrukcja GRANT), skojarzone z certyfikat podpisywania są tymczasowo UNION ed do token zabezpieczeń w czasie wykonywania na czas trwania rozmowy.Jak najszybciej zwraca wykonanie formantu, uprawnienia te są usuwane z token zabezpieczeń.W ten sposób tylko dla okresu istnienia wykonanie modułu skutecznie masz dodatkowego zestaw uprawnień.Użytkownika lub rolę, jaką ma udzielone uprawnienia wykonać na tej procedury będzie miał takie same możliwości.

Przykład

Poniżej Transact-SQL skrypt zawiera przykładowy scenariusz powyżej. Certyfikat został utworzony na podstawie klucz parą i mapowane do nowego identyfikatora logowania.Test pary kluczy musi zostać utworzony przy pierwszym użyciu MakeCert Narzędzie dołączonej.NET Framework SDK. Wybierz uprawnienia, aby sys.sysproceses widoku następnie są przypisywane do logowania się skojarzonego z certyfikatem.The usp_sysprocesses managed procedura przechowywana is created in the new database and signed with the certyfikat.The SysProcRole role is created and that role is granted wykonać permissions on the usp_sysprocesses procedura przechowywana.Użytkownika testowego jest tworzony i dodawany do SysProcRole roli.Użytkownika testowego wykonuje instrukcję SELECT sys.sysprocess , a następnie wykonuje usp_sysprocesses przechowywane procedury dla porównania.Następnie skrypt oczyszcza środowiska testowego.

use master
go

-- Create a test database.
CREATE DATABASE db_Demo
go

-- Create a certificate on the server. A test key pair can be created
-- using the MakeCert tool that ships with the .NET Framework SDK.
CREATE CERTIFICATE SysProcCert FROM FILE = 'e:\programming\testCert.cer'
go

-- Create a login and map it to the certificate.
CREATE LOGIN login_SysProcCert FROM CERTIFICATE SysProcCert
Go

-- Revoke the connect permission.
REVOKE CONNECT SQL FROM login_SysProcCert ;
go 
 
-- Grant the certificate, through the login, permission to select from sys.sysprocesses view.
GRANT VIEW SERVER STATE TO login_SysProcCert
go

-- Create a test login.
CREATE LOGIN bob WITH PASSWORD = '<enterStrongPasswordHere>'
go

-- Connect to the test database.
use db_Demo
go

-- Create the master key for the test database (used to protect 
-- private keys and certificates in the database).
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<enterStrongPasswordHere>' 

-- Create a certificate from a private key.
CREATE CERTIFICATE SysProcCert FROM FILE = 'e:\programming\testCert.cer'
WITH PRIVATE KEY
(FILE = 'e:\programming\testCert.pvk', 
 DECRYPTION BY PASSWORD= '<enterStrongPasswordHere>', 
 ENCRYPTION BY PASSWORD='<enterStrongPasswordHere>')
go 

-- Create the assembly on the server. The assembly DLL must be signed.
CREATE ASSEMBLY SysStoredProcedures
FROM 'E:\programming\SysStoredProcs.dll'
WITH PERMISSION_SET = SAFE
go 

-- Create the managed stored procedure on the server.
CREATE PROCEDURE usp_sysprocesses
AS EXTERNAL NAME SysStoredProcedures.StoredProcedures.usp_sysprocesses
go 

-- Add the signature to the stored procedure.
ADD SIGNATURE TO [dbo].[usp_sysprocesses] 
BY CERTIFICATE SysProcCert WITH PASSWORD = '<enterStrongPasswordHere>'
go 

-- Create a role.
CREATE ROLE SysProcRole
go

-- Create a test user
CREATE USER bob
go

-- Add the test user to the role.
EXEC sp_addrolemember 'SysProcRole', 'bob'
go

-- Grant execute permissions on the stored procedure to the new role.
GRANT EXECUTE ON [dbo].[usp_sysprocesses] TO SysProcRole
go
 
-- Connect as the test user.
EXECUTE AS LOGIN = 'bob'
use db_Demo
go
 
-- User only has permission to see their own processes.
SELECT * FROM sys.sysprocesses
go

-- Execute the stored procedure, which has been signed.
exec usp_sysprocesses
go

-- REVERT
REVERT
----------------------------------------------------------------------
-- Cleanup

use db_Demo
go

use master
go

DROP DATABASE db_Demo
go 

DROP login login_SysProcCert
DROP login bob
go

DROP CERTIFICATE SysProcCert
go

Poniżej znajduje się kod źródłowy usp_sysprocesses przechowywanej procedury, która wykonuje SELECT * instrukcja na sys.sysprocesses widoku.Musi być podpisany wirtualny plik dziennika, gdy jest ona wbudowana.

C#

using System;
using System.Data.SqlClient;
using Microsoft.SqlServer.Server;

public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void usp_sysprocesses()
{
    using(SqlConnection connection = new SqlConnection("context connection=true"))
    {
        connection.Open();
        SqlCommand command = new SqlCommand("SELECT * FROM sys.sysprocesses", connection);
        SqlContext.Pipe.ExecuteAndSend(command);
    }
}
};

Visual Basic

Imports System
Imports System.Data.SqlClient
Imports Microsoft.SqlServer.Server

Partial Public Class StoredProcedures
<Microsoft.SqlServer.Server.SqlProcedure()> _
Public Shared Sub  usp_sysprocesses ()
    Using connection As New SqlConnection("context connection=true")
        connection.Open()

        Dim command As New SqlCommand("SELECT * FROM sys.sysprocesses", connection)
        SqlContext.Pipe.ExecuteAndSend(command)
    End Using
End Sub
End Class