Dodaj podpis (Transact-SQL)

Dodaje podpisu cyfrowego do procedura składowana, funkcja, wirtualny plik dziennikalub wyzwalacza.Dodaje również kontrasygnaturze do procedura składowana, funkcja, wirtualny plik dziennikalub wyzwalacza.

Ikona łącza do tematuJęzyka Transact-SQL składni konwencje

Składnia

ADD [ COUNTER ] SIGNATURE TO module_class::module_name 
    BY <crypto_list> [ ,...n ]

<crypto_list> ::=
    CERTIFICATE cert_name
    | CERTIFICATE cert_name [ WITH PASSWORD = 'password' ]
    | CERTIFICATE cert_name WITH SIGNATURE = signed_blob 
    | ASYMMETRIC KEY Asym_Key_Name
    | ASYMMETRIC KEY Asym_Key_Name [ WITH PASSWORD = 'password'.]
    | ASYMMETRIC KEY Asym_Key_Name WITH SIGNATURE = signed_blob

Argumenty

  • module_class
    Jest to klasa moduł, do którego dodawany jest podpis.Domyślnie moduły o zakresie schematu jest obiekt.

  • module_name
    Jest nazwą procedura składowana, funkcja, wirtualny plik dziennikalub wyzwalacza podpisane lub kontrasygnowane.

  • CERTYFIKATcert_name
    Jest nazwą certyfikat do podpisywania lub kontrasygnować , procedura składowana, funkcja, wirtualny plik dziennikalub wyzwalacza.

  • HASŁO ='password"
    To hasło wymagane do odszyfrowania kluczasymetrycznego lub prywatnego klucz certyfikat .Ta klauzula jest tylko wymagane, jeśli klucz prywatny nie jest chroniony przez kluczgłówny bazy danych.

  • PODPIS =signed_blob
    Określa podpisane, duży obiekt binarny (BLOB) modułu.Tę klauzula jest przydatne, jeśli użytkownik chce wysłać moduł bez wysyłki kluczprywatnego.Użyj tej klauzulasą wymagane tylko moduł, podpis i klucz publiczny do dodania podpisane duży obiekt binarny do bazy danych.signed_blobblob sam jest w formacie szesnastkowym.

  • KLUCZA ASYMETRYCZNEGOAsym_Key_Name
    Jest to nazwa klucz asymetrycznego służącą do podpisywania lub counter-sign procedura składowana, funkcja, wirtualny plik dziennikalub wyzwalacza.

Uwagi

Moduł podpisane lub poświadczonych i certyfikat lub asymetrycznego klucz użyty do podpisania go musi już istnieć.Każdy znak w module jest uwzględniane w obliczeniach podpisu.Dotyczy to także wiodącego karetki, a wiersz źródła danych.

Moduł można podpisane i kontrasygnowane przez dowolną liczbę certyfikaty i klucze asymetryczne.

Podpis modułu jest odrzucany, gdy moduł zostanie zmieniona.

Moduł zawiera jako EXECUTE klauzula, identyfikator zabezpieczeń (SID) głównej jest również włączona jako część procesu podpisywania.

PrzestrogaPrzestroga

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

Informacje o podpisach są widoczne w sys.crypt_properties wykazu widoku.

Kontrasygnatury

Podczas wykonywania moduł podpisane, podpisy będą tymczasowo dodane do tokenu SQL , ale podpisy są tracone, jeśli moduł wykonuje inny moduł lub moduł kończy wykonywanie.Kontrasygnaturze jest specjalny formularz podpisu.Sama kontrasygnaturze nie udziela żadnych uprawnień, jednak pozwala podpisy dokonane przez tego samego certyfikat lub klucz asymetrycznego przechowywane przez czas trwania rozmowy do obiektu countersigned.

