# پایگاه‌های داده > SQL Server > مدیریت دیتابیس (Database Administration) >  كمي در مورد حفاظت فيزيكي و يا مكانيزم TDE - Transparent data Encryption

## esteghamat

سلام
از طرف دوستان عزيز سوالات مكرري در مورد حفاظت فيزيكي پرسيده مي شه. اول يه توضيح مختصر در مورد دو نوع حفاظت و سپس يه توضيح مشروح در مورد حفاظت فيزيكي مي دم. 
ببينين دو نوع حفاظت از اطلاعات داريم. 
الف - حفاظت از طريق كنترل دسترسي ها (يه جوري بگيم حفاظت نرم افزاري يا سيستمي)
ب- حفاظت فيزيكي
قسمت اول كه همون تعريف لاگين ها و يوزر هاست. اين قسمت الزام كار با 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 ميدهد. 

موفق باشيد
لطفا از تجربيات و نظريات خودتون راجع به اين موضوع بنويسيد.

----------


## esteghamat

سلام
در مورد WITH ALGORITHM = AES_128 اينكه يكي از الگوريتم هاي رمزنگاري است. 
موفق باشيد

----------


## wanted_bf

" اين كليد در بانك اطلاعاتي master ايجاد مي شود. فقط قبل از ايجاد بايد مطمئن شويد كه قبلا ايجاد نشده است.  "

بانک اطلاعاتی master کجا هست؟
من برای تست یه بانک به نام test ساختم که یک جدول profile داره.
حالا میخوام این مراحل رو انجام بدم.

(از sql خود visual studio دارم استفاده میکنم ، میشه؟ )

----------


## esteghamat

سلام
شما هر Instance جديد كه ايجاد مي كنيد يكسري بانك هاي اطلاعاتي سيستمي داره كه مهمترينش master هست. 
آره مي شه. 
فقط جاهايي كه از نام AdventureWorks اسم برده شده، اسم ديتابيس خودت رو بذار.

----------


## wanted_bf

تشکر

روش TDE فقط از دیدن اطلاعات محافظت میکنه درسته؟
مثلا اگر جدول یوزر داشته باشیم ، طرف میتونه سطر یوزر رو پاک کنه؟ ( فرضا بصورت کد شده پاک کنه ) یا کلا دسترسی به بانک نداره؟

----------


## alireza1735

سلام 
من یک Windows applicationدارم که با یک دیتبابیس کار می کنه واسه اینکه دیتابیسو Encrypt کنم اونو  توی Sql Server Mangement,اتچ کردم بعد ازینکه masterkey,Certificteo ساختم دیتابیسو بااستفاده از اونا Encrypt کردم ,بعدش Deattach میکنم حالا که میخوام توی windows application از استفاده کنم visual sudio هچین پیغامی میده :




```
Cannot find server certificate with thumbprint '0x3FAC4A245B140BD61305EE0BB48970BC7421C128'.
Could not open new database 'C:\USERS\ALIREZA\DESKTOP\PROJECT\SAVE AND RETRIEVAL FILES IN DB\PROJECT1\PROJECT1\DATA\DB.MDF'. CREATE DATABASE is aborted.
An attempt to attach an auto-named database for file C:\Users\Alireza\Desktop\project\Save and retrieval Files in DB\Project1\Project1\Data\DB.mdf failed. A database with the same name exists, or specified file cannot be opened, or it is located on UNC share.
```


 یه نسخه از گواهینامه هم واسه خود پایگاه داده نه master کریت کردم ولی بازم جواب نمیده میشه بهم بگید اچیکار باید کنم!
Use Mydb--//not master 
GO
CREATE DATABASE ENCRYPTION KEY
WITH ALGORITHM = AES_128
ENCRYPTION BY SERVER CERTIFICATE MyTDECert

GO
میشه بهم بگید  اگه بخوام windows form applicationام از این دیتابیس رمز گذاری شده استفاده کنه چیکار باید بکنم!

----------


## davidrobert

ممنون خوب بود.

----------


## shahram_vzvz

سلام دوستان   شرمنده كه سوالمو اينجا مطرح ميكنم  ميشه بگيد از كجا ميتونم يك مقاله در مورد امنيت فيزيكي DB  پيدا كنم ؟؟؟   ممنون ميشم اگه لينكي اينجا قرار بدين

----------


## Delphi7_love

سلام دوستان 
من یه دیتابیس دارم که از یک سال قبله و قبلا اینو Encrypt کردم و حالا رمزشو فراموش کردم 
چطور میتونم برش گردونم؟

----------


## Delphi7_love

دوستان کسی اطلاعی نداره ؟
کارم گیره - لطفا راهنمایی کنید

----------


## hassanzarabi

با سلام و خسته نباشید خدمت شما کاربر* esteghamat*  	 عزیز
از این آموزش بسیار ممنونم خیلی عالی توضیح داده شد البته من آشنایی دارم اما باز برای من مفید واقع شد 
دست شما درد نکنه

----------

