Tải bản đầy đủ (.doc) (52 trang)

nghiên cứu, tìm hiểu một số vấn đề liên quan đến việc bảo đảm an toàn trong SQL server 2012

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.01 MB, 52 trang )

MỤC LỤC
LỜI NÓI ĐẦU...........................................................................................................3
Chương I: Nghiên cứu và tìm hiểu chung về vấn đề an toàn trong SQL Server 2012
...................................................................................................................................5
1.1An toàn máy chủ và an toàn mạng.......................................................................5
1.2An toàn bên trong SQL Server.............................................................................8
1.3Bảo vệ dữ liệu mức phân quyền truy cập...........................................................11
1.4Bảo vệ dữ liệu bằng phương pháp mã hóa.........................................................13
Chương II: Nghiên cứu và tìm hiểu cơ chế mã hóa dữ liệu trong SQL Server 2012
.................................................................................................................................16
2.1Kiến trúc phân cấp khóa trong SQL Server 2012...............................................16
2.2Quá trình tạo và sử dụng khóa trong SQL Server 2012.....................................19
2.2.1Khóa chủ dịch vụ (Service Master Key – SMK).............................................19
2.2.2Khóa chủ cơ sở dữ liệu (Database Master Key - DMK).................................20
2.2.3Tạo và sử dụng khóa mã đối xứng...................................................................22
2.2.4Tạo và sử dụng các khóa phi đối xứng............................................................24
2.2.5Tạo và sử dụng các chứng chỉ.........................................................................26
2.3Quá trình thực hiện mã hóa dữ liệu....................................................................32
2.3.1Mã hóa dữ liệu với các khóa đối xứng............................................................32
2.3.2Mã hóa dữ liệu với các khóa phi đối xứng và chứng chỉ.................................34
2.4Quá trình thực hiện mã hóa dữ liệu sử dụng TDE..............................................36
Chương III: Thực hiện demo việc mã hóa dữ liệu trong SQL Server.....................38
3.1Demo áp dụng mã hóa dữ liệu mức cột..............................................................38
1


3.2 Demo áp dụng công nghệ mã hóa dữ liệu trong suốt - TDE.............................45
KẾT LUẬN.............................................................................................................50
TÀI LIỆU THAM KHẢO.......................................................................................52

2




LỜI NÓI ĐẦU

Thông tin được xem là tài sản vô giá và cần được bảo vệ bằng mọi cách. Với sự
phát triển hiện nay, yêu cầu chia sẻ thông tin qua các phương tiện truyền thông hay
Internet ngày càng tăng cao, điều này thúc đẩy việc bảo vệ thông tin ngày càng trở
nên cấp thiết.
Hầu hết các doanh nghiệp hay các nhà quản lý hiện nay đều sử dụng 1 hệ quản trị
cơ sở dữ liệu để lưu trữ tập trung tất cả thông tin của mình. Điều này đồng nghĩa
với việc hệ thống này sẽ là tiêu điểm của các kẻ tấn công. Ở mức độ nhẹ, các tấn
công có thể dẫn đến việc hỏng hệ thống cơ sở dữ liệu, làm cho hệ thống hoạt động
không ổn định, mất mát dữ liệu gây ra tổn thất cho các doanh nghiệp. Nghiêm
trọng hơn, các thông tin mật có thể bị tiết lộ và được đem bán cho các doanh
nghiệp đối thủ. Vì vậy việc đảm bảo an toàn và bảo mật cho hệ quản trị CSDL là
vô cùng quan trọng .
Một số hệ quản trị mà chúng ta thường gặp như MySQL Server, Oracle Database
Server, Microsoft SQL Server. Các hệ quản trị cơ sở dữ liệu cung cấp các cơ chế,
các quy tắc đảm bảo tính an toàn cho hệ quản trị của mình. Các nhà thiết kế và
phát triển ứng dụng cơ sở dữ liệu cần phải hiểu và nắm được các nguyên tắc đó để
làm sao trong quá trình thiết kế và xây dựng chương trình cần đảm bảo vấn đề an
toàn cho ứng dụng, an toàn cho dữ liệu trong cơ sở dữ liệu. Bất kỳ người dùng
không hợp lệ không thể khai thác được dữ liệu trong cơ sở dữ liệu.
Xuất phát từ nhu cầu thực, trong phạm vi của đề tài, chúng tôi đi vào nghiên cứu,
tìm hiểu một số vấn đề liên quan đến việc bảo đảm an toàn trong SQL Server 2012:

3


• Tìm hiểu các vấn đề chung liên quan đến việc đảm bảo an toàn cho hệ thống

khai thác cơ sở dữ liệu
• Nghiên cứu tìm hiểu vấn đề bảo đảm an toàn cho cơ sở dữ liệu bằng các
phương pháp mã hóa
• Tạo kịch bản demo áp dụng các phương pháp mã hóa trong SQL Server
Báo cáo của đề tài được trình bày gồm các phần sau:
Chương I: Nghiên cứu và tìm hiểu chung vấn đề an toàn trong hệ quản trị SQL
Server 2012. Trong chương này chúng tôi tìm hiểu các nguyên tắc cơ bản để đảm
bảo an toàn cho SQL Server 2012 bắt đầu từ khi được cài đặt lên máy chủ. An toàn
xác thực người dùng đăng nhập. Bảo vệ dữ liệu trong cơ sở dữ liệu dựa vào cơ chế
phân quyền trong hệ quản trị. Bảo vệ dữ liệu bằng cách áp dụng phương pháp mã
hóa dữ liệu.
Chương II: Nghiên cứu và tìm hiểu cơ chế mã hóa trong SQL Server 2012. Trong
chương này chúng tôi làm rõ hơn quá trình thực hiện mã hóa dữ liệu. Nắm được
kiến trúc phân cấp và quản lý khóa mã trong SQL Server 2012. Cách tạo khóa mã
và sử dụng nó để thực hiện mã hóa dữ liệu theo yêu cầu
Chương III: Thực hiện demo mã hóa dữ liệu trong SQL Server. Trong chương này
chúng tôi sẽ đưa ra kịch bản đơn giản để thấy được ý nghĩa của vấn đề mã hóa dữ
liệu. Áp dụng các kiến thức ở phần trước để thực hiện lập trình và mô phỏng quá
trình bảo vệ dữ liệu trong cơ sở dữ liệu.

