Megosztás a következőn keresztül:


ALÁÍRÁS HOZZÁADÁSA (Transact-SQL)

A következőkre vonatkozik:SQL ServerAzure SQL DatabaseFelügyelt Azure SQL-példánySQL-adatbázis a Microsoft Fabricben

Digitális aláírást ad hozzá egy tárolt eljáráshoz, függvényhez, szerelvényhez vagy DML-eseményindítóhoz. Ellenjegyzést is hozzáad egy tárolt eljáráshoz, függvényhez, szerelvényhez vagy DML-eseményindítóhoz.

Transact-SQL szintaxis konvenciói

Szintaxis

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

Érvek

module_class

Annak a modulnak az osztálya, amelyhez az aláírás hozzá van adva. A séma hatókörű modulok alapértelmezett OBJECT.

module_name

Egy aláírt vagy ellenjegyezendő tárolt eljárás, függvény, szerelvény vagy eseményindító neve.

TANÚSÍTVÁNY cert_name

Annak a tanúsítványnak a neve, amellyel aláírhatja vagy ellenjegyezheti a tárolt eljárást, függvényt, szerelvényt vagy eseményindítót.

JELSZÓVAL = 'jelszó'

A tanúsítvány vagy az aszimmetrikus kulcs titkos kulcsának visszafejtéséhez szükséges jelszó. Ez a záradék csak akkor szükséges, ha a titkos kulcsot nem védi az adatbázis főkulcsa.

ALÁÍRÁS = signed_blob

A modul aláírt, bináris nagy objektumát (BLOB) adja meg. Ez a záradék akkor hasznos, ha egy modult a titkos kulcs elküldése nélkül szeretne szállítani. A záradék használatakor csak a modul, az aláírás és a nyilvános kulcs szükséges az aláírt nagy bináris objektum adatbázishoz való hozzáadásához. signed_blob maga a blob hexadecimális formátumban.

ASZIMMETRIKUS KULCS ASYM_KEY_NAME

Egy aszimmetrikus kulcs neve, amellyel aláírhatja vagy ellenjegyezheti a tárolt eljárást, függvényt, szerelvényt vagy eseményindítót.

Megjegyzések

Az aláírt vagy ellenjegyzett modulnak és az aláíráshoz használt tanúsítványnak vagy aszimmetrikus kulcsnak már léteznie kell. A modul minden karaktere szerepel az aláírás kiszámításában. Ide tartoznak a vezető kocsivissza és a vonalcsatornák.

A modulok tetszőleges számú tanúsítványsal és aszimmetrikus kulcsokkal aláírhatók és ellenjegyezhetők.

A modul módosításakor a rendszer elveti a modul aláírását.

Ha egy modul EXECUTE AS záradékot tartalmaz, az aláírási folyamat részeként a rendszer a rendszerbiztonsági azonosítót (SID) is tartalmazza.

Figyelmeztet

A modul-aláírás csak engedélyek megadására használható, az engedélyek megtagadására és visszavonására soha.

Az adatdefiníciós nyelv (DDL) eseményindítói és a beágyazott táblaértékű függvények nem írhatók alá.

Az aláírásokkal kapcsolatos információk sys.crypt_properties katalógusnézetben láthatók.

Figyelmeztetés

Az aláírási eljárás ismételt létrehozásakor az eredeti kötegben lévő összes utasításnak meg kell egyeznie az újraalkotott kötegnek. Ha a köteg bármely része eltér, még szóközökben vagy megjegyzésekben is, az eredményül kapott aláírás eltérő.

Ellenjegyzések

Aláírt modul végrehajtásakor az aláírások ideiglenesen hozzáadódnak az SQL-jogkivonathoz, de az aláírások elvesznek, ha a modul egy másik modult hajt végre, vagy ha a modul leállítja a végrehajtást. A ellenjegyzési egy speciális aláírási forma. Az ellenjegyzés önmagában nem ad engedélyeket. Lehetővé teszi azonban, hogy az azonos tanúsítvány vagy aszimmetrikus kulcs által készített aláírások az ellenjegyzett objektumra irányuló hívás időtartamára legyenek megőrzve.

Tegyük fel például, hogy a felhasználó Alice hívási eljárást ProcForAlice, amely meghívja az eljárást ProcSelectT1, amely a T1táblából választ. Alice EXECUTE engedéllyel rendelkezik ProcForAlice, de nincs EXECUTE engedélye ProcSelectT1 vagy SELECT engedélyre T1, és ebben a láncban nincs tulajdonosi láncolás. Alice nem tudja elérni a tábla T1, sem közvetlenül, sem ProcForAlice és ProcSelectT1használatával. Mivel azt szeretnénk, hogy Alice mindig ProcForAlice használjon a hozzáféréshez, nem szeretnénk engedélyt adni neki a ProcSelectT1végrehajtására. Hogyan valósíthatjuk meg ezt a forgatókönyvet?

  • Ha aláírjuk ProcSelectT1, hogy ProcSelectT1 hozzáférhessen T1, Alice közvetlenül meghívhatja ProcSelectT1 , és nem kell meghívnia ProcForAlice.

  • Megtagadhatjuk EXECUTE engedélyt ProcSelectT1 Alice-nek, de alice nem tudja meghívni ProcSelectT1ProcForAlicekeresztül.

  • Az aláírási ProcForAlice önmagában nem működne, mert az aláírás elveszik a ProcSelectT1hívásában.

