NiFi 가 쓸 Kerberos 설정 파일은 nifi.properties 에서 지정한다. 지정하지 않으면 JVM 기본값인 /etc/krb5.conf 를 찾는다.
nifi.kerberos.krb5.file=/opt/nifi/conf/krb5.conf
nifi.kerberos.service.principal=
nifi.kerberos.service.keytab.location=
nifi.kerberos.spnego.principal=
nifi.kerberos.spnego.keytab.location=
nifi.kerberos.spnego.authentication.expiration=12 hours
nifi.kerberos.krb5.file 은 JVM 전역 설정이라 NiFi 인스턴스당 하나만 지정할 수 있다. 값을 바꾸면 재기동해야 한다.
"Kerberos 를 여러 개 설정한다" 는 요구는 대개 서로 다른 realm 의 클러스터에 동시에 접속하는 상황이다. krb5.conf 파일을 여러 개 두는 것이 아니라, 하나의 krb5.conf 에 realm 을 여러 개 적는다.
[libdefaults]
default_realm = A.EXAMPLE.COM
dns_lookup_kdc = false
dns_lookup_realm = false
udp_preference_limit = 1
[realms]
A.EXAMPLE.COM = {
kdc = kdc-a.example.com
admin_server = kdc-a.example.com
}
B.EXAMPLE.COM = {
kdc = kdc-b.example.com
admin_server = kdc-b.example.com
}
[domain_realm]
.a.example.com = A.EXAMPLE.COM
.b.example.com = B.EXAMPLE.COM
서로 다른 realm 사이에 신뢰 관계가 없어도, 각 서비스에 붙는 주체가 다르면 동작한다. 프로세서마다 어떤 주체로 붙을지는 Kerberos User Service 컨트롤러 서비스로 나눈다. KerberosKeytabUserService 를 realm 마다 하나씩 만들고 각각 principal 과 keytab 을 지정한 뒤, 프로세서에서 해당 서비스를 고른다.
KerberosKeytabUserService_A : principal=svc_nifi@A.EXAMPLE.COM, keytab=/opt/nifi/conf/a.keytab
KerberosKeytabUserService_B : principal=svc_nifi@B.EXAMPLE.COM, keytab=/opt/nifi/conf/b.keytab
keytab 은 NiFi 실행 계정만 읽을 수 있게 chmod 600 으로 둔다. 컨테이너에서는 Secret 으로 마운트한다.
JVM 전역 java.security.auth.login.config 로 JAAS 파일을 지정하는 방식은 한 벌만 적용되므로 여러 주체를 함께 쓰기 어렵다. 컨트롤러 서비스 방식을 쓴다.
Registry 의 인증은 nifi-registry.properties 가 가리키는 두 파일로 구성된다. LDAP 를 걷어내려면 세 곳을 함께 정리해야 한다. 한 곳만 지우면 기동 시 참조 오류가 난다.
먼저 identity-providers.xml 에서 ldap-identity-provider 블록을 지우거나 주석 처리한다.
그다음 nifi-registry.properties 에서 그 공급자를 가리키는 값을 비운다.
nifi.registry.security.identity.provider=
nifi.registry.security.identity.providers.configuration.file=./conf/identity-providers.xml
마지막으로 authorizers.xml 에서 LDAP 사용자·그룹을 읽어 오는 ldap-user-group-provider 참조를 지운다. composite-configurable-user-group-provider 안에 남아 있으면 그것도 함께 정리한다. 파일 기반으로만 쓰려면 file-user-group-provider 와 file-access-policy-provider 만 남긴다.
인증 자체를 쓰지 않고 HTTP 로만 열 것이라면 HTTPS 관련 값도 비운다.
nifi.registry.web.http.host=
nifi.registry.web.http.port=18080
nifi.registry.web.https.host=
nifi.registry.web.https.port=
nifi.registry.security.keystore=
nifi.registry.security.truststore=
nifi.registry.security.needClientAuth=false
HTTP 로 열면 인증 없이 누구나 버킷을 읽고 쓴다. 사내망 안쪽이라도 접근 통제가 필요한 환경이면 쓰지 않는다.
users.xml 과 authorizations.xml 에는 이전 인증 방식으로 만들어진 사용자 항목이 남아 있다. 인증 방식을 바꿀 때 이 두 파일을 그대로 두면 예전 신원이 정책에 남아 혼란스러우므로, 필요 없으면 지우고 다시 만들게 한다. 지우면 기존 정책도 함께 사라지므로 백업한 뒤에 한다.