سلام
از طرف دوستان عزيز سوالات مكرري در مورد حفاظت فيزيكي پرسيده مي شه. اول يه توضيح مختصر در مورد دو نوع حفاظت و سپس يه توضيح مشروح در مورد حفاظت فيزيكي مي دم.
ببينين دو نوع حفاظت از اطلاعات داريم.
الف - حفاظت از طريق كنترل دسترسي ها (يه جوري بگيم حفاظت نرم افزاري يا سيستمي)
ب- حفاظت فيزيكي
قسمت اول كه همون تعريف لاگين ها و يوزر هاست. اين قسمت الزام كار با DB ها هم هست . چرا كه بدون دسترسي امكان مشاهده اطلاعات و كار با اونها وجود نداره.
نوع دوم حفاظت فيزيكي است. يعني حفاظت از فايل ها. اين موضوع به هيچ طريقي با ابزار الف يا همون لاگين ها و يوزر ها تامين نمي شود.
چرا كه اگه كسي به فايل ها دسترسي پيدا كرد و امكان داشت كه اونو روي سرور ديگري Attach كنه ، سيستم به لاگين و يوزر ها اصلا نگاه نمي كنه و اونو در سرور جديد بالا مي ياره.
اما چه كنيم كه حفاظت فيزيكي هم داشته باشيم.
-------------------------------------------------
Data Encryption
مقدمه
يكي از مهمترين نگراني (concern) هاي يك DBA درز كردن اطلاعات (data leak) است. براي مقابله با آن كليه دسترسيها در سطح كاربري تنظيم و مكررا مرور مي شود. اما به يك سطح حفاظت بيشتر نيز نياز است. حافظت فيزيكي !! بله درست است. بايد فايل هاي داده اي و لاگ sqlserver نيز محافظت شوند.
براي اين منظور در sql server 2008 امكان جديدي با نام Transparent Data Encryption (TDE) اضافه شده است.
در اولين نگاه بايد بدانيم كه encryption چيست ؟
encryption يعني ترجمه و رمز كردن اطلاعات از طريق يك رمزنگار و يا يك الگوريتم بصورتيكه كسي نتواند اطلاعات رابخواند مگر اينكه كليد را داشته باشد.
دو نوع كليد براي اين عمليات وجود دارد :
1- symmetric : يعني اينكه يك كليد براي رمز نگاري و رمز گشايي استفاده مي شود.
2- asymmetric : يعني يك كليد (Privat key) براي رمز نگاري و كليد دوم (Public key) براي رمز گشايي.
TDE چيست ؟
TDE يك سطح از Encryption بانك اطلاعاتي است كه هم فايل داده و هم فايل Log را رمزنگاري مي كند.
اين تعريف در واژه نامه ميكروسافت به اين ترتيب آمده است :
TDE عمليات رمز نگاري و رمزگشايي را بصورت همزمان و هرزمان (Realtime) روي فايل هاي داده و لاگ انجام مي دهد. براي رمزنگاري از database encryption key (DEK) استفاده مي كند. DEK يك كليد از نوع Symetric است كه خودش توسط يك certificate محافظت مي شود كه اين certificate در بانك اطلاعاتي master ذخيره شده است.
يكي از مزاياي مهم TDE اين است كه براي فعال سازي و استفاده از آن نبايد به برنامه كاربردي (application) خود دست بزنيد.
Sql server اين عمليات را از طريق يك share Lock انجام ميدهد.
قبل از اينكه مشتاق استفاده از اين روش بشويد حتما تا انتهاي مقاله پيش برويد و از خطرات و اشكالات آن هم مطلع شويد.
چگونه از TDE استفاده كنيم ؟
4 مرحله براي setup كردن آن وجود دارد :
1- ايجاد يك Master Key
2- ايجاد يا دريافت يك Certificate Protected توسط master key
3- ايجاد يك database Key و protect كردن آن توسط Certificate
4- Set كردن يك ديتابيس به منظور استفاده از Encryption
اكنون مثال هاي اجرايي از اين مكانيزم : (دقت شود هيچ موقع مثال ها را براي بار اول روي بانكهاي اصلي خود اجرا نكنيد. )
مرحله اول : ايجاد Master Key
اين كليد در بانك اطلاعاتي master ايجاد مي شود. فقط قبل از ايجاد بايد مطمئن شويد كه قبلا ايجاد نشده است.
USE master;
GO
SELECT * FROM sys.symmetric_keys WHERE name LIKE '%MS_DatabaseMasterKey%'
GO
اگر نتيجه اين query ركوردي بود، به اين معني است كه شما قبلا يك master key ايجاد كرده ايد.
اگر master key نداشته باشد:
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '12345';
GO
مرحله دوم : ايجاد يك certificate توسط Master Key است
قبل ازايجاد آن چك مي كنيم كه با نام مورد نظر ما قبلا certificate ايجاد شده يا نه ؟
SELECT * FROM sys.certificates where [name] = 'Your Certificate Name'
GO
اكنون براي ايجاد آن اقدام مي كنيم.
CREATE CERTIFICATE MyTDECert WITH SUBJECT = 'My TDE Certificate'
GO
اگر select بالا را اجرا كنيم، نتيجه ركوردي است كه ستون نام آن MyTDECert مي باشد.
مرحله سوم : ايجاد يك Encryption Key و Protect كردن آن توسط certificate مي باشد.
اين مرحله حساس است و حتما بايد مراقب باشيد. (روي بانك اطلاعاتي تستي بانام AdventureWorks)
Use AdventureWorks
GO
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM = AES_128
ENCRYPTION BY SERVER CERTIFICATE MyTDECert
GO
بعد از اجراي اين دستور چنين پيغامي مي گيريد كه مهم است و بايد به دقت آنرا بخوانيد :
Warning: The certificate used for encrypting the database encryption key has not been backed up. You should immediately back up the certificate and the private key associated with the certificate. If the certificate ever becomes unavailable or if you must restore or attach the database on another server, you must have backups of both the certificate and the private key or you will not be able to open the database
اين موضوع توضيح داده خواهد شد.
اكنون مرحله آخر :
مرحله چهارم : فعال كردن Encryption در بانك اطلاعاتي است.
ALTER DATABASE AdventureWorks
SET ENCRYPTION ON
GO
در صورتيكه بانك شما سنگين باشد اين مرحله قدري طول خواهد كشيد.
بعد از آن شما به اين اسكريپت پي خواهيد برد كه آيا بانك اطلاعاتي شما رمزنگاري شده است.
SELECT DB_NAME(database_id) AS DatabaseName, * FROM sys.dm_database_encryption_keys
نتيجه براي يك db دو ركورد است. يكي خودش يكي tempdb.
حالا سوال ؟
آيا Encryption واقعا كار مي كنه ؟
اين مراحل رو براي تست دنبال مي كنيم.
1- از بانك اطلاعاتي Encrypt شده يك Backup مي گيريم.
BACKUP DATABASE [AdventureWorks] TO DISK = N'D:\BackUp\AdventureWorks_Encrypted.bak' WITH NOFORMAT, NOINIT,
NAME = N'AdventureWorks-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, STATS = 10
2- خوب مرحله بعد اينه كه اين Backup رو روي يك سرور ديگه و يا يك Instance ديگه روي همين سرور Restore كنيم. در اين مثال روي يك سرور ديگه Restore مي كنيم.
RESTORE DATABASE [AdventureWorks]
FROM DISK = N'D:\AdventureWorks_Encrypted.bak'
WITH FILE = 1,
MOVE N'AdventureWorks' TO N'D:\BackUp\AdventureWorks.mdf',
MOVE N'AdventureWorks_log' TO N'D:\BackUp\AdventureWorks_log.ldf',
NOUNLOAD, STATS = 10
GO
اگه Encription درست انجام شده باشه در اين مرحله بايد خطاي زير رو بگيريد :
Msg 33111, Level 16, State 3, Line 1
Cannot find server certificate with thumbprint
Msg 3013, Level 16, State 1, Line 1
RESTORE DATABASE is terminating abnormally.
حالا براي اطمينان بيشتر از مسير ديگهاي ميريم. يعني Attach & Detach . ابتدا فايل هاي mdf , ldf رو به سرور ديگه منتقل مي كنيم و با استفاده از دستور زير اونو Attach مي كنيم.
CREATE DATABASE [AdventureWorks] ON
( FILENAME = N'D:\BackUp\AdventureWorks.mdf'),
( FILENAME = N'D:\BackUp\AdventureWorks_log.ldf')
FOR ATTACH
درسته !!!! يك خطا مثل همون قبلي مي گيريد.
3- راه برگردوندن يك بانك اطلاعاتي Encrypt شده در يك ديتابيس ديگه :
*** اينه كه روي sql server مقصد هم همون Certificate رو اعمال كنيد. ***
براي اين كار دو مرحله وجود داره :
1-3- Backup گرفتن از certificate سرور اصلي
Use Master
GO
BACKUP CERTIFICATE MyTDECert TO FILE = 'D:\MyTDECert.cert'
WITH PRIVATE KEY
(
FILE = 'D:\EncryptPrivateKey.key',
ENCRYPTION BY PASSWORD = 'TryToUseOnlyStrongPassword'
)
GO
2-3- Restore كردن آن روي سرور مقصد
براي اين كار اول بايد master Key رو روي سرور مقصد ايجاد كنيم. بعد بريم سراغ certificate
USE [master]
GO
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '12345';
GO
//*--------------------------------------------*
CREATE CERTIFICATE MyTDECert
FROM FILE = 'D:\MyTDECert.cert'
WITH PRIVATE KEY (
FILE = 'D:\EncryptPrivateKey.key'
, DECRYPTION BY PASSWORD = 'TryToUseOnlyStrongPassword'
)
4- حالا مي تونيم دوباره دستور restore رو اعمال كنيم.
RESTORE DATABASE [AdventureWorks]
FROM DISK = N'D:\AdventureWorks_Encrypted.bak'
WITH FILE = 1,
MOVE N'AdventureWorks_data' TO N'D:\BackUp\AdventureWorks_Data.mdf',
MOVE N'AdventureWorks_log' TO N'D:\BackUp\AdventureWorks_Log.ldf',
NOUNLOAD, REPLACE, STATS = 10
GO
نكات مهم
نكاتي كه بايد در مورد Encryption به خاطر بسپاريد.
1- اگر بانك اطلاعاتي شما File Stream دارد و يا ReadOnly File group داريد، اين روش محافظت موفقيت آميز نخواهد بود.
• دراجراي رمزنگاري File stream با خطايي برخورد نمي كنيد اما به واقع آن فايل هايي كه روي هارد ذخيره شده اند ، كد نميشوند.
2- اگر شما Plan ي از نوع Maintenance/Recovery/Warm Standby داشته باشيد بايد برنامه خود را مرور كنيد و سروري كه روي آن Restore انجام مي دهيد حتما Certificate داشته باشد.
3- Backup از certificate حتما داشته باشيد ، چون اگر ويندوز شما از بين برود ديگر Backup هاي شما بدون backup از certificate بدرد بخور نخواهدبود.
مشكلات فعال شدن TDE
1- Tempdb
• به دليل اينكه اين بانك اطلاعاتي هم رمزنگاري مي شود، كارايي سرور پايين مي آيد.
2- رمزنگاري به شدت روي Compressed Backup تاثير مي گذارد.
• مكانيزم Compressed Backup بسيار مفيد است كه در زمان فعال شدن Encryption، درجه فشرده سازي بسيار كم مي شود.
3- باقي ماندن ارجاعي كه هميشه به يك certificate اشاره مي كند.
• به اين مفهوم كه حتي بعد از متوقف كردن Encryption، باز در هنگام Restore و با وجود موفقيت پيغامي مبني بر نبودن certificate ميدهد.
موفق باشيد
لطفا از تجربيات و نظريات خودتون راجع به اين موضوع بنويسيد.