4


Chương I: Nghiên cứu và tìm hiểu chung về vấn đề an toàn trong SQL Server
2012
1.1 An toàn máy chủ và an toàn mạng
• Lựa chọn tài khoản để chạy SQL Server: SQL Server là một dịch vụ
Windows, một tiến trình được khởi động bởi hệ điều hành Windows đang
chạy dưới quyền của người dùng hoặc tài khoản hệ thống. Chọn một tài
khoản đúng là rất quan trọng cho vấn đề an toàn. Vì những máy khách truy

cập SQL Server bằng kết nối cơ sở dữ liệu có thể truy cập vào hệ điều hành
Windows trong một vài trường hợp, hoặc nếu như một lỗ hổng an toàn được
tìm thấy trong mã lệnh SQL. SQL Server không cần phải có quyền quản trị
trên máy tính, nó chỉ cần có quyền trên các thư mục nơi nó được lưu trữ dữ
liệu của nó, các file log lỗi, sao lưu, và một số quyền hệ thống.
• Mã hóa phiên với SSL: Giữa máy khách và máy SQL Server, các câu truy
vấn và các dữ liệu kết quả được gửi đi trên mạng mà con người có thể đọc
được bằng cách sử dụng các công cụ bắt gói tin như Wireshark. Để bảo vệ
thông tin này khỏi bị nghe nén trên mạng thì chúng ta cần phải mã hóa
đường truyền thông giữa client và server bằng cách sử dụng SSL (Security
Socket Layer)
• Cấu hình firewall cho truy cập SQL Server: SQL Server trả lời trên cổng
TCP và UDP cụ thể, mà cần phải được mở trên firewall nếu muốn truy cập
vào SQL Server.
• Cấm dịch vụ SQL Server Browser: Dịch vụ SQL Server Browser khởi động
tự động khi cài đặt SQL Server. Nhiệm vụ của nó là để giao tiếp với các thể
hiện SQL Server trên máy tính, và gửi cho máy khách cổng TCP mà thể hiện
5


đó đang lắng nghe. Để che giấu sự hiện diện của một thể hiện SQL Server,
chúng ta có thể dừng nó hoặc cấu hình để nó không đáp ứng các yêu cầu
quảng bá.
• Đóng tất cả các dịch vụ không sử dụng: Nếu cài đặt trọn gói SQL Server,
chúng ta có thể có các thành phần không cần thiết chạy trên máy chủ, do đó
xuất hiện nhiều rủi ro an toàn và làm giảm hiệu suất máy chủ. Ngoài ra còn
có một số dịch vụ khác của Windows chạy trên máy chủ mà chúng ta có thể
vô hiệu hóa một cách an toàn, đặc biệt là trên một máy chủ dành riêng cho
SQL Server
• Sử dụng mã hóa cơ sở dữ liệu trong suốt: Kẻ tấn công có quyền đọc trên thư

mục SQL Server lưu trữ các tập tin dữ liệu của nó (.mdf) sẽ không gặp khó
khăn để đạt được quyền truy cập vào tất cả các cơ sở dữ liệu, chỉ đơn giản
bằng cách sao chép các tệp .mdf và gắn nó vào một SQL Server, nơi hắn có
quyền quản trị hệ thống. Bảo vệ đầu tiên chống lại mối đe dọa này tất nhiên
là quản lý quyền NTFS chặt chẽ trên các thư mục dữ liệu SQL Server. Để
đảm bảo an toàn hơn nữa cho cơ sở dữ liệu, chúng ta có thể sử dụng phương
pháp mã hóa cơ sở dữ liệu trong suốt (Transparent Database Encryption TDE) để mã hoá tất cả các file dữ liệu (một cơ sở dữ liệu có thể bao gồm
một hoặc nhiều tập tin dữ liệu). Kẻ tấn công cố gắng gắn tệp dữ liệu đó vào
một SQL Server khác sẽ không thể giải mã chúng bởi vì không có khóa để
giải mã.
• An toàn truy cập máy chủ liên kết: Tính năng Linked Server cho phép chúng
ta định nghĩa bên trong SQL Server, một kết nối đến một máy chủ khác mà
có thể được tham chiếu trong mã T -SQL để truy cập nguồn dữ liệu ở xa.
Với tính năng này, chúng ta có thể tạo ra các truy vấn phân phối hoặc trao
đổi dữ liệu bằng các cách của câu truy vấn (INSERT … SELECT). Giống
như việc lưu trữ chuỗi kết nối trong ứng dụng client, nhưng ứng dụng client
6


này là một SQL Server. Một máy chủ liên kết có thể tham chiếu tới một
SQL Server ở xa, hoặc bất kỳ nguồn dữ liệu khác có trình điều khiển
OLEDB được cài đặt trên máy SQL Server. Khi chúng ta tạo ra một máy
chủ liên kết, cần phải nhận thức được một số vấn đề bảo mật liên quan.
• Cấu hình an toàn điểm đầu cuối (endpoint): Một điểm đầu cuối SQL Server
là một cửa được mở ra từ hoặc đến SQL Server. Tất cả mọi thứ mà có thể đi
từ SQL Server tới mạng, hoặc từ mạng đến SQL Server, đều đi qua một
điểm đầu cuối. Điểm đầu cuối này có thể là hệ thống hoặc người dùng định
nghĩa. Các điểm đầu cuối hệ thống cho phép các kết nối T-SQL tới SQL
Server để gửi các truy vấn. Chúng ta có thể tạo ra một điểm đầu cuối cho ba
mục đích: Các yêu cầu TCP, service broker, hoặc phản chiếu cơ sở dữ liệu.

Ví dụ chúng ta sử dụng để tạo thiết lập một kết nối chuyên dụng và an toàn
tới SQL Server cho mục đích quản trị hoặc truy cập từ xa.
• Hạn chế các tính năng: Một số tính năng bị vô hiệu hóa trong quá trình cài
đặt SQL Server vì chúng có thể làm xuất hiện các rủi ro mất an toàn.

