Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

Mã hóa dữ liệu minh bạch và luôn được mã hóa

Nếu bạn cần lưu trữ dữ liệu bí mật trong cơ sở dữ liệu của mình, bạn có thể sử dụng mã hóa dữ liệu . SQL Server hỗ trợ mã hóa bằng khóa đối xứng, khóa bất đối xứng, chứng chỉ và cụm từ mật khẩu. Tôi cho rằng bạn, người đọc, đã quen thuộc với những thuật ngữ này. Trong bài viết này, tôi sẽ tập trung vào hai trong số nhiều tùy chọn mã hóa được cung cấp bởi SQL Server:

  • Mã hóa dữ liệu minh bạch (TDE)
  • Luôn được mã hóa (AE)

Mã hóa dữ liệu minh bạch

Mã hóa dữ liệu minh bạch (TDE) bảo vệ dữ liệu ở trạng thái nghỉ khi nó không được sử dụng. Khi dữ liệu được sử dụng, SQL Server sẽ tự động giải mã nó. Bạn có thể sử dụng TDE để mã hóa và giải mã thời gian thực đối với dữ liệu và tệp nhật ký. Bạn mã hóa dữ liệu bằng khóa mã hóa cơ sở dữ liệu (DEK) , là một khóa đối xứng. Nó được lưu trữ trong bản ghi khởi động cơ sở dữ liệu và do đó đã có sẵn trong quá trình khôi phục cơ sở dữ liệu. Bạn bảo vệ DEK bằng chứng chỉ trong cơ sở dữ liệu chính. Bạn cũng có thể sử dụng khóa không đối xứng thay cho chứng chỉ; tuy nhiên, khóa không đối xứng phải được lưu trữ trong một mô-đun EKM. TDE chỉ sử dụng mã hóa AES và Triple DES. TDE lần đầu tiên được triển khai trong SQL Server với phiên bản 2012.

Bạn chỉ có thể sử dụng TDE trên cơ sở dữ liệu người dùng. Bạn không thể xuất khóa mã hóa cơ sở dữ liệu. Khóa này chỉ được sử dụng bởi SQL Server Database Engine. Người dùng cuối không bao giờ sử dụng nó. Ngay cả khi bạn thay đổi chủ sở hữu cơ sở dữ liệu, bạn không cần tạo lại DEK.

TDE mã hóa dữ liệu ở cấp độ trang. Ngoài ra, nó cũng mã hóa nhật ký giao dịch. Bạn nên sao lưu chứng chỉ được sử dụng để bảo vệ DEK và khóa riêng được sử dụng để bảo vệ chứng chỉ ngay sau khi bạn bật TDE. Nếu bạn cần khôi phục hoặc đính kèm cơ sở dữ liệu đã mã hóa vào phiên bản SQL Server khác, bạn cần khôi phục cả chứng chỉ và khóa riêng tư, nếu không bạn không thể mở cơ sở dữ liệu. Một lần nữa lưu ý rằng bạn không xuất DEK, vì nó là một phần của chính cơ sở dữ liệu. Bạn cần giữ và duy trì chứng chỉ được sử dụng để bảo vệ DEK ngay cả sau khi bạn tắt TDE trên cơ sở dữ liệu. Điều này là do các phần của nhật ký giao dịch vẫn có thể được mã hóa. Chứng chỉ là cần thiết cho đến khi bạn thực hiện sao lưu toàn bộ cơ sở dữ liệu.

Luôn được mã hóa

SQL Server 2016 Enterprise Edition giới thiệu một cấp độ mã hóa mới, cụ thể là Luôn được mã hóa (AE) tính năng. Tính năng này cho phép mức độ bảo vệ dữ liệu tương tự như mã hóa dữ liệu trong ứng dụng khách. Trên thực tế, mặc dù đây là một tính năng của SQL Server, nhưng dữ liệu được mã hóa và giải mã ở phía máy khách. Các khóa mã hóa không bao giờ được tiết lộ cho SQL Server Database Engine. Bằng cách này, DBA cũng không thể xem dữ liệu nhạy cảm mà không có khóa mã hóa, chỉ bằng cách có quyền sysadmin trên phiên bản SQL Server với dữ liệu được mã hóa. Bằng cách này, AE tạo sự tách biệt giữa quản trị viên quản lý dữ liệu và người dùng sở hữu dữ liệu.

