수색…


데비안 기반 시스템을위한 설정

(이것은 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-certssl-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)

참고 문헌 및 추가 읽기 :

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.

이제 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에서도 작동 할 것입니다. 이 정확한 단계가 다른 곳에서 효과가 있는지 여부를 확인할 수 없습니다.

희망은 다른 누군가에게 약간의 시간과 악몽을 덜어주기를 바랍니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow