(Veritabanı altyapısı) imzalama Modülü

Veritabanı uygulamaları, Access'in temel alınan tablolar genellikle gerektirir ve uygulama şeması içindeki nesneler girişi aracılığıyla mediated düzey yordamları veya görünümler.Daha sonra kullanıcı adına alttaki nesnelere erişim düzey nesneleri girişteki son kullanıcılara erişim izni vermek için hedeftir.Son kullanıcılar bu nedenle uygulama şeması tüm nesnelerde erişim izni gerekmez.Bu yaklaşımın iki amaca hizmet eder:

  • Yalnızca küçük alt küme küme küme nesne izinleri yönetilen, uygulama şeması içindeki tüm nesnelere apposed gibi izinler yönetimini basitleştirir.

  • Temel şema düzeni son kullanıcıdan yalnızca giriş noktaları açık olan bu yana gizlemek mümkündür.

Microsoft SQL Server has a number of features that help achieve these scenarios, such as ownership chaining and using the EXECUTE AS statement.İle başlayan SQL Server 2005, SQL Server Ayrıca, yeteneği oturum modülleri içinde sağlarveritabanı. Modül imzalama benzer yetenekleri sunar, ancak yürütme içeriği değişmez.Bu bağlamda bir modül bir saklı yordam, işlev, tetikleyici veya derleme başvurur.Daha fazla bilgi için bkz: ROL (Transact-sql) oluştur ve execute as özel izin kümeleri oluşturmak için kullanma.

Modül imzalar

SQL Server 2005saklı yordamları, işlevleri, Tetikleyiciler veya derlemeler gibi veritabanı içindeki modülleri imzalamak için yeteneği kullanılmaya başlandı.Dikkat edin veri tanımlama dili (ddl) Tetikleyicileri olamaz imzalanmış olmalıdır.Sayısal imza İmzalayanın özel anahtar ile şifrelenmiş bir veri özeti gibidir.Özel anahtar, dijital imza, taşıyıcı veya sahibi benzersiz olmasını sağlar.

İmzalayan verileri imzalamak için Özet verileri, özel ile şifreler anahtarve verileri şifreli Özet değerini ekler.İmzayı doğrulamak için veri ile bağlantılı şifreli Özet değerini şifresini çözmek için ortak anahtar İmzalayanın Doğrulayıcı kullanır.Doğrulayıcı, daha sonra bu şifresi çözülmüş Özet değeri üzerindeki Kılavuzu verileri hesaplanan Özet değer ile karşılaştırır.İmzalayan hem Doğrulayıcı aynı karma işlev Özet verileri için kullanmanız önemlidir.

Dikkat notuDikkat

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

Senaryo

Bizi bu erişim varsayalım sys.sysprocesses görünüm mediated tarafından usp_sysprocesses saklı yordam.Kullanıcıların erişebileceği sys.sysprocesses sadece geçerken bilgi usp_sysprocesses yordam.Bu yana usp_sysprocesses ve sys.sysprocesses nesneleri farklı sahipliklerini sahip, sahiplik zincirlemeyi geçerli değildir.

İlk olarak, bir sertifika sunucusunda oluşturduğunuz sertifika kullanarak bir anahtar çifti tarafından oluşturulması gerekir deyim.Biz sonra sertifika seçmek için izin sys.sysprocesses tablo.Ancak, çünkü SQL Server yalnızca verir izinleri sorumluları, biz öncelikle gerekir bir sertifika kullanarak oturumu açma oluşturmaoturum açma oluşturma deyim. Bu oturum açma sunucu üzerindeki izinleri yalnızca izinler tutucudur ve sunucuya bağlanmak için tasarlanmamıştır bağlanmak gerekiyor mu örnek.Bu sertifika eşlenen oturum açma sonra select izinleri üzerinde verilebilir sys.sysprocesses grant görünüm sunucu durumu kullanarak tablo deyim.Sonra usp_sysprocesses saklı yordam oluşturulduğunda, biz sonra (Bu sertifikaya karşılık gelen gerçekten özel anahtar) sertifikası ile saklı yordam imzalayabilirsiniz eklemek imza kullanarak deyim.Yeni bir rol oluşturulur ve verilen üzerinde yürütmek izni usp_sysprocesses saklı yordam.Bu rolün üye olan sonra yürütmek iznine sahip tüm kullanıcılar usp_sysprocesses saklı yordam ve böylece seçim sys.sysprocess görünümü.saat, yürütmek imzalı bir modül imzalama sertifikası ile ilişkili (grant deyim ile) sorumlusu verilen izinler çağrı süresince geçici olarak BİRLİĞİ-çalışma zamanı güvenlik simgenizi ed.Yürütme denetimi verir hemen sonra bu izinleri güvenlik belirteci kaldırılır.Bu nedenle, yalnızca yaşam'ın modül yürütme için etkili bir şekilde fazladan sahip olduğunuz küme izin.Ayrıca herhangi bir kullanıcı veya rolü, bu yordamı yürütme izinleri verilen aynı yetenekleri vardır.

Örnek

