Taste of Tech Topics

Acroquest Technology株式会社のエンジニアが書く技術ブログ

Flumeでセキュアな通信を

Hadoopアドベントカレンダーの14日目。
阪本です。

セキュア通信でFlumeを使う方法について書こうと思います。



現行のFlumeには、セキュア通信を行うための仕組みは用意されていません。
完全ローカルで使用するのであれば、それでもよいかもしれませんが、
やはり通信経路のセキュリティは気になるもの。
特に日本ではこのあたり、気にされるんですよねぇ。

そこで、SSHポートフォワード+Flumeによるセキュア通信をやってみました。


まずは、flume configでの設定。

exec unmapAll
exec purgeAll
exec map host1 node1_1
exec map host1 node1_2
exec map host2 node2_1
exec map host2 node2_2
exec map host3 collector1
exec map host3 collector2
exec config node1_1 flow1 'execPeriodic("/usr/local/test/collect1.sh", 60000)'
        'agentSink("localhost", 10001)'
exec config node1_2 flow2 'execPeriodic("/usr/local/test/collect2.sh", 60000)'
        'agentSink("localhost", 10002)'
exec config node2_1 flow1 'execPeriodic("/usr/local/test/collect1.sh", 60000)'
        'agentSink("localhost", 10001)'
exec config node2_2 flow2 'execPeriodic("/usr/local/test/collect2.sh", 60000)'
        'agentSink("localhost", 10002)'
exec config collector1 flow1 'collectorSource(35851)' 'collectorSink("file:///home/test/output1")'
exec config collector2 flow2 'collectorSource(35852)' 'collectorSink("file:///home/test/output2")'

上は、論理ノード4つと論理コレクタ4つを、計3台の物理マシンに割り当てる例。
(見やすいように改行しています。)
collect1/2.shは、転送する内容を標準出力に出力します。
node1_1とnode2_1はcollector1に、node1_2とnode2_2はcollector2にデータを転送します。

ここでポイントとなるのは、ノードのagentSinkで指定するアドレスとポート。
当然ながら、SSHポートフォワードでポートを開けているアドレスとポートを指定しなければなりません。
Agentはlocalhostの10001/10002番ポートへデータを送信し、
Collectorは

そしてsshコマンド。各ノード上で以下を実行。

ssh -L 10001:host3:35851 -L 10002:host3:35852 -L 10003:host3:35872 user@host3

こうすることで、ノードの10001番ポートに来たデータはhost1の35851番ポートへ、
ノードの10002番ポートに来たデータはhost1の35852番ポートへ、
そしてノードの10003番ポートに来たデータはhost1の35872番ポートへ、
SSH経由で転送されることになります。
Agent <-> Master間のHeartbeat通信もSSH経由を忘れずに。
公開鍵認証できるようにしておけば、パスワード要らず。

あとは、Agent側のflume.master.heartbeat.portに10003を設定して、
普通にFlumeを実行するだけ。


プログラムに手を加えることなく、セキュア通信できるようにするのは
SSHの強みですね。

余談

SSHポートフォワードで通信させるときの注意。

sshコマンド1つでポートフォワードできる最大数は100です。
設定などで変えることはできません。
#これにはまりました^^;

100個以上の通信経路を用意する場合は、
以下のように複数個のsshコマンドを実行すれば回避できます。

ssh -L 10001:host3:35851 -L 10002:host3:35852 user@host3
ssh -L 10003:host3:35872 user@host3

それでは。