Spark セキュリティ
現在のところSparkは共有秘密鍵での認証をサポートします。認証はspark.authenticate
設定パラメータを使って設定することができます。このパラメータはSpark通信プロトコルが共有鍵を使って認証するかどうかを制御します。この認証は両側が同じ共有鍵を持つか、通信ができるかを確認するための基本ハンドシェイクです。もし秘密鍵が一致しない場合は、通信できないでしょう。共有鍵は以下のようにして生成されます:
- YARN上のSparkのデプロイのために、
spark.authenticate
をtrue
に設定すると自動的に共有鍵を生成および分配するでしょう。各アプリケーションはユニークな共有鍵を使うでしょう。 - Sparkの他の種類のデプロイについては、Sparkパラメータ
spark.authenticate.secret
が各ノード上で設定されなけえrばなりません。この鍵は全てのマスター/ワーカーおよびアプリケーションによって使われるでしょう。
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.useNodeLocalConf
を true
に設定することで達成することができます。このパラメータが設定された場合は、クライアント側でユーザによって提供された瀬て地はexecutorによって使用されません。
キーストアの準備
キーストアはkeytool
プログラムによって生成することができます。このツールのリファレンス文章は ここにあります。スタンドアローン配備モードのためのキーストアとtrustストアの設定の最も基本的なステップは以下の通りです: * 各ノードのためのキーペアを生成する * キーペアの公開キーを各ノードのファイルにエクスポートする * 全てのエクスポートされた公開キーを一つのtrustストアの中にインポートする * ノードにtrustストアを分配する
SASL暗号化の設定
現在のところ、認証(spark.authenticate
) が有効な場合に、ブロック転送サービスのためのSASL暗号化がサポートされています。アプリケーションのためのSASL暗号化を有効にするには、アプリケーションの設定の中でspark.authenticate.enableSaslEncryption
を true
に設定します。
外部シャッフルサービスを使用する場合は、シャッフルサービスの設定の中でspark.network.sasl.serverAlwaysEncrypt
を true
に設定することで、復号化された接続を無効にすることができます。そのオプションが有効な場合、SASL暗号化を使用しないように設定されたアプリケーションはシャッフルサービスへの接続に失敗するでしょう。
ネットワークセキュリティのためのポートの設定
Sparkはネットワークを酷く利用し、堅いファイアウォール設定の使用に関して幾つかの環境は厳しい要求をします。以下はSparkが通信のために使用する主なポートと、それらのポートの設定方法です。
スタンドアローンモードのみ
From | To | デフォルトのポート | 目的 | 設定 | 備考 |
---|---|---|---|---|---|
ブラウザ | スタンドアローンマスター | 8080 | Web UI | spark.master.ui.port / |
Jetty-based. スタンドアローンモードのみ。 |
ブラウザ | スタンドアローン ワーカー | 8081 | Web UI | spark.worker.ui.port / |
Jetty-based. スタンドアローンモードのみ。 |
Driver / スタンドアローン ワーカー |
スタンドアローンマスター | 7077 | クラスタへのジョブのサブミット / Join cluster |
SPARK_MASTER_PORT |
Akka-based. ポートをランダムに選択するには"0"を設定します。スタンドアローンモードのみ。 |
スタンドアローンマスター | スタンドアローン ワーカー | (random) | スケジュール executor | SPARK_WORKER_PORT |
Akka-based. ポートをランダムに選択するには"0"を設定します。スタンドアローンモードのみ。 |
全てのクラスタマネージャー
From | To | デフォルトのポート | 目的 | 設定 | 備考 |
---|---|---|---|---|---|
ブラウザ | アプリケーション | 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
を見てください。