7


1.2 An toàn bên trong SQL Server
• Lựa chọn phương pháp xác thực của Windows và SQL Server: Trong quá
trình cài đặt, SQL Server yêu cầu kiểu xác thực để cấu hình. Phương pháp
xác thực Windows mặc định được lựa chọn và là thiết lập được khuyến cáo.
Nó đơn giản hoá quản trị và an toàn hơn, bởi vì nó sử dụng thẻ an toàn
Windows. Người dùng không phải nhớ mật khẩu khác, và không phải truyền
mật khẩu qua mạng khi kết nối với SQL Server. Chúng ta không thể vô hiệu
hóa xác thực Windows, nhưng chỉ chọn để mở rộng nó với xác thực SQL
Server (Windows và SQL Server, còn được gọi là phương pháp xác thực hỗn
hợp). Chúng ta nên sử dụng xác thực SQL Server chỉ khi cần phải cho phép
truy cập từ người dùng bên ngoài mạng cục bộ và các miền Windows tin
cậy.
• Tạo các tài khoản đăng nhập: Một thông tin đăng nhập là một tài khoản
được định nghĩa ở cấp server với các quyền hạn được gán để kết nối và có
thể thực hiện nhiệm vụ quản trị, và để truy cập cơ sở dữ liệu trên các thể
hiện. Tạo ra thông tin đăng nhập là bước đầu tiên để cấp quyền truy cập
trong SQL Server. Mô hình an toàn SQL Server có hai mức: mức server và
mức cơ sở dữ liệu. Một thông tin đăng nhập đầu tiên phải được tạo ra ở
mức server , và sau đó, cho phép truy cập đến một cơ sở dữ liệu, một người
dùng phải được tạo ra trong cơ sở dữ liệu và được ánh xạ tới một thông tin
đăng nhập đang tồn tại.
• Bảo vệ server chống lại các tấn công brute-force: Tấn công brute-force là

một cách để crack mật khẩu đăng nhập SQL bằng cách cố gắng mọi kết hợp
ký tự có thể, hoặc bằng cách sử dụng một từ điển một danh sách từ, có chứa
các mật khẩu có thể xảy ra nhất. Cách tốt nhất để bảo vệ mật khẩu của chống

8


lại tấn công brute-force là để thi hành chính sách mật khẩu Windows và hết
hạn, vì điều này sẽ đảm bảo rằng chúng ta chỉ có mật khẩu mạnh.
• Giới hạn các quyền admin của tài khoản SA: Tài khoản sa là quản trị hệ
thống máy chủ SQL Server. Nó được tạo ra lúc cài đặt. Trước đây đó là một
đăng nhập cố định mà chúng ta không thể thay đổi, nhưng kể từ SQL Server
2005, chúng ta có thể đổi tên và vô hiệu hóa nó để ngăn chặn nó được sử
dụng bởi kẻ tấn công
• Sử dụng các vai trò server đã được cố định: Thông tin đăng nhập cho phép
bạn kết nối tới SQL Server và để truy cập cơ sở dữ liệu khi chúng được ánh
xạ tới người dùng cơ sở dữ liệu. Mặc định chúng không quyền thực hiện các
thao tác quản trị mức server như quản lý các thông tin đăng nhập khác hoặc
thay đổi cấu hình server. Nếu chúng ta muốn cho phép đăng nhập để có
quyền quản trị, chúng ta có thể cung cấp cho nó những đặc quyền hoặc là
thêm chúng vào vai trò máy chủ cố định đã xác định trước. Các vai trò
server cố định cho phép chúng ta dễ dàng thu hồi hoặc cấp một số tập quyền
chung.
• Tạo và sử dụng các vai trò server được người dùng định nghĩa: Một vai trò
server do người dùng định nghĩa là tiện dụng trong việc cấp một nhóm các
thông tin đăng nhập cho một số quyền quản trị, bởi vì nó giúp chúng ta tiết
kiệm khỏi phải áp dụng các quyền riêng lẻ cho mỗi thông tin đăng nhập.
Chúng ta có thể tạo ra một vai trò người dùng xác định, cấp quyền truy cập
vào nó, và thêm các thông tin đăng nhập mong muốn là thành viên vai trò.
Các quyền server có thể được cấp cho một vai trò, ví dụ quyền kết nối tới

một điểm đầu cuối, giả mạo đăng nhập khác (có nghĩa là, để thay đổi ngữ
cảnh của nó với EXECUTE AS), hoặc kiểm soát một số thông tin đăng nhập
khác.
• Tạo người dùng cơ sở dữ liệu và ánh xạ tới thông tin đăng nhập: Các thông
tin đăng nhập đảm bảo xác thực và truy cập vào tài nguyên máy chủ. Để truy
9


cập vào một cơ sở dữ liệu, chúng phải ánh xạ tới một người dùng trong cơ
sở dữ liệu. Truy cập vào các đối tượng cơ sở dữ liệu được cấp cho người
dùng, không áp dụng cho thông tin đăng nhập. dbo là viết tắt của DataBase
Owner. Đây là một người sử dụng cơ sở dữ liệu đặc biệt mà ánh xạ tới chủ
sở hữu của cơ sở dữ liệu. Khi được tạo ra, cơ sở dữ liệu được chỉ định một
chủ sở hữu, đó là tên đăng nhập đã tạo ra nó.
• Ngăn chặn thông tin đăng nhập và người dùng xem siêu dữ liệu: Trước SQL
Server 2005, tất cả các máy chủ và siêu dữ liệu cơ sở dữ liệu là mọi người
đều có thể nhìn thấy. Đó là một vấn đề, ví dụ, các công ty web-hosting
người chia sẻ một thể hiện SQL Server với khách hàng. Tất cả mọi người có
thể nhìn thấy sự hiện diện của cơ sở dữ liệu khách hàng khác trên máy chủ.
Bây giờ chúng ta có thể kiểm soát sự xuất hiện các siêu dữ liệu. Nếu như
chúng ta muốn ẩn các cơ sở dữ liệu đối với tất cả các thông tin đăng nhập,
thì loại bỏ quyền VIEW ANY DATABASE khỏi vai trò server công khai
• Chỉnh sửa các lỗi ánh xạ người dùng tới thông tin đăng nhập trên cơ sở dữ
liệu được khôi phục: Nếu chúng ta di chuyển một cơ sở dữ liệu từ một máy
chủ này sang một máy chủ khác, bằng các cách backup/restore hoặc
detach/attach, sau đó có một dịp nào đó người dùng SQL của bạn sẽ trở
thành mồ côi (orphaned), có nghĩa là họ sẽ không có thông tin đăng nhập
tương ứng. Như ánh xạ giữa tên đăng nhập và người sử dụng được thực hiện
bởi SID, nếu đăng nhập xuất hiện trên thể hiện SQL Server đích có cùng tên
nhưng khác SID, thì người dùng này sẽ lỗi và hệ thống không nhận ra.


