এসকিউএল সার্ভার সারি সারি অ্যাক্সেস


10

আমার মতো টেবিলের কাঠামো রয়েছে (সরলীকৃত)

Name, EMail, LastLoggedInAt

আমার এসকিউএল সার্ভারে (রিমোট ইউজার) একটি ব্যবহারকারী রয়েছে যেখানে কেবলমাত্র লাস্টলগডইএনএইচ ক্ষেত্রটি শূন্য নয় এমন ডেটা দেখতে (একটি নির্বাচিত ক্যোয়ারীর মাধ্যমে) দেখতে পারা উচিত।

দেখে মনে হচ্ছে আমি এইটা করতে পারি? এটা কি সম্ভব?


এখানে সারি-স্তর নিরাপত্তা জন্য বই অনলাইন বিষয়ে দেওয়া হল: docs.microsoft.com/en-us/sql/relational-databases/security/...
ডেভিড ব্রাউনি - মাইক্রোসফট

উত্তর:


32

এসকিউএল সার্ভার সুরক্ষা মডেল আপনাকে অন্তর্নিহিত সারণীতে অ্যাক্সেস না দিয়ে কোনও দৃশ্যে অ্যাক্সেসের অনুমতি দেয়।

যেহেতু উদাহরণ কোডটি একটি ধারণা দেখানোর দুর্দান্ত উপায়, নীচে একটি LoginDetailsটেবিল সহ এবং অনুরূপ দৃষ্টিভঙ্গিটি বিবেচনা করুন:

CREATE TABLE dbo.LoginDetails
(
    Username nvarchar(100) NOT NULL
    , EmailAddress nvarchar(256) NOT NULL
    , LastLoggedInAt datetime NULL
);
GO

CREATE VIEW dbo.LoginDetailsView
AS
SELECT ld.Username
    , ld.EmailAddress
    , ld.LastLoggedInAt
FROM dbo.LoginDetails ld
WHERE ld.LastLoggedInAt IS NOT NULL;
GO

আমরা একটি লগইন এবং একটি ব্যবহারকারী তৈরি করব, তারপরে সেই ব্যবহারকারীর সারণীটি দেখার কোনও অধিকার ছাড়াই ভিউ থেকে সারি নির্বাচন করার অধিকার নির্ধারণ করব।

CREATE LOGIN RemoteUser 
WITH PASSWORD = '2q1345lkjsadfgsa0(*';

CREATE USER RemoteUser
FOR LOGIN RemoteUser
WITH DEFAULT_SCHEMA = dbo;

GRANT SELECT ON dbo.LoginDetailsView TO RemoteUser;

এখন, আমরা দুটি পরীক্ষার সারি সন্নিবেশ করবো:

INSERT INTO dbo.LoginDetails(Username, EmailAddress, LastLoggedInAt)
VALUES ('user x', 'x@y.com', NULL)
    , ('user y', 'y@y.com', GETDATE());

এটি সুরক্ষা মডেলটি পরীক্ষা করে। প্রথম SELECTবিবৃতিটি সফল হয়, যেহেতু এটি ভিউ থেকে নির্বাচন করা হচ্ছে, অন্যদিকে দ্বিতীয় SELECTবিবৃতি ব্যর্থ হয়েছে কারণ ব্যবহারকারীর টেবিলটিতে সরাসরি অ্যাক্সেস নেই।

EXECUTE AS LOGIN = 'RemoteUser';

SELECT *
FROM dbo.LoginDetailsView;
╔══════════╦══════════════╦═══════════════════════ ══╗
║ ব্যবহারকারীর নাম ║ ইমেল অ্যাড্রেস ║ লাস্টলগডইনআ্যাট ║ ║
╠══════════╬══════════════╬═══════════════════════ ══╣
Y ব্যবহারকারী y ║ y@y.com ║ 2018-02-15 07: 36: 54.490 ║
╚══════════╩══════════════╩═══════════════════════ ══╝
SELECT *
FROM dbo.LoginDetails;

REVERT

আপনার প্রশ্নের প্রয়োজন অনুসারে LastLoggedInAtমানটি থেকে প্রাপ্ত ফলাফলগুলি সারিটি বাদ দিন NoteNULL