Ha azonban a ProcSelectT1aláírásához használt tanúsítvánnyal ProcForAlice ellenjegyez, az aláírás a hívásláncon belül marad, és hozzáférést biztosít a T1. Ha Alice közvetlenül megkísérli meghívni ProcSelectT1, nem fér hozzá T1, mert az ellenjegyzés nem biztosít semmilyen jogot. C példa a példához tartozó Transact-SQL jeleníti meg.

Képernyőkép az aláírási példáról.

Engedélyek

ALTER engedélyt igényel az objektumhoz, és CONTROL engedélyt a tanúsítványra vagy az aszimmetrikus kulcsra. Ha a társított titkos kulcsot jelszó védi, a felhasználónak is rendelkeznie kell a jelszóval.

Példák

Egy. Tárolt eljárás aláírása tanúsítvány használatával

Az alábbi példa aláírja a tárolt eljárást HumanResources.uspUpdateEmployeeLogin a tanúsítvány HumanResourcesDP.

USE AdventureWorks2022;

ADD SIGNATURE TO HumanResources.uspUpdateEmployeeLogin
    BY CERTIFICATE HumanResourcesDP;
GO

B. Tárolt eljárás aláírása aláírt BLOB használatával

Az alábbi példa létrehoz egy új adatbázist, és létrehoz egy tanúsítványt, amelyet a példában használ. A példa létrehoz és aláír egy alapszintű tárolt eljárást, és lekéri az aláírási BLOB-t sys.crypt_properties. Az aláírás ezután el lesz dobva, és újból hozzáadódik. A példa a WITH SIGNATURE szintaxissal írja alá az eljárást.

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 basic procedure.
CREATE PROCEDURE [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
     INNER JOIN sys.certificates AS cer
         ON cp.thumbprint = cer.thumbprint
WHERE cer.name = 'cert_signature_demo';
GO

Az utasítás által visszaadott crypt_property aláírás minden eljárás létrehozásakor eltérő. Jegyezze fel az eredményt a példában későbbi használathoz. Ebben a konkrét esetben a bemutatott eredmény 0x831F5530C86CC8ED606E5BC2720DA835351E46219A6D5DE9CE546297B88AEF3B6A7051891AF3EE7A68EAB37CD8380988B4C3F7469C8EABDD9579A2A5C507A4482905C2F24024FFB2F9BD7A953DD5E98470C4AA90CE83237739BB5FAE7BAC796E7710BDE291B03C43582F6F2D3B381F2102EEF8407731E01A51E24D808D54B373.

-- Drop the signature so that it can be signed again.
DROP SIGNATURE FROM [sp_signature_demo]
    BY CERTIFICATE [cert_signature_demo];
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. Eljárás elérése ellenjegyzés használatával

Az alábbi példa bemutatja, hogyan segíthet az ellenjegyzés az objektumhoz való hozzáférés szabályozásában. A <password> megfelelő jelszóra kell cserélnie.

-- 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 = '<password>'
    WITH SUBJECT = 'Certificate used to grant SELECT on T1';

CREATE USER ucsSelectT1 FOR CERTIFICATE csSelectT;
GRANT SELECT ON T1 TO ucsSelectT1;

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

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

-- 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;
GO

-- Create special procedure for accessing T1
CREATE PROCEDURE ProcForAlice
AS
BEGIN
    IF USER_ID() <> USER_ID('Alice')
        BEGIN
            PRINT 'Only Alice can use this.';
            RETURN;
        END
    EXECUTE ProcSelectT1;
END
GO

GRANT EXECUTE ON ProcForAlice TO PUBLIC;

-- Verify procedure works for a sysadmin user
EXECUTE ProcForAlice;

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

-- Sign procedure to grant it SELECT permission
ADD SIGNATURE TO ProcForAlice
BY CERTIFICATE csSelectT WITH PASSWORD = '<password>';

ADD COUNTER SIGNATURE TO ProcSelectT1
BY CERTIFICATE csSelectT WITH PASSWORD = '<password>';

-- Now the stored procedure works.   
-- Note that calling ProcSelectT1 directly still doesn't work.
EXECUTE AS LOGIN = 'Alice';
EXECUTE ProcForAlice;
EXECUTE ProcSelectT1;
REVERT;

-- Cleanup
USE master;
GO

DROP DATABASE testDB;
DROP LOGIN Alice;