نقش Public در SQL Server: راهنمای جامع مدیریت و افزایش امنیت مجوزها
درک نقش `public` در SQL Server برای طراحی امنیتی پایگاه داده بسیار حیاتی است. بسیاری از مدیران پایگاه داده و توسعهدهندگان به اشتباه تصور میکنند که نقش `public` بهطور پیشفرض هیچ مجوزی ندارد، در حالی که این موضوع میتواند منجر به آسیبپذیریهای امنیتی جدی شود. این مقاله به بررسی دقیق نقش `public`، نحوه عملکرد آن و بهترین شیوهها برای مدیریت مؤثر مجوزها میپردازد تا امنیت دادههای شما را تضمین کند.
نقش `public` یک نقش ویژه در SQL Server است که تمام کاربران پایگاه داده، صرف نظر از اینکه به صراحت به آن اختصاص داده شده باشند یا خیر، بهطور خودکار عضو آن محسوب میشوند. به عبارت دیگر، هر `login` در SQL Server که بهعنوان کاربر در یک پایگاه داده معین نقش دارد، بهطور پیشفرض عضو نقش `public` آن پایگاه داده است. این بدان معناست که هر مجوزی که به نقش `public` اعطا (GRANT) شود، بهطور خودکار برای همه کاربران آن پایگاه داده در دسترس خواهد بود، مگر اینکه آن مجوز بهطور صریح از کاربر خاصی رد (DENY) یا باطل (REVOKE) شده باشد.
برای روشنتر شدن این موضوع، اجازه دهید مثالی را بررسی کنیم. فرض کنید یک `login` جدید به نام `NewLogin` ایجاد کردهایم و آن را بهعنوان کاربر `NewUser` به پایگاه داده `TestDB` نگاشت (map) کردهایم، بدون اینکه هیچ نقش یا مجوز دیگری به آن اعطا کنیم.
ابتدا یک `login` و کاربر جدید ایجاد میکنیم:
USE master;
GO
CREATE LOGIN NewLogin WITH PASSWORD = 'YourStrongPassword!', CHECK_POLICY = ON;
GO
USE TestDB;
GO
CREATE USER NewUser FOR LOGIN NewLogin;
GO
اکنون، بدون اعطای هیچ مجوز اضافی به `NewUser` یا `NewLogin`، به پایگاه داده `TestDB` وارد میشویم. اگر در این حالت، مجوز `CREATE TABLE` به نقش `public` در `TestDB` اعطا شده باشد، `NewUser` میتواند جداول جدیدی ایجاد کند.
برای بررسی مجوزهای اعطا شده به `public` میتوانید از کوئری زیر استفاده کنید:
USE TestDB;
GO
SELECT
dp.permission_name,
dp.state_desc,
dp.class_desc,
OBJECT_NAME(dp.major_id) AS ObjectName
FROM sys.database_permissions AS dp
JOIN sys.database_principals AS dpr ON dp.grantee_principal_id = dpr.principal_id
WHERE dpr.name = 'public';
GO
این کوئری تمام مجوزهایی را که بهطور مستقیم به نقش `public` در پایگاه داده `TestDB` اعطا شدهاند، نمایش میدهد. توجه داشته باشید که در بسیاری از موارد، مجوزهای `CONNECT` به `public` اعطا شدهاند که برای ورود کاربران به پایگاه داده ضروری است.
سناریوی عملی: مجوزهای ناخواسته از طریق `public`
تصور کنید مدیر سیستم (DBA) یا توسعهدهندهای بهطور ناخواسته، مجوز `CREATE TABLE` را به `public` اعطا کرده است:
USE TestDB;
GO
GRANT CREATE TABLE TO public;
GO
با این عمل، اکنون هر کاربری در `TestDB`، حتی `NewUser` که هیچ مجوز صریحی برای ایجاد جدول ندارد، میتواند جداول جدیدی ایجاد کند. این وضعیت میتواند یک حفره امنیتی بزرگ باشد.
برای اثبات این موضوع، بهعنوان `NewLogin` وارد شوید و سعی کنید جدولی ایجاد کنید:
USE TestDB;
GO
CREATE TABLE PublicTableTest (
ID INT PRIMARY KEY,
Name NVARCHAR(50)
);
GO
اگر این دستور با موفقیت اجرا شود، نشاندهنده این است که `NewUser` از طریق نقش `public` مجوز `CREATE TABLE` را به ارث برده است.
مدیریت صحیح و افزایش امنیت با `REVOKE` کردن از `public`
بهترین رویکرد این است که هیچ مجوز اضافیای را به نقش `public` اعطا نکنید، مگر اینکه کاملاً ضروری باشد و بدانید که چه تأثیری بر همه کاربران خواهد داشت. در حالت ایدهآل، فقط مجوز `CONNECT` باید به `public` اعطا شود و سایر مجوزها باید به نقشها یا کاربران خاصی که به آنها نیاز دارند، اعطا شوند.
برای باطل کردن مجوز `CREATE TABLE` از `public`، دستور زیر را اجرا کنید:
USE TestDB;
GO
REVOKE CREATE TABLE FROM public;
GO
پس از اجرای این دستور، `NewUser` دیگر نمیتواند جداول ایجاد کند، مگر اینکه مجوز `CREATE TABLE` بهطور مستقیم به `NewUser` یا نقشی که `NewUser` عضو آن است، اعطا شود.
همین مفهوم برای مجوزهای `SELECT`, `INSERT`, `UPDATE`, `DELETE` و سایر مجوزهای شیئی و پایگاه داده صدق میکند. اگر میخواهید همه کاربران به یک شیء خاص دسترسی `SELECT` داشته باشند، بهتر است آن مجوز را بهجای `public`، به یک نقش سفارشی (مثلاً `db_data_readers_custom`) اعطا کرده و سپس کاربران مورد نظر را عضو آن نقش کنید. این روش کنترل دقیقتری بر دسترسیها فراهم میکند.
ملاحظات مهم:
اصل حداقل امتیاز (Principle of Least Privilege): همیشه به کاربران و نقشها فقط حداقل مجوزهای لازم برای انجام وظایفشان را اعطا کنید. این یک اصل اساسی در امنیت سایبری است.
بازبینی منظم: مجوزهای اعطا شده به `public` و سایر نقشها را بهطور منظم بازبینی کنید تا اطمینان حاصل شود که هیچ مجوز غیرضروری یا ناخواستهای وجود ندارد.
استفاده از نقشهای سفارشی: برای گروهبندی مجوزها و کاربران، از نقشهای پایگاه داده سفارشی استفاده کنید. این کار مدیریت مجوزها را سادهتر و امنتر میکند.
با درک عمیقتر از نقش `public` و اعمال بهترین شیوههای مدیریت مجوزها، میتوانید بهطور قابل توجهی امنیت پایگاه داده SQL Server خود را افزایش دهید و از دسترسیهای ناخواسته به دادههای حساس جلوگیری کنید. این رویکرد به شما کمک میکند تا یک محیط پایگاه داده پایدار و امن داشته باشید.