মডিউল সাইনিং ব্যবহার করে খুব নিরাপদ উপায়ে এটি সম্পাদন করা সহজ। এটি ডিবিএ.স্ট্যাকএক্সচেঞ্জ-এ আমার নিম্নলিখিত দুটি জবাবের সমান হবে, যা কেবল এটি করার উদাহরণ দেয়:
হিসাবে চালানো, ক্রস ডাটাবেস কোয়েরি এবং মডিউল স্বাক্ষর সহ পদ্ধতি সুরক্ষিত
ক্রস ডাটাবেস শংসাপত্র ব্যবহার করার সময় ট্রিগারগুলিতে অনুমতি
এই নির্দিষ্ট প্রশ্নের পার্থক্য হ'ল এটি একটি দর্শনের সাথে সম্পর্কিত এবং ভিউগুলিতে স্বাক্ষর করা যায় না। সুতরাং, আপনাকে ভিউটি একটি বহু-বিবৃতি টেবিল-মূল্যযুক্ত ফাংশন (টিভিএফ) এ রূপান্তর করতে হবে কারণ সেগুলিতে সাইন ইন করা যেতে পারে এবং একটি দৃশ্যের মতো অ্যাক্সেস করা যায় (ভালভাবে, SELECT
অ্যাক্সেসের জন্য )।
নিম্নলিখিত উদাহরণ কোডটিতে লগইন / ব্যবহারকারী "রিস্ট্রাকটেড ইউজার" কেবল "ডাটাবেসএ" এ অ্যাক্সেস পেয়েছে এবং এখনও "ডাটাবেসবি" থেকে ডেটা পেতে সক্ষম হয়েছে এমন প্রশ্নের মধ্যে অনুরোধ করা হচ্ছে ঠিক তা করছে তা দেখায়। এটি কেবলমাত্র এই একটি টিভিএফ থেকে নির্বাচন করে কাজ করে এবং কেবল এটি স্বাক্ষরিত হওয়ার কারণে।
ভিউ ব্যবহার করার সময় এই ধরণের ক্রস-ডাটাবেস অ্যাক্সেস সম্পন্ন করা এবং ব্যবহারকারীর কোনও অতিরিক্ত অনুমতি না দেওয়ার জন্য ক্রস-ডাটাবেস মালিকানা চেইন সক্ষম করা প্রয়োজন। এটি অনেক কম সুরক্ষিত কারণ এটি উভয় ডেটাবেসগুলির মধ্যে থাকা সমস্ত সামগ্রীর জন্য সম্পূর্ণ উন্মুক্ত (এটি কিছু নির্দিষ্ট বস্তু এবং / অথবা ব্যবহারকারীদের মধ্যে সীমাবদ্ধ করা যায় না)। মডিউল সইনিং কেবল এই একটি টিভিএফকে ক্রস-ডিবি অ্যাক্সেসের অনুমতি দেয় (ব্যবহারকারীর অনুমতি নেই, টিভিএফের অনুমতি নেই) এবং যে ব্যবহারকারীরা SELECT
টিভিএফ থেকে পারেন না তাদের "ডাটাবেসবি" -এর অ্যাক্সেস নেই।
USE [master];
CREATE LOGIN [RestrictedUser] WITH PASSWORD = 'No way? Yes way!';
GO
---
USE [DatabaseA];
CREATE USER [RestrictedUser] FOR LOGIN [RestrictedUser];
GO
CREATE FUNCTION dbo.DataFromOtherDB()
RETURNS @Results TABLE ([SomeValue] INT)
AS
BEGIN
INSERT INTO @Results ([SomeValue])
SELECT [SomeValue]
FROM DatabaseB.dbo.LotsOfValues;
RETURN;
END;
GO
GRANT SELECT ON dbo.[DataFromOtherDB] TO [RestrictedUser];
GO
---
USE [DatabaseB];
CREATE TABLE dbo.[LotsOfValues]
(
[LotsOfValuesID] INT IDENTITY(1, 1) NOT NULL
CONSTRAINT [PK_LotsOfValues] PRIMARY KEY,
[SomeValue] INT
);
INSERT INTO dbo.[LotsOfValues] VALUES
(1), (10), (100), (1000);
GO
---
USE [DatabaseA];
SELECT * FROM dbo.[DataFromOtherDB]();
EXECUTE AS LOGIN = 'RestrictedUser';
SELECT * FROM dbo.[DataFromOtherDB]();
/*
Msg 916, Level 14, State 1, Line XXXXX
The server principal "RestrictedUser" is not able to access
the database "DatabaseB" under the current security context.
*/
REVERT;
উপরের সমস্ত পদক্ষেপের বর্তমান পরিস্থিতিটি পুনরায় তৈরি করুন: ব্যবহারকারীর ডেটাবেসএতে অ্যাক্সেস রয়েছে, ডাটাবেসএতে কোনও বস্তুর সাথে ইন্টারঅ্যাক্ট করার অনুমতি রয়েছে, তবে ডাটাবেসএতে সেই অবজেক্টের কারণে একটি ত্রুটি ঘটে যেখানে ব্যবহারকারীর অ্যাক্সেস নেই।
নীচের পদক্ষেপগুলি মডিউল গাওয়া সেট আপ করে। এটি নিম্নলিখিতগুলি করে:
- ডাটাবেসএতে একটি শংসাপত্র তৈরি করে
- শংসাপত্র দিয়ে টিভিএফ স্বাক্ষর করে
- শংসাপত্র (ব্যক্তিগত কী ব্যতীত) ডাটাবেস বিতে অনুলিপি করে
- শংসাপত্র থেকে ডেটাবেসবিতে একটি ব্যবহারকারী তৈরি করে
- মঞ্জুর
SELECT
শংসাপত্র ভিত্তিক ব্যবহারকারী DatabaseB মধ্যে ছক করার অনুমতি
মডিউল স্বাক্ষরকারী সেটআপ:
CREATE CERTIFICATE [AccessOtherDB]
ENCRYPTION BY PASSWORD = 'SomePassword'
WITH SUBJECT = 'Used for accessing other DB',
EXPIRY_DATE = '2099-12-31';
ADD SIGNATURE
TO dbo.[DataFromOtherDB]
BY CERTIFICATE [AccessOtherDB]
WITH PASSWORD = 'SomePassword';
---
DECLARE @CertificatePublicKey NVARCHAR(MAX) =
CONVERT(NVARCHAR(MAX), CERTENCODED(CERT_ID(N'AccessOtherDB')), 1);
SELECT @CertificatePublicKey AS [Cert / PublicKey]; -- debug
EXEC (N'USE [DatabaseB];
CREATE CERTIFICATE [AccessOtherDB] FROM BINARY = ' + @CertificatePublicKey + N';');
---
EXEC (N'
USE [DatabaseB];
CREATE USER [AccessOtherDbUser] FROM CERTIFICATE [AccessOtherDB];
GRANT SELECT ON dbo.[LotsOfValues] TO [AccessOtherDbUser];
');
---
EXECUTE AS LOGIN = 'RestrictedUser';
SELECT * FROM dbo.[DataFromOtherDB]();
-- Success!!
SELECT * FROM [DatabaseB].[dbo].[LotsOfValues];
/*
Msg 916, Level 14, State 1, Line XXXXX
The server principal "RestrictedUser" is not able to access
the database "DatabaseB" under the current security context.
*/
REVERT;
যদি যাইহোক , যদি কোনও কারণে দৃষ্টিভঙ্গি হওয়ার প্রয়োজন হয়, তবে আপনি কেবলমাত্র এমন একটি ভিউ তৈরি করতে পারবেন যা উপরের দেখানো টিভিএফ থেকে নির্বাচন করে। এবং, যে পরিস্থিতিতে, SELECT
এক্সেস নেই না TVF, শুধুমাত্র দৃশ্যে মঞ্জুর করা, নিচের প্রদর্শিত প্রয়োজন:
GO
CREATE VIEW dbo.[DataFromTVF]
AS
SELECT [SomeValue]
FROM dbo.DataFromOtherDB();
GO
-- Remove direct access to the TVF as it is no longer needed:
REVOKE SELECT ON dbo.[DataFromOtherDB] FROM [RestrictedUser];
GRANT SELECT ON dbo.[DataFromTVF] TO [RestrictedUser];
এবং এখন এটি পরীক্ষা করতে:
EXECUTE AS LOGIN = 'RestrictedUser';
SELECT * FROM dbo.[DataFromOtherDB]();
/*
Msg 229, Level 14, State 5, Line XXXXX
The SELECT permission was denied on the object 'DataFromOtherDB',
database 'DatabaseA', schema 'dbo'.
*/
SELECT * FROM [OwnershipChaining].[dbo].[LotsOfValues];
/*
Msg 916, Level 14, State 1, Line XXXXX
The server principal "RestrictedUser" is not able to access
the database "DatabaseB" under the current security context.
*/
SELECT * FROM dbo.[DataFromTVF];
-- Success!!
REVERT;
মডিউল স্বাক্ষর সম্পর্কিত আরও তথ্যের জন্য, দয়া করে এখানে যান: https://ModuleSigning.Info/