10


1.3 Bảo vệ dữ liệu mức phân quyền truy cập
• Hiểu và quyền: Một hệ thống quản lý dữ liệu quan hệ , chẳng hạn như SQL
Server , không chỉ là đáp ứng lưu trữ và truy xuất dữ liệu , mà còn đảm bảo
sự gắn kết của nó và bảo vệ nó. Giống như hệ thống máy chủ khác , nó xác
thực người sử dụng và duy trì một phiên mà người dùng đó sẽ có thể truy
cập dữ liệu, nếu người này được phép. SQL Server sẽ kiểm tra những quyền
trong mỗi lần đọc hay ghi dữ liệu . Các quyền hạn được thiết lập bởi các câu
lệnh ngôn ngữ kiểm soát dữ liệu (Data Control Language - DCL). DCL là
một tập con của ngôn ngữ SQL được sử dụng để kiểm soát việc truy cập dữ
liệu. Có 3 trạng thái có thể của quyền hạn
o GRANT: Quyền được cho phép
o DENY: Quyền bị từ chối
o REVOKE: Xóa bỏ việc cấp hoặc từ chối quyền
Thuật toán kiểm tra quyền trong SQL Server là phức tạp, nhưng nó giúp ta
có chiến lược cấp quyền một cách đơn giản. Các quyền được phân cấp và
bắc cầu. Hệ thống phân cấp của các đối tượng trong SQL Server là như sau:
Server -> Database -> Schema -> Object -> Column
• Gán các quyền mức cột: Các quyền khoản trong SQL Server được phân cấp,
người dùng có quyền trên lược đồ có cùng các quyền trên các đối tượng bên
trong lược đồ, trừ khi từ chối cho cấp phép đã được thực hiện. Nhưng các
đối tượng này không phải là mức thấp nhất của hệ thống. Chúng ta có thể
thiết lập quyền tới cột đó. Để gán các quyền cho cột chúng ta sử dụng lệnh
GRANT SELECT ON <đối tượng>. Quyền mức cột là không phù hợp với
hệ thống phân cấp quyền chính thức và có thể sẽ thay đổi trong các phiên
bản tương lai, chúng ta có thể áp dụng tốt hơn bằng cách sử dụng các view
để hạn chế việc truy cập vào cột. Các view cung cấp mức độ trừu tượng để

truy cập bảng, đây là cách linh hoạt hơn so với thiết lập quyền mức cột.
11


• Quản lý quyền sở hữu đối tượng: Mặc định, chủ sở hữu đối tượng là chủ sở
hữu của lược đồ thuộc về nó. Chủ sở hữu này có tất cả các quyền đối với đối
tượng, và không thể phủ nhận. Để thiết lập quyền sở hữu đối tượng chúng ta
sử dụng lệnh ALTER AUTHORIZATION. Chúng ta muốn thay đổi quyền
sở hữu khi người dùng cần loại bỏ hoặc khi cần chỉnh sửa một số vấn đề về
sở hữu đối tượng. Tất nhiên, chuyển quyền sở hữu đòi hỏi phải có các quyền
hạn thực hiện điều này vì hai lý do. Thứ nhất, một người nào đó không được
phép ăn cắp một đối tượng, và thứ hai là chủ sở hữu của một đối tượng
không được phép để chuyển nó cho những người không muốn nó.
• Bảo vệ dữ liệu thông qua view và thủ tục lưu trữ: Khi chúng ta tham chiếu
một đối tượng trong một view hoặc một đối tượng code, chẳng hạn như một
thủ tục lưu trữ hoặc một hàm, thì các quyền có thể được thiết lập trên view
hoặc thủ tục, và loại bỏ quyền trên các đối tượng được tham chiếu. Điều này
cho phép bảo vệ các bảng dữ liệu bên dưới chống lại các truy vấn trực tiếp
lên bảng. Chúng ta cần phải hiểu được cách thức hoạt động để thực hiện nó
một cách chính xác.
• Cấu hình an toàn cross-database: Chuỗi các quyền sở hữu (ownership
chaining) cho phép cấp quyền chỉ trên view hay các thủ tục và cấp quyền
cho các các đối tượng bên dưới, điều này mặc định được giới hạn trong một
cơ sở dữ liệu. Nếu chúng ta tham chiếu một đối tượng từ một cơ sở dữ liệu
khác trong view hoặc thủ tục, thì người dùng phải là một người sử dụng
trong cơ sở dữ liệu đó, và có quyền truy cập vào đối tượng này. Đây là cách
an toàn được lựa chọn tốt nhất. Nếu cơ sở dữ liệu của chúng ta được liên kết
chặt chẽ, chúng ta có thể cho phép chuỗi sở hữu chéo cơ sở dữ liệu (crossdatabase ownership chaining).
• Sử dụng EXECUTE AS để thay đổi ngữ cảnh người dùng: Kể từ SQL
Server 2005, chúng ta có thể sử dụng lệnh EXECUTE AS để mạo danh

12


người dùng khác trong một phiên (dcó ích khi dùng để thử nghiệm các
quyền được gán cho người dùng) hoặc để thực thi một thủ tục. Để thay đổi
ngữ cảnh thực hiện trong phiên, chúng ta có thể dùng lệnh sau đây:
EXECUTE AS LOGIN = 'DOMAIN\Fred';
EXECUTE AS USER = 'Fred';

