MySQL
एसएसएल कनेक्शन सेटअप
खोज…
डेबियन-आधारित सिस्टम के लिए सेटअप
(यह माना जाता है कि MySQL स्थापित किया गया है और उस sudo
का उपयोग किया जा रहा है।)
एक सीए और एसएसएल चाबियाँ पैदा करना
सुनिश्चित करें कि OpenSSL और लाइब्रेरी स्थापित हैं:
apt-get -y install openssl
apt-get -y install libssl-dev
SSL फ़ाइलों के लिए अगली निर्देशिका बनाएं और दर्ज करें:
mkdir /home/ubuntu/mysqlcerts
cd /home/ubuntu/mysqlcerts
कुंजियाँ बनाने के लिए, कुंजी (स्व-हस्ताक्षरित) पर हस्ताक्षर करने के लिए प्रमाणपत्र प्राधिकारी (CA) बनाएँ:
openssl genrsa 2048 > ca-key.pem
openssl req -new -x509 -nodes -days 3600 -key ca-key.pem -out ca.pem
प्रत्येक प्रॉम्प्ट पर दर्ज किए गए मान कॉन्फ़िगरेशन को प्रभावित नहीं करेंगे। अगला सर्वर के लिए एक कुंजी बनाएं, और पहले से CA का उपयोग करके हस्ताक्षर करें:
openssl req -newkey rsa:2048 -days 3600 -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 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out server-cert.pem
फिर एक ग्राहक के लिए एक कुंजी बनाएं:
openssl req -newkey rsa:2048 -days 3600 -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 -days 3600 -CA ca.pem -CAkey ca-key.pem -set_serial 01 -out client-cert.pem
यह सुनिश्चित करने के लिए कि सब कुछ सही तरीके से सेट किया गया है, कुंजी सत्यापित करें:
openssl verify -CAfile ca.pem server-cert.pem client-cert.pem
MySQL में कुंजियाँ जोड़ना
MySQL कॉन्फ़िगरेशन फ़ाइल खोलें। उदाहरण के लिए:
vim /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
अनुभाग के तहत, निम्नलिखित विकल्प जोड़ें:
ssl-ca = /home/ubuntu/mysqlcerts/ca.pem
ssl-cert = /home/ubuntu/mysqlcerts/server-cert.pem
ssl-key = /home/ubuntu/mysqlcerts/server-key.pem
MySQL को पुनरारंभ करें। उदाहरण के लिए:
service mysql restart
एसएसएल कनेक्शन का परीक्षण करें
जेनरेट की गई क्लाइंट कुंजी का उपयोग करके अतिरिक्त विकल्प ssl-ca
, ssl-cert
और ssl-key
में पास करते हुए उसी तरह कनेक्ट करें। उदाहरण के लिए, cd /home/ubuntu/mysqlcerts
:
mysql --ssl-ca=ca.pem --ssl-cert=client-cert.pem --ssl-key=client-key.pem -h 127.0.0.1 -u superman -p
लॉग इन करने के बाद, सत्यापित करें कि कनेक्शन वास्तव में सुरक्षित है:
[email protected] [None]> SHOW VARIABLES LIKE '%ssl%';
+---------------+-----------------------------------------+
| Variable_name | Value |
+---------------+-----------------------------------------+
| have_openssl | YES |
| have_ssl | YES |
| ssl_ca | /home/ubuntu/mysqlcerts/ca.pem |
| ssl_capath | |
| ssl_cert | /home/ubuntu/mysqlcerts/server-cert.pem |
| ssl_cipher | |
| ssl_crl | |
| ssl_crlpath | |
| ssl_key | /home/ubuntu/mysqlcerts/server-key.pem |
+---------------+-----------------------------------------+
आप भी देख सकते हैं:
[email protected] [None]> STATUS;
...
SSL: Cipher in use is DHE-RSA-AES256-SHA
...
एसएसएल को लागू करना
यह REQUIRE SSL
का उपयोग करके GRANT
माध्यम से है:
GRANT ALL PRIVILEGES ON *.* TO 'superman'@'127.0.0.1' IDENTIFIED BY 'pass' REQUIRE SSL;
FLUSH PRIVILEGES;
अब, superman
को एसएसएल के माध्यम से कनेक्ट करना होगा ।
यदि आप क्लाइंट कुंजियों का प्रबंधन नहीं करना चाहते हैं, तो पहले से क्लाइंट कुंजी का उपयोग करें और स्वचालित रूप से सभी क्लाइंट के लिए उपयोग करें। उदाहरण के लिए MySQL कॉन्फ़िगरेशन फ़ाइल खोलें:
vim /etc/mysql/mysql.conf.d/mysqld.cnf
[client]
अनुभाग के तहत, निम्नलिखित विकल्प जोड़ें:
ssl-ca = /home/ubuntu/mysqlcerts/ca.pem
ssl-cert = /home/ubuntu/mysqlcerts/client-cert.pem
ssl-key = /home/ubuntu/mysqlcerts/client-key.pem
अब superman
केवल एसएसएल के माध्यम से लॉगिन करने के लिए निम्नलिखित टाइप करना होगा:
mysql -h 127.0.0.1 -u superman -p
दूसरे प्रोग्राम से कनेक्ट करना, उदाहरण के लिए पायथन में, आमतौर पर कनेक्ट फ़ंक्शन के लिए केवल एक अतिरिक्त पैरामीटर की आवश्यकता होती है। एक पायथन उदाहरण:
import MySQLdb
ssl = {'cert': '/home/ubuntu/mysqlcerts/client-cert.pem', 'key': '/home/ubuntu/mysqlcerts/client-key.pem'}
conn = MySQLdb.connect(host='127.0.0.1', user='superman', passwd='imsoawesome', ssl=ssl)
संदर्भ और आगे पढ़ने:
- https://www.percona.com/blog/2013/06/22/setting-up-mysql-ssl-and-secure-connections/
- https://lowendbox.com/blog/getting-started-with-mysql-over-ssl/
- http://xmodulo.com/enable-ssl-mysql-server-client.html
- https://ubuntuforums.org/showthread.php?t=1121458
CentOS7 / RHEL7 के लिए सेटअप
यह उदाहरण दो सर्वरों को मानता है:
- Dbserver (जहां हमारा डेटाबेस रहता है)
- appclient (जहां हमारे आवेदन रहते हैं)
FWIW, दोनों सर्वर SELinux एनफोर्सिंग हैं।
सबसे पहले, dbserver पर लॉग ऑन करें
प्रमाण पत्र बनाने के लिए एक अस्थायी निर्देशिका बनाएं।
mkdir /root/certs/mysql/ && cd /root/certs/mysql/
सर्वर सर्टिफिकेट बनाएं
openssl genrsa 2048 > ca-key.pem
openssl req -sha1 -new -x509 -nodes -days 3650 -key ca-key.pem > ca-cert.pem
openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout server-key.pem > server-req.pem
openssl rsa -in server-key.pem -out server-key.pem
openssl x509 -sha1 -req -in server-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > server-cert.pem
सर्वर प्रमाणपत्रों को / etc / pki / tls / certs / mysql / में ले जाएँ
निर्देशिका पथ CentOS या RHEL मानता है (अन्य डिस्ट्रो के लिए आवश्यकतानुसार समायोजित करें):
mkdir /etc/pki/tls/certs/mysql/
फ़ोल्डर और फ़ाइलों पर अनुमतियाँ सेट करना सुनिश्चित करें। mysql को पूर्ण स्वामित्व और पहुंच की आवश्यकता है।
chown -R mysql:mysql /etc/pki/tls/certs/mysql
अब MySQL / MariaDB कॉन्फ़िगर करें
# vi /etc/my.cnf
# i
[mysqld]
bind-address=*
ssl-ca=/etc/pki/tls/certs/ca-cert.pem
ssl-cert=/etc/pki/tls/certs/server-cert.pem
ssl-key=/etc/pki/tls/certs/server-key.pem
# :wq
फिर
systemctl restart mariadb
Appclient से कनेक्शन की अनुमति देने के लिए अपना फ़ायरवॉल खोलना न भूलें (IP 1.2.3.4 का उपयोग करके)
firewall-cmd --zone=drop --permanent --add-rich-rule 'rule family="ipv4" source address="1.2.3.4" service name="mysql" accept'
# I force everything to the drop zone. Season the above command to taste.
अब फ़ायरवॉल को पुनः आरंभ करें
service firewalld restart
इसके बाद, dbserver के mysql सर्वर में लॉग इन करें:
mysql -uroot -p
क्लाइंट के लिए एक उपयोगकर्ता बनाने के लिए निम्नलिखित जारी करें। ध्यान दें बयान बयान में एसएसएल।
GRANT ALL PRIVILEGES ON *.* TO ‘iamsecure’@’appclient’ IDENTIFIED BY ‘dingdingding’ REQUIRE SSL;
FLUSH PRIVILEGES;
# quit mysql
आप अभी भी पहले चरण से / रूट / सेर्ट्स / mysql में होना चाहिए। यदि नहीं, तो नीचे दिए गए किसी एक आदेश के लिए इसे वापस cd करें।
क्लाइंट सर्टिफिकेट बनाएं
openssl req -sha1 -newkey rsa:2048 -days 730 -nodes -keyout client-key.pem > client-req.pem
openssl rsa -in client-key.pem -out client-key.pem
openssl x509 -sha1 -req -in client-req.pem -days 730 -CA ca-cert.pem -CAkey ca-key.pem -set_serial 01 > client-cert.pem
नोट : मैंने सर्वर और क्लाइंट प्रमाणपत्र दोनों के लिए समान नाम का उपयोग किया है। YMMV।
सुनिश्चित करें कि आप अभी भी / रूट / certs / mysql / इस अगले कमांड के लिए हैं
सर्वर और क्लाइंट CA प्रमाणपत्र को एक ही फाइल में मिलाएं:
cat server-cert.pem client-cert.pem > ca.pem
सुनिश्चित करें कि आप दो प्रमाण पत्र देखते हैं:
cat ca.pem
अभी के लिए काम की अवधि समाप्त हो गई है।
एक और टर्मिनल खोलें और
ssh appclient
पहले की तरह, ग्राहक प्रमाणपत्र के लिए एक स्थायी घर बनाएं
mkdir /etc/pki/tls/certs/mysql/
अब, क्लाइंट सर्टिफिकेट (dbserver पर बनाया गया) को एप्लायंट पर रखें। आप या तो उन्हें खत्म कर सकते हैं, या बस एक-एक करके फाइलों को कॉपी और पेस्ट कर सकते हैं।
scp dbserver
# copy files from dbserver to appclient
# exit scp
फिर से, फ़ोल्डर और फ़ाइलों पर अनुमतियाँ सेट करना सुनिश्चित करें। mysql को पूर्ण स्वामित्व और पहुंच की आवश्यकता है।
chown -R mysql:mysql /etc/pki/tls/certs/mysql
आपके पास तीन फाइलें होनी चाहिए, प्रत्येक उपयोगकर्ता mysql के स्वामित्व में:
/etc/pki/tls/certs/mysql/ca.pem
/etc/pki/tls/certs/mysql/client-cert.pem
/etc/pki/tls/certs/mysql/client-key.pem
अब [client]
सेक्शन में Appclient के MariaDB / MySQL कॉन्फिगर को एडिट करें।
vi /etc/my.cnf
# i
[client]
ssl-ca=/etc/pki/tls/certs/mysql/ca.pem
ssl-cert=/etc/pki/tls/certs/mysql/client-cert.pem
ssl-key=/etc/pki/tls/certs/mysql/client-key.pem
# :wq
Appclient की मर्यादा सेवा को पुनः आरंभ करें:
systemctl restart mariadb
अभी भी यहाँ ग्राहक पर
इसे वापस करना चाहिए: ssl TRUE
mysql --ssl --help
अब, appclient के mysql उदाहरण में लॉग इन करें
mysql -uroot -p
नीचे के दोनों चरों पर YES देखना चाहिए
show variables LIKE '%ssl';
have_openssl YES
have_ssl YES
शुरू में मैंने देखा
have_openssl NO
Mariadb.log में एक त्वरित नज़र:
एसएसएल त्रुटि: '/etc/pki/tls/certs/mysql/client-cert.pem' से प्रमाणपत्र प्राप्त करने में असमर्थ
समस्या यह थी कि रूट के पास क्लाइंट-सर्टिफिकेट.पेम और युक्त फोल्डर था। इसका समाधान / etc / pki / tls / certs / mysql / से mysql का स्वामित्व सेट करना था।
chown -R mysql:mysql /etc/pki/tls/certs/mysql
तुरंत चरण से ऊपर की जरूरत है, तो mariadb को पुनरारंभ करें
अब हम सुरक्षा संबंध परीक्षण करने के लिए तैयार हैं
हम अभी भी यहाँ appclient पर हैं
ऊपर दिए गए खाते का उपयोग करके dbserver के mysql उदाहरण से कनेक्ट करने का प्रयास करें।
mysql -h dbserver -u iamsecure -p
# enter password dingdingding (hopefully you changed that to something else)
थोड़ी सी किस्मत के साथ आपको बिना किसी त्रुटि के लॉग इन होना चाहिए।
यह सुनिश्चित करने के लिए कि आप SSL सक्षम हैं, मारियाडीबी / माईएसक्यूएल प्रॉम्प्ट से निम्नलिखित कमांड जारी करें:
\s
यह एक बैकस्लैश एस, उर्फ स्थिति है
यह आपके कनेक्शन की स्थिति दिखाएगा, जो कुछ इस तरह दिखना चाहिए:
Connection id: 4
Current database:
Current user: iamsecure@appclient
SSL: Cipher in use is DHE-RSA-AES256-GCM-SHA384
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server: MariaDB
Server version: 5.X.X-MariaDB MariaDB Server
Protocol version: 10
Connection: dbserver via TCP/IP
Server characterset: latin1
Db characterset: latin1
Client characterset: utf8
Conn. characterset: utf8
TCP port: 3306
Uptime: 42 min 13 sec
यदि आपको अपने कनेक्शन के प्रयास पर अनुमति से वंचित त्रुटियां मिली हैं, तो सुनिश्चित करें कि कोई भी भटके हुए अक्षर या चिह्न नहीं हैं, यह सुनिश्चित करने के लिए अपने GRANT स्टेटमेंट की जाँच करें।
यदि आपके पास एसएसएल त्रुटियां हैं, तो इस गाइड के माध्यम से वापस जाएं सुनिश्चित करें कि चरण क्रमबद्ध हैं।
यह RHEL7 पर काम करता है और संभवतः CentOS7 पर भी काम करेगा। पुष्टि नहीं कर सकता कि ये सटीक कदम कहीं और काम करेंगे या नहीं।
आशा है कि यह किसी और को थोड़ा समय और वृद्धि बचाता है।