Aracılığıyla paylaş


(Veritabanı Altyapısı) imzalama modülü

Veritabanı uygulamaları genellikle, tablolar temel erişimi gerektirir ve uygulama şema nesneleri giriş düzey yordamlar ve görünümlerin mediated.Sonra kullanıcı adına alttaki nesnelere erişim düzey nesneleri, girişteki son kullanıcılara erişim vermek izin vermek amacıyla var.Son kullanıcılar böylece uygulama şemadaki tüm nesneler üzerinde erişim verilmiş olması gerekmez.Bu yaklaşımın iki amaca hizmet eder:

  • Yalnızca daha küçük alt küme küme nesne izinleri yönetilmesi, uygulama şemadaki tüm nesnelere apposed gibi izinleri yönetimini kolaylaştırır.

  • Yalnızca giriş noktaları kullanýma sunulan bu yana, son kullanıcı, şema temel düzeninden gizlemek olasıdır.

Microsoft SQL Server Bu senaryolarda, zincirleme ve yürütmek AS kullanarak sahipliği gibi elde yardımcı olan özellikler içerir deyim.Ile başlayan SQL Server 2005, SQL Server Ayrıca, modülleri veritabanı içinde oturum açma olanağı sağlar. Modül imzalama benzer yetenekler sağlar, 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şvuruyor.Daha fazla bilgi için bkz: ROLE (Transact-SQL) CREATE ve Özel bir izin kümesi oluşturmak için yürütmek AS kullanma.

Modül imzalar

SQL Server 2005 modülleri saklı yordamlar, işlevler, Tetikleyicileri veya derlemeleri gibi bir veritabanı içinde oturum özelliği kullanılmaya başlandı.veri tanımlama dili (DDL) tetikleyen Not imzalanamıyor.Dijital imza imzalayanın özel anahtar şifrelenen verileri Özeti ' dir.Özel anahtar dijital imza, bir taşıyıcı veya sahibi benzersiz olmasını gerektirir.

Imzalayan verileri imzalamak için , verileri digests, onu özel bir anahtar şifreler ve verileri şifreli bir Özet değer ekler.Imzayı doğrulamak için , veri ile bağlantılı şifrelenmiş bir Özet değer şifresini çözmek için ortak anahtar imzalayanın doğrulayıcıyı kullanır.Doğrulayıcıyı, daha sonra bu şifresi çözülmüş bir Özet değer ekindeki verileri hesaplanan Özet değerle karşılaştırır.Imzalayan hem doğrulayıcıyı aynı karma işlev verileri Özet için kullanmanız önemlidir.

Uyarı

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

Senaryosu

Us konunda bu erişimi kabul sys.sysprocesses tarafından görünümü mediatedusp_sysprocesses saklı yordam.Kullanıcıların erişebileceği sys.sysprocesses yalnızca giden bilgileriusp_sysprocesses yordamdır.Bu yana usp_sysprocesses and sys.sysprocesses nesneleri farklı sahipliklerini sahip, Sahiplik zincirleme uygulanmaz.

Ilk olarak, sertifika üzerindeki sunucu SERTIFIKASı CREATE deyim kullanarak bir anahtar çifti oluşturulmalıdır.Biz sonra izinleri seçmek için sertifika vermelisiniz sys.sysprocesses tablosudur.Ancak, çünkü SQL Server Biz önce gelen bir oturum oluşturmak gerekir, ilkeleri, izinleri yalnızca verir sertifika LOGIN CREATE deyim ile. Bu oturum, sunucu üzerindeki izinleri, yalnızca izinleri tutucudur ve sunucu kopyasına bağlanmak için tasarlanmamıştır bağlanmak gerekmez.Bu sertifika eşlenen oturumu sonra SELECT izinlerine göre verilebilir sys.sysprocesses tablo GRANT VIEW SERVER DURUM IÇIN kullanarak deyim.Sonra usp_sysprocesses saklı yordam oluşturulduğunda, size sonra (Bu sertifikaya karşılık gelen gerçekten özel anahtar) sertifika saklı yordamını imzalayabilirsiniz ADD SIGNATURE deyimini kullanarak.Yeni BIR rol oluşturulur ve verilen üzerinde yürütmek iznine usp_sysprocesses saklı yordam.Bu rolün bir üyesi olduğunuzu sonra yürütmek iznine sahip tüm kullanıcılar usp_sysprocesses saklı yordamını ve böylece SELECT.sys.sysprocess görüntüleyin.Imzalı bir modüle yürütmek izinleri için imzalama sertifikasıyla ilişkili anapara (GRANT deyim ile) geçici olarak UNION ed çalışma zamanı güvenlik simgenizi çağrı saat için olur.Yürütme denetimi veren hemen sonra bu izinleri kendi güvenlik belirteçten kaldırılır.Bu nedenle, yalnızca süresi modül yürütme için, etkin fazladan bir izinler kümesi vardır.Ayrıca, başka bir kullanıcı veya rolün, yürütmek izinleri, bu yordam hakkında aynı yetenekleri gerekir.

Örnek

Aşağıdaki Transact-SQL komut dosyası, yukarıdaki senaryoda örneği sağlar. Sertifika, bir anahtar çifti oluşturulan ve yeni bir oturum için eşleştirilmiş.Önce BIR sınama anahtar çifti oluşturulmalıdır MakeCert ile araç.NET Framework sdk. Izinleri seçin sys.sysproceses görünümü sonra verilen sertifika ile ilişkili oturumu için.The usp_sysprocesses managed saklı yordam is created in the new database and signed with the sertifika.The SysProcRole role is created and that role is granted yürütmek permissions on the usp_sysprocesses saklı yordam.Bir sınama kullanıcısı oluşturulur ve eklenen SysProcRole roldür.Sınama kullanıcı bir deyim üzerinde gerçekleştirir. sys.sysprocess ve sonra yürütür.usp_sysprocesses saklı yordam, karşılaştırma için.Komut dosyası, daha sonra sınama ortamını 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

Kaynak kodu aşağıda verilmektedir usp_sysprocesses saklı yordam, olan bir SELECT yapar * ekstresindesys.sysprocesses görüntüleyin.Oluşturulduğunda bu derlemeye imzalanmalıdır.

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