Aşağıdaki Transact-SQL komut dosyası sağlar bir örneği yukarıdaki senaryo.Sertifika oluşan bir anahtar çifti oluşturulur ve yeni bir oturum eşleştirilmiş.Bir sınama anahtar çifti ilk yaratılmalıdır MakeCert bulunan araç .NET Framework sdk.İzinleri Seç sys.sysproceses görünümü sonra ilişkili oturumu için verilen sertifika.The usp_sysprocesses managed stored procedure is created in the new database and signed with the certificate.The SysProcRole role is created and that role is granted execute permissions on the usp_sysprocesses stored procedure.Sınama kullanıcısı oluşturulur ve eklenen SysProcRole rolü.Sınama kullanıcısı bir deyim gerçekleştirir sys.sysprocess ve sonra usp_sysprocesses saklı yordam, karşılaştırma için.Komut dosyası test ortamı kurduktan sonra temizler.

use master
go

-- Create a test database.
CREATE DATABASE db_Demo
go

-- Create a certificate on the server. A test key pair can be created
-- using the MakeCert tool that ships with the .NET Framework SDK.
CREATE CERTIFICATE SysProcCert FROM FILE = 'e:\programming\testCert.cer'
go

-- Create a login and map it to the certificate.
CREATE LOGIN login_SysProcCert FROM CERTIFICATE SysProcCert
Go

-- Revoke the connect permission.
REVOKE CONNECT SQL FROM login_SysProcCert ;
go 
 
-- Grant the certificate, through the login, permission to select from sys.sysprocesses view.
GRANT VIEW SERVER STATE TO login_SysProcCert
go

-- Create a test login.
CREATE LOGIN bob WITH PASSWORD = '<enterStrongPasswordHere>'
go

-- Connect to the test database.
use db_Demo
go

-- Create the master key for the test database (used to protect 
-- private keys and certificates in the database).
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<enterStrongPasswordHere>' 

-- Create a certificate from a private key.
CREATE CERTIFICATE SysProcCert FROM FILE = 'e:\programming\testCert.cer'
WITH PRIVATE KEY
(FILE = 'e:\programming\testCert.pvk', 
 DECRYPTION BY PASSWORD= '<enterStrongPasswordHere>', 
 ENCRYPTION BY PASSWORD='<enterStrongPasswordHere>')
go 

-- Create the assembly on the server. The assembly DLL must be signed.
CREATE ASSEMBLY SysStoredProcedures
FROM 'E:\programming\SysStoredProcs.dll'
WITH PERMISSION_SET = SAFE
go 

-- Create the managed stored procedure on the server.
CREATE PROCEDURE usp_sysprocesses
AS EXTERNAL NAME SysStoredProcedures.StoredProcedures.usp_sysprocesses
go 

-- Add the signature to the stored procedure.
ADD SIGNATURE TO [dbo].[usp_sysprocesses] 
BY CERTIFICATE SysProcCert WITH PASSWORD = '<enterStrongPasswordHere>'
go 

-- Create a role.
CREATE ROLE SysProcRole
go

-- Create a test user
CREATE USER bob
go

-- Add the test user to the role.
EXEC sp_addrolemember 'SysProcRole', 'bob'
go

-- Grant execute permissions on the stored procedure to the new role.
GRANT EXECUTE ON [dbo].[usp_sysprocesses] TO SysProcRole
go
 
-- Connect as the test user.
EXECUTE AS LOGIN = 'bob'
use db_Demo
go
 
-- User only has permission to see their own processes.
SELECT * FROM sys.sysprocesses
go

-- Execute the stored procedure, which has been signed.
exec usp_sysprocesses
go

-- REVERT
REVERT
----------------------------------------------------------------------
-- Cleanup

use db_Demo
go

use master
go

DROP DATABASE db_Demo
go 

DROP login login_SysProcCert
DROP login bob
go

DROP CERTIFICATE SysProcCert
go

Aşağıdaki kaynak kodu olan usp_sysprocesses saklı yordam, bir seçim yapar * on deyimini sys.sysprocesses görünümü.Bunu oluşturulduğunda derleme imzalanması gerekir.

C#

using System;
using System.Data.SqlClient;
using Microsoft.SqlServer.Server;

public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void usp_sysprocesses()
{
    using(SqlConnection connection = new SqlConnection("context connection=true"))
    {
        connection.Open();
        SqlCommand command = new SqlCommand("SELECT * FROM sys.sysprocesses", connection);
        SqlContext.Pipe.ExecuteAndSend(command);
    }
}
};

Visual Basic

Imports System
Imports System.Data.SqlClient
Imports Microsoft.SqlServer.Server

Partial Public Class StoredProcedures
<Microsoft.SqlServer.Server.SqlProcedure()> _
Public Shared Sub  usp_sysprocesses ()
    Using connection As New SqlConnection("context connection=true")
        connection.Open()

        Dim command As New SqlCommand("SELECT * FROM sys.sysprocesses", connection)
        SqlContext.Pipe.ExecuteAndSend(command)
    End Using
End Sub
End Class