Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर 2016:हमेशा एन्क्रिप्टेड

SQL सर्वर 2016 में हमेशा एन्क्रिप्टेड नामक डेटाबेस सुरक्षा सुविधा शामिल होती है। जैसा कि हमने SQL सर्वर ODBC ड्राइवर में हमेशा एन्क्रिप्टेड समर्थन जोड़ा है, हमारे ग्राहक इस सुविधा का लाभ उठा सकेंगे।

हमेशा एन्क्रिप्टेड SQL सर्वर डेटा को उस बिंदु पर सुरक्षित करता है जिस पर उस पर हमला होने की सबसे अधिक संभावना होती है:जब उस डेटा का उपयोग किया जा रहा हो। उदाहरण के लिए, लेनदेन और गणना के दौरान। यह मौजूदा SQL सर्वर एन्क्रिप्शन सुविधाओं से अलग है क्योंकि इस पर संचालन करने से पहले डेटा को डिक्रिप्ट करने की आवश्यकता होती है।

हमेशा एन्क्रिप्ट किए गए कॉलम की सुरक्षा करने वाली एन्क्रिप्शन कुंजी एप्लिकेशन मशीन पर संग्रहीत होती है। इसका मतलब है कि SQL सर्वर हमेशा एन्क्रिप्टेड डेटा को डिक्रिप्ट नहीं कर सकता है। यदि SQL सर्वर मशीन से छेड़छाड़ की जाती है, तो हमलावर केवल हमेशा एन्क्रिप्ट किए गए डेटा को सिफर रूप में ही एक्सेस कर पाएगा।

अधिकांश उपयोगकर्ताओं के लिए, हमेशा एन्क्रिप्ट की गई सुविधा पारदर्शी होगी यानी वे हमेशा एन्क्रिप्टेड के कामकाज से अछूता रहता है और सुविधा से लाभ उठाने के लिए वे जो कर रहे हैं उसे बदलने की आवश्यकता नहीं है।

एप्लिकेशन के अंत में, एन्क्रिप्शन सॉफ़्टवेयर ड्राइवर द्वारा किया जाता है जो SQL सर्वर के लिए क्लाइंट इंटरफ़ेस प्रदान करता है। Linux और UNIX पर, यह एक ODBC ड्राइवर है, जो यात्रा की दिशा के आधार पर डेटा को पारदर्शी रूप से एन्क्रिप्ट या डिक्रिप्ट करता है। Easysoft ड्राइवर के मामले में, कनेक्शन स्ट्रिंग पैरामीटर सेट करके हमेशा एन्क्रिप्टेड सक्षम होता है।

जैसा कि लोग तेजी से चिंतित हैं कि उनका डेटा क्लाउड में सुरक्षित है, हमेशा एन्क्रिप्टेड Azure SQL में उपलब्ध होगा, जो SQL सर्वर के क्लाउड-आधारित पे-एज़-यू-गो संस्करण है। Azure SQL के लिए Easysoft का ODBC ड्राइवर भी हमेशा एन्क्रिप्टेड का समर्थन करेगा।

पूर्वाभ्यास:Linux पर हमेशा एन्क्रिप्ट किए गए स्तंभ डेटा के साथ कार्य करना

Easysoft का SQL सर्वर ODBC ड्राइवर आपको हमेशा एन्क्रिप्ट किए गए कॉलम में रखे गए डेटा को अपडेट और क्वेरी करने में सक्षम बनाता है।

तालिका बनाएं और एन्क्रिप्शन कुंजियां बनाएं

