Spark セキュリティ

現在のところSparkは共有秘密鍵での認証をサポートします。認証はspark.authenticate 設定パラメータを使って設定することができます。このパラメータはSpark通信プロトコルが共有鍵を使って認証するかどうかを制御します。この認証は両側が同じ共有鍵を持つか、通信ができるかを確認するための基本ハンドシェイクです。もし秘密鍵が一致しない場合は、通信できないでしょう。共有鍵は以下のようにして生成されます:

Web UI

Saprk UIはspark.ui.filtersを使って javax servlet filters を使用することでもセキュアにすることができます。他のユーザが見ることが許されないデータがある場合にUIをセキュアにしたいと思うかも知れません。ユーザによって指定された javax servlet filter はユーザを認証することができ、一旦ユーザがログインすると、SparkはUIを見る許可があるかを調べるためにユーザとview ACLを比較することができます。spark.acls.enable および spark.ui.view.acls 設定がACLの挙動を制御します。アプリケーションを開始したユーザは常にUIへのviewアクセスを持つことに注意してください。YARN上では、Spark UIは標準YARN webアプリケーションプロキシ機構を使用し、あらゆるインストールされたHadoopフィルタを使って認証することができるでしょう。

Sparkも実行中のSparkアプリケーションを修正するアクセスを誰が持つかを制御する修正ACLをサポートします。これにはアプリケーションあるいはタスクのkill のようなものが含まれます。これは spark.acls.enable および spark.modify.acls設定によって制御されます。Note that if you are authenticating the web UI, in order to use the kill button on the web UI it might be necessary to add the users in the modify acls to the view acls also. On YARN, the modify acls are passed in and control who has modify access via YARN interfaces.

Spark allows for a set of administrators to be specified in the acls who always have view and modify permissions to all the applications. is controlled by the config spark.admin.acls. これは、あなたが管理権限を持っているか、ユーザのアプリケーションデバッグを助けるスタッフをサポートするような共有クラスタの場合に便利です。

イベントのログ

アプリケーションがイベントログを使っている場合は、イベントログが入るディレクトリ(spark.eventLog.dir) は手動で作成され、適切なパーミッションが設定されていなければなりません。それらのログファイルをセキュアにしたい場合は、そのディレクトリのパーミッションは drwxrwxrwxt に設定されなければなりません。ディレクトリの所有者は履歴サーバを実行しているスーパーユーザで、グループパーミッションはスーパーユーザグループに制限されていなければなりません。これにより全てのユーザはディレクトリに書き込むことができるでしょうが、ファイルあるいはディレクトリを所有すること無しに権限の無いユーザがファイルを削除あるいは名前を変えることを防ぎます。イベントログファイルはSparkによってユーザおよびグループのみが読み書きアクセスを持つパーミッションで生成されるでしょう。

暗号化

SparkはAkkaおよびHTTP(ブロードキャストおよびファイルサーバのため)プロトコルのSSLをサポートします。ブロック転送サービスのためにSASL 暗号化がサポートされています。WebUIのための暗号化はまだサポートされません。

シャッフルサービス、キャッシュされたデータ、および他のアプリケーションファイルのような、Sparkによって一時的なローカルストレージに格納されるデータのための暗号化はまだサポートされていません。このデータの暗号化が望ましい場合は、次善策としてクラスタマネージャーを暗号化ディスク上にアプリケーションデータを保存するように設定します。

SSL 設定

SSLのための設定は階層構造によって整理されます。プロトコル固有の設定で上書きされていない限り、ユーザは全てのサポートされる通信プロトコルのために使われるデフォルトのSSL設定を設定することができます。This way the user can easily provide the common settings for all the protocols without disabling the ability to configure each one individually. 共通のSSL設定はSpark設定のspark.ssl名前空間にあり、一方でAkka SSL 設定は spark.ssl.akka にあり、ブロードキャストのためのHTTPおよびファイルサーバSSL設定は spark.ssl.fsにあります。完全なブレークダウンは 設定ページで見つけることができます。

SSLは各ノード上で設定され、特定のプロトコルで使用される通信に関係する各コンポーネントのために設定されなければなりません。

YARN モード

キーストアはクライアント側で準備されることができ、executorによってアプリケーションの一部として分配および使われることができます。spark.yarn.dist.files あるいは spark.yarn.dist.archives 設定によって、ユーザはアプリケーションがYARN内で実行される前にファイルを配布することが可能なので、それが可能です。それらのファイルの転送の暗号化の責任はYARN側にあるので、Sparkは何もすることがありません。