Lệnh đầu thay đổi ngữ cảnh được giả mạo một tài khoản đăng nhập mà được
gán quyền mức server, trong khi đó lệnh thứ hai thay đổi ngữ cảnh chỉ liên
quan đến cơ sở dữ liệu hiện tại và không cho đưa cho người gọi quyền mức
server. Chúng ta sẽ không thể chạy các lệnh bên ngoài của cơ sở dữ liệu
hoặc thay đổi cơ sở dữ liệu hiện tại khi đang trong ngữ cảnh an toàn này.
1.4 Bảo vệ dữ liệu bằng phương pháp mã hóa
Một trong những khó khăn để hiểu các lựa chọn nhất trong SQL Server 2012 là
khả năng mã hóa dữ liệu. Lý do chính là tất cả các khả năng mã hóa khác nhau đều
được cung cấp. Mã hóa dữ liệu có thể được thực hiện bởi hệ điều hành, SQL
Server, hoặc các ứng dụng. Một số tùy chọn mã hóa SQL Server khác nhau.
• Mã hóa dữ liệu trong suốt (Transparent Data Encryption - TDE) là tùy chọn
mã hóa chính trong SQL Server. Lần đầu tiên TDE có sẵn trong SQL Server
2008, SQL Server 2012 và nó chỉ có trong các phiên bản SQL Server
Enterprise. TDE cho phép chúng ta mã hóa toàn bộ một cơ sở dữ liệu. Các
bản sao lưu cơ sở dữ liệu sử dụng TDE cũng được mã hóa. TDE bảo vệ phần
dữ liệu ở trên thiết bị lưu trữ, có nghĩa là các file của cơ sở dữ liệu và các
file log được mã hóa bằng thuật toán AES và 3DES. TDE là hoàn toàn trong
suốt với các ứng dụng và không đòi hỏi phải sửa đổi mã lệnh để thực hiện.
• Mã hóa mức cột (Column-level): Mã hóa mức cột (hay còn gọi là mã hóa
mức ô – cell-level) đã được đưa ra trong SQL Server 2005 và có sẵn trong
tất cả các phiên bản của SQL Server. Để sử dụng mã hóa mức ô, các lược đồ

phải thay đổi tới kiểu nhị phân (varbinary), sau đó chuyển đổi lại về kiểu dữ
13


liệu mong muốn. Điều này có nghĩa là các ứng dụng phải sửa đổi để hỗ trợ
việc mã hóa, giải mã, ngoài ra nó có thể ảnh hưởng đến hiệu năng. Mã hóa
cơ sở dữ liệu xảy ra ở mức trang, nhưng khi các trang được đọc đến pool
đệm thì chúng được giải mã. Dữ liệu có thể được mã hóa bằng cách sử dụng
mật khẩu, khóa bất đối xứng, khóa đối xứng, hoặc chứng chỉ. Các thuật toán
hỗ trợ cho việc mã hóa mức cột là AES với 128, 196, 256 bit khóa và 3DES.
• Mã hóa và giải mã dữ liệu với .NET Framework:. Một tùy chọn khác cho
việc mã hóa dữ liệu được lưu trữ trong SQL Server là thực hiện việc mã hóa
và giải mã từ bên trong ứng dụng. Tất cả các phiên bản của SQL Server hỗ
trợ kiểu mã hóa dữ liệu này. Tuy nhiên, không giống như TDE, mã hóa dữ
liệu trong ứng dụng yêu cầu chúng ta phải viết code ứng dụng để thực hiện
mã hóa bằng cách gọi cách hàm mã hóa và giải mã trong .NET Framework,
bằng cách sử dụng không gian tên System.Security.Cryptography để thực
hiện mã hóa đối xứng hoặc bất đối xứng.
• Mã hóa hệ thống tập tin (Encrypting File Systems - EFS): Phương pháp này
là một tính năng mã hóa file được giới thiệu trong Windows 2000. Windows
Server hỗ trợ EFS để mã hóa dữ liệu vào file và cấp độ thư mục. EFS sử
dụng thuật toán mã hóa AES, ECC và mã hóa dựa vào smartcard. Cài đặt
một cơ sở dữ liệu SQL Server trong EFS trên thực tế là không được đề nghị
vì tăng thêm các chi phí. EFS không được tối ưu hóa cho hiệu suất, và tất cả
các thao tác vào/ra là đồng bộ. Nếu chúng ta sử dụng EFS, các tập tin cơ sở
dữ liệu được mã hóa dưới danh tính của các tài khoản đang chạy SQL
Server. Nếu chúng ta thay đổi tài khoản chạy dịch vụ SQL Server, trước tiên
cần phải giải mã các tập tin bằng cách sử dụng tài khoản cũ, sau đó mã hóa
lại chúng bằng cách sử dụng tài khoản mới.
• BitLocker: Đây là một tính năng bảo vệ dữ liệu có sẵn trong Windows

Server 2012, Windows 8, Windows 7 và Windows Server 2008 R2.
14


BitLocker thực hiện bảo vệ dữ liệu bằng cách mã hóa tất cả các dữ liệu trên
phân vùng của hệ điều hành Windows.

15


Chương II: Nghiên cứu và tìm hiểu cơ chế mã hóa dữ liệu trong SQL Server
2012
Vấn đề bảo vệ dữ liệu nhạy cảm là mối quan tâm quan trọng đối với các tổ chức.
Số thẻ tín dụng, hồ sơ y tế và sức khỏe, và các thông tin cá nhân khác phải được
lưu trữ và bảo đảm theo một cách mà chỉ có nhân viên được ủy quyền mới có thể
truy cập thông tin. Các phiên bản SQL Server 2000, 2005 vấn đề mã hóa cần phải
được xử lý bởi ứng dụng. SQL Server cung cấp các hàm mã hóa, giải mã dữ liệu
để người phát triển tích hợp. Ngoài ra vấn đề quản lý khóa mã do người phát triển
ứng dụng quản lý thủ công. Từ phiên bản SQL Server 2008, 2012 ngoài kế thừa
giải pháp mã hóa của các phiên bản trước, nó áp dụng một công nghệ mới, đó là
công nghệ mã hóa dữ liệu trong suốt (Transparent Data Encryption - TDE). TDE
cho phép thực hiện mã hóa toàn bộ file cơ sở dữ liệu một cách trong suốt, có nghĩa
là ứng dụng người dùng không phải sửa đổi. TDE chỉ có trong các phiên bản SQL
Server sau:


SQL Server 2012 Enterprise, Developer, Evaluation

• SQL Server 2008 R2 Datacenter, Enterprise, Developer, Evaluation
• SQL Server 2008 Enterprise, Developer, Evaluation

2.1 Kiến trúc phân cấp khóa trong SQL Server 2012
Trong quá trình tính toán, mã hóa bao gồm việc biến đổi đổi dữ liệu từ dạng rõ và
dễ đọc (được gọi là dạng rõ) thành một giá trị nhị phân phức tạp (được gọi là các
bản mã), bằng một thuật toán mã hóa. Hàm mã hóa sử dụng một khóa để mã hóa
dữ liệu, đó là thông tin xác định kết quả bản mã. Khóa mã đảm bảo rằng các kết
quả của việc mã hóa sẽ không chỉ phụ thuộc vào các thuật toán mã hóa. Trong thực
16


tế khóa là yếu tố quan trọng của mã hóa. Chất lượng của khóa đảm bảo rằng rất
khó để giải mã dữ liệu mà không có khóa, nhưng không giữ bí mật thuật toán và rất
nhiều thuật toán có mã nguồn mở. Nếu như việc mã hóa chỉ dựa vào thuật toán, nó
có thể dễ dàng dịch ngược mã lệnh và crack nó.
Vì vậy , ngay cả khi sức mạnh của thuật toán mã hóa phụ thuộc vào chất lượng và
độ phức tạp của thuật toán, thì yếu tố bí mật thực sự là khóa. Một khóa được người
dùng mật mã tạo ra phải có đủ độ dài để ngăn chặn việc tìm kiếm tất cả các khả
năng có thể của các ký tự. Thông thường, độ dài khóa ngày nay là giữa 128 và
2048 bit. Vì vậy , khóa càng dài , mã hóa càng mạnh, nhưng đây không phải là tiêu
chí duy nhất , bởi vì mã hóa mạnh hơn đòi hỏi cần nhiều tài nguyên hơn. Đặc biệt
là trong các hệ thống cơ sở dữ liệu, hiệu suất của mã hóa và giải mã cần được xem
xét. Trong SQL Server chia ra làm nhiều loại khóa nhằm đáp ứng nhu cầu linh
động trong việc quản lý và an toàn các khóa mã, cũng nhu đảm bảo hiệu năng truy
xuất dữ liệu của toàn hệ thống như:
• Service Master Key - SMK
• Database Master Key DMK
• Khóa bất đối xứng
• Chứng chỉ số
• Khóa đối xứng
Các khóa này sẽ được mô tả cụ thể hơn về các loại khóa này. Dưới đây là hệ thống
phân cấp khóa trong SQL Server 2012:


17


Khóa (Key)

Được bảo vệ bởi
Mật khẩu
(Password)

Chứng chỉ
(Certificate)

Chứa

Khóa
(Key)

Gắn kết với

Khóa công khai
(Public Key)

Khóa bí mật
(Private Key)
Được bảo vệ bởi

Khóa chủ
(Master Key)


Mật khẩu
(Password)

Được bảo vệ bởi
DP API

Service Key
Được bảo vệ bởi

18


2.2 Quá trình tạo và sử dụng khóa trong SQL Server 2012
2.2.1 Khóa chủ dịch vụ (Service Master Key – SMK)
SQL Server cho phép tạo và lưu trữ các khóa mã trong một cơ sở dữ liệu. Bí mật là
ở trong khóa, và điều quan trọng là bảo vệ các khóa này. Cách tốt nhất để làm điều
đó là mã hóa các khóa đó sử dụng khóa khác. Trong SQL Server, khóa này được
gọi là khóa chủ (master key). Mỗi cơ sở dữ liệu sử hữu một khóa chủ, và các khóa
chủ cơ sở dữ liệu được mã hóa bằng một khóa chủ mức server. Các khóa chủ cơ sở
dữ liệu được sử dụng để mã hóa một số thông tin nhạy cảm khác, chẳng hạn như
mật khẩu chúng ta nhập vào trong các tùy chọn kết nối máy chủ liên kết.
Trước khi một khóa có thể được sử dụng trong SQL Server, nó phải được mở ra.
Điều này có nghĩa rằng khóa này được đọc từ một bảng hệ thống và giải mã. Sau
khi sử dụng, khóa này được đóng lại bằng cách sử dụng lệnh CLOSE hoặc khi kết
nối được đóng lại.
SMK được bảo vệ bởi Windows Data Protect API (DPAPI), sử dụng thuật toán
AES (Advanced Encryption Standard) và cả các bằng chứng (credentials) tài khoản
máy và tài khoản dịch vụ. SMK được dùng để bảo vệ các khóa DMK (Database
Master Key ).


19


Khóa SMK là gốc của hệ thống phân cấp mã hóa và được tạo tự động lần đầu khi
SQL Server sử dụng để mã hóa khóa khác.
Điều quan trọng là việc sao lưu khóa SMK này, sử dụng lệnh
BACKUP SERVICE MASTER KEY TO FILE = ‘e:\encryption_keys\smk.key’
ENCRYPTION BY PASSWORD = ‘a strong password’ ;

Để khôi phục lại khóa SMK, chúng ta sử dụng lệnh sau:
RESTORE SERVICE MASTER KEY FROM FILE = ‘e:\encryption_keys\smk.key’
DECRYPTION BY PASSWORD = ‘a strong password’ FORCE ;

Chúng ta có thể quyết định tạo lại khóa SMK như là một phần trong chính sách an
toàn. Nó sẽ thực hiện giải mã và mã hóa lại các khóa mà được bảo vệ bởi SMK. Sử
dụng lệnh sau để tạo lại khóa SMK
ALTER SERVICE MASTER KEY REGENERATE;

