Sparkのセキュリティ保護
Sparkセキュリティについての情報とSpark用にDataStax Enterpriseを構成する手順。
DataStax Enterpriseは、パスワードとLDAP認証、Kerberos、クライアントとノード間でのSparkのSSLセキュリティによる暗号化、およびSpark SSL暗号化をサポートしています。内部認証を使用するには、「内部認証を使用してのspark-submitジョブの実行」を参照してください。
パスワードとLDAP認証
- 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の認証情報の提供
- DseSparkConfHelperパッケージをインポートするための指示をアプリケーションに含めます。
import com.datastax.bdp.spark.DseSparkConfHelper._
- 認証プロパティを設定します。
System.setProperty(“cassandra.username”, xxx) System.setProperty(“cassandra.password”, yyy)
- 新しいSparkContextを作成して、SparkConf.forDSEを引数として渡します。.forDSEメソッドは、SparkConfオブジェクトをDataStax Enterprise向けに拡張します。
~/.dsercファイルが構成されていない場合は、DseSparkConfHelperメソッドを使用してDprop=value形式でプロパティを見つけて、システム・プロパティに自動的に渡します。setSystemPropertiesFromArgs(args)を呼び出します。ここで、argsはメインのメソッドに渡されるコマンドライン引数です。new SparkContext(args(0), "PortfolioDemo", new SparkConf().setJars(Array(myJar)).forDse)
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暗号化」を参照してください。
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コンポーネント間での認証は行っていません。
- Sparkコンポーネントは信頼されるユーザーにのみ公開する。
- ファイル・システムへのアクセスを信頼されるユーザーにのみ許可する。
SparkエグゼキューターはDataStax Enterpriseと同じユーザー・アカウントで実行されるため、未承認ユーザーによって悪意のあるSparkプログラムが実行され、ノード上のファイル・システムがアクセスされる可能性があります。システム・ファイルだけでなくCassandra SSTableにも脆弱性があります。ノード上のCassandraファイルにアクセスできないが、ファイル・システムへのアクセス権は与えられているユーザーがいる場合、これらのユーザーによって、RDDの断片が一時的に格納されるテンポラリー・ディレクトリーがアクセスされる可能性があります。また、十分な権限を与えられているユーザーによって、悪意のあるシステム・コマンドが実行される場合もあります。パスワード認証、LDAP、Kerberosのいずれを使用してCassandraをセキュリティで保護しても、ファイル・システムへの直接アクセスを制限しなければ意味がありません。