Aracılığıyla paylaş


İMZA (Transact-SQL) Ekle

saklı yordam, işlev, derlemeveya tetikleyici için dijital imza ekler.Ayrıca bir onay imzası saklı yordam, işlev, derlemeveya tetikleyici için ekler.

Konu bağlantısı simgesiTransact-SQL sözdizimi 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 ekleneceği modülü sınıfıdır.Şema kapsamlı modülleri için varsayılan nesnedir.

  • module_name
    saklı yordam, işlev, derlemeveya tetikleyici imzalanmış veya onayını imzalayan adıdır.

  • SERTİFİKAcert_name
    sertifika imzalamak veya onay imzası atmak saklı yordam, işlev, derlemeveya tetikleyici adıdır.

  • PAROLA ile ='password'
    Özel anahtar sertifika veya asimetrik anahtarşifresini çözmek için gereken parolayı olur.Bu yan tümce yalnızca olan özel anahtar veritabanı ana anahtarkorunmuyor, gerekli.

  • İMZA =signed_blob
    İmzalı, ikili büyük nesne (blob) Modülü belirtir.Bu yan tümce modülü özel anahtarteslim olmadan sevk etmek istiyorsanız kullanışlıdır.Bu yan tümcekullandığınızda, yalnızca modülü, imza ve ortak anahtar ikili büyük nesne imzalı bir veritabanına eklemek için gereklidir.signed_blobblob onaltılı biçimde kendisi değildir.

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

Açıklamalar

Modül imzalanmış veya onayını imzalayan sertifika veya formu imzalamak için kullanılan asimetrik anahtar zaten bulunması gerekir.Her karakterin modülünde imza hesaplamasına dahil edilir.Bu önde gelen satırbaşları içerir ve satır beslemeleri.

Bir modül imzalanmış ve herhangi bir sayıda sertifikaları ve asimetrik anahtarları tarafından onayını imzalayan.

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

Bir modül execute as içeriyorsa yan tümce güvenlik kimliği (SID) patron da imzalama işleminin bir parçası olarak dahil edilir.

Dikkat notuDikkat

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

İmzalar hakkında bilgi görünür sys.crypt_properties Katalog görünümü.

Onay imzaları

İmzalı bir modül yürütürken, imzalar geçici olarak SQL belirtecine 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 formdur.Tek başına bir onay imzası herhangi bir izin vermez, ancak countersigned nesnesine yapılan çağrı süresince tutulmalıdır aynı sertifika veya asimetrik anahtar tarafından yapılan imza verir.

Örneğin, Gamze arama yordamı kullanıcının presume ProcSelectT1ForAlice, hangi arama yordamı procSelectT1, tabloyaptığı T1.Çiğdem execute izni olan ProcSelectT1ForAlice ve procSelectT1, ancak Gönül select izni yok T1, hiçbir sahiplik zincirleme bu tüm zinciri. katıldı veÇiğdem tabloerişemiyorT1, doğrudan ya da kullanımından ProcSelectT1ForAlice ve procSelectT1. Her zaman kullanmak için Çiğdem istiyoruz bu yana ProcSelectT1ForAlice erişimi için biz istemiyorsanız kendi yürütmekizni vermek procSelectT1.Nasıl biz bunu gerçekleştirmenin?

  • Biz kaydolursanız procSelectT1, gibi procSelectT1 erişebileceğiniz T1, sonra Çiğdem çağırmak procSelectT1 doğrudan ve Gönül aramak zorunda ProcSelectT1ForAlice.

  • Biz üzerinde execute izni vermemek procSelectT1 Çiğdem, ancak sonra Çiğdem çağırmak mümkün olmazdı procSelectT1 ile ProcSelectT1ForAlice ya da.

  • İmzalama ProcSelectT1ForAlice işe tek başına, çünkü imza kayıp çağrısında procSelectT1.

Ancak, countersigning tarafından procSelectT1 aynı sertifika imzalamak için kullanılan ProcSelectT1ForAlice, SQL Server imza çağrısı zinciri boyunca tutmak ve yürütmelerine izin erişimi T1.Çiğdem çağrısı girişiminde procSelectT1 doğrudan, Gönül erişemiyor T1, çünkü onay imzası olmayan verin tüm hakları.c aşağıdaki örnekte gösterildiği Transact-SQL için bu örnek.

İzinler

Nesne üzerinde alter iznine ve sertifika veya asimetrik anahtarcontrol izni gerektirir.İlişkili bir özel anahtar parola ile korunmuşsa, kullanıcı parolası da olmalıdır.

Örnekler

A.Bir sertifikakullanarak saklı yordam imzalama

Aşağıdaki örnek saklı yordamimzalarHumanResources.uspUpdateEmployeeLogin sertifika HumanResourcesDP.

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

B.İmzalı bir blob kullanarak 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 imzalar ve DAMLA imza alır dan sys.crypt_properties.Yordam daha sonra bırakılan ve yeniden oluşturulacak.Örnek ile imza 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

crypt_property Bu deyim tarafından döndürülen imza farklı olacaktır her saat yordamı. oluşturduğunuzBu örnekte, sonucu kullanılacak Not.Bu örnekte gösterilen sonuç şudur: 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.Bir yordam bir onay imzası kullanarak erişme

Aşağıdaki örnek, nasıl countersigning erişimi denetleme nesneye yardımcı 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;