SELECTঅন্তর্নিহিত টেবিলের বিপরীতে দ্বিতীয় বিবৃতিটি একটি ত্রুটি প্রদান করে:

এমএসজি 229, স্তর 14, রাজ্য 5, লাইন 28
বস্তু 'লগইনডেটেলস', ডাটাবেস 'টেম্পডিবি', স্কিমা 'ডিবিও' তে SELECT অনুমতি অস্বীকার করা হয়েছিল।

পরিষ্কার কর:

DROP USER RemoteUser;
DROP LOGIN RemoteUser;
DROP VIEW dbo.LoginDetailsView;
DROP TABLE dbo.LoginDetails;

পর্যায়ক্রমে, যদি আপনার এসকিউএল সার্ভার 2016 বা আরও নতুন হয় তবে আপনি নির্দিষ্ট ব্যবহারকারীদের একটি নাল LastLoggedInAtমান সহ রোধ করতে রোধ করতে একটি সারি-স্তরের-সুরক্ষা-প্রিকিকেট ব্যবহার করতে পারেন ।

প্রথমত, আমরা সেই লগইনের জন্য সারণী, একটি লগইন, ব্যবহারকারী তৈরি করি এবং আমরা টেবিলটিতে অ্যাক্সেস প্রদান করি:

CREATE TABLE dbo.LoginDetails
(
    Username nvarchar(100) NOT NULL
    , EmailAddress nvarchar(256) NOT NULL
    , LastLoggedInAt datetime NULL
);
GO

CREATE LOGIN RemoteUser 
WITH PASSWORD = '2q1345lkjsadfgsa0(*';

CREATE USER RemoteUser
FOR LOGIN RemoteUser
WITH DEFAULT_SCHEMA = dbo;

GRANT SELECT ON dbo.LoginDetails TO RemoteUser;

এর পরে, আমরা কয়েকটি নমুনা সারি সন্নিবেশ করি। নাল দিয়ে একটি সারি LastLoggedInAtএবং সেই কলামটির জন্য একটি নন-নাল মান সহ।

INSERT INTO dbo.LoginDetails(Username, EmailAddress, LastLoggedInAt)
VALUES ('user x', 'x@y.com', NULL)
    , ('user y', 'y@y.com', GETDATE());

এখানে, আমরা একটি স্কিমা-সীমাবদ্ধ টেবিল-মানযুক্ত-ফাংশন তৈরি করছি যা ফাংশনে স্থানান্তরিত হবে @LastLoggedInAtএবং @usernameভেরিয়েবলের মানের উপর নির্ভর করে 0 বা 1 দিয়ে একটি সারি দেয়। এই ফাংশনটি আমরা নির্দিষ্ট ব্যবহারকারীর কাছ থেকে যে সারিগুলি আড়াল করতে চাই তা সরিয়ে দিতে ফিল্টার-প্রিডিকেট দ্বারা ব্যবহৃত হবে।

CREATE FUNCTION dbo.fn_LoginDetailsRemoteUserPredicate
(
    @LastLoggedInAt datetime
    , @username sysname
)  
RETURNS TABLE  
WITH SCHEMABINDING  
AS  
    RETURN SELECT 1 AS fn_securitypredicate_result   
    WHERE (@username = N'RemoteUser' AND @LastLoggedInAt IS NOT NULL)
        OR @username <> N'RemoteUser';  
GO

এটি সিকিউরিটি ফিল্টার যা টেবিলের SELECTবিপরীতে চালানো বিবৃতিগুলি থেকে সারিগুলি সরিয়ে দেয় dbo.LoginDetails:

CREATE SECURITY POLICY LoginDetailsRemoteUserPolicy
ADD FILTER PREDICATE dbo.fn_LoginDetailsRemoteUserPredicate(LastLoggedInAt, USER_NAME())
ON dbo.LoginDetails
WITH (STATE=ON);

উপরের ফিল্টারটি dbo.fn_LoginDetailsRemoteUserPredicateবর্তমান ব্যবহারকারীর নাম সারণী LastLoggedInAtথেকে কলামের জন্য প্রতিটি সারি থেকে আসা মানগুলি সহ ফাংশনটি ব্যবহার করে dbo.LoginDetails