Phím AE

Bạn cần hai khóa cho Luôn được mã hóa. Trước tiên, bạn tạo khóa chính của cột (CMK) . Sau đó, bạn tạo khóa mã hóa cột (CEK) và bảo vệ nó bằng CMK. Một ứng dụng sử dụng CEK để mã hóa dữ liệu. SQL Server chỉ lưu trữ dữ liệu được mã hóa và không thể giải mã nó. Điều này có thể xảy ra vì khóa chính của cột không thực sự được lưu trữ trong cơ sở dữ liệu SQL Server. Trong cơ sở dữ liệu, SQL Server chỉ lưu trữ liên kết đến các khóa đó. Khóa chính của cột được lưu trữ bên ngoài SQL Server, ở một trong những nơi có thể sau:

  • Kho lưu trữ chứng chỉ Windows cho người dùng hiện tại
  • Kho lưu trữ chứng chỉ Windows cho máy cục bộ
  • Dịch vụ Azure Key Vault
  • Mô-đun bảo mật phần cứng (HSM) , hỗ trợ Microsoft CryptoAPI hoặc API mật mã:Thế hệ tiếp theo

Các khóa mã hóa cột được lưu trữ trong cơ sở dữ liệu. Bên trong cơ sở dữ liệu SQL Server, chỉ phần được mã hóa của các giá trị của khóa mã hóa cột được lưu trữ cùng với thông tin về vị trí của khóa chính của cột. CEK không bao giờ được lưu trữ dưới dạng văn bản thuần túy trong cơ sở dữ liệu. CMK, như đã đề cập, thực sự được lưu trữ trong các kho khóa đáng tin cậy bên ngoài.

Sử dụng các phím AE

Một ứng dụng có thể sử dụng khóa AE và mã hóa bằng cách sử dụng trình điều khiển hỗ trợ AE, như .NET Framework Data Provider cho SQL Server phiên bản 4.6 trở lên, Microsoft JDBC Driver cho SQL Server 6.0 trở lên hoặc trình điều khiển Windows ODBC cho SQL Server phiên bản 13.1 trở lên cao hơn. Ứng dụng phải gửi truy vấn được tham số hóa sang SQL Server. Trình điều khiển hỗ trợ AE hoạt động cùng với Công cụ cơ sở dữ liệu máy chủ SQL để xác định tham số nào nên được mã hóa hoặc giải mã. Đối với mỗi tham số cần được mã hóa hoặc giải mã, trình điều khiển sẽ nhận được siêu dữ liệu cần thiết để mã hóa từ Công cụ cơ sở dữ liệu, bao gồm thuật toán mã hóa, vị trí của CMK tương ứng và giá trị được mã hóa cho CEK tương ứng. Sau đó, trình điều khiển liên hệ với cửa hàng CMK, lấy CMK, giải mã CEK và sử dụng CEK để mã hóa hoặc giải mã tham số. Sau đó, trình điều khiển lưu trữ CEK, để tăng tốc độ sử dụng tiếp theo của cùng một CEK. Hình sau thể hiện quy trình bằng đồ thị.

Hình thể hiện toàn bộ quá trình theo các bước:

  1. Ứng dụng khách tạo một truy vấn được tham số hóa
  2. Ứng dụng khách gửi truy vấn được tham số hóa tới trình điều khiển được kích hoạt AE
  3. Trình điều khiển hỗ trợ AE liên hệ với SQL Server để xác định thông số nào cần mã hóa hoặc giải mã, vị trí của CMK và giá trị được mã hóa của CEK
  4. Trình điều khiển hỗ trợ AE truy xuất CMK và giải mã CEK
  5. Trình điều khiển hỗ trợ AE mã hóa (các) tham số
  6. Trình điều khiển gửi truy vấn đến Công cụ cơ sở dữ liệu
  7. Công cụ cơ sở dữ liệu truy xuất dữ liệu và gửi tập hợp kết quả tới trình điều khiển
  8. Trình điều khiển thực hiện giải mã, nếu cần và gửi tập hợp kết quả tới ứng dụng khách

