Spark セキュリティ

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

Web UI

Spark UI はspark.ui.filtersによるjavax servlet filtersを使い、そしてspark.ui.https.enabled設定によるhttps/SSL を使うことでsecureに成り得ます。

Authentication

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

Sparkも実行中のSparkアプリケーションを修正するアクセスを誰が持つかを制御する修正ACLをサポートします。これにはアプリケーションあるいはタスクのkill のようなものが含まれます。これは設定spark.acls.enable, spark.modify.acls および spark.modify.acls.groupsによって制御されます。web UIを認証しようとする場合、web UI上でkillボタンを使うためには修正acla内でユーザをview acl にも追加する必要もあるかも知れないことに注意してください。YARN上では、修正aclが渡され、YARNインタフェースを使って修正アクセスを持つかを制御します。Sparkは、管理者のセットが誰が常に全てのアプリケーションにviewおよびmodifyパーミッションを持つかを、指定することができます。設定 spark.admin.acls および spark.admin.acls.groupsによって制御されます。これは、あなたが管理権限を持っているか、ユーザのアプリケーションデバッグを助けるスタッフをサポートするような共有クラスタの場合に便利です。

イベントのログ

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

暗号化

SparkはHTTPプロトコルのためのSSLをサポートします。ブロック転送サービスのためにSASL 暗号化がサポートされています。

シャッフルサービス、キャッシュされたデータ、および他のアプリケーションファイルのような、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 名前空間にあります。以下の表はデフォルトの設定を上書きするために使われるコンポーネント固有の設定の名前空間を説明します。

設定の名前空間 コンポーネント
spark.ssl.fs HTTP ファイルサーバとブロードキャストサーバ
spark.ssl.ui Spark アプリケーション Web UI
spark.ssl.standalone スタンドアローン マスター / ワーカー Web UI
spark.ssl.historyServer 履歴サーバ Web UI

The full breakdown of available SSL options can be found on the configuration page. 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に書き続けることができるように定期的に生成されるでしょう。

スタンドアローンモード

ユーザがマスターとワーカーのためにキーストアと設定オプションを提供する必要があります。それらはSPARK_MASTER_OPTSSPARK_WORKER_OPTS 環境変数内、あるいは単にSPARK_DAEMON_JAVA_OPTSの中で、適切なJavaシステムプロパティを加えることで設定されなければなりません。このモードでは、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 ポートをランダムに選択するには"0"を設定します。スタンドアローンモードのみ。
スタンドアローンマスター スタンドアローン ワーカー (random) スケジュール executor SPARK_WORKER_PORT ポートをランダムに選択するには"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 ポートをランダムに選択するには"0"を設定します。
Executor / Driver Executor / Driver (random) ブロックマネージャー ポート spark.blockManager.port ServerSocketChannelを使ったrawソケット

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

TOP
inserted by FC2 system