2.2.2 Khóa chủ cơ sở dữ liệu (Database Master Key - DMK)
Khóa DMK phải được tạo bên trong một cơ sở dữ liệu. Chúng ta phải cung cấp
một mật khẩu mà đáp ứng các yêu cầu chính sách mật khẩu Windows của máy tính
đang chạy SQL Server. Hai bản sao của khóa DMK được giữ lại: một bản sao
được lưu trong cơ sở dữ liệu đó, và bản sao còn lại lưu trong cơ sở dữ liệu master.
Khóa DMK được bảo vệ bởi khóa SMK. Điều này cho phép khóa DMK được mở
tự động. Đây là tiện dụng, bởi vì chúng ta không cần mở khóa trong mã lệnh,
nhưng nó cũng có nghĩa là bất kỳ người sử dụng cơ sở dữ liệu có thể sử dụng khóa
này.
Để tạo khóa DMK, thực hiện lệnh sau:
USE marketing ;
CREATE MASTER KEY

ENCRYPTION BY PASSWORD = ‘a very strong password’ ;

Chúng ta có thể xem cơ sở dữ liệu của mình có khóa DMK được mã hóa bởi SMK
bằng cách thực hiện truy vấn sau:
SELECT name, is_master_key_encrypted_by_server
FROM sys.databases
20


ORDER BY name;

Chúng ta có thể biết cơ sở dữ liệu của mình có DMK bằng cách view
sys.symetric_keys như sau:
SELECT *
FROM sys.symmetric_keys
WHERE symmetric_key_id = 101;

Khóa DMK là một khóa đối xứng và nó luôn nhận ID là 101 trong cơ sở dữ liệu.
Nó luôn có tên là ###MS_DatabaseMasterKey###
Điều cần thiết là chúng ta cần sao lưu các khóa mã này, sử dụng lệnh
OPEN MASTER KEY
DECRYPTION BY PASSWORD = ‘a very strong password’ ;
BACKUP MASTER KEY TO FILE = ‘e:\encryption_keys\dmk.key’
ENCRYPTION BY PASSWORD = ‘new strong password’
CLOSE MASTER KEY ;

Để khôi phục khóa DMK từ file, chúng ta thực hiện lệnh sau:
RESTORE MASTER KEY FROM FILE = ‘e:\encryption_keys\dmk.key’’
DECRYPTION BY PASSWORD = ‘new strong password’
ENCRYPTION BY PASSWORD = ‘a very strong password’


Để tạo một bản sao của DMK được bảo vệ bằng SMK, và lưu nó trong cơ sở dữ
liệu hiện hành và cơ sở dữ liệu master, thực hiện lệnh
ALTER MASTER KEY ADD ENCRYPTION BY SERVICE MASTER KEY ;

Chúng ta có thể muốn hạn chế truy cập chỉ để những người dùng cung cấp mật
khẩu. Để làm điều đó, loại bỏ việc bảo vệ SMK, như thể hiện trong ví dụ sau đây
Để loại bỏ việc bảo vệ DMK bởi SMK, thực hiện lệnh sau:
ALTER MASTER KEY
DROP ENCRYPTION BY SERVICE MASTER KEY;

Để xóa bỏ khóa DMK, thực hiện lệnh sau:
DROP MASTER KEY ;

21


2.2.3 Tạo và sử dụng khóa mã đối xứng
Để mã hóa dữ liệu trong cột, đầu tiên chúng ta cần phải tạo các khóa mã. SQL
Server cho phép chúng ta định nghĩa 2 kiểu khóa:
• Khóa đối xứng: Cùng một khóa được sử dụng để mã hóa và giải mã
• Khóa phi đối xứng: Một cặp khóa được sử dụng. Một khóa công khai (public
key) được dùng để mã hóa và một khóa bí riêng (private key) dùng để giải mã
Mã hóa đối xứng là nhanh hơn mã hóa phi đối xứng, nhưng độ an toàn kém hơn.
Thuật toán mã hóa có thể sử dụng các khóa đối xứng đó là DES, TRIPLE_DES,
TRIPLE_DES_3KEY, RC2, RC4, RC4_128, DESX, AES_128, AES_192,
AES_256.
Một lần nữa, sự bí mật của mã hóa nằm ở khóa. Khóa này cần được bảo vệ để ngăn
chặn truy cập không mong muốn. Để bảo vệ khóa, chúng ta mã hóa nó với một
khóa khác hoặc với một mật khẩu mạnh. Một khóa có thể được bảo vệ bởi một số

thao tác mã hóa. Ví dụ, chúng ta có thể mã hóa một khóa đối xứng bởi một mật
khẩu và một khóa phi đối xứng. Sau đó để mở nó, chúng ta cần phải cung cấp chỉ
một trong số chúng. Điều này có ích khi chúng ta cung cấp các phương pháp để
giải mã một số dữ liệu cho người sử dụng khác nhau bằng cách sử dụng cùng khóa,
nhưng với mật khẩu cá nhân. Nếu một người sử dụng sẽ cần bị từ chối truy cập
trong tương lai, chúng ta chỉ phải gỡ bỏ mật khẩu từ khóa đó, như thể hiện trong
đoạn mã sau:
CREATE SYMMETRIC KEY UserSKey
WITH ALGORITHM = AES_256
ENCRYPTION BY PASSWORD = 'Password for Fred',
PASSWORD = 'Password for Mary' ;
OPEN SYMMETRIC KEY UserSKey
DECRYPTION BY PASSWORD = 'Password for Fred' ;
ALTER SYMMETRIC KEY UserSKey
DROP ENCRYPTION BY PASSWORD = 'Password for Fred' ;
CLOSE SYMMETRIC KEY UserSKey ;

22


Đoạn mã trên tạo khóa đối xứng UserSKey với 2 mật khẩu. Mary và Fred sẽ có thể
mở được khóa này bằng cách sử dụng mật khẩu được cung cấp. Để ngăn chặn Fred
mở khóa, một người quản trị (là người biết được mật khẩu của Fred và có quyền
ALTER trên khóa) có thể mở khóa và sử dụng lệnh ALTER SYMMETRIC KEY
để loại bỏ mật khẩu.
View sys.openkeys cho chúng ta biết các khóa được mở cho phiên hiện tại. Khóa
được lưu trong cơ sở dữ liệu mà nó được tạo ra. Để mở và sử dụng khóa, chúng ta
phải ở trong ngữ cảnh cơ sở dữ liệu đó. Nếu chúng ta cố gắng để mở một khóa
trong ngữ cảnh cơ sở dữ liệu sai, thì chúng ta sẽ nhận được một thông báo lỗi
‘object not found’. Nếu chúng ta mở thành công một khóa, sau đó thay đổi ngữ

