MySQL
SSL 연결 설정
수색…
데비안 기반 시스템을위한 설정
(이것은 MySQL이 설치되어 있고 sudo
가 사용되고 있다고 가정합니다.)
CA 및 SSL 키 생성
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 연결 테스트
생성 된 클라이언트 키를 사용하여 추가 옵션 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
...
SSL 적용
이는 REQUIRE SSL
사용하여 GRANT
를 통해 수행됩니다.
GRANT ALL PRIVILEGES ON *.* TO 'superman'@'127.0.0.1' IDENTIFIED BY 'pass' REQUIRE SSL;
FLUSH PRIVILEGES;
이제 superman
은 SSL을 통해 연결 해야 합니다.
클라이언트 키를 관리하지 않으려면 이전의 클라이언트 키를 사용하고 자동으로 모든 클라이언트에 사용하십시오. 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
은 SSL을 통해 로그인하려면 다음을 입력하면됩니다.
mysql -h 127.0.0.1 -u superman -p
예를 들어 Python과 같은 다른 프로그램에서 연결하는 경우 일반적으로 connect 함수에 대한 추가 매개 변수 만 필요합니다. 파이썬 예제 :
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.
이제 firewalld를 다시 시작하십시오.
service firewalld restart
다음으로 dbserver의 mysql 서버에 로그인하십시오.
mysql -uroot -p
다음을 실행하여 클라이언트에 대한 사용자를 작성하십시오. note GRANT 문에서 SSL을 요구합니다.
GRANT ALL PRIVILEGES ON *.* TO ‘iamsecure’@’appclient’ IDENTIFIED BY ‘dingdingding’ REQUIRE SSL;
FLUSH PRIVILEGES;
# quit mysql
첫 번째 단계에서 / root / certs / 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.
다음 명령에 대해서는 여전히 / root / certs / mysql /입니다.
서버 및 클라이언트 CA 인증서를 단일 파일로 결합 :
cat server-cert.pem client-cert.pem > ca.pem
두 가지 인증서가 있는지 확인하십시오.
cat ca.pem
지금 서버 측 작업 끝.
다른 터미널을 열고
ssh appclient
이전과 마찬가지로 클라이언트 인증서를 영구적으로 만들 수 있습니다.
mkdir /etc/pki/tls/certs/mysql/
이제 클라이언트 인증서 (dbserver에서 작성)를 appclient에 배치하십시오. 그 파일들을 scp로 복사하거나 파일을 하나씩 복사하여 붙여 넣을 수 있습니다.
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의 mariadb 서비스를 다시 시작하십시오.
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에 대한 간략한 설명 :
SSL 오류 : '/etc/pki/tls/certs/mysql/client-cert.pem'에서 인증서를 가져올 수 없습니다.
문제는 루트 소유의 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을 사용하여 연결되어 있는지 확인하려면 MariaDB / MySQL 프롬프트에서 다음 명령을 실행하십시오.
\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 문을 검사하여 잘못된 문자 나 '표시가 없는지 확인하십시오.
SSL 오류가있는 경우이 가이드를 통해 단계가 규칙적인지 확인하십시오.
이것은 RHEL7에서 작동했으며 CentOS7에서도 작동 할 것입니다. 이 정확한 단계가 다른 곳에서 효과가 있는지 여부를 확인할 수 없습니다.
희망은 다른 누군가에게 약간의 시간과 악몽을 덜어주기를 바랍니다.