Na przykład zakładać, że użytkownik Alicja wywołania procedury ProcSelectT1ForAlice, których procedura wywołania procSelectT1, który wybiera z tabela T1.Alicja ma uprawnienie EXECUTE na ProcSelectT1ForAlice i procSelectT1, ale użytkownik nie ma uprawnienia SELECT T1, a nie tworzenie łańcucha własności jest zaangażowany w tym cały łańcuch.Alicja nie może uzyskać dostępu do tabela T1, bezpośrednio lub za pośrednictwem ProcSelectT1ForAlice i procSelectT1.Ponieważ chcemy Alicja należy zawsze używać ProcSelectT1ForAlice dla dostępu, firma Microsoft nie chce udzielić jej uprawnienia do wykonać procSelectT1.W jaki sposób możemy to zrobić?

  • Jeżeli możemy zarejestrować procSelectT1, w taki sposób, że procSelectT1 można uzyskać dostęp do T1, następnie Robert może wywołać procSelectT1 bezpośrednio i użytkownik nie musi wywołać ProcSelectT1ForAlice.

  • Firma Microsoft może odmówić uprawnienia wykonywania na procSelectT1 do Alicji, ale następnie Alicja nie będzie w stanie wywołać procSelectT1 przez ProcSelectT1ForAlice albo.

  • Podpisywanie ProcSelectT1ForAlice nie będzie działać, ponieważ podpis będzie utracone w wywołaniu procSelectT1.

Jednakże, przez countersigning procSelectT1 z tego samego certyfikat użytego do podpisania ProcSelectT1ForAlice, SQL Server zachowa podpisu przez łańcuch połączenia i umożliwi dostęp do T1.Jeśli Alicja próby wywołania procSelectT1 bezpośrednio, użytkownik nie może uzyskać dostępu T1, ponieważ kontrasygnaturze nie udzielać żadnych praw.Pokazuje przykład c poniżej, Transact-SQL tego przykładu.

Uprawnienia

Wymaga ZMIEŃ uprawnienia dla obiektu i uprawnienie Kontrola certyfikat lub kluczasymetrycznego.Jeśli skojarzony klucz prywatny jest chroniony hasłem, użytkownik musi mieć hasło.

Przykłady

A.Podpisywanie procedura składowana przy użyciu certyfikat

Poniższy przykład podpisuje procedura składowana HumanResources.uspUpdateEmployeeLogin z certyfikat HumanResourcesDP.

USE AdventureWorks2008R2;
ADD SIGNATURE TO HumanResources.uspUpdateEmployeeLogin 
    BY CERTIFICATE HumanResourcesDP;
GO

B.Podpisywanie procedura składowana przy użyciu podpisanych BLOB

Poniższy przykład tworzy nową bazę danych i tworzy certyfikat w przykładzie.W przykładzie tworzy i podpisuje prostą procedura składowana i pobiera obiekt BLOB podpisu z sys.crypt_properties.Procedury jest następnie spadły i utworzony ponownie.Przykład podpisuje procedurę przy użyciu składni z podpisu.

CREATE DATABASE TestSignature ;
GO
USE TestSignature ;
GO
-- Create a CERTIFICATE to sign the procedure.
CREATE CERTIFICATE cert_signature_demo 
    ENCRYPTION BY PASSWORD = 'pGFD4bb925DGvbd2439587y'
    WITH SUBJECT = 'ADD SIGNATURE demo';
GO
-- Create a simple procedure.
CREATE PROC [sp_signature_demo]
AS
    PRINT 'This is the content of the procedure.' ;
GO
-- Sign the procedure.
ADD SIGNATURE TO [sp_signature_demo] 
    BY CERTIFICATE [cert_signature_demo] 
    WITH PASSWORD = 'pGFD4bb925DGvbd2439587y' ;
GO
-- Get the signature binary BLOB for the sp_signature_demo procedure.
SELECT cp.crypt_property
    FROM sys.crypt_properties AS cp
    JOIN sys.certificates AS cer
        ON cp.thumbprint = cer.thumbprint
    WHERE cer.name = 'cert_signature_demo' ;
GO

crypt_property Podpisu, który jest zwracany przez to instrukcja będzie inny każdego czas tworzenia procedury.Zanotuj wynik użycia później w tym przykładzie.W tym przykładzie jest wynikiem wykazać: 0x831F5530C86CC8ED606E5BC2720DA835351E46219A6D5DE9CE546297B88AEF3B6A7051891AF3EE7A68EAB37CD8380988B4C3F7469C8EABDD9579A2A5C507A4482905C2F24024FFB2F9BD7A953DD5E98470C4AA90CE83237739BB5FAE7BAC796E7710BDE291B03C43582F6F2D3B381F2102EEF8407731E01A51E24D808D54B373.

