SSL Trust

7 \07UTC Novembro, 2007

Apenas uma nota muito rápida sobre um tema (SSL) que já me consumiu umas horas valentes.

Se uma aplicação escrita em Java necessitar de aceder a um URL usando HTTPS como transporte, o security manager tenta validar o certificado apresentado pelo servidor remoto.

Em ambiente de desenvolvimento, e mesmo em alguns ambientes de produção muito particulares, é usual que os certificados sejam auto-assinados, e por isso inválidos do ponto de vista do security manager. A solução usual, e conhecida de toda a gente, é adicionar o certificado auto-assinado à keystore do JRE que lança o processo Java. Isto resolve o problema.

No entanto, também acontece em ambiente de desenvolvimento (e em alguns ambientes de produção, já não tão “particulares” como no caso anterior) o certificado ser inválido por outro motivo: o CommonName não corresponder ao URL usado para aceder ao servidor. Neste caso, adicionar o certificado à keystore não adianta nada, o security manager vai continuar a impedir a ligação.

Uma forma de resolver o problema está descrita neste wikibook. Consiste essencialmente em acrescentar uma classe à aplicação em causa e chamar o seguinte método antes de tentar aceder ao URL:

SSLUtilities.trustAllHostnames()

Edit: A dica vem da Teresa Frias, obrigado!


Centralized Logs – ToDo List

25 \25UTC Abril, 2007

(continuação deste outro post)

Encriptação
Encriptar a transmissão dos logs para garantir confidencialidade dos dados transmitidos. Como a transmissão é feita sobre UDP, não basta usar um túnel de SSH. Uma possibilidade é usar a funcionalidade de Datagram TLS (DTLS) que o openssl também fornece, mas ainda não consegui pôr isso a funcionar em Windows…

Host-based Auth
Neste momento qualquer host que tenha acesso ao servidor onde corre o rsyslogd pode enviar logs para lá. Já com a escrita dos logs para ficheiros isto podia ser usado para ataques DoS, mas com o overhead adicional da escrita para base de dados, começa a ser preocupante. Se não houver uma alternativa mais application-level, posso usar o iptables para limitar os hosts que têm acesso à porta 514/udp.

Storage Engine Archive
Na versão 5.0 o MySQL suporta um novo tipo de storage engine, o Archive. Descrição abreviada retirada do site:

In addition to its compression and ease-of-use capabilities, the Archive storage engine is ideal for data auditing uses. Archive tables only support SELECT and INSERT operations, which should cause every data security officer or auditor to smile. Why? Because auditing restrictions require that, once created, audit data should not be manipulated in any way. Archive tables support just these types of restrictions since data cannot be updated or selectively removed – in other words, no tampering allowed.

Para este tipo de aplicação isto é ouro sobre azul… Só é preciso ter cuidado com a versão do servidor MySQL que se usa, até à 5.0.15 havia um bug na Zlib que impedia que os ORDER BY funcionassem devidamente.


Centralized Logs

23 \23UTC Abril, 2007

