Sparkのセキュリティ保護

Sparkセキュリティについての情報とSpark用にDataStax Enterpriseを構成する手順。

DataStax Enterpriseは、パスワードとLDAP認証、Kerberos、クライアントとノード間でのSparkのSSLセキュリティによる暗号化、およびSpark SSL暗号化をサポートしています。内部認証を使用するには、「内部認証を使用してのspark-submitジョブの実行」を参照してください。

パスワードとLDAP認証 

Cassandra認証情報をSparkに渡すには、Sparkコンテキストを作成する前に、Spark構成オブジェクトのSparkConfに以下のプロパティを設定します。
  • cassandra.username
  • cassandra.password

DataStax Enterprise Sparkアプリケーションおよびツールの場合は、Sparkの認証コマンドを使用して、ログイン認証情報を提供できます。

以下の例は、Cassandra認証情報をアプリケーションに含める方法を示しています。

例:ハードウェアに組み込まれたCassandra認証情報を渡す場合

import com.datastax.bdp.spark.DseSparkConfHelper._
import org.apache.spark.{SparkConf, SparkContext}

object AuthenticationExample extends App {

def createSparkContext() = {
val myJar = getClass.getProtectionDomain.getCodeSource.getLocation.getPath
  
val conf = new SparkConf()
.setAppName("Authentication example")
.setMaster("local")
.setJars(Array(myJar))
.set("cassandra.username", "cassandra")
.set("cassandra.password", "cassandra")
.forDse

new SparkContext(conf)
 }

val sc = createSparkContext()

 // ...

sc.stop()
}

例:Cassandra認証情報の入力を求める場合

import com.datastax.bdp.spark.DseSparkConfHelper._
import org.apache.spark.{SparkConf, SparkContext}

object AuthenticationExample extends App {

def createSparkContext() = {
   /*
-Dcassandra.username=... and -Dcassandra.password=... arguments will be copied to system properties and removed
from the args list
    */

val args = setSystemPropertiesFromArgs(this.args)
val myJar = getClass.getProtectionDomain.getCodeSource.getLocation.getPath

val conf = new SparkConf()
.setAppName("Authentication example")
.setMaster("local")
.setJars(Array(myJar))
.forDse

new SparkContext(conf)
 }

val sc = createSparkContext()

 // ...

sc.stop()
}

さまざまなパラメーターを構成することで、独自のSparkアプリケーションをDataStax Enterpriseとともに実行できるようになります。

SparkアプリケーションでのCassandraの認証情報の提供 

この手順では、パスワード認証を使用するSparkアプリケーションの作成方法について説明します。SparkContextは認証されません。この認証では、Sparkコンポーネントが相互に認証されるのではなく、SparkがCassandraに接続されます。
  1. DseSparkConfHelperパッケージをインポートするための指示をアプリケーションに含めます。
    import com.datastax.bdp.spark.DseSparkConfHelper._
  2. 認証プロパティを設定します。
    System.setProperty(“cassandra.username”, xxx)
    System.setProperty(“cassandra.password”, yyy) 
  3. 新しいSparkContextを作成して、SparkConf.forDSEを引数として渡します。.forDSEメソッドは、SparkConfオブジェクトをDataStax Enterprise向けに拡張します。
    new SparkContext(args(0), "PortfolioDemo", 
    new SparkConf().setJars(Array(myJar)).forDse)
    ~/.dsercファイルが構成されていない場合は、DseSparkConfHelperメソッドを使用してDprop=value形式でプロパティを見つけて、システム・プロパティに自動的に渡します。setSystemPropertiesFromArgs(args)を呼び出します。ここで、argsはメインのメソッドに渡されるコマンドライン引数です。

Kerberos認証 

Kerberos認証は、Sparkコンポーネント間の相互認証に適用されるのではなく、SparkのCassandraへの接続に適用されます。Spark Web UIはセキュリティで保護されておらず、Kerberosの使用時に、デリゲーション・トークンを含むSpark構成を表示する可能性があります。

SparkからCassandraへのSSL暗号化 

クライアントとノード間の暗号化は、クライアントとコーディネーター・ノードの間にセキュアなチャネルを確立することで、SparkエグゼキューターとCassandra間の接続における転送中のデータを保護します。SSLは完全に分散化されており、共有認証サービスの設定を必要としません。サーバー証明書の作成クライアントとノード間のSSLの有効化が必要です。

Spark SSL暗号化 

Sparkノード間のコミュニケーションおよびクライアントとクラスター間のコミュニケーションも、サーバー側はdse.yaml、クライアント側はSpark構成ファイルspark-defaults.confで暗号化を有効にすることにより、SSLを使用して暗号化できます。詳細については、「SSLを用いたSpark SSL暗号化」を参照してください。

dse.yamlファイルの場所は、インストールのタイプによって異なります。
Installer-Services /etc/dse/dse.yaml
パッケージ・インストール /etc/dse/dse.yaml
Installer-No Services install_location/resources/dse/conf/dse.yaml
tarボール・インストール install_location/resources/dse/conf/dse.yaml

セキュリティ上の制限事項 

DataStax Enterpriseには、Sparkデータのセキュリティ保護に関連した以下の制限事項があります。

  • SSLを使用したクライアントとノード間の暗号化は、SparkエグゼキューターとCassandra間の接続でしかサポートされません。
  • Sparkエグゼキューターは、DataStax Enterpriseと同じユーザー・アカウントで実行されます。
  • Spark Web UIはセキュリティで保護されておらず、Kerberosを使用する場合は、ユーザー名、パスワード、デリゲーション・トークンを含むSpark構成を表示する可能性があります。
  • DataStax Enterpriseは、SparkとCassandra間の接続用の内部認証はサポートしていますが、Sparkコンポーネント間での認証は行っていません。
DataStaxでは、以下のセキュリティ・プラクティスに従うことを推奨しています。
  • Sparkコンポーネントは信頼されるユーザーにのみ公開する。
  • ファイル・システムへのアクセスを信頼されるユーザーにのみ許可する。

SparkエグゼキューターはDataStax Enterpriseと同じユーザー・アカウントで実行されるため、未承認ユーザーによって悪意のあるSparkプログラムが実行され、ノード上のファイル・システムがアクセスされる可能性があります。システム・ファイルだけでなくCassandra SSTableにも脆弱性があります。ノード上のCassandraファイルにアクセスできないが、ファイル・システムへのアクセス権は与えられているユーザーがいる場合、これらのユーザーによって、RDDの断片が一時的に格納されるテンポラリー・ディレクトリーがアクセスされる可能性があります。また、十分な権限を与えられているユーザーによって、悪意のあるシステム・コマンドが実行される場合もあります。パスワード認証、LDAP、Kerberosのいずれを使用してCassandraをセキュリティで保護しても、ファイル・システムへの直接アクセスを制限しなければ意味がありません。