Newer
Older
notes / NiFi / AuthN_and_AuthZ_ClientCertification / README.md

クライアント証明書による認証・認可

概要

Apache NiFiでは、デフォルトでは認証認可が有効になってはなっておらず、また、開発の段階では特に必要というわけではありません。 しかし、運用では明確に監視だけ行うユーザ、データフローを変更できるユーザを分ける必要があります。 そうでないと、不正なアクセスによりデータフローを変更される恐れがあります。

Apache NiFiでは、LDAPやKerberosの他にデフォルトで、クライアント証明書を使用した認証、認可をデフォルトで提供しています。 まず最初に、NiFi Toolkitを使用して管理者の証明書を作成し、認証認可を有効にしたNiFiにログインできるように設定します。 認証認可を有効にすると、ユーザとポリシーが選べるようになるため、適切なユーザを作成し、ポリシーを設定します。

前提

設定

NiFi ToolKitを使用した管理者の証明書の生成

クライアント証明書を用いる場合、NiFiのUIとはHTTPSで接続します。そのため、サーバ側でキーストアやトラストストアの作成、クライアント側のクライアント証明書の作成が必要になります。 本来、複雑な手順が必要になりますが、プロジェクトが提供するNiFi ToolKitに含まれるtls-toolkit.sh[.bat]を使用すると、比較的容易に作成することができます。

ここでは、管理者のDNを "CN=nifiAdmin, OU=ApacheNiFi" (CN:ユーザ名 OU:組織) として、次のコマンドを実行して作成します。

    c:\nifi-toolkit> bin\tls-toolkit.bat standalone -n localhost -C "CN=nifiAdmin, OU=ApacheNiFi" -o target
  • -n localhost
    • アクセスする際のホスト名を指定します。localhostを指定した場合に、127.0.0.1でアクセスするとhttpsでは接続できずに警告が表示される可能性があります。
  • -C "CN=nifiAdmin, OU=ApacheNiFi"
    • 管理者のDN(識別名)を指定します。
  • -o target
    • 生成するデータの出力先ディレクトリです。

targetには、以下のファイルが生成されます。このtargetディレクトリは今後も使用するので、削除しないでください。

    $ ls -lR target
    target:
    total 13
    -rw-r--r-- 1 sogabe 197121 3445 5月  31 14:00  CN=nifiAdmin_OU=ApacheNiFi.p12   // クライアントのブラウザにインポートする証明書
    -rw-r--r-- 1 sogabe 197121    7 5月  31 14:00  CN=nifiAdmin_OU=ApacheNiFi.password // インポート時に必要なパスワード
    drwxr-xr-x 1 sogabe 197121    0 5月  31 14:00  localhost
    -rw-r--r-- 1 sogabe 197121 1220 5月  31 14:00  nifi-cert.pem
    -rw-r--r-- 1 sogabe 197121 1702 5月  31 14:00  nifi-key.key

    target/localhost:
    total 20
    -rw-r--r-- 1 sogabe 197121  3075 5月  31 14:00 keystore.jks     // サーバ側にインストールするキーストア
    -rw-r--r-- 1 sogabe 197121 11017 5月  31 14:00 nifi.properties  // nifi.propertiesの修正イメージ
    -rw-r--r-- 1 sogabe 197121   911 5月  31 14:00 truststore.jks   // サーバ側にインストールするトラストストア

nifi.propertiesの修正

HTTPS接続やクライアント認証のための修正を行います。target/localhostに生成されたnifi.propertiesを参考に修正します。 修正箇所は以下の差分を参考にしてください。

--- nifi/conf/nifi.properties    2018-03-17 00:32:32.000000000 +0900
+++ nifi-toolkit/target/localhost/nifi.properties    2018-05-31 15:09:11.919171900 +0900
     # Site to Site properties
    -nifi.remote.input.host=
    -nifi.remote.input.secure=false
    -nifi.remote.input.socket.port=
    +nifi.remote.input.host=localhost
    +nifi.remote.input.secure=true
    +nifi.remote.input.socket.port=10443
     nifi.remote.input.http.enabled=true
     nifi.remote.input.http.transaction.ttl=30 sec
     nifi.remote.contents.cache.expiration=30 secs
     @@ -132,10 +132,10 @@
     # web properties #
     nifi.web.war.directory=./lib
     nifi.web.http.host=
    -nifi.web.http.port=8080
    +nifi.web.http.port=
     nifi.web.http.network.interface.default=
    -nifi.web.https.host=
    -nifi.web.https.port=
    +nifi.web.https.host=localhost
    +nifi.web.https.port=9443
     nifi.web.https.network.interface.default=
     nifi.web.jetty.working.directory=./work/jetty
     nifi.web.jetty.threads=200
     @@ -150,13 +150,13 @@
     nifi.sensitive.props.provider=BC
     nifi.sensitive.props.additional.keys=
 
    -nifi.security.keystore=
    -nifi.security.keystoreType=
    -nifi.security.keystorePasswd=
    -nifi.security.keyPasswd=
    -nifi.security.truststore=
    -nifi.security.truststoreType=
    -nifi.security.truststorePasswd=
    +nifi.security.keystore=./conf/keystore.jks
    +nifi.security.keystoreType=jks
    +nifi.security.keystorePasswd=fUIvpgA0mDxQjghk5JJ+xkSF9+oSnuPKDXN+mrPK/x0
    +nifi.security.keyPasswd=fUIvpgA0mDxQjghk5JJ+xkSF9+oSnuPKDXN+mrPK/x0
    +nifi.security.truststore=./conf/truststore.jks
    +nifi.security.truststoreType=jks
    +nifi.security.truststorePasswd=LliIK2/plhIvG1Go0XAspeGd6He6RTYbHmBLUcq7waM
     nifi.security.needClientAuth=
     nifi.security.user.authorizer=managed-authorizer
     nifi.security.user.login.identity.provider=
     @@ -189,12 +189,12 @@