Các kiểu mã hóa AE

Cơ sở dữ liệu không bao giờ hoạt động trên dữ liệu văn bản thuần túy được lưu trữ trong các cột được mã hóa. Tuy nhiên, một số truy vấn về dữ liệu được mã hóa có thể thực hiện được, tùy thuộc vào loại mã hóa. Có hai loại mã hóa:

  • Mã hóa xác định , luôn tạo ra cùng một giá trị được mã hóa cho cùng một giá trị đầu vào. Với mã hóa này, bạn có thể lập chỉ mục cột được mã hóa và sử dụng tra cứu điểm, phép nối bình đẳng và nhóm biểu thức trên cột được mã hóa. Tuy nhiên, một người dùng độc hại có thể cố gắng đoán các giá trị bằng cách phân tích các mẫu của các giá trị được mã hóa. Điều này đặc biệt nguy hiểm khi tập hợp các giá trị có thể có cho một cột là rời rạc, với một số lượng nhỏ các giá trị riêng biệt.
  • Mã hóa ngẫu nhiên , mã hóa dữ liệu theo cách không thể đoán trước.

AE Demo:Tạo đối tượng

Đã đến lúc trình bày cách thức hoạt động của AE thông qua một số đoạn mã demo. Trước tiên, hãy tạo và sử dụng cơ sở dữ liệu demo.

USE master;
IF DB_ID(N'AEDemo') IS NULL
   CREATE DATABASE AEDemo;
GO
USE AEDemo;
GO

Tiếp theo, tạo CMK trong SSMS GUI. Trong Object Explorer, làm mới thư mục Cơ sở dữ liệu để xem cơ sở dữ liệu AEDemo. Mở rộng thư mục cơ sở dữ liệu này, mở rộng thư mục con Bảo mật, sau đó là thư mục con Khóa luôn được mã hóa và bấm chuột phải vào thư mục con Khóa chính cột và chọn tùy chọn Khóa chính cột mới từ menu bật lên. Trong hộp văn bản Tên, hãy viết AE_ColumnMasterKey và đảm bảo bạn chọn tùy chọn Windows Certificate Store - Local Machine trong danh sách thả xuống Key Store, như hình minh họa sau đây.

Bạn có thể kiểm tra xem CMK đã được tạo thành công hay chưa bằng truy vấn sau.

SELECT * 
FROM sys.column_master_keys;

Tiếp theo, bạn tạo CEK. Trong SSMS, trong Object Explorer, bấm chuột phải vào thư mục con Khóa mã hóa cột ngay bên dưới thư mục con Khóa chính cột và chọn tùy chọn Khóa mã hóa cột mới từ menu bật lên. Đặt tên cho CEK AE_ColumnEncryptionKey và sử dụng AE_ColumnMasterKey CMK để mã hóa nó. Bạn có thể kiểm tra xem việc tạo CEK có thành công hay không bằng truy vấn sau.

SELECT * 
FROM sys.column_encryption_keys;

Hiện tại, chỉ có các đối chiếu nhị phân mới, các đối chiếu với BIN2 hậu tố, được hỗ trợ cho AE. Do đó, hãy tạo một bảng với các đối chiếu thích hợp cho các cột ký tự.

CREATE TABLE dbo.Table1
(id INT,
 SecretDeterministic NVARCHAR(10) COLLATE Latin1_General_BIN2 
  ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = AE_ColumnEncryptionKey,
   ENCRYPTION_TYPE = DETERMINISTIC,
   ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL,
 SecretRandomized NVARCHAR(10) COLLATE Latin1_General_BIN2
  ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = AE_ColumnEncryptionKey,
   ENCRYPTION_TYPE = RANDOMIZED,
   ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NULL
);

