RabbitMQをSSL対応させてみる(with Graylogでログを受け取らせてみる)

前回、RabbitMQにキューイングされたログをGraylogで取得させるようにしたが、今回はさらにRabbitMQ側でSSL対応させて通信を暗号化させる。 証明書ファイルは(お金もないので)オレオレ証明書で作成する。 (Let's Encryptでもいいのだが、どうせローカルネットワーク内での検証なので)

1. SSL証明書の準備

まずはSSL証明書の準備から。 クライアント側(Graylog側)にクライアント証明書が必要になるので、CA証明書含めこちらを参考に作成を行う。

証明書作成後はRabbitMQへ送るのを忘れずに。 今回の場合は、「/etc/rabbitmq/ssl/」というフォルダを作成してそこに証明書ファイルを配置する。

2. RabbitMQでのSSL設定

証明書の作成をしたら、設定ファイル「/etc/rabbitmq/rabbitmq.config」を新規で作成し、RabbitMQでのSSL設定を行う。 SSL用に新たに5671番ポートを指定する。

[
    {rabbit, [
    {ssl_listeners, [5671]},
    {ssl_options, [{cacertfile,"/etc/rabbitmq/ssl/cacert.crt"},
                   {certfile,"/etc/rabbitmq/ssl/server.crt"},
                   {keyfile,"/etc/rabbitmq/ssl/server.key"},
                   {verify,verify_peer},
                   {fail_if_no_peer_cert,true}]}
  ]}
].

設定ファイル作成後、RabbitMQを再起動し、さらにFirewalldで5671番ポートも開放する。

firewall-cmd --permanent --add-port=5671/tcp
firewall-cmd --reload
systemctl restart rabbitmq-server

3. Graylog側の設定

RabbitMQ側でSSLの設定が終わったら、Graylog側でも設定を行う。 まず、以下のコマンドでオレオレ証明書をGraylogで読み込めるよう登録を行う。

sudo keytool -importcert -keystore /usr/lib/jvm/java-8-oracle/jre/lib/security/cacerts -storepass changeit -alias rabbitmq_ca -file cacert.crt # ルートCA証明書
sudo keytool -importcert -keystore /usr/lib/jvm/java-8-oracle/jre/lib/security/cacerts -storepass changeit -alias rabbitmq_ica -file icacert.crt # 中間CA証明書
sudo systemctl restart graylog-server

信頼できる証明書として登録が完了したら、Inputから「Enable TLS」にチェックを入れる。

あとは、無事ログが受信できるか確認するだけだ。

tcpdumpも実行して、通信が暗号化されていることも確認しよう。

blacknon@BS-PUB-GRAYLOG:~$ sudo tcpdump -A -i ens18 port 5671
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens18, link-type EN10MB (Ethernet), capture size 262144 bytes
15:48:54.354235 IP BS-PUB-GRAYLOG.BLACKNON.LOCAL.34270 > BS-PUB-RABBITMQ01.BLACKNON.LOCAL.amqps: Flags [P.], seq 973071435:973071504, ack 3443263906, win 1444, options [nop,nop,TS val 300865577 ecr 27421255], length 69
E..ymC@.@.s|...........'9..K.< .....Z+..... ...)..jG....@..c..Dj...*....T ..,m_*R...n.P.s7.......Qk...}..W#%].g.Cc 9]lN.. 15:48:54.394471 IP BS-PUB-RABBITMQ01.BLACKNON.LOCAL.amqps > BS-PUB-GRAYLOG.BLACKNON.LOCAL.34270: Flags [.], ack 69, win 772, options [nop,nop,TS val 27469841 ecr 300865577], length 0
E..4..@.@.B..........'...< .9.......t...... ..(....) 15:48:54.644763 IP BS-PUB-RABBITMQ01.BLACKNON.LOCAL.amqps > BS-PUB-GRAYLOG.BLACKNON.LOCAL.34270: Flags [P.], seq 1:70, ack 69, win 772, options [nop,nop,TS val 27470082 ecr 300865577], length 69
E..y..@.@.A..........'...< .9.............. ..)....)....@..]..".g7~..1..Y.&.].T....L.?&. ..a_ ..........0.._7Gb...g*...G. 15:48:54.684531 IP BS-PUB-GRAYLOG.BLACKNON.LOCAL.34270 > BS-PUB-RABBITMQ01.BLACKNON.LOCAL.amqps: Flags [.], ack 70, win 1444, options [nop,nop,TS val 300865660 ecr 27470082], length 0
E..4mD@.@.s............'9....< .....Y...... ...|..). 15:49:05.675325 IP BS-PUB-RABBITMQ01.BLACKNON.LOCAL.amqps > BS-PUB-GRAYLOG.BLACKNON.LOCAL.34270: Flags [P.], seq 70:587, ack 69, win 772, options [nop,nop,TS val 27481121 ecr 300865660], length 517
E..9..@.@.?..........'...<      .9.......xJ.....
..T!...|....._v......}M..n).;.u.....2...r.....'.93..-...s.l..t+.......-.V...o.1.....j.......A.......H$.iS.s.4..%......,r....,..!.KJ....>*"-.r.h...M.r...*.\6\.........)..*.....SH..D........a... .b.....bW.t]X......s....LF..Xt..--m#.><S...Y..@.Z.A.. ~..Z....ln..r8>VJ.RF..?.AZ}Z..Z.|j\'..".1~n....d..;...^...{.[.R.4L...9.......qJ.y4}..Opi..}r...
15:49:05.675358 IP BS-PUB-GRAYLOG.BLACKNON.LOCAL.34270 > BS-PUB-RABBITMQ01.BLACKNON.LOCAL.amqps: Flags [.], ack 587, win 1444, options [nop,nop,TS val 300868407 ecr 27481121], length 0
E..4mE@.@.s............'9....