キーストア/トラストストアの設定

生成された${NIFI_TOOLKIT}/target/localhost/{keystore.jks, truststore.jks}を、${NIFI_HOME}/confにコピーします。

Authorizersと管理者の設定

${APACHE_HOME}/conf/authorizers.xmlの修正を行います。

  • 46行目の<userGroupProvider>の子要素<property name="Initial User Identity 1"/>に、管理者のDNを設定します。
    <userGroupProvider>
        <identifier>file-user-group-provider</identifier>
        <class>org.apache.nifi.authorization.FileUserGroupProvider</class>
        <property name="Users File">./conf/users.xml</property>
        <property name="Legacy Authorized Users File"></property>

        <property name="Initial User Identity 1">CN=nifiAdmin, OU=ApacheNiFi</property>    // ここを修正
    </userGroupProvider>
  • 242行目の<accessPolicyProvider>の子要素<property name="Initial Admin Identity"/>に、管理者のDNを設定します。
    <accessPolicyProvider>
        <identifier>file-access-policy-provider</identifier>
        <class>org.apache.nifi.authorization.FileAccessPolicyProvider</class>
        <property name="User Group Provider">file-user-group-provider</property>
        <property name="Authorizations File">./conf/authorizations.xml</property>
        <property name="Initial Admin Identity">CN=nifiAdmin, OU=ApacheNiFi</property>    // ここを修正
        <property name="Legacy Authorized Users File"></property>

        <property name="Node Identity 1"></property>
    </accessPolicyProvider>
  • 一番最後の<authorizer />のコメントは外して有効にします。また、子要素の<property name="Initial Admin Identity"/>に、管理者のDNを設定します。
            NOTE: Any identity mapping rules specified in nifi.properties will also be applied to the node identities,
            so the values should be the unmapped identities (i.e. full DN from a certificate).
    -->
    <authorizer> <!-- ここを有効にする -->
        <identifier>file-provider</identifier>
        <class>org.apache.nifi.authorization.FileAuthorizer</class>
        <property name="Authorizations File">./conf/authorizations.xml</property>
        <property name="Users File">./conf/users.xml</property>
        <property name="Initial Admin Identity">CN=nifiAdmin, OU=ApacheNiFi</property> <!-- ここに管理者のDNを設定 -->
        <property name="Legacy Authorized Users File"></property>

        <property name="Node Identity 1"></property>
    </authorizer>
</authorizers>

クライアント証明書のインポート

NiFiのUIにアクセスするマシンに、クライアント証明書をインポートします。 OSやブラウザによってこと異なりますが、ここではChromeの設定画面から設定します。Chromeの"設定" -> "詳細設定" -> "証明書の管理"をクリックすると、証明書画面がポップアップします。

"クライアント証明書インポート"

ここで、"インポート"ボタンを押下して、証明書のインポートウィザードを開始します。

"証明書のインポートウィザート1"

"参照"を押下して、インポートする証明書 "CN=nifiAdmin_OU=ApacheNiFi.p12" を選択します。

"証明書のインポートウィザート2"

"CN=nifiAdmin_OU=ApacheNiFi.password"を開いて、記載されているパスワードを、"パスワード"欄に記載し、"次へ"を押下します。

"証明書のインポートウィザート3"

"証明書の種類に基づいて、自動的に証明書ストアを選択する(U)"を選択し、"次へ"を押下するとインポート完了です。

"証明書のインポートウィザート4"

証明書画面に、インポートした証明書が表示されていることを確認してください。

HTTPSでの接続確認

設定が完了したので、接続確認を行います。使用するブラウザを再起動してから、https://localhost:9443/nifiに接続します。

"接続確認1"

証明書の選択画面が表示されますので、インストールしたnifiAdminを選択します。

"接続確認2"

画面右上に、選択した証明書に対応するユーザ名が表示されます。また、グローバルメニューにUsersPoliciesが表示され、ユーザ/グループとポリシーの設定が可能になります。

管理者のデフォルトポリシー

ここで作成した管理者nifiAdminには、デフォルトで以下のようなポリシーが設定されています。最低限のことのみできるようになっていますので、別途適切なポリシーを持つユーザを作成する必要があります。

"nifiAdminのデフォルトポリシー"

ユーザの追加

新たにユーザを追加する場合は、証明書の追加、nifi.propertiesの更新、キーストア/トラストストアの更新、NiFi UIでのユーザの追加が必要になります。 CN=develop, OU=ApacheNiFiを追加する例を示します。

証明書の追加

次のコマンドを実行して、証明書を新規に生成し、キーストアなどを上書き更新します。

    c:\nifi-toolkit> bin\tls-toolkit.bat standalone -n localhost -C "CN=develop, OU=ApacheNiFi" -o target -O

nifi.propertiesの更新

再生成された${NIFI_TOOLKIT}/target/localhost/nifi.propertiesをもとに、以下の設定を修正します。

    nifi.security.keystorePasswd
    nifi.security.keyPasswd
    nifi.security.truststorePasswd

キーストア/トラストストアの更新

${NIFI_TOOLKIT}/target/localhost/{keystore.jks, truststore.jks}${NIFI_HOME}/conf/に上書きします。

NiFi UIでのユーザ追加

グローバルメニューからUsersを選択してユーザを追加します。