terça-feira, 1 de novembro de 2011

Splunk com autenticação Apache + SSL

Seguindo a linha do último artigo, outra peça importante em qualquer ambiente é um centralizador de logs, principalmente para auditoria e rastreamento de usuários.

Uma excelente opção é o Splunk. Na sua versão free, é possível indexar 500MB de logs diários, o que é bastante pra qualquer ambiente. Apesar desta limitação, essa quantidade de dados é suficiente para atender grande parte dos ambientes que conheço. 

Como medida de comparação, já vi ambientes com mais de 1000 servidores utilizando essa versão gratuita do Splunk para registrar apenas a autenticação de usuários nos servidores (AUTHPRIV do syslog), não atingindo nem 10% da sua capacidade diária.

Porém, na minha visão, a grande limitação desta versão gratuita é a falta de autenticação no acesso à sua console de gerenciamento e busca. Como não existe autenticação, qualquer usuário que conheça a URL de acesso poderá manipular os logs já coletados, inclusive apagar completamente o que já foi indexado.

A solução que encontrei para contornar essa situação foi incluir uma autenticação do Apache com SSL na frente do Splunk através de um proxy, junto com algumas configurações adicionais no próprio Splunk.


O ambiente que utilizei com estas configurações foi um Linux CentOS 5.6, Splunk 4.2 (instalado diretamente com o RPM disponibilizado na página oficial) e o Apache 2.2 com mod_proxy + mod_ssl. Por padrão, o mod_proxy já vem habilitado no CentOS, mas o mod_ssl precisa ser instalado e configurado.

Recomendo ler o artigo Geração de chave e certificado para Apache SSL caso não saiba como ativá-lo.

Partindo para o Splunk, é necessário modificar o arquivo web.conf no diretório /opt/splunk/etc/system/local e adicionar as seguintes linhas:

[settings]
enableSplunkWebSSL = 1
root_endpoint = /splunk
updateCheckerBaseURL = 0
tools.proxy.on = True
Crie o arquivo, caso ele não exista. Explicando cada uma das configurações:

  • enableSplunkWebSSL = 1 : Ativa o protocolo HTTPS para a console do Splunk;
  • root_endpoint = /splunk : Garante que todas as URLs relacionadas ao Splunk no host de instalação iniciem com o prefixo /splunk, o que facilita bastante se for um host compartilhado e o filtro do proxy;
  • updateCheckerBaseURL = 0 : Desativa a tela inicial de verificação de atualizações para o Splunk. Por algum motivo, com esta tela habilitada, alguns bugs acontecem na autenticação do Apache, que contornei desabilitando essa tela inicial;
  • tools.proxy.on = True : Indica que o Splunk funcionará através de um Proxy. No nosso caso, o próprio Apache fará o papel de proxy.

Após estas configurações, reinicie o Splunk através da console ou via linha de comando e acesse-o, verificando que tudo está funcionando corretamente. Veja que, com essas mudanças, a console usará agora HTTPS e sempre a URI terá /splunk no seu início.

É necessário agora configurar o Apache do servidor para realizar o proxy e a autenticação. Crie um novo arquivo de configuração no diretório /etc/httpd/conf.d (exemplo: splunk.conf) com as seguintes configurações:

Listen 8066

<VirtualHost *:8066>
 ServerAdmin dms@dominiointerno.com
 ServerAlias splunk.dominiointerno.com
 ProxyPass /splunk https://127.0.0.1:8000/splunk
 ProxyPassReverse /splunk https://127.0.0.1:8000/splunk
        
 ErrorLog /var/log/httpd/splunk-error.log
 CustomLog /var/log/httpd/splunk-access.log combined
  
 SSLEngine On
 SSLCertificateFile /etc/pki/tls/certs/server.crt
 SSLCertificateKeyFile /etc/pki/tls/private/server.key
 SSLProxyEngine on
</VirtualHost>


Essa configuração criará um redirecionamento na porta 8066 do servidor para a console do Splunk, inicializada por padrão na porta 8000. Repare também que no arquivo acima existe uma configuração relacionada ao SSL, que faz parte da minha solução.

Caso prefira executar em HTTP apenas (não recomendo), remova as quatro linhas a partir de SSLEngine e edite as linhas ProxyPass e ProxyPassReverse, substituindo https por http. Lembre-se também de editar o arquivo de configuração do splunk, colocando a variável enableSplunkWebSSL para o valor 0.

É importante que você bloqueie o acesso externo à porta 8000, para forçar o uso do Splunk através da porta configurada no proxy (8066 no caso), que garantirá a autenticação. Esse bloqueio pode ser feito através do iptables:

[dms@s1 ~]# iptables -A INPUT -p tcp -s 127.0.0.1/32 --dport 8000 -j ACCEPT
[dms@s1 ~]# iptables -A INPUT -p tcp --dport 8000 -j DROP
[dms@s1 ~]# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  127.0.0.1            0.0.0.0/0           tcp dpt:8000
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0           tcp dpt:8000

Com o proxy em HTTPS agora configurado, e a porta 8000 bloqueada externamente, vamos à autenticação.

A forma mais básica será através de um arquivo de usuários e senhas, adicionando as linhas a seguir no arquivo /etc/httpd/conf.d/splunk.conf, após as configurações de VirtualHost:
<Proxy https://127.0.0.1:8000/splunk/*>
 AuthName "Autenticacao - Splunk Manager"
 AuthType Basic
 AuthUserFile /etc/httpd/htaccess.splunk
 require valid-user

</Proxy>
Agora crie o arquivo de senhas usando o comando htpasswd (disponível no pacote httpd-tools):
[dms@s1 ~]# htpasswd -m -c /etc/httpd/htaccess.splunk dms
New password:
Re-type new password:
Adding password for user dms

O parametro -m determinado o uso do MD5 para geração do hash da senha. O parametro -c indica que um novo arquivo será criado, e deve ser usado apenas no primeiro login. Para os próximos logins, utilize a mesma linha de comando sem o parâmetro -c. Verifique as permissões do arquivo criado, já que o usuário que executa o apache precisa de permissão de leitura.

Reiniciando o Apache, você já terá a autenticação necessária à console do Splunk. Basta agora manter o arquivo de senhas atualizado com os usuários necessários. 

Para a solução ficar mais elegante, você também pode usar uma base de usuários centralizada (Active Directory, por exemplo) ao invés de um arquivo de senhas. Para isso, precisamos de uma nova configuração no Apache. É possível usar o OpenLDAP também, caso prefira.

O primeiro passo é criar um Security Group dentro do AD e adicionar todos os usuários com autorização de acesso à console do Splunk.

Agora, dentro do mesmo splunk.conf do Apache, adicione ao final as seguintes configurações (remova a configuração acima relacionada à autenticação via arquivo de senhas, se você testou):

<Proxy https://127.0.0.1:8000/splunk/*>
 AuthBasicProvider ldap
 AuthzLDAPAuthoritative on
 AuthName "Autenticacao - Splunk Manager - AD"
 AuthType Basic
 AuthLDAPBindDN         "usuario"
 AuthLDAPBindPassword   "senha"
 AuthLDAPURL            "ldap://ad.meudominio.com.br:389/OU=Empresa,DC=exemplo,DC=com,DC=br?samAccountName?sub?(objectClass=*)"
 require ldap-group CN=SplunkUsers,OU=Empresa,DC=exemplo,DC=com,DC=br
 Allow from all
</Proxy>

É importante que você personalize os seguintes campos da configuração acima de acordo com o seu ambiente:

  • AuthLDAPBindDN: Usuário criado no AD para consulta da árvore LDAP. Esse usuário não precisa ter privilégios além de participar do grupo Domain Users. Pode ser configurado como usuario@dominio OU dominio\usuario;
  • AuthLDAPBindPassword: Senha do usuário acima;
  • AuthLDAPURL: URL de busca para validar os usuários que utilizarão a autenticação. Nesta URL, altere o hostname de ad.meudominio.com.br para o AD do seu ambiente, e modifique o DN de acordo com o nome do seu domínio. Caso o seu dominio seja exemplo.com.br, e sua árvore possuir o nome Empresa, o DN será OU=Empresa,DC=exemplo,DC=com,DC=br;
  • require ldap-group: Aqui é necessário indicar o DN do grupo criado no AD que conterá os usuários que terão permissão de acesso ao Splunk. No exemplo acima, foi criado um Security Group chamado SplunkUsers na raiz da OU Empresa.

Com essa configuração, você terá a interface do Splunk em SSL, com autenticação através de um grupo do Active Directory. Qualquer dúvida, comente abaixo.

2 comentários:

  1. Daniel, ótimo artigo.

    Você teria materiais de Splunk voltado para infra de redes?

    ResponderExcluir
  2. Oi Tiago, nao tenho materiais específicos, mas o que você precisa?

    A monitoração de infra de redes pode ser toda feita via syslog em conjunto com instalação de aplicativos Splunk. Acredito que há muita flexibilidade para o que você precisa.

    Abs!

    ResponderExcluir