Objectivo
O objectivo era criar um repositório centralizado para os logs de todos os equipamentos existentes dentro do Datacenter.
A resposta óbvia para quem vem do Linux é syslog-ng + MySQL, mas é preciso ver que nem só de Linux é o mundo feito, neste caso, nem tudo o que está no Datacenter corre Linux :-(
A solução final tem vários componentes, que explico já a seguir. A forma como se interligam é fácil de ver na figura seguinte.

Logs Centralizados

Syslogd
O syslogd vem de base com tudo o que é distro Linux e também se encontra para Unix. A consola do VMware ESX, sendo baseada em RHEL 3, também usa obviamente syslog.
Basta acrescentar ao /etc/syslog.conf (ou substitui-lo por inteiro) a seguinte linha para se conseguir enviar todas as mensagens para um servidor syslog central:

*.* @endereço-ip

Winlogd
O winlogd é um executável que se adiciona aos serviços do Windows e que envia, com as prioridades adequadas, todos os eventos que apareçam no Event Viewer para um syslog server remoto. A parametrização do endereço IP é feita no sítio do costume:

HKLM\System\CurrentControlSet\Services\Winlogd

Snmptrapd + snmptt
É vulgar encontrar UPS’s, unidades de A/C, geradores e demais equipamentos periféricos que enviam alertas através de TRAPs SNMP. As mensagens reportadas por um TRAP não são muito informativas se não forem traduzidas a partir de uma MIB. Uma boa forma de o fazer automaticamente e ainda guardar as mensagens num syslog é usar o SNMPTT.

Logs Domino
Os servidores Lotus Domino guardam os seus logs numa base de dados… adivinhem… Domino! Felizmente, se estiverem a correr em Linux, também enviam os logs para a consola. Se se acrescentar o seguinte pipe à invocação do servidor, consegue-se ter a consola disponível numa tty e, simultaneamente, enviar todos os logs para o syslog local:

$domino_server | tee /dev/tty8 | logger -p local3.info

É pena perder-se o conceito de priority, mas como o Domino não o suporta internamente, não há nada a fazer…

Rsyslogd
Em vez de syslog-ng como concentrador de logs, resolvi usar o rsyslogd. Na altura foi uma escolha do momento, mas veio a revelar-se oportuna, essencialmente porque o Phplogcon é melhorzinho que o php-syslog-ng.
O ficheiro de configuração é compatível com o do syslog, o que torna a migração muito fácil e rápida. Tal como o syslog-ng, a configuração é feita através de templates, e há vários exemplos no site que tornam o setup inicial coisa de segundos…
Com uma linha (grandita, é verdade…) define-se o template para inserir registos na base de dados:

$template dbFormat,"insert into SystemEvents (Message, Facility,FromHost, Priority, DeviceReportedTime, ReceivedAt, InfoUnitID, SysLogTag) values ('%msg%', %syslogfacility%, '%HOSTNAME%',%syslogpriority%, '%timereported:::date-mysql%', '%timegenerated:::date-mysql%', %iut%, '%syslogtag%')",sql

E com outra linha, diz-se que se quer tudo lá dentro ;-)

*.* >localhost,rsyslog,rsyslog,rsyslog;dbFormat

Phplogcon
Finalmente, o Phplogcon é uma aplicação web para explorar os dados que o rsyslog guarda na base de dados. Não é o supra-sumo das ferramentas de exploração de dados, mas é bem rápida e suficientemente flexível para aquilo que normalmente se pretende destas ferramentas.
Para análises mais elaboradas, há uma ferramenta proprietária feita pela Adiscon (a empresa que faz o rsyslog e o phplogcon, já agora). Não cheguei a experimentá-la, mas parece valer a pena…

MySQL
Não há muito a dizer aqui. Usei um servidor MySQL completamente vanilla, com tabelas MyISAM, que para o caso servem perfeitamente.


NTFS Alternate Data Streams

11 \11UTC Março, 2007

Até ontem nunca tinha ouvido falar disto.

Trata-se de uma feature do NTFS que existe desde a 1ª versão e ainda hoje se mantém. Permite que um ficheiro possua data streams alternativas, ou seja, permite acrescentar conteúdo a um ficheiro sem que o conteúdo original seja afectado. Esta feature foi incluída no NTFS para compatibilidade com o HFS da Apple.

A Wikipedia diz o seguinte sobre esta feature:

Alternate data streams allows files to be associated with more than one data stream. For example, a file such as text.txt can have an ADS with the name of text.txt:secret.txt (of form filename:ads) that can only be accessed by knowing the ADS name or by specialized directory browsing programs. Alternate streams are not detectable in the original file’s size but are lost when the original file (i.e. text.txt) is deleted with a RemoveFile or RemoveFileTransacted call (or a call that uses those calls), or when the file is copied or moved to a partition that doesn’t support ADS (e.g. a FAT partition, a floppy disk, or a network share). While ADS is a useful feature, it can also easily eat up hard disk space if unknown either through being forgotten or not being detected.

O que acontece é que é possível criar um ADS de um ficheiro executável (calc.exe) e meter lá outro ficheiro executável (type notepad.exe>calc.exe:notepad.exe) de forma a que o tamanho e nome do ficheiro visto através do Explorer (ou dir) se mantenha inalterado. Mais, é possível depois invocar o executável que está no ADS (start calc.exe:notepad.exe), efectivamente lançando um executável cuja presença é mais ou menos indetectável… De facto, em Windows 2000, o nome do processo que aparece no Task Manager é o do ficheiro original!

Quantos vírus, worms, spywares e afins é que já terão usado isto?
Um kernel linux com suporte para HFS sofre do mesmo “problema”?


Seguir

Get every new post delivered to your Inbox.