ये चरण SQL सर्वर मशीन पर किए जाते हैं।

  1. SQL सर्वर प्रबंधन स्टूडियो 2016 CTP3 या बाद के संस्करण में, एक नया डेटाबेस बनाएँ।
  2. नए डेटाबेस में, एक तालिका बनाएं जिसमें एक या अधिक कॉलम हों जिनकी सामग्री आप एन्क्रिप्ट करना चाहते हैं। उदाहरण के लिए:
    CREATE TABLE dbo.EncryptedTable
    (
      ID INT IDENTITY(1,1) PRIMARY KEY, LastName NVARCHAR(32), Salary INT NOT NULL
    );
    
  3. डेटाबेस पर राइट-क्लिक करें। पॉप-अप मेनू से, कार्य> कॉलम एन्क्रिप्ट करें चुनें .

    हमेशा एन्क्रिप्ट किया गया विज़ार्ड प्रारंभ होता है।

  4. कॉलम चयन पर पृष्ठ, तालिकाओं का विस्तार करें, और उन स्तंभों का चयन करें जिन्हें आप एन्क्रिप्ट करना चाहते हैं।
  5. प्रत्येक कॉलम के लिए एक एन्क्रिप्शन प्रकार चुनें।

    नियतात्मक - हमेशा एक ही सिफर टेक्स्ट को एन्क्रिप्ट करता है, जिससे समानता लुकअप, जॉइन और ग्रुप बाय को निष्पादित किया जा सकता है।

    यादृच्छिक एक ही सादे पाठ के लिए एक अलग सिफर टेक्स्ट मान उत्पन्न करता है, जो अधिक सुरक्षित है, लेकिन किसी भी संचालन का समर्थन नहीं करता है।

  6. चुनें CEK_Auto1 (New) प्रत्येक कॉलम के लिए एन्क्रिप्शन कुंजी के रूप में, जो एक नई ऑटो-जेनरेटेड कुंजी है। अगलाचुनें .
  7. मास्टर कुंजी कॉन्फ़िगरेशन पृष्ठ में, डिफ़ॉल्ट सेटिंग्स स्वीकार करें:
    फ़ील्ड मान
    स्तंभ मास्टर कुंजी चुनें स्तंभ मास्टर कुंजी स्वतः उत्पन्न करें
    कुंजी स्टोर प्रदाता चुनें Windows प्रमाणपत्र स्टोर
    स्तंभ मास्टर कुंजी चुनें वर्तमान उपयोगकर्ता
  8. अगला का उपयोग करें सारांश पर जाने के लिए बटन पृष्ठ। समाप्तचुनें ।
  9. विज़ार्ड के पूरा होने तक प्रतीक्षा करें और फिर बंद करें choose चुनें ।

प्रमाणपत्र निर्यात करना

प्रमाणपत्रों को Linux मशीन में स्थानांतरित करने के लिए, आपको पहले उन्हें विंडोज़ पर निर्यात करना होगा।

  1. कमांड प्रॉम्प्ट विंडो में, टाइप करें certmgr , प्रमाणपत्र स्नैप-इन लॉन्च करने के लिए।
  2. नया हमेशा एन्क्रिप्ट किया गया प्रमाणपत्र प्रमाणपत्र - वर्तमान उपयोगकर्ता> व्यक्तिगत> प्रमाणपत्र के अंतर्गत उपलब्ध होगा ।
  3. प्रमाणपत्र पर राइट-क्लिक करें (जिसे Always Encrypted Auto Certificate1 जैसा कुछ कहा जाएगा। ) पॉप-अप मेनू से, सभी कार्य> निर्यात करें चुनें .

    प्रमाणपत्र निर्यात विज़ार्ड प्रारंभ होता है। अगलाचुनें ।

  4. चुनें हां, निजी कुंजी निर्यात करें
  5. निर्यात फ़ाइल स्वरूप पृष्ठ में डिफ़ॉल्ट स्वीकार करें। अगलाचुनें ।
  6. संकेत दिए जाने पर पासवर्ड प्रदान करें। अगलाचुनें ।
  7. संकेत दिए जाने पर प्रमाणपत्र को नाम दें और सहेजें। उदाहरण के लिए, CMK_Auto1.pfx
  8. अगला का उपयोग करें और समाप्त करें विज़ार्ड को पूरा करने के लिए बटन।

लिनक्स पर प्रमाणपत्र इंस्टॉल करना

