Spark セキュリティ
現在のところSparkは共有秘密鍵での認証をサポートします。認証はspark.authenticate
設定パラメータを使って設定することができます。このパラメータはSpark通信プロトコルが共有鍵を使って認証するかどうかを制御します。この認証は両側が同じ共有鍵を持つか、通信ができるかを確認するための基本ハンドシェイクです。もし秘密鍵が一致しない場合は、通信できないでしょう。共有鍵は以下のようにして生成されます:
- YARN上のSparkのデプロイのために、
spark.authenticate
をtrue
に設定すると自動的に共有鍵を生成および分配するでしょう。各アプリケーションはユニークな共有鍵を使うでしょう。 - Sparkの他の種類のデプロイについては、Sparkパラメータ
spark.authenticate.secret
が各ノード上で設定されなければなりません。この鍵は全てのマスター/ワーカーおよびアプリケーションによって使われるでしょう。
Web UI
Spark UI はspark.ui.filters
によるjavax servlet filtersを使い、そしてSSL 設定によるhttps/SSL を使うことでsecureに成り得ます。
認証
他のユーザが見ることが許されないデータがある場合に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 暗号化はブロック転送サービスとRPCエンドポイントのためにサポートされます。望ましい場合はシャッフルファイルも暗号化することができます。
SSL 設定
SSLのための設定は階層構造によって整理されます。プロトコル固有の設定で上書きされていない限り、ユーザは全てのサポートされる通信プロトコルのために使われるデフォルトのSSL設定を設定することができます。このようにユーザは全てのプロトコルのための共通の設定を、それぞれ個々に設定する機能を無効にすること無しに、簡単に提供することができます。共通のSSL設定はSpark設定内の spark.ssl
名前空間にあります。以下の表はデフォルトの設定を上書きするために使われるコンポーネント固有の設定の名前空間を説明します。
設定の名前空間 | コンポーネント |
---|---|
spark.ssl.fs |
ファイル ダウンロード クライアント (HTTPSが有効なサーバからjarおよびファイルをダウンロードするために使われます)。 |
spark.ssl.ui |
Spark アプリケーション Web UI |
spark.ssl.standalone |
スタンドアローン マスター / ワーカー Web UI |
spark.ssl.historyServer |
履歴サーバ Web UI |
利用可能なSSLオプションの完全なブレークダウンは 設定ページで見つけることができます。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_OPTS
と SPARK_WORKER_OPTS
環境変数内、あるいは単にSPARK_DAEMON_JAVA_OPTS
の中で、適切なJavaシステムプロパティを加えることで設定されなければなりません。このモードでは、executorがspawnしたワーカーから継承したSSL設定をexecutorが使うようにユーザがするかも知れません。これは spark.ssl.useNodeLocalConf
を true
に設定することで達成することができます。このパラメータが設定された場合は、クライアント側でユーザによって提供された設定はexecutorによって使用されません。
キーストアの準備
キーストアはkeytool
プログラムによって生成することができます。このツールのリファレンス文章は ここにあります。スタンドアローン配備モードのためのキーストアとtrustストアを設定する最も基本的なステップは以下の通りです:
- 各ノードのためにキーのペアを生成します
- キーのペアの公開鍵を各ノード上のファイルにエクスポートします
- 全てのエクスポートされた公開鍵を1つの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 |
ポートをランダムに選択するには"0"を設定します。スタンドアローンモードのみ。 |
スタンドアローンマスター | スタンドアローン ワーカー | (random) | スケジュール executor | SPARK_WORKER_PORT |
ポートをランダムに選択するには"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 |
ポートをランダムに選択するには"0"を設定します。 |
Executor / Driver | Executor / Driver | (random) | ブロックマネージャー ポート | spark.blockManager.port |
ServerSocketChannelを使ったrawソケット |
セキュリティ設定パラメータの詳細は 設定ページ を、セキュリティの実装詳細についてはorg.apache.spark.SecurityManager
を見てください。