Moduł podpisywania (aparat bazy danych)

Aplikacje baz danych często wymagają, że dostęp do podstawowych tabel i obiektów w aplikacji schemat sprawcą za pomocą procedur wejścia poziom lub widoków.Zamiarem jest może przyznać dostęp użytkownikom końcowym w zapisie poziom obiekty, do których dostęp do obiektów w imieniu użytkownika.Użytkownicy końcowi w ten sposób nie trzeba udzielić dostępu wszystkich obiektów schematu aplikacji.Ta metoda służy dwóm celom:

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

  • Jest możliwe ukryć podstawowej układ schematu z użytkownika końcowego, ponieważ narażeni są tylko punkty wejścia.

Microsoft SQL Server has a number of features that help achieve these scenarios, such as ownership chaining and using the EXECUTE AS statement.Począwszy od SQL Server 2005, SQL Server zapewnia także możliwość podpisania modułów w bazie danych.Moduł podpisywania oferuje funkcje podobne, ale nie zmienia kontekst wykonania.Moduł, w tym kontekście odnosi się do procedura składowana, funkcja, wyzwalacza lub wirtualny plik dziennika.Aby uzyskać więcej informacji, zobacz Tworzenie roli (Transact-SQL) i Aby utworzyć niestandardowe zestawy uprawnień przy użyciu jako wykonywanie.

Moduł podpisów

SQL Server 2005wprowadzono możliwość podpisania modułów w bazie danych, takie jak procedury przechowywane, funkcje, wyzwalacze lub zespoły.Nie można podpisać notatki, która wyzwala języka definicja danych (DDL).Podpis cyfrowy jest szyfrowanie danych zaszyfrowanych za pomocą klucz prywatnego osoby podpisującej.klucz prywatnego zapewnia, że podpis cyfrowy jest unikatową okaziciela lub właściciela.

Podpisywanie danych, osoby podpisującej skróty służące danych, szyfruje go za pomocą klucz prywatnego i dołącza wartość szyfrowanego zaszyfrowanych danych.Aby zweryfikować podpis, weryfikator używa klucz publicznego podpisującej odszyfrować wartości skrótu zaszyfrowanych dołączonych do danych.Weryfikator następnie porównuje tę wartość odszyfrowanie szyfrowanego z wartości skrótu, obliczoną na Pomocnika danych.Jest ważne, że osoba podpisująca i weryfikator używać tej samej funkcja mieszania do danych.

PrzestrogaPrzestroga

Moduł podpisywania powinny służyć wyłącznie przyznać uprawnienia, nigdy nie do odmowy lub odwołać uprawnienia.

Scenariusz

Załóżmy, że dostęp do sys.sysprocesses widok należy sprawcą przez usp_sysprocesses procedura składowana.Użytkownicy mają dostęp do sys.sysprocesses informacji tylko wtedy, gdy przejście przez usp_sysprocesses procedurę.Ponieważ usp_sysprocesses i sys.sysprocesses obiekty mają różnych właścicieli, tworzenie łańcucha własności nie mają zastosowania.

Najpierw należy utworzyć certyfikat na serwerze z klucz parą za pomocą instrukcja Tworzenie certyfikatu.Następnie udzielamy Państwu certyfikat uprawnienia, aby wybrać z sys.sysprocesses tabela.Jednak ponieważ SQL Server tylko udziela uprawnień do podmiotów, najpierw należy utworzyć identyfikator logowania z certyfikat przy użyciu instrukcja tworzenia logowania.Tego identyfikatora logowania nie jest konieczne połączenie uprawnień na serwerze, jak to tylko symbol zastępczy uprawnienia i nie jest przeznaczony do łączenia się z wystąpienie serwera.Ten certyfikat mapowany logowania można następnie udzielić wybierz na sys.sysprocesses tabela za pomocą dotacji Widok serwera Państwo do instrukcja.Po usp_sysprocesses tworzona jest procedura składowana, procedura składowana o można następnie zapisać certyfikat (faktycznie prywatny klucz odpowiadający tej certyfikat) za pomocą instrukcja Dodawanie podpisu.Nowa rola jest tworzony i przyznane wykonać uprawnienie do usp_sysprocesses procedura składowana.Wszyscy użytkownicy, którzy są element członkowski tej roli następnie mają uprawnienia do wykonywania usp_sysprocesses procedura składowana, a tym samym wybierz z sys.sysprocess widok.Gdy zostanie wykonać moduł podpisane uprawnień głównej (za pomocą instrukcja dotacji) skojarzonego z certyfikat podpisywania są tymczasowo Unii ed do token zabezpieczeń w czasie wykonywania na czas trwania rozmowy.Jak najszybciej zwraca wykonanie kontroli, te uprawnienia są usuwane z tokenu zabezpieczeń.W ten sposób tylko dla okresu istnienia wykonanie modułu skutecznie masz dodatkowy zestaw uprawnień.Użytkownika lub rolę, któremu udzielono uprawnienia Wykonywanie tej procedury będzie miał takie same możliwości.

Przykład

Następujące Transact-SQL skrypt zawiera przykład scenariusza powyżej.Certyfikat jest tworzona z klucz parą i mapowane na nowe logowanie.Test klucz para musi zostać utworzony przy pierwszym użyciu MakeCert jest dołączone narzędzie .NET Framework SDK.Wybierz uprawnienia, aby sys.sysproceses widok przyznawane są następnie logowania skojarzone z certyfikat.Usp_sysprocesses zarządzanych procedura składowana jest tworzony w nowej bazie danych i podpisany przy użyciu certyfikat.SysProcRole utworzono rolę i przyznany danej roli wykonać uprawnienia usp_sysprocesses procedura składowana.Badanie użytkownika jest tworzony i dodawany do SysProcRole rolę.Użytkownik test wykonuje instrukcję SELECT na sys.sysprocess , a następnie wykonuje usp_sysprocesses procedura składowana, 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

Oto kod źródłowy dla usp_sysprocesses procedura składowana, który wykonuje SELECT * instrukcja na sys.sysprocesses widok.wirtualny plik dziennika Musi być podpisany, 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