SQL Server 2016 bao gồm một tính năng bảo mật cơ sở dữ liệu được gọi là Luôn được Mã hóa. Vì chúng tôi đã thêm hỗ trợ Luôn được Mã hóa vào trình điều khiển SQL Server ODBC, khách hàng của chúng tôi sẽ có thể tận dụng tính năng này.
Luôn được mã hóa bảo vệ dữ liệu SQL Server tại thời điểm dễ bị tấn công nhất:khi dữ liệu đó đang được sử dụng. Ví dụ, trong quá trình giao dịch và tính toán. Điều này khác với các tính năng mã hóa SQL Server hiện có vì chúng yêu cầu dữ liệu phải được giải mã trước khi có thể thực hiện các thao tác trên đó.
Khóa mã hóa bảo vệ các cột Luôn được Mã hóa được lưu trữ trên máy ứng dụng. Điều này có nghĩa là SQL Server không thể giải mã dữ liệu luôn được mã hóa. Nếu máy SQL Server bị xâm nhập, kẻ tấn công sẽ chỉ có thể truy cập vào dữ liệu Luôn được Mã hóa ở dạng mật mã.
Đối với hầu hết người dùng, tính năng Luôn được mã hóa sẽ minh bạch, tức là họ được cách ly khỏi hoạt động của Luôn được mã hóa và không phải thay đổi những gì họ đang làm để hưởng lợi từ tính năng này.
Ở cuối ứng dụng, mã hóa được thực hiện bởi trình điều khiển phần mềm cung cấp giao diện máy khách cho SQL Server. Trên Linux và UNIX, đây là trình điều khiển ODBC, mã hóa hoặc giải mã dữ liệu một cách minh bạch tùy thuộc vào hướng di chuyển. Trong trường hợp của trình điều khiển Easysoft, Luôn mã hóa được bật bằng cách đặt tham số chuỗi kết nối.
Khi mọi người ngày càng lo ngại rằng dữ liệu của họ được an toàn trên đám mây, Luôn được mã hóa sẽ có sẵn trong Azure SQL, phiên bản trả tiền dựa trên đám mây của SQL Server. Do đó, trình điều khiển ODBC của Easysoft cho Azure SQL cũng sẽ hỗ trợ Luôn được Mã hóa.
Hướng dẫn:Làm việc với dữ liệu cột Luôn được Mã hóa trên Linux
Trình điều khiển ODBC SQL Server của Easysoft cho phép bạn cập nhật và truy vấn dữ liệu được giữ trong các cột Luôn được Mã hóa.
Tạo bảng và tạo khóa mã hóa
Các bước này được thực hiện trên máy SQL Server.
- Trong SQL Server Management Studio 2016 CTP3 trở lên, hãy tạo cơ sở dữ liệu mới.
- Trong cơ sở dữ liệu mới, hãy tạo một bảng chứa một hoặc nhiều cột có nội dung bạn muốn mã hóa. Ví dụ:
CREATE TABLE dbo.EncryptedTable (ID INT IDENTITY (1,1) PRIMARY KEY, LastName NVARCHAR (32), Salary INT NOT NULL);
- Nhấp chuột phải vào cơ sở dữ liệu. Từ trình đơn bật lên, hãy chọn Công việc> Mã hóa Cột .
Trình hướng dẫn luôn được mã hóa bắt đầu.
- Trên Lựa chọn Cột , mở rộng bảng và chọn cột bạn muốn mã hóa.
- Chọn một kiểu mã hóa cho mỗi cột.
Xác định - luôn mã hóa thành cùng một văn bản mật mã, cho phép thực hiện tra cứu bình đẳng, nối và nhóm theo.
Ngẫu nhiên tạo một giá trị văn bản mật mã khác cho cùng một văn bản thuần túy, an toàn hơn, nhưng không hỗ trợ bất kỳ thao tác nào.
- Chọn
CEK_Auto1 (New)
làm khóa mã hóa cho mỗi cột, là khóa mới được tạo tự động. Chọn Tiếp theo . - Trong trang Cấu hình Khoá Chính, chấp nhận cài đặt mặc định:
Field Giá trị Chọn khóa chính của cột Tự động tạo khóa chính của cột Chọn nhà cung cấp kho khóa Kho chứng chỉ Windows Chọn khóa chính của cột Người dùng hiện tại - Sử dụng Tiếp theo để tiếp tục đến Tóm tắt trang. Chọn Kết thúc .
- Chờ trình hướng dẫn hoàn thành và sau đó chọn Đóng .
Xuất chứng chỉ
Để chuyển các chứng chỉ sang máy Linux, trước tiên bạn cần xuất chúng trên Windows.
- Trong cửa sổ nhắc lệnh, nhập
certmgr
, để khởi chạy phần đính vào Chứng chỉ. - Chứng chỉ luôn được mã hóa mới sẽ có sẵn trong Chứng chỉ - Người dùng hiện tại> Cá nhân> Chứng chỉ .
- Nhấp chuột phải vào chứng chỉ (sẽ được gọi là
Always Encrypted Auto Certificate1
). Từ trình đơn bật lên, chọn Tất cả Công việc> Xuất .Trình hướng dẫn xuất chứng chỉ bắt đầu. Chọn Tiếp theo .
- Chọn Có, xuất khóa cá nhân .
- Chấp nhận các giá trị mặc định trong trang Định dạng Tệp Xuất. Chọn Tiếp theo .
- Cung cấp mật khẩu khi được nhắc. Chọn Tiếp theo .
- Đặt tên và lưu chứng chỉ khi được nhắc. Ví dụ:
CMK_Auto1.pfx
. - Sử dụng Tiếp theo và Kết thúc để hoàn thành trình hướng dẫn.
Cài đặt chứng chỉ trên Linux
Chuyển các chứng chỉ đã xuất sang máy Linux mà bạn muốn truy cập vào các cột Luôn được Mã hóa:
- Sao chép chứng chỉ bạn vừa xuất sang
~/ssl/private
trên máy Linux hoặc UNIX nơi bạn đã cài đặt trình điều khiển SQL Server ODBC.~
là thư mục chính của người dùng sẽ chạy ứng dụng kết nối với SQL Server thông qua trình điều khiển Easysoft ODBC.~/ssl/private
là vị trí mà lớp OpenSSL được tích hợp trong trình điều khiển sẽ cố gắng tải chứng chỉ cá nhân từ đó. Tạo thư mục nếu nó không tồn tại. Ví dụ:$ mkdir -p ~ / ssl / private $ cd ~ / ssl / private $ mv /tmp/CMK_Auto1.pfx.
- Để sử dụng chứng chỉ với trình điều khiển ODBC SQL Server, bạn cần xóa cụm mật khẩu có trong đó. Để thực hiện việc này, OpenSSL phải được cài đặt trên máy. (Điều này chỉ cần thiết để loại bỏ cụm mật khẩu, đối với các hoạt động khác, trình điều khiển SQL Server ODBC sử dụng lớp OpenSSL tích hợp sẵn.) Loại bỏ cụm mật khẩu bằng các lệnh sau. Khi được nhắc nhập cụm mật khẩu sau giây , nhấn RETURN mà không cần nhập bất cứ thứ gì. Điều này sẽ đặt cụm mật khẩu thành không.
$ openssl pkcs12 -in CMK_Auto1.pfx -nodes -out temp.pemEnter Import Password:******* MAC đã xác minh OK $ openssl pkcs12 -export -in temp.pem -out nopassphrase.p12Enter Export Password:Đang xác minh - Nhập mật khẩu xuất:$
- Để tải chứng chỉ, trình điều khiển SQL Server ODBC sử dụng thông tin meta mà nó nhận được từ SQL Server về cột được mã hóa. Tên chứng chỉ mà trình điều khiển nhận được từ SQL Server có dạng
my/thumbprint
. Bạn cần sử dụng quy ước đặt tên này cho chứng chỉ. Sử dụng OpenSSL để hiển thị dấu vết của chứng chỉ và sau đó đổi tên chứng chỉ trong thư mục con có tên là my:$ openssl x509 -in temp.pem -fingerprint -noout | tr -d ":" SHA1 Fingerprint =EFC1940E545941D6C05C763361403F55A5DEF0E8 $ mkdir my $ cp nopassphrase.p12 my / EFC1940E545941D6C05C763361403F55A5DEF0E8 $ ln -s my My
Lưu ý Trong quá trình thử nghiệm, chúng tôi nhận thấy rằng SQL Server đôi khi đặt tên chứng chỉ là
My/thumbprint
. Liên kết tượng trưng trong ví dụ trên hoạt động xung quanh sự không nhất quán này.
Cài đặt trình điều khiển ODBC SQL Server
Trình điều khiển SQL Server ODBC không chỉ cung cấp lớp kết nối giữa ứng dụng và SQL Server, nó còn xử lý mã hóa / giải mã dữ liệu được lưu trữ trong các cột Luôn được Mã hóa.
Cài đặt và cấp phép trình điều khiển SQL Server ODBC. Để biết hướng dẫn về cách thực hiện việc này, hãy tham khảo tài liệu trình điều khiển SQL Server ODBC. Nếu ứng dụng của bạn là 64 bit, hãy tải xuống phiên bản 64 bit của trình điều khiển ODBC. Nếu không, hãy sử dụng phiên bản 32-bit của trình điều khiển, bất kể kiến trúc của hệ điều hành.
Nguồn dữ liệu ODBC chứa thông tin chuỗi kết nối cho phép trình điều khiển ODBC SQL Server kết nối với phiên bản SQL Server đích. Trên máy của chúng tôi, các nguồn dữ liệu ODBC được lưu trữ trong /etc/odbc.ini
. Trích xuất nguồn dữ liệu này hiển thị các cài đặt có liên quan cho các cột Luôn được Mã hóa:
[SQLSERVER_2016] Driver =Easysoft ODBC-SQL Server SSL # Phải sử dụng phiên bản SSL của driverServer =machine \ sqlserver_instanceDatabase =database_with_always_encrypted_dataUser =user # Đây có thể là thông tin đăng nhập Windows hoặc SQL Server. để # chèn vào cột Luôn được Mã hóa được đặt thành Đã bật
Lưu ý Nếu kết nối của bạn không thành công với lỗi "Kết nối SSL không thành công trong cuộc gọi tổng hợp", hệ thống của bạn thiếu "thiết bị ngẫu nhiên". Xem Entropy
trong hướng dẫn sử dụng trình điều khiển ODBC SQL Server để biết thông tin về những việc cần làm đối với điều này.
Chèn dữ liệu vào cột luôn được mã hóa
Bây giờ chúng tôi đã tạo một bảng trống với các cột Luôn được Mã hóa và thiết lập máy khách Linux của chúng tôi để trình điều khiển SQL Server ODBC có thể hoạt động với Dữ liệu Luôn được Mã hóa. Tiếp theo, chúng ta cần điền dữ liệu vào bảng.
Để chèn dữ liệu vào cột Luôn được mã hóa, ứng dụng phải:
- Sử dụng một chèn được tham số hóa, tức là CHÈN VÀO CÁC GIÁ TRỊ có thể mã hóa (?,?).
Điều này cho phép trình điều khiển SQL Server ODBC phân biệt giữa các giá trị cột (mà nó cần mã hóa) và văn bản câu lệnh SQL (phải duy trì ở dạng văn bản thuần túy; với Luôn được mã hóa, hãy nhớ rằng, SQL Server không thực hiện bất kỳ giải mã nào).
- Mô tả rõ ràng kiểu dữ liệu của các tham số.
SQL Server không cung cấp thông tin cần thiết về cột Luôn được Mã hóa cho trình điều khiển ODBC SQL Server để khám phá kiểu dữ liệu bằng cách sử dụng
SQLDescribeParam
.
Đây là một mẫu Perl chỉ ra cách thực hiện việc này:
# Sử dụng Perl DBI / DBD:ODBC để chèn dữ liệu vào các cột Luôn được Mã hóa. sử dụng nghiêm ngặt; sử dụng cảnh báo; sử dụng DBI; my $ data_source =q / dbi:ODBC:SQLSERVER_2016 /; my $ h =DBI-> connect ( $ data_source) hoặc chết "Không thể kết nối với $ data_source:$ DBI ::errstr"; $ h -> {RaiseError} =1; my $ s =$ h-> chuẩn bị (q / chèn vào các giá trị EncryptedTable (?, ?) /); my $ lastname ='Smith'; my $ Lương =25000; # Đặt kiểu dữ liệu của các cột mục tiêu. # Không thể sử dụng SQLDescribeParam với các cột Luôn được Mã hóa. $ s-> bind_param (1, $ lastname, DBI ::SQL_WVARCHAR); $ s-> bind_param (2, $ lương, DBI ::SQL_INTEGER); $ s-> thực thi ($ lastname, $ lương); $ h-> ngắt kết nối;
Đây là một mẫu C cho thấy cách thực hiện việc này:
#include#include #include #include #include #include #include #define LASTNAME_LEN 6SQLHENV henv =SQL_NULL_HENV; // Môi trườngSQLHDBC hdbc =SQL_NULL_HDBC; // Kết nối handleSQLHSTMT hstmt =SQL_NULL_HSTMT; // Câu lệnh handleSQLRETURN retcode; SQLCHAR strLastName [] ="Jones"; SQLINTEGER pSalary =25000; SQLLEN lenLastName =0; int main () {// Phân bổ môi trường retcode =SQLAllocHandle (SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv); // Đặt phiên bản ODBC retcode =SQLSetEnvAttr (henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER *) SQL_OV_ODBC3, 0); // Phân bổ kết nối retcode =SQLAllocHandle (SQL_HANDLE_DBC, henv, &hdbc); // Kết nối với DSN retcode =SQLConnect (hdbc, (SQLCHAR *) "MyDSN", SQL_NTS, (SQLCHAR *) NULL, 0, NULL, 0); // Xử lý câu lệnh phân bổ retcode =SQLAllocHandle (SQL_HANDLE_STMT, hdbc, &hstmt); // Liên kết Tham số cho tất cả các trường retcode =SQLBindParameter (hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_WVARCHAR, LASTNAME_LEN, 0, strLastName, LASTNAME_LEN, &lenLastName); retcode =SQLBindParameter (hstmt, 2, SQL_PARAM_INPUT, SQL_C_LONG, SQL_INTEGER, 0, 0, &pSalary, 0, NULL); retcode =SQLPrepare (hstmt, (SQLCHAR *) "CHÈN VÀO [dbo]. [EncryptedTable] ([Tên], [Lương]) VALUES (?,?)", SQL_NTS); lenLastName =strlen ((char *) strLastName); retcode =SQLExecute (hstmt); exit:printf ("\ nComplete. \ n"); // Các điều khiển miễn phí // Câu lệnh if (hstmt! =SQL_NULL_HSTMT) SQLFreeHandle (SQL_HANDLE_STMT, hstmt); // Kết nối if (hdbc! =SQL_NULL_HDBC) {SQLDisconnect (hdbc); SQLFreeHandle (SQL_HANDLE_DBC, hdbc); } // Môi trường if (henv! =SQL_NULL_HENV) SQLFreeHandle (SQL_HANDLE_ENV, henv); trả về 0;}
Bây giờ các cột đã được điền, chúng ta có thể sử dụng isql để truy xuất dữ liệu:
$ /usr/local/easysoft/unixODBC/bin/isql.sh -v SQLSERVER_2016SQL> chọn * từ EncryptedTable + ---- + ---------- + -------- ---- + | ID | LastName | Mức lương | + ---- + ---------- + ------------ + | 1 | Smith | 25000 | + ---- + ---------- + ------------ +
Chúng tôi đã bật ghi nhật ký trình điều khiển trong nguồn dữ liệu của mình. Đoạn trích sau từ nhật ký trình điều khiển cho thấy rằng:
- SQL Server cung cấp tên chứng chỉ dưới dạng thông tin meta về cột.
- Dữ liệu cột được mã hóa ở đầu SQL Server và do đó vẫn được mã hóa khi chuyển tiếp. Trình điều khiển SQL Server ODBC trên máy khách giải mã các giá trị cột rồi trả lại chúng ở dạng văn bản thuần túy cho ứng dụng.
1. M.S.S.Q.L._.C.E.R.T.I.F.I.C.A.T.E._.S.T.O.R.E.7.C.u.r.r.e.n.t.U.s.e.r./.m.y./.7.2.8.8.1.8.C.5.F.B.2.C.6.E.B.F.C.2.5.3.D.B.C.1.2.2.8.5.B.6.A.D.9.4 .8.9.0.8.3.E..R.S.A ._. O.A.E.P ....... 8.I.D ................. @ .......... L.a.s.t.N.a.m.e ........ Q ....... 8 .... S.a.l.a.r.y ........... 2. PKTDUMP:Cột được mã hóa.); ... 'A..zs..I..N.] R..p .- .. $ .... S;.]. Km6 ..... 3cr.OhR ..j * ..... fj .... ARN {V.F ..... DETAIL:EVP_DecryptInit trả về 1DETAIL:EVP_DecryptUpdate trả về 1, 0DETAIL:EVP_DecryptUpdate trả về 1, 16DETAIL:EVP_DecryptFinal trả về 1, 0PKTDUMP:dataS.m.i.t.h.Xem thêm
- Sử dụng dữ liệu được bảo vệ bằng Azure Key Vault từ Linux
- Sử dụng dữ liệu được bảo vệ bằng Kho khóa tùy chỉnh từ Linux