निर्यात किए गए प्रमाणपत्रों को उस Linux मशीन में स्थानांतरित करें जिससे आप हमेशा एन्क्रिप्ट किए गए कॉलम तक पहुंचना चाहते हैं:

  1. उस प्रमाणपत्र को कॉपी करें जिसे आपने अभी निर्यात किया है ~/ssl/private Linux या UNIX मशीन पर जहाँ आपने SQL Server ODBC ड्राइवर स्थापित किया है।

    ~ उपयोगकर्ता की होम निर्देशिका है जो उस एप्लिकेशन को चलाएगा जो Easysoft ODBC ड्राइवर के माध्यम से SQL सर्वर से कनेक्ट होता है। ~/ssl/private वह स्थान है जहां ड्राइवर में निर्मित ओपनएसएसएल परत व्यक्तिगत प्रमाणपत्र लोड करने का प्रयास करेगी। निर्देशिका बनाएँ यदि यह मौजूद नहीं है। उदाहरण के लिए:

    $ mkdir -p ~/ssl/private
    $ cd ~/ssl/private
    $ mv /tmp/CMK_Auto1.pfx .
    
  2. SQL सर्वर ODBC ड्राइवर के साथ प्रमाणपत्र का उपयोग करने के लिए, आपको इसमें शामिल पासफ़्रेज़ को निकालना होगा। ऐसा करने के लिए, मशीन पर ओपनएसएसएल स्थापित होना चाहिए। (यह केवल पासफ़्रेज़ को हटाने के लिए आवश्यक है, अन्य कार्यों के लिए, SQL सर्वर ODBC ड्राइवर एक अंतर्निहित OpenSSL परत का उपयोग करता है।) निम्न आदेशों के साथ पासफ़्रेज़ को हटा दें। सेकंड . के बाद पासफ़्रेज़ के लिए पूछे जाने पर आदेश, कुछ भी दर्ज किए बिना रिटर्न दबाएं। यह पासफ़्रेज़ को शून्य पर सेट कर देगा।
    $ openssl pkcs12 -in CMK_Auto1.pfx -nodes -out temp.pem
    Enter Import Password: *******
    MAC verified OK
    $ openssl pkcs12 -export -in temp.pem  -out nopassphrase.p12
    Enter Export Password:
    Verifying - Enter Export Password:
    $
    
  3. प्रमाण पत्र लोड करने के लिए, SQL सर्वर ODBC ड्राइवर एन्क्रिप्टेड कॉलम के बारे में SQL सर्वर से प्राप्त मेटा जानकारी का उपयोग करता है। ड्राइवर को SQL सर्वर से प्राप्त होने वाला प्रमाणपत्र नाम my/thumbprint . आपको प्रमाणपत्र के लिए इस नामकरण परंपरा का उपयोग करने की आवश्यकता है। प्रमाणपत्र के थंबप्रिंट को प्रदर्शित करने के लिए OpenSSL का उपयोग करें और फिर my:
    $ openssl x509 -in temp.pem -fingerprint -noout | tr -d ":"
    SHA1 Fingerprint=EFC1940E545941D6C05C763361403F55A5DEF0E8
    $ mkdir my
    $ cp nopassphrase.p12 my/EFC1940E545941D6C05C763361403F55A5DEF0E8
    $ ln -s my My
    

    नोट परीक्षण के दौरान, हमने देखा कि SQL सर्वर ने कभी-कभी प्रमाणपत्र को My/thumbprint . उपरोक्त उदाहरण में प्रतीकात्मक लिंक इस असंगति के आसपास काम करता है।

SQL सर्वर ODBC ड्राइवर स्थापित करना

SQL सर्वर ODBC ड्राइवर न केवल एप्लिकेशन और SQL सर्वर के बीच कनेक्टिविटी परत प्रदान करता है, यह हमेशा एन्क्रिप्टेड कॉलम में संग्रहीत डेटा के एन्क्रिप्शन / डिक्रिप्शन को भी संभालता है।

SQL सर्वर ODBC ड्राइवर को स्थापित और लाइसेंस दें। इसे कैसे करें, इस पर निर्देशों के लिए, SQL सर्वर ODBC ड्राइवर दस्तावेज़ देखें। यदि आपका एप्लिकेशन 64-बिट है, तो ODBC ड्राइवर का 64-बिट संस्करण डाउनलोड करें। अन्यथा, ऑपरेटिंग सिस्टम के आर्किटेक्चर की परवाह किए बिना, ड्राइवर के 32-बिट संस्करण का उपयोग करें।

