İMZA ekle (Transact-sql)

Dijital imza, bir saklı yordam, işlev, derleme veya tetikleyici için ekler. Ayrıca bir onay imzası saklı yordam, işlev, derleme veya tetikleyici için ekler.

Konu bağlantısı simgesi Transact-SQL Sözdizim Kuralları

Sözdizimi

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

Bağımsız değişkenler

  • module_class
    İmzanın eklendiği modülünün bir sınıftır. NESNENİN şema kapsamlı modülleri için varsayılandır.

  • module_name
    Bir saklı yordam, işlev, derleme veya tetikleyici imzalanmış veya countersigned adıdır.

  • SERTİFİKAcert_name
    Bir sertifika ile imzalamak veya saklı yordam, işlev, derleme veya tetikleyici countersign addır.

  • ŞİFRE ile ='password'
    Sertifika veya asimetrik anahtar özel anahtar şifresini çözmek için gereken parolayı olduğunu. Bu yan tümcesi yalnızca olan özel anahtar veritabanı ana anahtar tarafından korunan değil eğer gerekli.

  • İMZA =signed_blob
    İmzalı, ikili büyük nesne (blob) modülü belirtir. Bu fıkra modülü özel anahtar teslim olmadan sevk etmek istiyorsanız kullanışlıdır. Bu yan tümcesi kullandığınızda, yalnızca modülü, imza ve ortak anahtar imzalı ikili büyük nesne bir veritabanı eklemek için gereklidir. signed_blobblob onaltılık biçimdedir.

  • ASİMETRİK ANAHTARAsym_Key_Name
    İle imzalamak veya saklı yordam, işlev, derleme veya tetikleyici counter-sign bir asimetrik anahtar adıdır.

Açıklamalar

Modül imzalanmış veya countersigned ve sertifika veya asimetrik anahtar, bunu imzalamak için kullanılan önceden mevcut olmalıdır. Modül her karakter imza hesaplamasına dahil edilir. Bu önde gelen satırbaşları içerir ve satır beslemeleri.

Bir modül imzalanmış ve sertifikaları ve asimetrik anahtarları herhangi bir sayı tarafından countersigned.

Modül değiştiğinde bir modülün imza bırakılır.

Baba, güvenlik kimliği (SID) sorumlusunun da imzalama işleminin bir parçası olarak dahil olduğu bir modül bir execute içeriyorsa.

Dikkat notuDikkat

Modül imzalama yalnızca hiçbir zaman reddetme veya izinleri iptal için izinleri vermek için kullanılmalıdır.

Imzalar hakkında bilgi görünür sys.crypt_propertiesKatalog görünümü.

Onay imzaları

İmzalı bir modül yürütürken, imzalar sql belirtece geçici olarak eklenir ancak başka bir modül modül yürütür veya modül yürütme sona ererse imzalar kaybolur. Bir onay imzası imza özel bir şeklidir. Tek başına, bir onay imzası herhangi bir izin vermez, ancak countersigned nesneye yapılan çağrı süresi için tutulacak aynı sertifika veya asimetrik anahtar tarafından yapılan imzalar sağlar.

Örneğin, Alice arama yordamı kullanıcı tahmin ProcSelectT1ForAlice, hangi arama yordamı procSelectT1hangi tablodan seçer T1. Alice, üzerinde execute izni olan ProcSelectT1ForAliceve procSelectT1, ancak o select izni yok T1, ve hiçbir sahipliği zincir tüm bu zincirinde yer. Alice cant erişim tablo T1, doğrudan veya kullanarak ProcSelectT1ForAliceve procSelectT1. Çünkü biz istemek-e doğru her zaman kullanma Alice ProcSelectT1ForAliceerişim için biz yürütme izni onu vermek istemiyorum procSelectT1. Nasıl biz gerçekleştirebilirsiniz?

  • Biz oturum procSelectT1öyle ki, procSelectT1erişebilirsiniz T1, ardından Alice çağırabilirsiniz procSelectT1doğrudan ve o aramak zorunda değildir ProcSelectT1ForAlice.

  • Üzerinde execute izni reddetme procSelectT1için Alice, ama sonra Alice aramak mümkün olmaz procSelectT1ile ProcSelectT1ForAliceya da.

  • İmza ProcSelectT1ForAliceimza aramak için kayıp çünkü kendisi, işe yaramaz procSelectT1.

Ancak, countersigning tarafından procSelectT1imzalamak için kullanılan aynı sertifika ile ProcSelectT1ForAlice, SQL Serverimza çağrısı zinciri boyunca devam edecek ve erişim sağlar T1. Alice çağrısı girişiminde procSelectT1doğrudan, o cant'giriş T1, çünkü onay imzası tüm hakları yok. c aşağıdaki örnek Transact-SQLBu örnek için.

İzinler

Object alter izni ve sertifika veya asimetrik anahtar control izni gerektirir. Kullanıcı ilişkili bir özel anahtar parola ile korunmuşsa, parola da olması gerekir.

Örnekler

A.Bir sertifika kullanarak bir saklı yordam imzalama

Aşağıdaki örnek saklı yordam imzalar HumanResources.uspUpdateEmployeeLoginsertifika ile HumanResourcesDP.

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

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

B.İmzalı bir blob kullanarak bir saklı yordam imzalama

Aşağıdaki örnek, yeni bir veritabanı oluşturur ve örnekte kullanmak üzere bir sertifika oluşturur. Örnek oluşturur ve basit bir saklı yordam işaret ve imza blob alır dan sys.crypt_properties. Yordam daha sonra atılacak ve. Örneğin imza ile sözdizimini kullanarak yordamı imzalar.

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

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_propertyBu deyimi tarafından döndürülen imza bir yordamda oluşturduğunuz her zaman farklı olacak. Bu örnekte kullanımı sonucu not edin. Bu örnekte, gösterdi sonucudur: 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

-- 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.Bir yordamı bir onay imzası kullanarak erişme

Aşağıdaki örnek, nasıl countersigning erişim denetimi bir nesneye yardımcı olabilir gösterir.

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

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

Ayrıca bkz.

Başvuru

sys.crypt_properties (Transact-sql)

İMZA ekle (Transact-sql)