AE Demo:Chèn dữ liệu

Bây giờ, bạn có thể thử chèn một hàng dữ liệu bằng câu lệnh sau.

INSERT INTO dbo.Table1
 (id, SecretDeterministic, SecretRandomized)
VALUES (1, N'DeterSec01', N'RandomSec1');

Bạn gặp lỗi 206, văn bản lỗi:“Operand type clash:nvarchar không tương thích với nvarchar (4000) được mã hóa bằng (encode_type ='DETERMINISTIC', crypt_algorithm_name ='AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name ='column_encryption_key_name =' AEAD_Column '' . SQL Server không thể mã hóa hoặc giải mã dữ liệu. Bạn cần sửa đổi dữ liệu từ một ứng dụng khách. Bạn có thể thực hiện một số thao tác hạn chế trên bảng từ SQL Server. Ví dụ:bạn có thể sử dụng câu lệnh TRUNCATE TABLE trên bảng có các cột AE.

Tôi đã tạo một ứng dụng Windows Console máy khách rất đơn giản trong Visual C #. Ứng dụng thực sự chỉ lấy các khóa và chèn một hàng duy nhất vào bảng được tạo bằng mã ở trên. Đây là mã C #.

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace AEDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            string connectionString = "Data Source=localhost; “ +
              “Initial Catalog=AEDemo; Integrated Security=true; ” +
              “Column Encryption Setting=enabled";
            SqlConnection connection = new SqlConnection(connectionString);
            connection.Open();
            if (args.Length != 3)
            {
                Console.WriteLine("Please enter a numeric “ + 
                                  “and two string arguments.");
                return;
            }
            int id = Int32.Parse(args[0]);
            {
                using (SqlCommand cmd = connection.CreateCommand())
                {
                    cmd.CommandText = @"INSERT INTO dbo.Table1 “ +
                        “(id, SecretDeterministic, SecretRandomized)" +
                        " VALUES (@id, @SecretDeterministic, @SecretRandomized);";

                    SqlParameter paramid= cmd.CreateParameter();
                    paramid.ParameterName = @"@id";
                    paramid.DbType = DbType.Int32;
                    paramid.Direction = ParameterDirection.Input;
                    paramid.Value = id;
                    cmd.Parameters.Add(paramid);

                    SqlParameter paramSecretDeterministic = cmd.CreateParameter();
                    paramSecretDeterministic.ParameterName = 
                      @"@SecretDeterministic";
                    paramSecretDeterministic.DbType = DbType.String;
                    paramSecretDeterministic.Direction = ParameterDirection.Input;
                    paramSecretDeterministic.Value = "DeterSec1";
                    paramSecretDeterministic.Size = 10;
                    cmd.Parameters.Add(paramSecretDeterministic);

                    SqlParameter paramSecretRandomized = cmd.CreateParameter();
                    paramSecretRandomized.ParameterName =
                      @"@SecretRandomized";
                    paramSecretRandomized.DbType = DbType.String;
                    paramSecretRandomized.Direction = ParameterDirection.Input;
                    paramSecretRandomized.Value = "RandomSec1";
                    paramSecretRandomized.Size = 10;
                    cmd.Parameters.Add(paramSecretRandomized);

                    cmd.ExecuteNonQuery();
                }
            }
            connection.Close();
            Console.WriteLine("Row inserted successfully");            
        }
    }
}

Bạn có thể chạy mã C # từ Visual Studio ở chế độ gỡ lỗi hoặc xây dựng ứng dụng. Sau đó, bạn có thể chạy ứng dụng AEDemo.exe từ dấu nhắc lệnh hoặc từ SSMS ở chế độ SQMCMD.

AE Demo:Đọc dữ liệu

Sau khi chạy ứng dụng, bạn nên thử đọc dữ liệu từ cùng một phiên trong SSMS mà bạn đã sử dụng để tạo bảng.

SELECT *
FROM dbo.Table1;