ODBC डेटा स्रोत में कनेक्शन स्ट्रिंग जानकारी होती है जो SQL सर्वर ODBC ड्राइवर को लक्ष्य SQL सर्वर इंस्टेंस से कनेक्ट करने में सक्षम बनाती है। हमारी मशीन पर, ODBC डेटा स्रोत /etc/odbc.ini . में संग्रहीत होते हैं . यह डेटा स्रोत एक्सट्रैक्ट हमेशा एन्क्रिप्ट किए गए कॉलम के लिए प्रासंगिक सेटिंग दिखाता है:

[SQLSERVER_2016]
Driver=Easysoft ODBC-SQL Server SSL # Must use SSL version of driver
Server=machine\sqlserver_instance
Database=database_with_always_encrypted_data
User=user # This can be a Windows or SQL Server login.
Password=password
Trusted_Connection=Yes # Set this to No for a SQL Server login
ColumnEncryption=Enabled # To view Always Encrypted data or to
                         # insert into an Always Encrypted column set to Enabled

नोट यदि आपका कनेक्शन "SSL कनेक्शन syscall में विफल" त्रुटि के साथ विफल हो जाता है, तो आपके सिस्टम में "यादृच्छिकता डिवाइस" का अभाव है। देखें Entropy इसके बारे में क्या करना है इसके बारे में जानकारी के लिए SQL सर्वर ODBC ड्राइवर मैनुअल में विशेषता।

डेटा को हमेशा एन्क्रिप्ट किए गए कॉलम में सम्मिलित करना

हमने अब हमेशा एन्क्रिप्टेड कॉलम के साथ एक खाली तालिका बनाई है और अपनी लिनक्स क्लाइंट मशीन को सेट किया है ताकि SQL सर्वर ODBC ड्राइवर हमेशा एन्क्रिप्टेड डेटा के साथ काम कर सके। इसके बाद, हमें तालिका को डेटा से भरना होगा।

हमेशा एन्क्रिप्ट किए गए कॉलम में डेटा डालने के लिए, एक एप्लिकेशन को यह करना होगा:

  1. पैरामीटरयुक्त इंसर्ट का उपयोग करें यानी एन्क्रिप्टेडटेबल वैल्यू (?,?) में INSERT करें।

    यह SQL सर्वर ODBC ड्राइवर को कॉलम मानों (जिसे इसे एन्क्रिप्ट करने की आवश्यकता होती है) और SQL स्टेटमेंट टेक्स्ट (जो सादे पाठ में रहना चाहिए; हमेशा एन्क्रिप्टेड के साथ, याद रखें, SQL सर्वर कोई डिक्रिप्शन नहीं करता है) के बीच अंतर करने में सक्षम बनाता है।

  2. पैरामीटर के डेटा प्रकार का स्पष्ट रूप से वर्णन करें।

    SQL सर्वर SQLDescribeParam का उपयोग करके डेटा प्रकार खोजने के लिए SQL सर्वर ODBC ड्राइवर के लिए हमेशा एन्क्रिप्टेड कॉलम के बारे में आवश्यक जानकारी प्रदान नहीं करता है ।

यहां एक पर्ल नमूना है जो दिखाता है कि यह कैसे करना है:

# Use Perl DBI / DBD:ODBC to insert data into Always Encrypted columns.
use strict;
use warnings;
use DBI;

my $data_source = q/dbi:ODBC:SQLSERVER_2016/;

my $h = DBI->connect($data_source)
    or die "Can't connect to $data_source: $DBI::errstr";
$h->{RaiseError} = 1;

my $s = $h->prepare(q/insert into EncryptedTable values(?,?)/);
my $lastname='Smith';
my $salary=25000;

# Set the data type of the target columns.
# Cannot use SQLDescribeParam with Always Encrypted columns.
$s->bind_param(1, $lastname, DBI::SQL_WVARCHAR);
$s->bind_param(2, $salary, DBI::SQL_INTEGER);
$s->execute($lastname,$salary);
$h->disconnect;

यहां एक सी नमूना है जो दिखाता है कि यह कैसे करना है:

#include <stdio.h>
#include <stdlib.h>
#include <sql.h>
#include <sqlucode.h>
#include <sqlext.h>
#include <string.h>
#include <wchar.h>

#define LASTNAME_LEN 6