-- Drop the procedure so that a new version can be created.
DROP PROC [sp_signature_demo] ;
GO
-- Re-create the procedure by using the exact text including spaces.
CREATE PROC [sp_signature_demo]
AS
    PRINT 'This is the content of the procedure.' ;
GO
-- Add the signature. Use the signature BLOB obtained earlier.
ADD SIGNATURE TO [sp_signature_demo] 
    BY CERTIFICATE [cert_signature_demo]
    WITH SIGNATURE = 0x831F5530C86CC8ED606E5BC2720DA835351E46219A6D5DE9CE546297B88AEF3B6A7051891AF3EE7A68EAB37CD8380988B4C3F7469C8EABDD9579A2A5C507A4482905C2F24024FFB2F9BD7A953DD5E98470C4AA90CE83237739BB5FAE7BAC796E7710BDE291B03C43582F6F2D3B381F2102EEF8407731E01A51E24D808D54B373 ;
GO

C.Dostęp do procedury przy użyciu kontrasygnaturze.

W poniższym przykładzie pokazano, jak countersigning może pomóc kontrolować dostęp do obiektu.

-- Create tesT1 database
CREATE DATABASE testDB;
GO
USE testDB;
GO
-- Create table T1
CREATE TABLE T1 (c varchar(11));
INSERT INTO T1 VALUES ('This is T1.');

-- Create a TestUser user to own table T1
CREATE USER TestUser WITHOUT LOGIN;
ALTER AUTHORIZATION ON T1 TO TestUser;

-- Create a certificate for signing
CREATE CERTIFICATE csSelectT
  ENCRYPTION BY PASSWORD = 'SimplePwd01'
  WITH SUBJECT = 'Certificate used to grant SELECT on T1';
CREATE USER ucsSelectT1 FROM CERTIFICATE csSelectT;
GRANT SELECT ON T1 TO ucsSelectT1;

-- Create a principal with low privileges
CREATE LOGIN Alice WITH PASSWORD = 'SimplePwd01';
CREATE USER Alice;

-- Verify Alice cannoT1 access T1;
EXECUTE AS LOGIN = 'Alice';
    SELECT * FROM T1;
REVERT;

-- Create a procedure that directly accesses T1
CREATE PROCEDURE procSelectT1 AS
BEGIN
    PRINT 'Now selecting from T1...';
    SELECT * FROM T1;
END;
GO
GRANT EXECUTE ON procSelectT1 to public;

-- Create special procedure for accessing T1
CREATE PROCEDURE  procSelectT1ForAlice AS
BEGIN
   IF USER_ID() <> USER_ID('Alice')
    BEGIN
        PRINT 'Only Alice can use this.';
        RETURN
    END
   EXEC procSelectT1;
END;
GO;
GRANT EXECUTE ON procSelectT1ForAlice TO PUBLIC;

-- Verify procedure works for a sysadmin user
EXEC procSelectT1ForAlice;

-- Alice still can't use the procedure yet
EXECUTE AS LOGIN = 'Alice';
    EXEC procSelectT1ForAlice;
REVERT;

-- Sign procedure to grant it SELECT permission
ADD SIGNATURE TO procSelectT1ForAlice BY CERTIFICATE csSelectT 
WITH PASSWORD = 'SimplePwd01';

-- Counter sign proc_select_t, to make this work
ADD COUNTER SIGNATURE TO procSelectT1 BY CERTIFICATE csSelectT 
WITH PASSWORD = 'SimplePwd01';

-- Now the proc works. 
-- Note that calling procSelectT1 directly still doesn't work
EXECUTE AS LOGIN = 'Alice';
    EXEC procSelectT1ForAlice;
    EXEC procSelectT1;
REVERT;

-- Cleanup
USE master;
GO
DROP DATABASE testDB;
DROP LOGIN Alice;