खोज…


डेबियन-आधारित सिस्टम के लिए सेटअप

(यह माना जाता है कि 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)

संदर्भ और आगे पढ़ने:

CentOS7 / RHEL7 के लिए सेटअप

यह उदाहरण दो सर्वरों को मानता है:

  1. Dbserver (जहां हमारा डेटाबेस रहता है)
  2. 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 पर भी काम करेगा। पुष्टि नहीं कर सकता कि ये सटीक कदम कहीं और काम करेंगे या नहीं।

आशा है कि यह किसी और को थोड़ा समय और वृद्धि बचाता है।



Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow