This documentation is for an unreleased version of Apache Flink. We recommend you use the latest stable version.
Kerberos認証のセットアップと設定 #
このドキュメントは簡単にFlinkのセキュリティが様々な配備の仕組み (スタンドアローン、ネイティブKubernetes、YARN)、ファイルシステム、コネクタ および 状態バックエンド の点においてどのように動作するかを説明します。
目的 #
Flink Kerberos セキュリティ基盤の主要な目的:
- コネクタ(例えば Kafka)を使ってクラスタ内のジョブへの安全なデータアクセスを有効にする
- ZooKeeperへの認証をする(SASLを使うように設定された場合)
- Hadoopコンポーネント(例えば、HDFS, HBase) への認証をする
プロダクションの配備のシナリオでは、ストリーミング ジョブは長期間(日/週/月)実行し、ジョブの生存期間を通して安全なデータソースへ認証できるものと理解されます。 認証情報キャッシュやHadoop移譲トークンと異なり、Kerberos keytabはその期間内に期限切れになりません。
現在の実装では、以下を使ったFlinkクラスタ(JobManager / TaskManager / jobs)の実行がサポートされます:
- Keytabファイル(推奨)
- 認証情報キャッシュ(例えば、
kinit
によって作成された認証情報キャッシュファイル) - Hadoop移譲トークン(ユーザが提供したトークンは更新されず、Flinkによって上書きされる可能性があります)
全てのジョブは指定されたクラスタのために設定された証明書を共有することに注意してください。 あるジョブのために異なるキータブを使うには、単純に別個のFlinkクラスタを異なる設定で起動します。 多数のFlinkクラスタがKubernetesやYARN環境で並列して実行される場合があります。
Flinkのセキュリティはどのように動作するか #
概念的には、Flinkのプログラムは任意の認証メソッド(Kerberos, SSL/TLS, username/password など)を必要とする一次あるいは第三者のコネクタ(Kafka、HDFS、Cassandra、Flume、Kinesisなど)を使うかもしれません。 全てのコネクタのセキュリティ要求を満たすことに努力を継続中ですが、Flink Kerberos 認証のみのためのfirst-classのサポートを提供します。 以下のサービスとコネクタはKerberos認証のためにサポートされます:
- Kafka (0.9+)
- HDFS
- HBase
- ZooKeeper
各サービスあるいはコネクタのためにKerberosを自由に使うことができるようにすることが可能なことに注意してください。 例えば、ユーザはZooKeeperにKerberosを使わずにHadoopセキュリティを有効にすることも、その逆も可能です。共有される要素はKerberos証明書の設定です。これは各コンポーネントによって明示的に使われます。
内部的な構造は起動時にインストールされた(org.apache.flink.runtime.security.modules.SecurityModule
を実装する)セキュリティモジュールに基づきます。以下の章は各セキュリティモジュールを説明します。
Hadoop セキュリティ モジュール #
このモジュールはHadoop UserGroupInformation
(UGI)クラスを使って、プロセス全体のlogin userコンテキストを確立します。
そしてログインユーザはHDFS, HBase および YARN を含むHadoopとの全てのやり取りのために使われます。
Hadoopセキュリティが(core-site.xml
内で)有効な場合、ログインユーザは設定されている全てのKerberous認証情報を持ちます。
そうでなければ、ログインユーザはクラスタを起動したOSアカウントの身元のみを運びます。
具体的にいうと、ログインプロセスには次の優先順位があります:
hadoop.security.authentication
がkerberos
が設定されている場合security.kerberos.login.keytab
とsecurity.kerberos.login.principal
が設定され、keytabログインが行われた場合security.kerberos.login.use-ticket-cache
が設定され、認証情報キャッシュログインが行われた場合
- そのほか全ての場合、OSアカウントのユーザIDが使われます
JAAS セキュリティ モジュール #
このモジュールは、クラスタに動的なJAAS設定を提供し、設定されたKerberos資格情報をZooKeeper、Kafka、JAASに依存するその他のコンポーネントで利用できるようにします。
ユーザは Java SEドキュメントで説明される仕組みを使って静的なJAAS設定ファイルも提供することもできることに注意してください。静的なエントリはこのモジュールによって提供される全ての動的なエントリを上書きします。 dynamic entries provided by this module.
ZooKeeperセキュリティモジュール #
このモジュールは、プロせず全体のZookeeperセキュリティ関係の設定、つまり、ZooKeeperサービス名(デフォルト: zookeeper
)とJAASログインコンテキスト名(デフォルト: Client
)を設定しまsう。
デプロイメントモード #
以下は各配備モードに特有の情報です。
スタンドアローンモード #
スタンドアローン/クラスタ モードでのセキュアなFlinkクラスタを実行するためのステップ:
- セキュリティ関係の設定オプションをFlink設定ファイル(全てのクラスタノード上)に追加します(ここを参照してください)。
- 全てのクラスタノード上の
security.kerberos.login.keytab
でシミされるパスにkeytabファイルが存在することを確認してください。 - 通常のFlinkクラスタのデプロイ
ネイティブKerbernetesとYARNモード #
ネイティブKubernetesとYARNモードで安全なFlinkクラスタを実行する手順:
- クライアント上のFlink設定ファイルにセキュリティ関係の設定オプションを追加します(を参照してください。)
- keytabファイルがクライアントノード上の
security.kerberos.login.keytab
で示されるパスに存在することを確認します。 - 通常のFlinkクラスタのデプロイ
YARNとネイティブKubernetesモードでは、keytabはクライアントからFlinkコンテナに自動的にコピーされます。
Kerberos認証を有効にするには、Kerberos設定ファイルも必要です。このファイルは、クラスタ環境から取得することも、Flinkによってアップロードすることもできます。後者の場合、Kerberos設定アイルのパスを示すようにsecurity.kerberos.krb5-conf.path
を設定する必要があります。Flinkはこのファイルをコンテナ/ポッドにコピーします。
詳細については、 YARNセキュリティドキュメントを参照してください。
ユーザ資格情報キャッシュ(kinit
)の使用
#
使い方に進む前に、知っておくべき重要な点がいくつかあります:
- 資格情報キャッシュは様々な形式で表現されますが、最も一般的な形式は
FILE
です。詳細については、Kerberos ccache typesを読んでください。 Kerberos認証が実行される全てのクラスタノードで資格情報キャッシュが利用可能であることを確認してください。 - 資格情報キャッシュは主に
kinit
コマンドの実行よって生成されます。 - keytabとの重要な違いは、keytabは期限切れにならない方法で生成できるのに対し、資格情報キャッシュには有効期限があることです。has an expiry date. 資格情報キャッシュを最新お状態に保つことは、完全にユーザーの責任です。
資格情報キャッシュのみを使ってkeytab無しで安全なFlinkクラスタをデプロイすることもできます。
kinit
を使って安全なFlinkクラスタを自国する手順:
- クライアント上のFlink設定ファイルにセキュリティ関係の設定オプションを追加します(を参照してください。)
kinit
コマンドを使ってログインします。- オプション: Kerberos認証が実行される全てのクラスタノードで資格キャッシュを使えるようにします。
- 通常のFlinkクラスタのデプロイ
更なる詳細 #
TGT Renewal #
Kerberosを使用する各コンポーネントは独自にKerberosチケット認可チケット(TGT)を更新する責任があります。 keytabが提供されると各コンポーネントでTGTが自動的に更新されますが、資格情報キャッシュを使う場合はユーザの責任になります。
移譲トークンの使用 #
Flink 1.17では、実験t系機能として移譲トークンのサポートが追加されました。This is quite a heavyweight これは非常に重要なトピックであるため、一般的な移譲トークン情報ページがあります。
Hadoopベースのサービスと通信する場合、FlinkはFlinkは移譲トークンを取得できるため、ローカル以外のサービスはプロセスは認証できます。以下のサポートがあります:
- HDFHDFSとその他のHadoopファイルシステム
- HBase
Hadoopファイルシステム((HDFSやWebHDFS)使う場合、Flinkは次のディレクトリに関するトークンを取得できます。following directories:
- Hadoopデフォルトファイルシステム
- 設定されているファイルシステム:
security.kerberos.access.hadoopFileSystems
- YARNステージンディレクトリ
HBaseがアプリケーションのクラスパスにあり、HBase設定でKerberos認証が有効になっている場合(hbase.security.authentication=kerberos
)、Hbaseトークンが取得されます。
Flinkは、Javaサービスの仕組みをつかった独自の移譲トークンプロバイダも提供します(java.util.ServiceLoader
を参照してください)。org.apache.flink.runtime.security.token.DelegationTokenProvider
の実装は、jarのMETA-INF/services
ディレクトリの対応するファイルに名前をリストすることで、Flinkで利用できるようになります。