Distributionを実現したい。問題と対応策について整理する。Distributionは、ノードと呼ばれるErlangランタイムが相互に通信することで実現される。他のノードに接続する際に、接続先のノード名から接続先のポートを解決するために用いられる。待ち受けているepmdに、そのノードの用いているポート番号を問い合わせる接続対象のノードがlistenしているそのポート番号に接続するという流れになる。Protocolに記載されている。Distributionを実現することは実際問題としてできない。epmdへの接続epmdへの接続に対しては特に認証はないため、接続されてしまうと登録しているノードの一覧を見られてしまう。別のホストにあるノードと通信する場合は、epmdのlistenするポート(デフォルトでは4369番)への通信を許可しておく必要があるが、上述の問題があるためインターネット越しのノード間通信にepmdを使うことはできない。通信経路デフォルトの通信モジュールinet_tcp_distによる通信では、平文のTCPによる通信が行われる。cookie(以下、cookie)と呼ばれる文字列(Erlangの内部的にはatom)が用いられる。あるノードが別のノードに接続しようとした際、それぞれに設定されているcookieが同一であるかを比較することで認証する。この方式は、ブルートフォースアタックに対して脆弱である。セキュアなノード間通信セキュリティを担保しつつインターネット越しでノード間通信をしたい場合、以下の3つの条件を満たす必要がある。epmdを使わないepmdを使うと、前述の通りインターネット越しでのノード間通信をセキュアにはできない。以下のerlコマンドオプションを用いることで、epmdを使わないようにできる。-name/-snameオプションを用いてノードが起動された際、デフォルトでは自動的にepmdが起動される。falseを設定する。ノード間通信を行うerl_epmdというプロセスがlistenし、また、他のノードにつなぐ際に使うポート番号を設定する。通信に使うポートを指定してやることで、epmdによるポート番号の解決を不要にする。いう形で渡すことができる。指定することができる。inet_tls_distによるTLSを用いるようにする。Elixirでの具体的な手順については、以下のメモに記載しているので参照されたい。よるTLS通信に加えて、クライアント証明書認証を用いることで、セキュアな認証を実現する。その際、サーバでは以下の項目を必ず設定しなければならない。true}こちらについても、上述の「Vaultで発行した証明書を使ってElixirでmTLS通信する」で例を示しているので参照されたい。補遺-connect_allオプションについてノードAからノードBに接続したとき、ノードBがノードCへすでに接続している場合、ノードAは自動的にノードCにも接続を試みる。falseを設定する。falseを設定してepmdを起動しないようにしたとしても、他で起動されるとepmdとの通信が発生し、ノードが登録されてしまう。-no_epmdを設定する。-erl_epmd_portと同時には使えないようだ。これだとノード間通信ができなくなってしまう。erlang/otpで議論されている。その結果として、以下のドキュメントが追加された。Distribution.デフォルトのもの以外のプロトコルを用いて通信したい場合に、epmdを使わないようにするためのものということのようだ。erl_epmdが開始されないため、既存のプロトコルだと通信そのものができなくなってしまう。Blogツイートあんちぽあんちぽです。バッジを贈って著者を応援しようバッジを受け取った著者にはZennから現金やAmazonギフト券が還元されます。約4,400字あんちぽあんちぽです。セキュアな認証をする補遺-connect_allオプションについて-no_epmdオプションについて参考文献Zennエンジニアのための情報共有コミュニティAboutZennについて運営会社お知らせ・リリースGuides使い方Publicationよくある質問LinksTwitterGitHubメディアキットLegal利用規約プライバシーポリシ。