যদি আমরা সাধারণ ব্যবহারকারী হিসাবে টেবিলটি জিজ্ঞাসা করি:

SELECT *
FROM dbo.LoginDetails

আমরা সমস্ত সারি দেখতে পাই:

╔══════════╦══════════════╦═══════════════════════ ══╗
║ ব্যবহারকারীর নাম ║ ইমেল অ্যাড্রেস ║ লাস্টলগডইনআ্যাট ║ ║
╠══════════╬══════════════╬═══════════════════════ ══╣
║ ব্যবহারকারী x ║ x@y.com ║ NULL ║ ║
Y ব্যবহারকারী y ║ y@y.com ║ 2018-02-15 13: 53: 42.577 ║ ║
╚══════════╩══════════════╩═══════════════════════ ══╝

তবে, যদি আমরা পরীক্ষা করি RemoteUser:

EXECUTE AS LOGIN = 'RemoteUser';

SELECT *
FROM dbo.LoginDetails

REVERT

আমরা কেবল "বৈধ" সারিগুলি দেখতে পাই:

╔══════════╦══════════════╦═══════════════════════ ══╗
║ ব্যবহারকারীর নাম ║ ইমেল অ্যাড্রেস ║ লাস্টলগডইনআ্যাট ║ ║
╠══════════╬══════════════╬═══════════════════════ ══╣
Y ব্যবহারকারী y ║ y@y.com ║ 2018-02-15 13: 42: 02.023 ║
╚══════════╩══════════════╩═══════════════════════ ══╝

এবং, আমরা পরিষ্কার:

DROP SECURITY POLICY LoginDetailsRemoteUserPolicy;
DROP FUNCTION dbo.fn_LoginDetailsRemoteUserPredicate;
DROP USER RemoteUser;
DROP LOGIN RemoteUser;
DROP TABLE dbo.LoginDetails;

সচেতন থাকুন যে স্কিমা-এইভাবে কোনও ফাংশনটি টেবিলের সাথে আবদ্ধ করার ফলে ফিল্টারের প্রাকটিকেট এবং dbo.fn_LoginDetailsRemoteUserPredicateফাংশনটিকে প্রথমে না ফেলে টেবিলের সংজ্ঞাটি সংশোধন করা অসম্ভব করে তোলে ।


জমকালো উত্তর - ধন্যবাদ! এই 2 টি পদ্ধতির পারফরম্যান্সের প্রভাব কী। আমরা খুঁজে পেয়েছি যে আমরা যখন ফাংশনটি ব্যবহার করি তখন আমাদের ওয়েব অ্যাপ্লিকেশনটি 5 গুণ বেশি ধীর হয়। ভিউ পদ্ধতির দিকে নজর দেওয়া দরকার।
লিয়ামব

সারি-স্তর-সুরক্ষা ফাংশনটি প্রতিটি সারণী থেকে পঠিত প্রতিটি সারির জন্য মূল্যায়ন করা হয়; আমি আশা করি এটির সেই টেবিলে উল্লেখযোগ্যভাবে অ্যাক্সেসটি কমবে। অন্যদিকে, দর্শনটির LastLoggedInAtকলামে আপনি একটি দরকারী সূচক তৈরি করে ধরে নিয়ে পারফরম্যান্সের উপর নগণ্য প্রভাব ফেলতে হবে ।
ম্যাক্স ভার্নন

এটি উপলব্ধি করে - আমি এখন দেখুন দেখুন, ভাল কাজ করছে বলে মনে হচ্ছে! আমরা যদি চাইতাম যে এই সারিগুলির জন্য ব্যবহারকারী কেবলমাত্র ডেটা সম্পাদনা করতে সক্ষম হয়েছে যা মাপদণ্ডের সাথে মেলে তা দর্শন দিয়ে কী সম্ভব?
লিয়ামাম

এটি সুন্দর, সবকটি কাজ - এটির সাহায্যের জন্য ধন্যবাদ
লিয়ামাম

হ্যাঁ, আপনি দৃশ্যের মাধ্যমে সারিগুলি সম্পাদনা করতে পারেন
ম্যাক্স ভার্নন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.