ورود

View Full Version : كمي در مورد حفاظت فيزيكي و يا مكانيزم TDE - Transparent data Encryption



esteghamat
چهارشنبه 28 تیر 1391, 14:24 عصر
سلام
از طرف دوستان عزيز سوالات مكرري در مورد حفاظت فيزيكي پرسيده مي شه. اول يه توضيح مختصر در مورد دو نوع حفاظت و سپس يه توضيح مشروح در مورد حفاظت فيزيكي مي دم.
ببينين دو نوع حفاظت از اطلاعات داريم.
الف - حفاظت از طريق كنترل دسترسي ها (يه جوري بگيم حفاظت نرم افزاري يا سيستمي)
ب- حفاظت فيزيكي
قسمت اول كه همون تعريف لاگين ها و يوزر هاست. اين قسمت الزام كار با 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
شنبه 31 تیر 1391, 11:28 صبح
سلام
در مورد WITH ALGORITHM = AES_128 اينكه يكي از الگوريتم هاي رمزنگاري است.
موفق باشيد

wanted_bf
دوشنبه 09 مرداد 1391, 12:42 عصر
" اين كليد در بانك اطلاعاتي master ايجاد مي شود. فقط قبل از ايجاد بايد مطمئن شويد كه قبلا ايجاد نشده است. "

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

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

esteghamat
دوشنبه 09 مرداد 1391, 12:59 عصر
سلام
شما هر Instance جديد كه ايجاد مي كنيد يكسري بانك هاي اطلاعاتي سيستمي داره كه مهمترينش master هست.
آره مي شه.
فقط جاهايي كه از نام AdventureWorks اسم برده شده، اسم ديتابيس خودت رو بذار.

wanted_bf
سه شنبه 10 مرداد 1391, 01:42 صبح
تشکر

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

alireza1735
دوشنبه 02 بهمن 1391, 12:08 عصر
سلام
من یک 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
سه شنبه 25 تیر 1392, 12:30 عصر
ممنون خوب بود.

shahram_vzvz
شنبه 01 آذر 1393, 10:56 صبح
سلام دوستان شرمنده كه سوالمو اينجا مطرح ميكنم ميشه بگيد از كجا ميتونم يك مقاله در مورد امنيت فيزيكي DB پيدا كنم ؟؟؟ ممنون ميشم اگه لينكي اينجا قرار بدين

Delphi7_love
چهارشنبه 21 بهمن 1394, 21:13 عصر
سلام دوستان
من یه دیتابیس دارم که از یک سال قبله و قبلا اینو Encrypt کردم و حالا رمزشو فراموش کردم
چطور میتونم برش گردونم؟

Delphi7_love
پنج شنبه 22 بهمن 1394, 20:59 عصر
دوستان کسی اطلاعی نداره ؟
کارم گیره - لطفا راهنمایی کنید

hassanzarabi
شنبه 26 خرداد 1397, 17:20 عصر
با سلام و خسته نباشید خدمت شما کاربر esteghamat (http://barnamenevis.org/member.php?29203-esteghamat) عزیز
از این آموزش بسیار ممنونم خیلی عالی توضیح داده شد البته من آشنایی دارم اما باز برای من مفید واقع شد
دست شما درد نکنه