SQLHENV   henv  = SQL_NULL_HENV;   // Environment
SQLHDBC   hdbc  = SQL_NULL_HDBC;   // Connection handle
SQLHSTMT  hstmt = SQL_NULL_HSTMT;  // Statement handle
SQLRETURN retcode;

SQLCHAR strLastName[]="Jones";
SQLINTEGER pSalary=25000;

SQLLEN lenLastName=0;

int main () {
    // Allocate environment
    retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);

    // Set ODBC Version
    retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION,
                            (SQLPOINTER*)SQL_OV_ODBC3, 0);

    // Allocate Connection
    retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);

    // Connect to DSN
    retcode = SQLConnect(hdbc, (SQLCHAR*) "MyDSN", SQL_NTS,
                         (SQLCHAR*) NULL, 0, NULL, 0);

    // Allocate Statement Handle
    retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);

    // Bind Parameters to all fields
    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*)"INSERT INTO [dbo].[EncryptedTable] ([LastName],[Salary]) VALUES (?,?)",
                               SQL_NTS);

    lenLastName=strlen((char*)strLastName);

    retcode = SQLExecute(hstmt);

exit:

    printf ("\nComplete.\n");

    // Free handles
    // Statement

    if (hstmt != SQL_NULL_HSTMT)
        SQLFreeHandle(SQL_HANDLE_STMT, hstmt);

    // Connection
    if (hdbc != SQL_NULL_HDBC) {
        SQLDisconnect(hdbc);
        SQLFreeHandle(SQL_HANDLE_DBC, hdbc);
    }

    // Environment
    if (henv != SQL_NULL_HENV)
        SQLFreeHandle(SQL_HANDLE_ENV, henv);

    return 0;
}

	

अब कॉलम भर गए हैं, हम डेटा को पुनः प्राप्त करने के लिए isql का उपयोग कर सकते हैं:

$ /usr/local/easysoft/unixODBC/bin/isql.sh -v SQLSERVER_2016
SQL> select * from EncryptedTable
+----+----------+------------+
| ID | LastName | Salary     |
+----+----------+------------+
| 1  | Smith    | 25000      |
+----+----------+------------+

हमारे डेटा स्रोत में ड्राइवर लॉगिंग चालू थी। ड्राइवर लॉग से निम्न उद्धरण दिखाता है कि:

  1. SQL सर्वर प्रमाणपत्र नाम को स्तंभ के बारे में मेटा जानकारी के रूप में आपूर्ति करता है।
  2. कॉलम डेटा SQL सर्वर के अंत में एन्क्रिप्ट किया गया है और इसलिए ट्रांज़िट में एन्क्रिप्टेड रहता है। क्लाइंट पर SQL सर्वर ODBC ड्राइवर कॉलम मानों को डिक्रिप्ट करता है और फिर उन्हें सादे पाठ में एप्लिकेशन में वापस कर देता है।
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:         Encrypted column
.);...'A..zs..I.
.N.]r..p.-..$...
.S;.].km6.....3c
r.OhR..j*.....fj
....ARN{V.F.....

DETAIL:  EVP_DecryptInit returns 1
DETAIL:  EVP_DecryptUpdate returns 1, 0
DETAIL:  EVP_DecryptUpdate returns 1, 16
DETAIL:  EVP_DecryptFinal returns 1, 0
PKTDUMP:         data

S.m.i.t.h.

यह भी देखें

  • Linux के Azure Key Vault के साथ सुरक्षित डेटा का उपयोग करना
  • लिनक्स के कस्टम कुंजी स्टोर से सुरक्षित डेटा का उपयोग करना

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. IS NULL या LIKE> ऑपरेटर का उपयोग करने के अलावा, टेक्स्ट, ntext और छवि डेटा> प्रकारों की तुलना या सॉर्ट नहीं किया जा सकता है

  2. तालिका से सभी डेटा को एक सम्मिलित एसक्यूएल प्रारूप में कैसे निर्यात करें?

  3. मैं डीबी स्कीमा को डीबीओ में कैसे बदलूं?

  4. परिणाम के रूप में पूर्ण दिनांक-समय मान के साथ SQL सर्वर में प्रति घंटे पंक्तियों की गणना करें

  5. डिज़ाइन द्वारा शून्य SQL गतिरोध - कोई कोडिंग पैटर्न?