Bạn chỉ có thể xem dữ liệu được mã hóa. Bây giờ, hãy mở cửa sổ truy vấn thứ hai trong SSMS. Bấm chuột phải vào cửa sổ này và chọn Kết nối, sau đó Thay đổi kết nối. Trong hộp thoại Kết nối, nhấp vào nút Tùy chọn ở dưới cùng. Nhập AEDemo cho tên cơ sở dữ liệu và sau đó bấm vào tab Tham số kết nối bổ sung. Trong hộp văn bản, nhập “Cài đặt mã hóa cột =đã bật” (không có dấu ngoặc kép). Sau đó nhấp vào Kết nối.

Hãy thử lại để chèn một hàng từ SSMS. Sử dụng truy vấn sau.

INSERT INTO dbo.Table1
 (id, SecretDeterministic, SecretRandomized)
VALUES (2, N'DeterSec2', N'RandomSec2');

Tôi lại gặp lỗi. Phiên bản SSMS này tôi đang sử dụng vẫn không thể tham số hóa các chèn đặc biệt. Tuy nhiên, hãy thử đọc dữ liệu bằng truy vấn sau.

SELECT *
FROM dbo.Table1;

Lần này, truy vấn hoạt động và bạn nhận được kết quả sau:

Id SecretDeterministic SecretRandomized

- ——————– —————-

1 ConfirmSec1 RandomSec1

2 ConfirmSec2 RandomSec2

Hạn chế AE

Bạn đã thấy một số hạn chế của Luôn được mã hóa, bao gồm:

  • Chỉ hỗ trợ đối chiếu BIN2 cho chuỗi
  • Bạn chỉ có thể lập chỉ mục các cột có mã hóa xác định và sử dụng một tập hợp giới hạn các phép toán T-SQL trên các cột đó
  • Bạn không thể lập chỉ mục các cột bằng mã hóa ngẫu nhiên
  • AE chỉ giới hạn trong các phiên bản Doanh nghiệp và Nhà phát triển
  • Làm việc với AE trong SSMS có thể khó khăn

Vui lòng tham khảo Books Online để biết danh sách chi tiết hơn về các giới hạn của AE. Tuy nhiên AE cũng lưu ý những điểm mạnh nhé. Nó đơn giản để thực hiện vì nó không cần sửa đổi trong một ứng dụng, ngoại trừ việc sửa đổi các chuỗi kết nối. Dữ liệu được mã hóa end-to-end, từ bộ nhớ máy khách qua mạng đến bộ lưu trữ cơ sở dữ liệu. Ngay cả DBA cũng không thể chỉ xem dữ liệu trong SQL Server; ngay cả DBA cũng cần quyền truy cập vào bộ lưu trữ khóa bên ngoài SQL Server để đọc CMK. AE và các tùy chọn mã hóa khác trong SQL Server cung cấp một tập hợp đầy đủ các khả năng và tùy thuộc vào bạn và vấn đề kinh doanh mà bạn đang giải quyết để chọn phương pháp thích hợp.

Kết luận

Mã hóa dữ liệu minh bạch cực kỳ đơn giản để sử dụng. Tuy nhiên, việc bảo vệ dữ liệu rất hạn chế. TDE chỉ bảo vệ dữ liệu ở trạng thái nghỉ. Tuy nhiên, Luôn mã hóa thực sự là một tính năng mạnh mẽ. Nó vẫn không quá phức tạp để thực hiện và dữ liệu được bảo vệ hoàn toàn. Thậm chí không một DBA nào có thể nhìn thấy nó nếu không có quyền truy cập vào các khóa mã hóa. Hy vọng rằng các giới hạn dành cho AE, đặc biệt là giới hạn đối chiếu, sẽ được loại bỏ trong các phiên bản SQL Server trong tương lai.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MERGE:Cập nhật các bảng nguồn và mục tiêu nằm trên các máy chủ riêng biệt

  2. Cải thiện Mô hình Dữ liệu Cổng Thông tin Việc làm Trực tuyến của Chúng tôi

  3. Cách sắp xếp theo ngày trong T-SQL

  4. RDBMS so với NoSQL

  5. Làm thế nào để lọc các hàng không có NULL trong một cột