Apache NiFi Standalone com TLS/SSL e OpenLDAP

Anselmo Borges
Rescue Point
Published in
9 min readOct 20, 2020
Primeiro passo antes de ir pro Cluster NiFi

Meu post anterior ensinou como criar um Server OpenLDAP e um phpLDAPadmin em 3 min. Esse post tem o intuito de subir um Apache NiFi Standalone (uma única instância) em alguns comandos.

O que é o Apache NIFI:

Segundo o Wikipedia:
O Apache NiFi é um projeto de software da Apache Software Foundation projetado para automatizar o fluxo de dados entre sistemas de software . Ele é baseado no software “ NiagaraFiles “, desenvolvido anteriormente pela NSA , que também é a fonte de uma parte de seu nome atual — NiFi . Foi de código aberto como parte do programa de transferência de tecnologia da NSA em 2014.

O design do software é baseado no modelo de programação baseado em fluxo e oferece recursos que incluem a capacidade de operar em clusters , segurança usando criptografia TLS , extensibilidade (os usuários podem escrever seu próprio software para ampliar suas habilidades) e recursos de usabilidade aprimorados , como um portal que pode ser usado para visualizar e modificar o comportamento visualmente.

Atualmente, o desenvolvimento de software e o suporte comercial são oferecidos pela Hortonworks (agora incorporada à Cloudera ), que adquiriu o criador da NiFi, Onyara Inc.

Porquê Standalone e não em Cluster?

A ideia aqui é mostrar pra vocês como funciona a autenticação no Apache NiFi e quais seus pré requisitos, nosso desafio final é monta-lo como um Cluster com gerenciamento via Zookeeper, a partir do fonte na raça, então acredite, a dificuldade que você não terá nesse post, terá no próximo.

A instalação simples do fonte sem autenticação ou SSL é tão ridícula que nem vale a pena fazer um post sobre isso. Basta baixar o fonte, descompactar e executar o binário (desde que você tenha o Java, que a instalação consegue ser mais complexa do que a da aplicação, rs), ou você pode fazer via Docker que leva basicamente o mesmo tempo.

O que quero mostrar com esse post é que para termos a autenticação do NiFi precisamos:

  • Ter o SSL/TLS configurado: pois ele não aceita autenticação sem o serviço subir am HTTPS, por isso em instalações do fonte preciso de instalar o Nifi ToolKit, pacote com algumas ferramentas de administração e configuração do Nifi que veremos mais a fundo no nosso próximo post.
  • Ter alguma base de autenticação: pelo que li na documentação, ele aceita somente 3 tipos de autenticação, LDAP (que pode ser um AD, OpenLDAP, IPA, etc), Kerberos desde que você possua um Kerberos server e um outro lá que não lembro qual agora, rs. Sei que ele não aceita o PAM por exemplo com usuários locais do S.O. de um ambiente Unix o que seria fantástico.
  • Ter o NifiToolkit: Com esse cara criamos os certificados e senhas criptografadas como ensino mais a frente.

Eliminando nossas pendencias, vale lembra que devemos ter o Java instalado no host pois vamos rodar o TLSToolkit com ele e quanto ao OpenLDAP vamos usar o exemplo do post anterior criando ele como base de autenticação, segue o link abaixo:

OBS: A criação desse openLDAP é um pré-requisito para o funcionamento do LAB proposto nesse post. Se não fez, faça!

Entendeu bebê?

Criando os certificados via Toolkit

O NiFi tem um tls-toolkit que cria os certificados, você pode baixar o nifi-toolkit no próprio site do Apache NiFi que vem com esse e outros utilitários legais. Para baixar digite o comando abaixo:

wget https://downloads.apache.org/nifi/1.11.3/nifi-toolkit-1.11.3-bin.tar.gz

Fiz o Download no home do meu usuário (/home/anselmoborges), descompactar lá mesmo com o comando abaixo:

tar zfxv nifi-toolkit-1.11.3-bin.tar.gz

Assim que descompactado vamos criar o diretório onde geraremos os certificados. Criei uma pasta certs no home do meu usuário, mude pro seu:

mkdir -p /home/anselmoborges/certs
cd ~/certs

Estando dentro do diretório basta rodar o comando abaixo, substituindo o meu home pelo seu e colocando o nome do domínio a sua escolha, no meu caso usei o “rescuepoint.com.br”, tenha o Java instalado pois a geração desses certificados é feita por ele:

/home/anselmoborges/nifi-toolkit-1.11.3/bin/tls-toolkit.sh standalone -n 'rescuepoint.com.br'

Ele cria uma pasta com o nome do seu domínio e 2 arquivos do lado de fora, o nifi-cert.pem e o nifi-key.key, mova os 2 arquivos pra dentro da pasta apenas para organiza-los:

mv nifi-* rescuepoint.com.br/

Após movimentado, essa é a estrutura de arquivos que vai ficar:

cd rescuepoint.com.br/
ls -lh
total 32K
-rw-------. 1 anselmoborges anselmoborges 3,1K mar 4 23:13 keystore.jks
-rw-------. 1 anselmoborges anselmoborges 1,2K mar 4 23:13 nifi-cert.pem
-rw-------. 1 anselmoborges anselmoborges 1,7K mar 4 23:13 nifi-key.key
-rw-------. 1 anselmoborges anselmoborges 13K mar 4 23:13 nifi.properties
-rw-------. 1 anselmoborges anselmoborges 911 mar 4 23:13 truststore.jks

Um desses arquivos é o nifi.properties, vamos dar um cat nesse cara para copiar alguns dados que serão usados na criação do NiFi via Docker mais adiante.

Desse cat eu separo o seguinte:

  • nifi.security.keystorePasswd=nCfK/Vp/fRN+xPtPu5J+vQ5fon++cesiIwyHH4ymEGg
  • nifi.security.truststorePasswd=kOYJDzT6G9fw14zv4kZyM1vEJJ63oYfkSssmZsK8pHk

Criando um grupo e um user no OpenLDAP

Antes de iniciarmos a criação, vamos criar um usuário de administração inicial do NiFi, vou criar primeiramente um grupo pessoas apenas pra gerar um GID (se for no usuário direto não dá) e posteriormente criar o usuário:

Logamos no phpLDAPadmin no endereço que no meu caso é https://localhost:6443

Tela de login do phpLDAPadmin

Nessa tela logamos com aquele usuário administrativo que criamos no post anterior, no meu caso é o “cn=admin,dc=rescuepoint,dc=com,dc=br” e a senha “bjj2020”.

Feito isso vamos criar uma nova entrada conforme abaixo:

Clique no domínio a esquerda e abrindo clique em “create new entry here”

Abrindo as opções de criação, clique em “Generic: Posix Group” e crie o grupo pessoas, o GID criado será 500. Lembre de dar “commit” no final.

Agora o mesmo procedimento clicando em “Generic: User Account” onde vou criar o usuário aborges. Criei Anselmo Borges e ele vai ficar assim no começo mas vamos mudar. Tirei a criptografia de senha também então a criação fica mais ou menos assim.

Criação do usuário no OpenLDAP

Clicando em “create object”, vai pra tela de efetivação onde você confirma a criação do cara. Porem a CN vai ficar assim (cn=Anselmo Borges,dc=rescuepoint,dc=com,dc=br) e eu tenho TOC e quero deixar aborges, sendo assim após criado eu faço o seguinte:

Tela de edição do usuário após criado.

Se você olhar ali no cn com Anselmo Borges tem um rename pequenininho, onde clico nele mudo para “aborges”, feito isso a minha CN fica cn=aborges,dc=rescuepoint,dc=com,dc=br.

Mãos a Obra

Vamos criar o nosso Server Nifi tendo em mãos os parâmetros abaixo:

  • name: nome do container
  • -v: é o volume que vamos montar, compartilhando o diretório de dentro do container com um diretório na nossa maquina, sendo “/home/anselmoborges/certs/rescuepoint.com.br” na minha máquina e “/opt/certs” dentro do container.
  • -p: A porta onde vai subir e ela será mapeada para localhost (maquina real) na porta 8443 que já é uma porta HTTPS, lembrando que numa instalação sem TLS/SSL o NiFi sobe na porta 8080.
  • -link: Usamos esse link para linkar o container do openlap com a string openldap do ldap://openldap do comando abaixo. É uma maneira do Docker se resolver nos seus IPs.
  • AUTH: O tipo de autenticação que será usado, no nosso caso, LDAP.
  • KEYSTORE_PATH: Caminho do Keystore, como vai estar mapeado para o diretório o keystore.jks já vai estar lá.
  • KEYSTORE_TYPE: JKS e tem que ser JKS, no de Cluster vamos ver isso.
  • KEYSTORE_PASSWORD: A senha do Keystore que a gente separou lá em cima do nifi.properties
  • TRUSTSTORE_PATH: Caminho do TrustStore, esse é o arquivo onde ficam armazenados todas as Keystores caso exista mais de um host no cluster e a validação para confiança no acesso é validada nele. Como já mapeamos do diretório também já vai estar lá.
  • TRUSTSTORE_PASSWORD: Senha do truststore que a gente pegou lá em cima do nifi.properties
  • TRUSTSTORE_TYPE: Também tem que ser JKS já que o NiFi Tools cria ele nesse formato.
  • INITIAL_ADMIN_IDENTITY: Esse cara é importante, é um CN (commom name que é criado no OpenLDAP) que será usado como login no Nifi com privilégios administrativos, se você já tem usuários no OpenLDAP o que será esse caso, você pode setar o caminho completo dele, nesse caso criei um usuário pra mim que ficou assim (cn=aborges,dc=rescuepoint,dc=com,dc=br)
  • LDAP_AUTHENTICATION_STRATEGY: Caso eu não tenho um OpenLDAP com TLS/SSL configurado o que é o nosso caso usamos o método SIMPLE, nos outros casos usamos o LDAP_TLS ou o LDAPS.
  • LDAP_MANAGER_DN: Quem é o dono do dominio OpenLDAP ou um user com privilégios equivalentes, no nosso caso usaremos o mesmo que usamos para logar no phpLDAPadmin do post anterior (cn=admin,dc=rescuepoint,dc=com,dc=br)
  • LDAP_MANAGER_PASSWORD: Vamos colocar a senha desse user que é a mesma que configuramos nos post anterior “bjj2020”.
  • LDAP_USER_SEARCH_BASE: Aqui seria o nome do domínio no formato LDAP (dc=rescuepoint,dc=com,dc=br)
  • LDAP_USER_SEARCH_FILTER: Aqui é a linha na Arvore LDAP onde ele vai buscar a autenticação, no caso CN, buscaria aborges, admin e outros que sejam CN dentro na arvore, por isso o valor é cn={0}.
  • LDAP_IDENTITY_STRATEGY: Aqui é o método de autenticação, se vai usar o caminho completo ou somente o nome, acredito que DN do USE_DN é de domain name, a outra opção é USE_USERNAME.
  • LDAP_URL: Esse é o pulo do Gato, vamos apontar o LDAP para o outro container de nome “openldap” por isso usaremos ele como host.

Com tudo editado temos o comando abaixo montado.

sudo docker run --name nifi \
-v /home/anselmoborges/certs/rescuepoint.com.br:/opt/certs \
-p 8443:8443 \
--link openldap:openldap -e AUTH=ldap \
-e KEYSTORE_PATH=/opt/certs/keystore.jks \
-e KEYSTORE_TYPE=JKS \
-e KEYSTORE_PASSWORD=nCfK/Vp/fRN+xPtPu5J+vQ5fon++cesiIwyHH4ymEGg \
-e TRUSTSTORE_PATH=/opt/certs/truststore.jks \
-e TRUSTSTORE_PASSWORD=kOYJDzT6G9fw14zv4kZyM1vEJJ63oYfkSssmZsK8pHk \
-e TRUSTSTORE_TYPE=JKS \
-e INITIAL_ADMIN_IDENTITY='cn=aborges,dc=rescuepoint,dc=com,dc=br' \
-e LDAP_AUTHENTICATION_STRATEGY='SIMPLE' \
-e LDAP_MANAGER_DN='cn=admin,dc=rescuepoint,dc=com,dc=br' \
-e LDAP_MANAGER_PASSWORD='bjj2020' \
-e LDAP_USER_SEARCH_BASE='dc=rescuepoint,dc=com,dc=br' \
-e LDAP_USER_SEARCH_FILTER='cn={0}' \
-e LDAP_IDENTITY_STRATEGY='USE_DN' \
-e LDAP_URL='ldap://openldap:389' \
-d \
apache/nifi:latest

Vamos executá-lo e ver no que dá! Ele demora um pouquinho pra liberar via navegador e…

Um Nifi, com TLS/SSL e louco pra alguém logar.

Fiz meu login com o usuário aborges e a senha rescue que configurei e?

Logueiiiii… epa… perae!

O nível de frescura do NiFi é uma coisa irritante:

Não perca a linha, já perdi por você antes de montar esse artigo

O usuário Inicial admin (no meu caso o aborges) vem sem privilégio nenhum, você tem privilégios pra se dar privilégios ou pode criar um novo grupo, aplicar as policies para esse grupo e posteriormente colocar os usuários que quiser nesse grupo, ai sim vai liberar algo.

Mas vamos lá né, o procedimento é o seguinte:

  • Criei no OpenLDAP um usuário chamado teste (não basta criar só ai no Nifi porque se não tem no LDAP ele não reconhece, existe uma opção que quando crio ai crio também no LDAP mas ainda não sei fazer isso via Docker)
  • Crie no Nifi um grupo o qual eu chamei de grupo01 (no users conforme print abaixo)
  • Entre em policies e atribua policies para o grupo01, vão ter algumas que tem um create pequeno lá em cima, cria e aplica.
Menu de criação de usuários e aplicação de policies
  • Depois que você aplicou tudo pro grupo01, crie um user teste na nomenclatura completa (cn=teste,dc=rescuepoint,dc=com,dc=br) e coloque ele no grupo1.
  • Deslogue do seu user admin e logue com esse user teste.
  • Pra sua semi-tristeza ainda não liberou a criação das paradas mas calma, clique aqui do lado no Flow no Policies (na chavinha)
Clica na chavinha

Agora que clicou na chavinha miserável (você está quase lá), habilite as policies de utilização do Nifi como usuário (aquelas outras era de administrador). E parecido com o cenário abaixo:

Pronto carai…. kkkk

Coloque seu cara em todas as policies que julgar necessário, você vai ver que ao voltar para tela inicial já liberou as paradas.

Conclusão

Se você achou complicado esse que é em Docker é que você não viu em Cluster que é instalado do fonte na raça! Você não imagina a minha alegria quando isso funcionou depois de apanhar 3 semanas.

Mas como disse em outro post, alguém tem que sofrer pro amiguinho ser feliz!

Espero que gostem porque deu um trabalhão!

Abraço,

Anselmo Borges

--

--

Anselmo Borges
Rescue Point

Bigdata Engineer, Cloud Architect, Nerd, Alcoholic, Brazilian Jiujitsu Black belt and hide and seek World champion.