cảnh cơ sở dữ liệu và cố gắng mã hóa một cái gì đó thì sẽ nhận được kết quả
NULL. Trong mã hóa đối xứng, việc mã hóa và giải mã sử dụng cùng một khóa,
đôi khi chúng ta có thể muốn gửi khóa này đến máy chủ khác để trao đổi các thông
tin được mã hóa. Không có cách nào để sao lưu hoặc trích xuất một khóa đối xứng
tạo ra trong SQL Server vào một tập tin, nhưng chúng ta có thể tạo lại khóa này
trên một máy chủ khác. Để thực hiện điều này chúng ta cung cấp tùy chọn
KEY_SOURCE và IDENTITY_VALUE khi chúng ta tạo khóa như sau:
CREATE SYMMETRIC KEY SKeyToShare WITH
ALGORITHM = AES_256,
KEY_SOURCE = 'a complex passphrase #1',
IDENTITY_VALUE = 'a complex passphrase #2'
ENCRYPTION BY PASSWORD = 'a complex passphrase #3';

Hai khóa đối xứng tạo ra với cùng KEY_SOURCE và IDENTITY_VALUE là
giống hệt nhau, và chúng có thể được sử dụng thay thế cho nhau. Ở đây, chúng ta
bảo vệ các khóa bằng mật khẩu, nhưng chúng ta cũng có thể bảo vệ chúng với một
khoá phi đối xứng hoặc chứng chỉ.
23


Khi chúng ta mở khóa bằng lệnh OPEN SYMMETRIC KEY, khóa này sẽ được
duy trì đến khi chúng ta đóng nó hoặc phiên này kết thúc.
Nếu chúng ta muốn mở một khóa cho một phiên hoặc tất cả các phiên, mà không
cần đặt bất kỳ lệnh nào trong mã lệnh của mã khách hàng thì chúng ta thực hiện
lệnh OPEN SYMMETRIC KEY trong sự kiện kích hoạt đăng nhập. Chúng ta có
thể chèn lệnh OPEN SYMMETRIC KEY trong thủ tục lưu trữ với ngữ cảnh thực
hiện là OWNER hoặc SELF để ẩn mật khẩu từ người dùng. Khóa sẽ được mở ra
trong thủ tục và sẽ duy trì cho đến khi phiên kết thúc. Tất nhiên, việc thực hành an
toàn tốt nhất là không giữ việc mở khóa trong thời gian dài hơn mức cần thiết, và
chèn lệnh OPEN SYMMETRIC KEY trong khối xử lý lỗi try/catch để đảm bảo

rằng các khóa đã được đóng ngay cả trường hợp có lỗi xảy ra, như trong ví dụ sau:
BEGIN TRY
OPEN SYMMETRIC KEY UserSKey
DECRYPTION BY PASSWORD = 'I am for Fred';
/* Thực hiện các công việc tại đây */
……

CLOSE SYMMETRIC KEY UserSKey;
END TRY
BEGIN CATCH
IF EXISTS (SELECT * FROM sys.openkeys WHERE key_name = 'UserSKey')
CLOSE SYMMETRIC KEY UserSKey;
END CATCH

2.2.4 Tạo và sử dụng các khóa phi đối xứng
Một khóa bất đối xứng là một cặp khóa: một khóa công khai mà chỉ có thể mã hóa
dữ liệu, và một khóa riêng chỉ có thể giải mã những gì đã được mã hóa bằng khóa
24


công khai tướng ứng. Để có các khóa bất đối xứng được mã hóa bằng các khóa
DMK, trước hết chúng ta phải tạo các khóa DMK. Nếu cơ sở dữ liệu không có
khóa DMK, chúng ta vẫn có thể tạo khóa bất đối xứng, nhưng sẽ được bảo vệ bằng
mật khẩu.
Để tạo một khóa bất đối xứng, chúng ta thực hiện các bước sau:
• Tạo khóa bất đối xứng một cách đơn giản nhất, thực hiện lệnh:
CREATE ASYMMETRIC KEY EmployeeSalaryASKey
WITH ALGORITHM = RSA_2048;

Lưu ý rằng, lệnh ở trên chúng ta không cung cấp mật khẩu. Nếu chúng ta tạo

một khóa bất đối xứng mà không cung cấp mật khẩu thì khóa riêng sẽ được mã
hóa bằng khóa DMK.
• Để thấy những khóa đang tồn tại trong cơ sở dữ liệu hiện tại, chúng ta có thế
xem view sys.asymmetric_keys, như sau:
SELECT * FROM sys.asymmetric_keys;

Thuật toán mật mã được sử dụng cho khóa bất đối xứng là RSA (được đặt theo tên
của 3 người tạo ra thuật toán: Ron Rivest, Adi Shamir, Leonard Adleman). Độ dài
khóa ở đây chọn là 2028 bit.
Microsoft khuyến cáo sử dụng khóa đối xứng để mã hóa dữ liệu, bởi vì lý do chính
là mã hóa và giải mã khóa bất đối xứng cần nhiều tài nguyên hơn. Cách sử dụng
thông thường là sử dụng mã hóa đối xứng để mã hóa dữ liệu, và khóa đối xứng này
được bảo vệ bởi khóa mã bất đối xứng. Theo cách này thì hiệu năng thực hiện
không giảm đáng kể vì việc giải mã khóa bất đối xứng chỉ xảy ra một lần khi giải
mã để lấy khóa phi đối xứng. Đoạn mã sau chỉ ra cách sử dụng khóa bất đối xứng
để bảo vệ khóa đối xứng.
USE HumanResources;
CREATE ASYMMETRIC KEY HumanResourceASKey
WITH ALGORITHM = RSA_2048
25


×