Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Şunlar için geçerlidir:SQL Server
Azure SQL Veritabanı
Azure SQL Yönetilen Örneği
Microsoft Fabric'te SQL veritabanı
Saklı yordama, işleve, derlemeye veya DML tetikleyicisine dijital imza ekler. Ayrıca saklı yordama, işleve, derlemeye veya DML tetikleyicisine bir karşı imza ekler.
Transact-SQL söz dizimi 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şken
module_class
İmzanın eklendiği modülün sınıfı. Şema kapsamlı modüller için varsayılan değer OBJECT' dir.
module_name
İmzalanacak veya imzalanacak saklı yordamın, işlevin, derlemenin veya tetikleyicinin adı.
SERTIFIKA cert_name
Saklı yordamın, işlevin, derlemenin veya tetikleyicinin imzalandığı veya karşı imzalandığı sertifikanın adı.
WITH PASSWORD = 'parola'
Sertifikanın veya asimetrik anahtarın özel anahtarının şifresini çözmek için gereken parola. Bu yan tümce yalnızca özel anahtar veritabanı ana anahtarı tarafından korunmuyorsa gereklidir.
İMZA = signed_blob
Modülün imzalı, ikili büyük nesnesini (BLOB) belirtir. Bu yan tümce, özel anahtarı göndermeden bir modülü göndermek istiyorsanız kullanışlıdır. Bu yan tümceyi kullandığınızda, bir veritabanına imzalı ikili büyük nesneyi eklemek için yalnızca modül, imza ve ortak anahtar gerekir. signed_blob, blob'un kendisi onaltılık biçimdedir.
ASIMETRIK ANAHTAR Asym_Key_Name
Saklı yordamın, işlevin, derlemenin veya tetikleyicinin imzalandığı veya karşı imzalandığı asimetrik anahtarın adı.
Açıklamalar
İmzalanan veya imzalanan modül ve imzalamak için kullanılan sertifika veya asimetrik anahtar zaten mevcut olmalıdır. Modüldeki her karakter imza hesaplamasında yer alır. Buna baştaki satır iadeleri ve satır beslemeleri dahildir.
Bir modül, herhangi bir sayıda sertifika ve asimetrik anahtar tarafından imzalanabilir ve imzalanabilir.
Modül değiştirildiğinde modülün imzası bırakılır.
Modül bir EXECUTE AS yan tümcesi içeriyorsa, imzalama işleminin bir parçası olarak sorumlunun güvenlik kimliği (SID) de dahil edilir.
Dikkat
Modül imzalama yalnızca izinleri vermek için kullanılmalı, hiçbir zaman izinleri reddetmemeli veya iptal etmemelidir.
Veri tanımı dili (DDL) tetikleyicileri ve Satır içi tablo değerli işlevler imzalanamaz.
İmzalar hakkındaki bilgiler sys.crypt_properties katalog görünümünde görünür.
Uyarı
İmza için bir yordam yeniden oluşturduğunuzda, özgün toplu işteki tüm deyimlerin yeniden oluşturulmuş toplu işlemle eşleşmesi gerekir. Toplu işlemin herhangi bir bölümü boşluk veya açıklamalarda bile farklıysa, sonuçta elde edilen imza farklıdır.
Karşı imzalar
İmzalı bir modülü yürütürken, imzalar GEÇICI olarak SQL belirtecine eklenir, ancak modül başka bir modül yürütürse veya modül yürütmeyi sonlandırırsa imzalar kaybolur. imza özel bir imza biçimidir. Bir karşı imza tek başına herhangi bir izin vermez. Ancak, aynı sertifika veya asimetrik anahtar tarafından yapılan imzaların, karşı imzalanan nesneye yapılan çağrı süresince saklanmasına izin verir.
Örneğin, kullanıcının AliceProcForAlicetablosundan seçim yapan ProcSelectT1yordamını çağıran T1yordamını çağırdığını varsayalım. Alice'in EXECUTEüzerinde ProcForAlice izni vardır, ancak EXECUTE veya ProcSelectT1SELECT üzerinde T1 izni yoktur ve zincirin tamamına sahiplik zinciri dahil değildir. Alice, T1tablosuna doğrudan veya ProcForAlice ve ProcSelectT1kullanarak erişemez. Alice'in erişim için her zaman ProcForAlice kullanmasını istediğimizden, ProcSelectT1yürütme izni vermek istemiyoruz. Bu senaryoya nasıl erişebiliriz?
ProcSelectT1ProcSelectT1T1erişebilecek şekilde imzalarsak Alice doğrudanProcSelectT1çağırabilir veProcForAliceçağrısı yapmak zorunda değildir.Alice'e
EXECUTEProcSelectT1iznini reddedebiliriz, ancak aliceProcSelectT1aracılığıylaProcForAliceçağıramaz.ProcForAliceçağrısında imza kaybolduğundan, imzalamaProcSelectT1tek başına çalışmaz.
Ancak, ProcSelectT1imzalamak için kullanılan sertifikaya sahip ProcForAlice karşı atarak, imza çağrı zincirinde tutulur ve T1erişimine izin verilir. Alice doğrudan ProcSelectT1 çağırmaya çalışırsa, T1erişemez çünkü karşı imza herhangi bir hak vermez.
Örnek C bu örneğin Transact-SQL gösterir.
İzinler
Nesne üzerinde ALTER izin ve sertifika veya asimetrik anahtar üzerinde CONTROL izni gerektirir. İlişkili bir özel anahtar parolayla korunuyorsa, kullanıcının da parolaya sahip olması gerekir.
Örnekler
A. Sertifika kullanarak saklı yordamı imzalama
Aşağıdaki örnek, HumanResources.uspUpdateEmployeeLogin saklı yordamı sertifika HumanResourcesDPile imzalar.
USE AdventureWorks2022;
ADD SIGNATURE TO HumanResources.uspUpdateEmployeeLogin
BY CERTIFICATE HumanResourcesDP;
GO
B. İmzalı BLOB kullanarak saklı yordamı imzalama
Aşağıdaki örnek yeni bir veritabanı oluşturur ve örnekte kullanmak üzere bir sertifika oluşturur. Örnek, temel bir saklı yordam oluşturup imzalar ve sys.crypt_properties'den imza BLOB'unu alır. Ardından imza bırakılır ve yeniden eklenir. Örnek, WITH SIGNATURE söz dizimini 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 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
Bu deyim tarafından döndürülen crypt_property imzası, her yordam oluşturduğunuzda farklıdır. Bu örnekte daha sonra kullanmak üzere sonucu not edin. Bu özel durumda, gösterildiği sonuç 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. Bir karşı imza kullanarak yordama erişme
Aşağıdaki örnekte, sayaç atamanın bir nesneye erişimi denetlemeye nasıl yardımcı olabileceği gösterilmektedir.
<password> uygun bir parolayla değiştirmeniz gerekir.
-- 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;