इस ब्लॉग में, हम किसी मौजूदा डेटाबेस को पहले एन्क्रिप्टेड स्थिति में ले जाने और फिर अपने डेटाबेस को अनएन्क्रिप्टेड स्थिति में ले जाने का तरीका प्रस्तुत करते हैं।
एन्क्रिप्शन का उपयोग करने के लिए, आपको एन्क्रिप्शन कुंजियों को प्रबंधित करने के लिए एक प्लगइन लोड करना होगा। वर्तमान में समर्थित एन्क्रिप्शन प्लग इन देखें। प्रत्येक कुंजी एक 32-बिट पूर्णांक का उपयोग कुंजी पहचानकर्ता (key_id) और वास्तविक कुंजी के रूप में करती है। कुंजी को संस्करणित किया जा सकता है ताकि डेटा को पुरानी कुंजी से कुंजी के नए संस्करण में फिर से एन्क्रिप्ट किया जा सके। इस ब्लॉग में, हम एक उदाहरण के रूप में फ़ाइल कुंजी प्रबंधन प्लगइन का उपयोग करेंगे (एन्क्रिप्शन कुंजी प्रबंधन देखें)। हम यह भी मानते हैं कि आप मारियाडीबी सर्वर के नवीनतम संस्करण का उपयोग कर रहे हैं (यह ब्लॉग मानता है कि एमडीईवी-15566 तय है यानी मारियाडीबी संस्करण 10.1.33, 10.2.15 या 10.3.6 होना चाहिए)।
किसी डेटाबेस को एन्क्रिप्टेड स्थिति में या अनएन्क्रिप्टेड स्थिति में ले जाना एक key_rotation का उपयोग करके किया जाता है। कुंजी रोटेशन डेटाबेस को मौजूदा एन्क्रिप्टेड स्थिति से दूसरी स्थिति में ले जाता है। ध्यान दें कि यहां टेबलस्पेस में कोई एन्क्रिप्टेड स्थिति नहीं हो सकती है (यानी टेबलस्पेस अनएन्क्रिप्टेड है) या टेबलस्पेस में एक एन्क्रिप्शन स्थिति हो सकती है जिसे अनएन्क्रिप्टेड स्थिति में ले जाया जाता है। कुंजी रोटेशन समय-समय पर हो सकता है (कॉन्फ़िगरेशन वैरिएबल innodb-encryption-rotate-key-age के आधार पर) यानी घुमाए जाने से पहले कितनी पुरानी कुंजी हो सकती है), डेटाबेस व्यवस्थापक द्वारा अनुरोध किया गया (उदाहरण के लिए सेट ग्लोबल innodb_encrypt_tables=ON जारी करके; ) या एन्क्रिप्शन कुंजी प्रबंधन प्रणाली द्वारा (उदाहरण के लिए कुंजियाँ घुमाएँ देखें)।
डेटाबेस व्यवस्थापकों को यह निर्णय लेने की आवश्यकता है कि क्या यह केवल व्यक्तिगत तालिकाओं को एन्क्रिप्ट करने के लिए पर्याप्त है (देखें InnoDB के लिए डेटा एन्क्रिप्ट करना) या सिस्टम टेबलस्पेस सहित संपूर्ण डेटाबेस। ध्यान दें कि तालिका डेटा को लॉग को फिर से करने और लॉग को पूर्ववत करने के लिए भी लिखा जाता है। इस प्रकार, यदि डेटाबेस में बहुत संवेदनशील डेटा वाली तालिकाएँ हैं innodb-encrypt-log भी सक्षम होना चाहिए। इस ब्लॉग में, हम दिखाते हैं कि पूरे डेटाबेस को कैसे एन्क्रिप्ट किया जाए।
डेटाबेस को एन्क्रिप्टेड स्थिति में ले जाना
डेटाबेस को एन्क्रिप्टेड स्थिति में ले जाने से पहले, हमें कॉन्फ़िगरेशन फ़ाइल में एन्क्रिप्शन प्लगइन कॉन्फ़िगरेशन जोड़ना होगा (पैरामीटर पर विस्तृत विवरण देखें):
# File Key Management
plugin-load-add = file_key_management
file-key-management-filename = /mnt/flash/keys.txt
file-key-management-encryption-algorithm = aes_ctr
# InnoDB encryption setup
innodb-encrypt-tables=ON
innodb-encrypt-log=ON
innodb-encryption-rotate-key-age=1024
innodb-encryption-threads=4
innodb-tablespaces-encryption
पुनः आरंभ करने के बाद एन्क्रिप्शन ऑपरेशन की प्रगति की निगरानी INFORMATION_SCHEMA.INNODB_TABLESPACES_ENCRYPTION तालिका से की जा सकती है। निम्नलिखित उदाहरण में, हम टेबलस्पेस का नाम, कुंजी रोटेशन के तहत वर्तमान पृष्ठ और उन तालिकाओं के लिए टेबलस्पेस में अधिकतम पृष्ठ पूछते हैं जो अभी तक एन्क्रिप्ट नहीं किए गए हैं:
MariaDB [(none)]> select name, KEY_ROTATION_PAGE_NUMBER, KEY_ROTATION_MAX_PAGE_NUMBER from information_schema.innodb_tablespaces_encryption where min_key_version = 0 or ROTATING_OR_FLUSHING = 1;
+---------------+--------------------------+------------------------------+
| name | KEY_ROTATION_PAGE_NUMBER | KEY_ROTATION_MAX_PAGE_NUMBER |
+---------------+--------------------------+------------------------------+
| innodb_system | 17641 | 1397504 |
+---------------+--------------------------+------------------------------+
1 row in set (0.000 sec)
स्वाभाविक रूप से, आप सभी तालिकाओं की स्थिति के बारे में भी पूछ सकते हैं:
MariaDB [tpcc1000]> select * from information_schema.innodb_tablespaces_encryption;
+-------+-------------------+-------------------+--------------------+-----------------+---------------------+--------------------------+------------------------------+----------------+----------------------+
| SPACE | NAME | ENCRYPTION_SCHEME | KEYSERVER_REQUESTS | MIN_KEY_VERSION | CURRENT_KEY_VERSION | KEY_ROTATION_PAGE_NUMBER | KEY_ROTATION_MAX_PAGE_NUMBER | CURRENT_KEY_ID | ROTATING_OR_FLUSHING |
+-------+-------------------+-------------------+--------------------+-----------------+---------------------+--------------------------+------------------------------+----------------+----------------------+
| 0 | innodb_system | 1 | 1 | 1 | 1 | NULL | NULL | 1 | 0 |
| 3 | tpcc1000/customer | 1 | 1 | 0 | 1 | 2401 | 1317888 | 1 | 1 |
+-------+-------------------+-------------------+--------------------+-----------------+---------------------+--------------------------+------------------------------+----------------+----------------------+
2 rows in set (0.000 sec)
इससे हम देख सकते हैं कि सिस्टम टेबलस्पेस पहले से ही एन्क्रिप्टेड है लेकिन डेटाबेस tpcc1000 से टेबल ग्राहक वर्तमान में एन्क्रिप्ट किया जा रहा है। यदि आपके सिस्टम में हार्डवेयर संसाधन हैं और एन्क्रिप्शन प्रक्रिया धीमी लगती है, तो आप निम्न पैरामीटर आज़मा सकते हैं:
# Set close to number of cores
set global innodb_encryption_threads=16;
# For SSD increase number of I/O operations used for encryption in second
set global innodb_encryption_rotation_iops=40000;
जब एन्क्रिप्टेड स्थिति में कोई तालिका नहीं होती है तो डेटाबेस एन्क्रिप्शन समाप्त हो जाता है:
MariaDB [tpcc1000]> select name, KEY_ROTATION_PAGE_NUMBER, KEY_ROTATION_MAX_PAGE_NUMBER from information_schema.innodb_tablespaces_encryption where min_key_version = 0 or ROTATING_OR_FLUSHING = 1;
Empty set (0.001 sec)
और सत्यापित करने के लिए, एन्क्रिप्ट की गई सभी तालिकाओं को सूचीबद्ध करें:
MariaDB [tpcc1000]> select * from information_schema.innodb_tablespaces_encryption where min_key_version != 0;
+-------+---------------------+-------------------+--------------------+-----------------+---------------------+--------------------------+------------------------------+----------------+----------------------+
| SPACE | NAME | ENCRYPTION_SCHEME | KEYSERVER_REQUESTS | MIN_KEY_VERSION | CURRENT_KEY_VERSION | KEY_ROTATION_PAGE_NUMBER | KEY_ROTATION_MAX_PAGE_NUMBER | CURRENT_KEY_ID | ROTATING_OR_FLUSHING |
+-------+---------------------+-------------------+--------------------+-----------------+---------------------+--------------------------+------------------------------+----------------+----------------------+
| 0 | innodb_system | 1 | 1 | 1 | 1 | NULL | NULL | 1 | 0 |
| 3 | tpcc1000/customer | 1 | 1 | 1 | 1 | NULL | NULL | 1 | 0 |
| 2 | tpcc1000/district | 1 | 1 | 1 | 1 | NULL | NULL | 1 | 0 |
| 4 | tpcc1000/history | 1 | 1 | 1 | 1 | NULL | NULL | 1 | 0 |
| 8 | tpcc1000/item | 1 | 1 | 1 | 1 | NULL | NULL | 1 | 0 |
| 5 | tpcc1000/new_orders | 1 | 1 | 1 | 1 | NULL | NULL | 1 | 0 |
| 7 | tpcc1000/order_line | 1 | 1 | 1 | 1 | NULL | NULL | 1 | 0 |
| 6 | tpcc1000/orders | 1 | 1 | 1 | 1 | NULL | NULL | 1 | 0 |
| 9 | tpcc1000/stock | 1 | 1 | 1 | 1 | NULL | NULL | 1 | 0 |
| 1 | tpcc1000/warehouse | 1 | 1 | 1 | 1 | NULL | NULL | 1 | 0 |
+-------+---------------------+-------------------+--------------------+-----------------+---------------------+--------------------------+------------------------------+----------------+----------------------+
10 rows in set (0.000 sec)
जैसा कि देखा जा सकता है, सभी टेबलस्पेस ENCRYPTION_SCHEME=1 . का उपयोग करते हैं (एन्क्रिप्टेड) और MIN_KEY_VERSION=1 . इस चरण के बाद डेटाबेस व्यवस्थापक को उपयोग किए गए एन्क्रिप्शन थ्रेड्स और रोटेशन iops की संख्या घटाने पर विचार करना चाहिए। इसके अलावा, आगे की कुंजी रोटेशन की आवश्यकता पर भी विचार किया जाना चाहिए क्योंकि फ़ाइल कुंजी प्रबंधन प्लगइन वास्तविक कुंजी रोटेशन का समर्थन नहीं करता है। innodb-encryption-rotate-key-age=0 . का उपयोग करके कुंजी रोटेशन को अक्षम किया जा सकता है . ध्यान दें कि उस सेटअप के साथ भी बनाई गई सभी नई तालिकाओं को एन्क्रिप्शन के लिए माना जाता है।
डेटाबेस को अनएन्क्रिप्टेड स्थिति में ले जाना
यहां हम मानते हैं कि आपके पास एक डेटाबेस है जो एन्क्रिप्टेड है और अब डेटा को एन्क्रिप्ट करने की आवश्यकता नहीं है या डेटा सुरक्षा अलग तरीके से की जाती है। हम डेटाबेस को एन्क्रिप्टेड स्थिति में ले जाने के उदाहरण के रूप में उसी डेटाबेस का उपयोग करेंगे। इस बिंदु पर सर्वर को पुनरारंभ करने की कोई आवश्यकता नहीं है। इसके बजाय डेटाबेस को अनएन्क्रिप्टेड स्थिति में ले जाना एक ऑनलाइन ऑपरेशन के रूप में किया जा सकता है। सबसे पहले, डेटाबेस व्यवस्थापक को यह जांचना चाहिए कि स्पष्ट एन्क्रिप्शन का उपयोग करने वाली कोई तालिका नहीं है यानी एक तालिका है जहां तालिका बनाएं ENCRYPTED=YES तालिका विकल्प का उपयोग किया जाता है। अब डेटाबेस को अनएन्क्रिप्टेड स्थिति में ले जाकर जारी करके सरल किया जा सकता है:
SET GLOBAL innodb_encrypt_tables=OFF;
यह सिस्टम टेबलस्पेस सहित सभी टेबलस्पेस को अनएन्क्रिप्ट करना शुरू कर देगा और इस ऑपरेशन की प्रगति की निगरानी की जा सकती है:
MariaDB [tpcc1000]> select * from information_schema.innodb_tablespaces_encryption where min_key_version != 0;
+-------+---------------------+-------------------+--------------------+-----------------+---------------------+--------------------------+------------------------------+----------------+----------------------+
| SPACE | NAME | ENCRYPTION_SCHEME | KEYSERVER_REQUESTS | MIN_KEY_VERSION | CURRENT_KEY_VERSION | KEY_ROTATION_PAGE_NUMBER | KEY_ROTATION_MAX_PAGE_NUMBER | CURRENT_KEY_ID | ROTATING_OR_FLUSHING |
+-------+---------------------+-------------------+--------------------+-----------------+---------------------+--------------------------+------------------------------+----------------+----------------------+
| 7 | tpcc1000/order_line | 1 | 1 | 1 | 1 | 76564 | 1947904 | 1 | 1 |
| 6 | tpcc1000/orders | 1 | 1 | 1 | 1 | NULL | NULL | 1 | 0 |
| 9 | tpcc1000/stock | 1 | 1 | 1 | 1 | NULL | NULL | 1 | 0 |
| 1 | tpcc1000/warehouse | 1 | 1 | 1 | 1 | NULL | NULL | 1 | 0 |
| 10 | tpcc1000/t1 | 1 | 1 | 1 | 1 | NULL | NULL | 1 | 0 |
+-------+---------------------+-------------------+--------------------+-----------------+---------------------+--------------------------+------------------------------+----------------+----------------------+
5 rows in set (0.001 sec)
इससे हम देख सकते हैं कि डेटाबेस tpcc1000 से टेबल ऑर्डर_लाइन को घुमाया जा रहा है। एन्क्रिप्शन का उपयोग करने वाली कोई तालिका नहीं होने पर संचालन समाप्त हो जाता है यानी min_key_version !=0.
MariaDB [tpcc1000]> select * from information_schema.innodb_tablespaces_encryption where min_key_version != 0 or rotating_or_flushing = 1;
Empty set (0.000 sec)
यदि एन्क्रिप्शन सेटअप को कॉन्फ़िगरेशन से हटाने की आवश्यकता है तो अब सर्वर को बंद करने का समय है। यदि कॉन्फ़िगरेशन फिर से लॉग एन्क्रिप्शन का उपयोग करता है अर्थात innodb-encrypt-log=ON InnoDB लॉग फ़ाइलों सहित अपने डेटाबेस से बैकअप लें और उसके बाद InnoDB लॉग फ़ाइलों को हटा दें क्योंकि वे एन्क्रिप्टेड डेटा होने पर अनुपयोगी हैं।
rm -rf ib_logfile*
कॉन्फ़िगरेशन से एन्क्रिप्शन सेटअप निकालें और सर्वर को पुनरारंभ करें। अब आपके पास एक डेटाबेस इंस्टेंस है जहां कोई एन्क्रिप्शन का उपयोग नहीं किया जाता है।
निष्कर्ष
डेटाबेस को एन्क्रिप्टेड स्थिति में ले जाना जैसा कि ऊपर देखा गया है, सर्वर को पुनरारंभ करने की आवश्यकता है और सावधानीपूर्वक एन्क्रिप्शन प्लगइन कॉन्फ़िगरेशन की आवश्यकता है। इस ऑपरेशन में कितना समय लगता है यह टेबल की संख्या और ये टेबल कितने बड़े हैं पर निर्भर करता है। हमने इस प्रगति की निगरानी करने का एक तरीका प्रस्तुत किया है और यदि उपयोग किए गए हार्डवेयर में पर्याप्त संसाधन हैं तो इसे कैसे तेज किया जाए। किसी डेटाबेस को अनएन्क्रिप्टेड स्थिति में ले जाने के लिए केवल एक वैश्विक चर सेट करने की आवश्यकता होती है। हालाँकि, यदि एन्क्रिप्शन अधिक समय तक आवश्यक है और इसके सभी संदर्भों को हटाने की आवश्यकता है, तो एक पुनरारंभ की आवश्यकता है। हमने दिखाया है कि इस संक्रमण की निगरानी कैसे करें और डेटाबेस और कॉन्फ़िगरेशन दोनों से एन्क्रिप्शन सेटअप को पूरी तरह से कैसे हटाएं।