आपके डेटा को यथासंभव सुरक्षित रखने के लिए एन्क्रिप्शन सबसे महत्वपूर्ण सुरक्षा सुविधाओं में से एक है। आपके द्वारा प्रबंधित किए जा रहे डेटा के आधार पर, यह हमेशा जरूरी नहीं है, लेकिन आपको कम से कम इसे अपने संगठन में सुरक्षा सुधार के रूप में मानना चाहिए, और वास्तव में डेटा चोरी या अनधिकृत पहुंच से बचने की सिफारिश की जाती है।
इस ब्लॉग में, हम दो बुनियादी प्रकार के एन्क्रिप्शन और मारियाडीबी सर्वर पर इसे कैसे कॉन्फ़िगर करें, इसका वर्णन करेंगे।
डेटा एन्क्रिप्शन क्या है?
डेटा एन्क्रिप्शन के दो बुनियादी प्रकार हैं:एट-रेस्ट और इन-ट्रांजिट। आइए देखें कि उनका क्या मतलब है।
डेटा-एट-रेस्ट एन्क्रिप्शन
सिस्टम में संग्रहीत डेटा को डेटा-एट-रेस्ट के रूप में जाना जाता है। इस डेटा के एन्क्रिप्शन में टेक्स्ट या कोड को अपठनीय में बदलने के लिए एल्गोरिदम का उपयोग करना शामिल है। एन्क्रिप्टेड डेटा को डीकोड करने के लिए आपके पास एक एन्क्रिप्शन कुंजी होनी चाहिए।
संपूर्ण डेटाबेस को एन्क्रिप्ट करना सावधानी के साथ किया जाना चाहिए क्योंकि इससे प्रदर्शन पर गंभीर प्रभाव पड़ सकता है। इसलिए केवल अलग-अलग फ़ील्ड या तालिकाओं को एन्क्रिप्ट करना बुद्धिमानी है।
डेटा-एट-रेस्ट को एन्क्रिप्ट करना डेटा को हार्ड ड्राइव की भौतिक चोरी या अनधिकृत फ़ाइल संग्रहण एक्सेस से बचाता है। यह एन्क्रिप्शन डेटा सुरक्षा विनियमों का भी अनुपालन करता है, खासकर अगर फ़ाइल सिस्टम पर वित्तीय या स्वास्थ्य डेटा संग्रहीत है।
डेटा-इन-ट्रांज़िट एन्क्रिप्शन
डेटा ट्रांसफर या लेन-देन के बीच घूमना डेटा-इन-ट्रांजिट के रूप में जाना जाता है। वेब पेज ब्राउज़ करते समय सर्वर और क्लाइंट के बीच चलने वाला डेटा इस तरह के डेटा का एक अच्छा उदाहरण है।
चूंकि यह हमेशा चलता रहता है, इसलिए इसे अपने गंतव्य तक पहुंचने से पहले किसी भी चोरी या डेटा में परिवर्तन से बचने के लिए उचित एन्क्रिप्शन के साथ संरक्षित करने की आवश्यकता होती है।
डेटा-इन-ट्रांज़िट की सुरक्षा के लिए आदर्श स्थिति यह है कि डेटा को स्थानांतरित होने से पहले एन्क्रिप्ट किया जाए और अंतिम गंतव्य तक पहुंचने पर ही इसे डिक्रिप्ट किया जाए।
MariaDB डेटा-एट-रेस्ट एन्क्रिप्शन
टेबल और टेबल स्पेस का एन्क्रिप्शन 10.1 संस्करण से मारियाडीबी में जोड़ा गया था, और यह XtraDB, InnoDB, और Aria स्टोरेज इंजन के लिए एन्क्रिप्शन का समर्थन करता है, और बाइनरी लॉग के लिए भी।
आप एन्क्रिप्ट करने के विभिन्न तरीके चुन सकते हैं:
- सभी टेबल
- व्यक्तिगत टेबल
- व्यक्तिगत तालिकाओं को छोड़कर सब कुछ
दस्तावेज़ीकरण के अनुसार, एन्क्रिप्शन का उपयोग करने पर लगभग 3-5% का ओवरहेड होता है, इसलिए उत्पादन में समस्याओं से बचने के लिए, इसे तनाव देने और यह देखने के लिए कि यह कैसे प्रतिक्रिया करता है, एक परीक्षण वातावरण होना महत्वपूर्ण है।पी>
MariaDB पर डेटा-पर-रेस्ट एन्क्रिप्शन को कैसे कॉन्फ़िगर करें
आइए मारियाडीबी डेटाबेस में मौजूदा "शहर" तालिका की जांच करें:
$ strings city.ibd |head
infimum
supremum
infimum
supremum
3ABW
3KHM
infimum
supremum
Kabul AFGKabol
Qandahar AFGQandahar
जैसा कि आप देख सकते हैं, आप उदाहरण के लिए स्ट्रिंग्स लिनक्स कमांड का उपयोग करके बिना किसी समस्या के वहां से डेटा पढ़ सकते हैं। अब, देखते हैं कि इसे कैसे एन्क्रिप्ट किया जाता है।
openssl rand कमांड का उपयोग करके एक एन्क्रिप्शन कुंजी जेनरेट करें:
$ mkdir -p /etc/mysql/encryption
$ for i in {1..4}; do openssl rand -hex 32 >> /etc/mysql/encryption/keyfile; done;
जेनरेट की गई फ़ाइल /etc/mysql/encryption/keyfile संपादित करें और उन कुंजी आईडी को जोड़ें जिन्हें एन्क्रिप्टेड टेबल बनाते समय संदर्भित किया जाएगा। प्रारूप इस प्रकार होना चाहिए:
<encryption_key_id1>;<hex-encoded_encryption_key1>
<encryption_key_id2>;<hex-encoded_encryption_key2>
आप इसे इस तरह से sed linux कमांड का उपयोग करके संपादित कर सकते हैं:
$ for i in {1..4}; do sed -i -e "$i s/^/$i;/" keyfile; done
तो फ़ाइल कुछ इस तरह होनी चाहिए:
$ cat /etc/mysql/encryption/keyfile
1;f237fe72e16206c0b0f6f43c3b3f4accc242564d77f5fe17bb621de388c193af
2;0c0819a10fb366a5ea657a71759ee6a950ae8f25a5ba7400a91f59b63683edc5
3;ac9ea3a839596dbf52492d9ab6b180bf11a35f44995b2ed752c370d920a10169
4;72afc936e16a8df05cf994c7902e588de0d11ca7301f9715d00930aa7d5ff8ab
अब, समान ओपनएसएल कमांड का उपयोग करके एक यादृच्छिक पासवर्ड उत्पन्न करें जो आपने पहले देखा था:
$ openssl rand -hex 128 > /etc/mysql/encryption/keyfile.key
अगले चरण पर आगे बढ़ने से पहले, कुंजी फ़ाइल को एन्क्रिप्ट करने के बारे में निम्नलिखित विवरण जानना महत्वपूर्ण है:
- मारियाडीबी वर्तमान में कुंजी फ़ाइल को एन्क्रिप्ट करने के लिए एकमात्र एल्गोरिदम का समर्थन करता है जो उन्नत एन्क्रिप्शन स्टैंडर्ड (एईएस) का सिफर ब्लॉक चेनिंग (सीबीसी) मोड है।
- एन्क्रिप्शन कुंजी का आकार 128-बिट्स, 192-बिट्स या 256-बिट्स हो सकता है।
- एन्क्रिप्शन कुंजी एन्क्रिप्शन पासवर्ड के SHA-1 हैश से बनाई गई है।
- एन्क्रिप्शन पासवर्ड में अधिकतम 256 वर्ण होते हैं।
अब, Opensl enc कमांड का उपयोग करके कुंजी फ़ाइल को एन्क्रिप्ट करने के लिए, निम्न कमांड चलाएँ:
$ openssl enc -aes-256-cbc -md sha1 -pass file:/etc/mysql/encryption/keyfile.key -in /etc/mysql/encryption/keyfile -out /etc/mysql/encryption/keyfile.enc
आखिरकार, आपको अपनी my.cnf कॉन्फ़िगरेशन फ़ाइल में निम्नलिखित पैरामीटर जोड़ने होंगे (RedHat-आधारित OS पर /etc/ में या डेबियन-आधारित OS पर /etc/mysql/ में स्थित):पी>
[mysqld]
…
#################### DATABASE ENCRYPTION ####################
plugin_load_add = file_key_management
file_key_management_filename = /etc/mysql/encryption/keyfile.enc
file_key_management_filekey = FILE:/etc/mysql/encryption/keyfile.key
file_key_management_encryption_algorithm = aes_cbc
encrypt_binlog = 1
innodb_encrypt_tables = ON
innodb_encrypt_log = ON
innodb_encryption_threads = 4
innodb_encryption_rotate_key_age = 0
…
और परिवर्तन करने के लिए MariaDB सेवा को पुनरारंभ करें:
$ systemctl restart mariadb
इस समय, एन्क्रिप्शन सुविधा का उपयोग करने के लिए सब कुछ तैयार है। आइए उसी तालिका को एन्क्रिप्ट करें जिसे हमने पहले दिखाया था, "शहर"। इसके लिए आपको ALTER TABLE स्टेटमेंट को YES में एनक्रिप्टेड पैरामीटर सेट करने की आवश्यकता है:
MariaDB [world]> ALTER TABLE city ENCRYPTED=YES;
Query OK, 0 rows affected (0.483 sec)
Records: 0 Duplicates: 0 Warnings: 0
अब, यदि आप सीधे फ़ाइल सिस्टम से तालिका तक पहुँचने का प्रयास करते हैं, तो आपको कुछ इस तरह दिखाई देगा:
$ strings city.ibd |head
PU%O
!ybN)b
9,{9WB4
T3uG:
?oiN
,35sz
8g)Q
o(o
q_A1
k=-w
जैसा कि आप देख सकते हैं, तालिका अपठनीय है। आप MySQL कमांड में ENCRYPTION_KEY_ID =
नई तालिकाओं को डिफ़ॉल्ट रूप से एन्क्रिप्ट किया जाएगा क्योंकि हम my.cnf कॉन्फ़िगरेशन फ़ाइल में innodb_encrypt_tables पैरामीटर को ON में सेट करते हैं।
MariaDB डेटा-इन-ट्रांज़िट एन्क्रिप्शन
MariaDB आपको ट्रांसपोर्ट लेयर सिक्योरिटी प्रोटोकॉल (TLS) का उपयोग करके सर्वर और क्लाइंट के बीच डेटा-इन-ट्रांजिट को एन्क्रिप्ट करने की अनुमति देता है, जिसे पहले सिक्योर सॉकेट लेयर या एसएसएल के रूप में जाना जाता था।
सबसे पहले, आपको यह सुनिश्चित करना होगा कि आपका मारियाडीबी सर्वर टीएलएस समर्थन के साथ संकलित किया गया था। आप निम्न SHOW GLOBAL VARIABLES कथन चलाकर इसे सत्यापित कर सकते हैं:
MariaDB [(none)]> SHOW GLOBAL VARIABLES LIKE 'version_ssl_library';
+---------------------+----------------------------+
| Variable_name | Value |
+---------------------+----------------------------+
| version_ssl_library | OpenSSL 1.1.1 11 Sep 2018 |
+---------------------+----------------------------+
1 row in set (0.001 sec)
और देखें कि क्या यह वर्तमान में SHOW VARIABLES कथन का उपयोग करके उपयोग में नहीं है:
MariaDB [(none)]> SHOW VARIABLES LIKE '%ssl%';
+---------------------+----------------------------+
| Variable_name | Value |
+---------------------+----------------------------+
| have_openssl | YES |
| have_ssl | DISABLED |
| ssl_ca | |
| ssl_capath | |
| ssl_cert | |
| ssl_cipher | |
| ssl_crl | |
| ssl_crlpath | |
| ssl_key | |
| version_ssl_library | OpenSSL 1.1.1 11 Sep 2018 |
+---------------------+----------------------------+
10 rows in set (0.001 sec)
आप स्थिति MariaDB कमांड का उपयोग करके भी SSL स्थिति सत्यापित कर सकते हैं:
MariaDB [(none)]> status
--------------
mysql Ver 15.1 Distrib 10.4.13-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
Connection id: 22
Current database:
Current user: [email protected]
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server: MariaDB
Server version: 10.4.13-MariaDB-1:10.4.13+maria~bionic-log mariadb.org binary distribution
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: latin1
Db characterset: latin1
Client characterset: utf8
Conn. characterset: utf8
UNIX socket: /var/lib/mysql/mysql.sock
Uptime: 4 hours 28 min 25 sec
Threads: 11 Questions: 111668 Slow queries: 0 Opens: 92 Flush tables: 1 Open tables: 85 Queries per second avg: 6.933
--------------
MariaDB पर डेटा-इन-ट्रांज़िट एन्क्रिप्शन को कैसे कॉन्फ़िगर करें
आइए सभी प्रमाणपत्रों को संग्रहीत करने के लिए प्रमाणपत्र निर्देशिका बनाएं:
$ mkdir -p /etc/mysql/certs
अब, CA प्रमाणपत्र जेनरेट करते हैं जो कनेक्शन को एन्क्रिप्ट करने के लिए कॉन्फ़िगर किया जाएगा:
$ openssl genrsa 2048 > ca-key.pem
$ openssl req -new -x509 -nodes -days 365000 -key ca-key.pem -out ca-cert.pem
यह अंतिम आदेश आपको निम्नलिखित जानकारी को पूरा करने के लिए कहेगा:
Country Name (2 letter code) [AU]:
State or Province Name (full name) [Some-State]:
Locality Name (eg, city) []:
Organization Name (eg, company) [Internet Widgits Pty Ltd]:
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:
Email Address []:
अब, आपको सर्वर प्रमाणपत्र जेनरेट करने होंगे:
$ openssl req -newkey rsa:2048 -nodes -keyout server-key.pem -out server-req.pem
यह आदेश आपको वही जानकारी भरने के लिए कहेगा जो पहले एक वैकल्पिक प्रमाणपत्र पासवर्ड के साथ थी।
$ openssl rsa -in server-key.pem -out server-key.pem
$ openssl x509 -req -in server-req.pem -days 365000 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
और अंत में, आपको क्लाइंट प्रमाणपत्र जेनरेट करने होंगे:
$ openssl req -newkey rsa:2048 -nodes -keyout client-key.pem -out client-req.pem
यह आपको जानकारी और एक वैकल्पिक प्रमाणपत्र पासवर्ड को पूरा करने के लिए भी कहेगा।
$ openssl rsa -in client-key.pem -out client-key.pem
$ openssl x509 -req -in client-req.pem -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
सुनिश्चित करें कि आप प्रत्येक प्रमाणपत्र पर एक अलग सामान्य नाम का उपयोग कर रहे हैं, अन्यथा यह काम नहीं करेगा और आपको एक संदेश प्राप्त होगा जैसे:
ERROR 2026 (HY000): SSL connection error: self signed certificate
इस समय, आपके पास कुछ ऐसा होगा:
$ ls /etc/mysql/certs/
ca-cert.pem ca-key.pem client-cert.pem client-key.pem client-req.pem server-cert.pem server-key.pem server-req.pem
और आप निम्न आदेश का उपयोग करके प्रमाणपत्रों को सत्यापित कर सकते हैं:
$ openssl verify -CAfile ca-cert.pem server-cert.pem client-cert.pem
server-cert.pem: OK
client-cert.pem: OK
तो अब इसे my.cnf कॉन्फ़िगरेशन फ़ाइल (रेडहैट-आधारित OS पर /etc/ में स्थित या डेबियन-आधारित OS पर /etc/mysql/ में स्थित) में कॉन्फ़िगर करते हैं:
[mysqld]
ssl_ca=/etc/mysql/certs/ca-cert.pem
ssl_cert=/etc/mysql/certs/server-cert.pem
ssl_key=/etc/mysql/certs/server-key.pem
[client-mariadb]
ssl_ca =/etc/mysql/certs/ca-cert.pem
ssl_cert=/etc/mysql/certs/client-cert.pem
ssl_key=/etc/mysql/certs/client-key.pem
सुनिश्चित करें कि आप इसे संबंधित अनुभाग (mysqld और client-mariadb) के अंतर्गत जोड़ रहे हैं।
प्रमाणपत्र का स्वामी बदलें और डेटाबेस सेवा पुनः प्रारंभ करें:
$ chown mysql.mysql /etc/mysql/certs/
$ systemctl restart mariadb
इसके बाद, यदि आप SHOW VARIABLES आउटपुट पर एक नज़र डालते हैं, तो आपके पास यह होना चाहिए:
MariaDB [(none)]> SHOW VARIABLES LIKE '%ssl%';
+---------------------+----------------------------------+
| Variable_name | Value |
+---------------------+----------------------------------+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | /etc/mysql/certs/ca-cert.pem |
| ssl_capath | |
| ssl_cert | /etc/mysql/certs/server-cert.pem |
| ssl_cipher | |
| ssl_crl | |
| ssl_crlpath | |
| ssl_key | /etc/mysql/certs/server-key.pem |
| version_ssl_library | OpenSSL 1.1.1 11 Sep 2018 |
+---------------------+----------------------------------+
10 rows in set (0.001 sec)
अब, इसका उपयोग करने के लिए REQUIRE SSL पैरामीटर के साथ एक उपयोगकर्ता बनाएं:
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 's9s'@'%' IDENTIFIED BY 'root123' REQUIRE SSL;
Query OK, 0 rows affected (0.005 sec)
यदि आप डेटाबेस तक पहुंचने के लिए इस उपयोगकर्ता का उपयोग करते हैं, और स्थिति कमांड की जांच करते हैं, तो आप उपयोग में एसएसएल देखेंगे:
MariaDB [(none)]> status
--------------
mysql Ver 15.1 Distrib 10.4.13-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2
Connection id: 15
Current database:
Current user: [email protected]
SSL: Cipher in use is TLS_AES_256_GCM_SHA384
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server: MariaDB
Server version: 10.4.13-MariaDB-1:10.4.13+maria~bionic-log mariadb.org binary distribution
Protocol version: 10
Connection: 127.0.0.1 via TCP/IP
Server characterset: latin1
Db characterset: latin1
Client characterset: utf8
Conn. characterset: utf8
TCP port: 3306
Uptime: 16 sec
Threads: 11 Questions: 136 Slow queries: 0 Opens: 17 Flush tables: 1 Open tables: 11 Queries per second avg: 8.500
--------------
ClusterControl के साथ SSL एन्क्रिप्शन कैसे सक्षम करें
एक और तरीका है, और इससे भी आसान तरीका, अपने मारियाडीबी डेटाबेस पर एसएसएल को सक्षम करने के लिए क्लस्टरकंट्रोल का उपयोग करना है। हम मान लेंगे कि आपने ClusterControl स्थापित कर लिया है और आप इसका उपयोग करके अपने MariaDB डेटाबेस का प्रबंधन कर रहे हैं, इसलिए ClusterControl पर जाएँ -> अपना MariaDB क्लस्टर चुनें -> सुरक्षा -> SSL एन्क्रिप्शन -> सक्षम करें।
और बस इतना ही, आपके मारियाडीबी डेटाबेस में आपका एसएसएल एन्क्रिप्शन सक्षम होगा। बिना किसी मैन्युअल कार्य के।
MariaDB में ऐट-रेस्ट एन्क्रिप्शन सीमाएं
मारियाडीबी एट-रेस्ट एन्क्रिप्शन से संबंधित कुछ सीमाएं हैं जिन्हें ध्यान में रखा जाना चाहिए:
- मेटाडेटा (उदाहरण के लिए .frm फ़ाइलें) और क्लाइंट को भेजा गया डेटा एन्क्रिप्ट नहीं किया जाता है।
- केवल MariaDB सर्वर डेटा को डिक्रिप्ट करना जानता है, विशेष रूप से
- mysqlbinlog एन्क्रिप्टेड बाइनरी लॉग केवल तभी पढ़ सकता है जब --read-from-remote-server का उपयोग किया जाता है।
- Percona XtraBackup उन इंस्टेंस का बैकअप नहीं ले सकता जो एन्क्रिप्टेड InnoDB का उपयोग करते हैं। हालांकि, मारियाबैकअप एन्क्रिप्टेड इंस्टेंस का बैकअप ले सकता है।
- डिस्क-आधारित गैलेरा gcache मारियाडीबी सर्वर के सामुदायिक संस्करण में एन्क्रिप्ट नहीं किया गया है, हालांकि, यह फ़ाइल मारियाडीबी एंटरप्राइज सर्वर 10.4 में एन्क्रिप्ट की गई है।
- ऑडिट प्लग इन एन्क्रिप्टेड आउटपुट नहीं बना सकता है। इसे syslog पर भेजें और इसके बजाय वहां सुरक्षा को कॉन्फ़िगर करें।
- फ़ाइल-आधारित सामान्य क्वेरी लॉग और धीमी क्वेरी लॉग को एन्क्रिप्ट नहीं किया जा सकता है।
- एरिया लॉग एन्क्रिप्ट नहीं किया गया है। यह केवल गैर-अस्थायी एरिया टेबल को प्रभावित करता है।
- MariaDB त्रुटि लॉग एन्क्रिप्ट नहीं किया गया है। त्रुटि लॉग में कुछ मामलों में क्वेरी टेक्स्ट और डेटा हो सकता है, जिसमें क्रैश, अभिकथन विफलता और ऐसे मामले शामिल हैं जहां InnoDB/XtraDB डीबगिंग में सहायता के लिए लॉग में मॉनिटर आउटपुट लिखता है। जरूरत पड़ने पर इसे syslog पर भी भेजा जा सकता है।
निष्कर्ष
डेटा-इन-ट्रांज़िट की सुरक्षा करना उतना ही महत्वपूर्ण है जितना कि आराम से डेटा की सुरक्षा करना, और भले ही यह आपके संगठन में आवश्यक न हो, आपको इसे लागू करने पर विचार करना चाहिए क्योंकि यह डेटा से बचने में आपकी मदद कर सकता है चोरी या अनधिकृत पहुंच।
मारियाडीबी के पास पहले बताए गए चरणों का पालन करके इसे लागू करने का एक बहुत आसान तरीका है, लेकिन निश्चित रूप से ClusterControl का उपयोग करना और भी आसान है।