0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MYSQL5.7とLogstash7.4のSSL接続

0
Last updated at Posted at 2019-10-20

<背景>
さくらサーバー環境で稼働しているMYSQLの社外販売情報を、AWS側へセキュアに転送し、
kibanaのグラフツールを使用して社外からもマーケティング情報として営業が利用できないか検討しました。

・AWSインスタンス
 ubuntu 18.04
 elastic search7.4
 logstash7.4

・さくらサーバー
 mysql5.7(ここで本番用データベースが稼働中)

という環境で、AWSインスタンスからさくらのMYSQLのデータを、SSL接続設定したので参考にしてみてください。
ElastichsearchのNODE間接続というのもあるようなのですが、まだ知識がないので、MYSQLのSSL接続化で
実現してみました。

1.SWをインストール

 以下のサイトから、Elasticsearch、Logstash をダウンロードし、AWSインスタンスにインストール。
 java環境は、Openjdk-8 としました。

 https://www.elastic.co/jp/downloads/

2.jdbcドライバーをダウンロード

 以下のサイトから、「mysql-connector-java-8.0.12.jar」をAWSインスタンスの/usr/share/logstash へダウンロード。

3.jksを作成

 JDBCドライバでSSL接続するには、接続先サーバーのpemファイルを使用して、jksファイルを作成し、AWSインスタンスに保存する必要があります。

そのために、MYSQLのSSL設定を確認する必要があります。
自分の環境は既にSSL設定が構築されていましたので、証明書の作成などは必要ありませんでした。

自分の環境は以下のようでした。

mysql> SHOW VARIABLES LIKE '%ssl%';
+---------------+-----------------+
| Variable_name | Value           |
+---------------+-----------------+
| have_openssl  | YES             |
| have_ssl      | YES             |
| ssl_ca        | ca.pem          |
| ssl_capath    |                 |
| ssl_cert      | server-cert.pem |
| ssl_cipher    |                 |
| ssl_crl       |                 |
| ssl_crlpath   |                 |
| ssl_key       | server-key.pem  |
+---------------+-----------------+
9 rows in set (0.02 sec)

上記の情報をもとに、以下のコマンド1~3を実行し、pemからjksを作成します。

1 keytool -import -file ./ca.pem -alias elastic1 -keystore elastickey.jks
2 penssl pkcs12 -export -inkey ./server-key.pem -in ./server-cert.pem -name elastic -out ./temp.p12
3 keytool -importkeystore -srckeystore ./temp.p12 -srcstoretype pkcs12 -destkeystore elastickey.jks

1の ./ca.pemは、SQL結果のssl_ca
    elastic1 は適当な別名
    elastickey.jks は作成するjksファイル名

2の ./server-key.pem は、SQL結果のssl_key
   ./server-cert.pem は、SQL結果のssl_cert
   elastic は適当な別名(1とは別にしました。)

3の elastickey.jks は1のjksファイル名と同じ

作成する上で、2度パスワードを設定しますが、両方とも同じにして、下記、4の設定ファイルでセットする
パスワード(YYYYYY)と同じにしました。

作成された、elastickey.jks を、下の4で設定する、AWSインスタンス側に保存しました。
(/home/ubuntu/elastickey.jks)

4.logstashの設定ファイルを編集

 /etc/logstash/conf.d/ に/etc/logstash/logstash-sample.conf を、logstash.confとしてコピーして、
 以下のように記述を変更。

input {
  jdbc {
    jdbc_driver_library => "/usr/share/logstash/mysql-connector-java-8.0.12.jar"
    jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
  jdbc_connection_string => 'jdbc:mysql://x.x.x.x:3306/model_on?useSSL=true&requireSSL=true&verifyServerCertificate=true&trustCertificateKeyStoreUrl=file:///home/ubuntu/elastickey.jks&trustCertificateKeyStoreType=JKS&trustCertificateKeyStorePassword=YYYYYY'
 (x.x.x.x は本番DBのIP、その他のパラメータはSSL接続時に必要な設定項目)
    jdbc_user => "xxxxxxxx" (MYSQLサーバーへ接続するMYSQLのユーザーID)
    jdbc_password => "xxxxxxxx" (そのパスワード)
statement => "" (ここにDBから抽出するSelect文)
type => "download"
  }
}

output {
  if [type] == "download" {
    elasticsearch {
      manage_template => false
      hosts => ["localhost:9200"]
      index => "" (RDBでいうところのElasticsearch側のテーブル 任意に指定可能)
      document_type => "%{type}"
      document_id => "%{id}"
    }
    stdout {codec => rubydebug {metadata => true }}
  }
}

5.logstashの設定反映

 AWSインスタンスからDBサーバーへ接続できるようにするために、DBサーバー側で以下のSQLを実行しておく必要があります。

 mysql> grant all privileges on [データベース名].* to [user名]@"接続元IP" identified by 'パスワード' with grant option;
(user名は、4の設定内で登録したユーザー)

上記設定を追加後、以下のコマンドを実行し、4の設定ファイルを反映、実行。
 sudo /usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/logstash.conf
 
その結果、AWSのElasticsearch側に、DBサーバーからselectで抽出したデータがSSL通信で送信され、indexが作成されます。
セキュリティを確保するために、接続するユーザーは必ずSSL接続という条件でユーザー登録ができます。
(mysql> create user user1 identified by 'Password' require ssl;)

あとは、tcpdumpで実際にSSL通信できているか確認してください。
サーバー側で、 sudo tcpdump -X port 3306

 

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?