Spark ストリーミングのような長く実行するアプリケーションがHDFSに書き込むことができるように、--principal および --keytab パラメータをそれぞれ使ってプリンシパルおよびキータブをspark-submit に渡すことができます。渡されたキータブはHadoop分散キャッシュを使ってアプリケーションマスターを実行しているマシーンにコピーされるでしょう(YARNがSSLを使って設定されていて、HDFS暗号化が有効な場合には、セキュアです)。Kerberosログインはこのプリンシパルとキータブを使って定期的に新しくされます。HDFSに必要とされる委譲トークンがアプリケーションがHDFSに書き続けることができるように定期的に生成されるでしょう。

スタンドアローンモード

ユーザがマスターとワーカーのためにキーストアと設定オプションを提供する必要があります。They have to be set by attaching appropriate Java system properties in SPARK_MASTER_OPTS and in SPARK_WORKER_OPTS environment variables, or just in SPARK_DAEMON_JAVA_OPTS. このモードでは、executorがspawnしたワーカーから継承したSSL設定をexecutorが使うようにユーザがするかも知れません。これは spark.ssl.useNodeLocalConftrueに設定することで達成することができます。このパラメータが設定された場合は、クライアント側でユーザによって提供された瀬て地はexecutorによって使用されません。

キーストアの準備

キーストアはkeytool プログラムによって生成することができます。このツールのリファレンス文章は ここにあります。スタンドアローン配備モードのためのキーストアとtrustストアの設定の最も基本的なステップは以下の通りです: * 各ノードのためのキーペアを生成する * キーペアの公開キーを各ノードのファイルにエクスポートする * 全てのエクスポートされた公開キーを一つのtrustストアの中にインポートする * ノードにtrustストアを分配する

SASL暗号化の設定

現在のところ、認証(spark.authenticate) が有効な場合に、ブロック転送サービスのためのSASL暗号化がサポートされています。アプリケーションのためのSASL暗号化を有効にするには、アプリケーションの設定の中でspark.authenticate.enableSaslEncryptiontrue に設定します。

外部シャッフルサービスを使用する場合は、シャッフルサービスの設定の中でspark.network.sasl.serverAlwaysEncrypttrue に設定することで、復号化された接続を無効にすることができます。そのオプションが有効な場合、SASL暗号化を使用しないように設定されたアプリケーションはシャッフルサービスへの接続に失敗するでしょう。

ネットワークセキュリティのためのポートの設定

Sparkはネットワークを酷く利用し、堅いファイアウォール設定の使用に関して幾つかの環境は厳しい要求をします。以下はSparkが通信のために使用する主なポートと、それらのポートの設定方法です。

スタンドアローンモードのみ

FromToデフォルトのポート目的設定備考
ブラウザ スタンドアローンマスター 8080 Web UI spark.master.ui.port /
SPARK_MASTER_WEBUI_PORT
Jetty-based. スタンドアローンモードのみ。
ブラウザ スタンドアローン ワーカー 8081 Web UI spark.worker.ui.port /
SPARK_WORKER_WEBUI_PORT
Jetty-based. スタンドアローンモードのみ。
Driver /
スタンドアローン ワーカー
スタンドアローンマスター 7077 クラスタへのジョブのサブミット /
Join cluster
SPARK_MASTER_PORT Akka-based. ポートをランダムに選択するには"0"を設定します。スタンドアローンモードのみ。
スタンドアローンマスター スタンドアローン ワーカー (random) スケジュール executor SPARK_WORKER_PORT Akka-based. ポートをランダムに選択するには"0"を設定します。スタンドアローンモードのみ。

全てのクラスタマネージャー

FromToデフォルトのポート目的設定備考
ブラウザ アプリケーション 4040 Web UI spark.ui.port Jetty-based
ブラウザ ヒストリーサーバ 18080 Web UI spark.history.ui.port Jetty-based
Executor /
スタンドアローンマスター
Driver (random) アプリケーションへの接続 /
executor の状態の変更を通知
spark.driver.port Akka-based. ポートをランダムに選択するには"0"を設定します。
Driver Executor (random) スケジュールタスク spark.executor.port Akka-based. ポートをランダムに選択するには"0"を設定します。
Executor Driver (random) ファイルおよびjarのためのファイルサーバ spark.fileserver.port Jetty-based
Executor Driver (random) HTTP ブロードキャスト spark.broadcast.port Jetty-based. TorrentBroadcatによって使われるのではなく、代わりにブロックマネージャーを使ってデータを送信します。
Executor Driver (random) クラスファイルサーバ spark.replClassServer.port Jetty-based. Spark シェルでのみ使用されます。
Executor / Driver Executor / Driver (random) ブロックマネージャー ポート spark.blockManager.port ServerSocketChannelを使ったrawソケット

セキュリティ設定パラメータの詳細は 設定ページ を、セキュリティの実装詳細についてはorg.apache.spark.SecurityManagerを見てください。

TOP
inserted by FC2 system