CFMX Sandbox Security para ambientes compartilhados
Aqui você encontra uma versão atualizada para o ColdFusion MX 7
Alex Hübner,
http://www.cfgigolo.com
alex@hubner.org.br
Macromedia
Certified Professional
Freqüentemente
me deparo com provedores de hospedagem que oferecem ColdFusion
Certamente
existem empresas e pessoas oferecendo um serviço de hospedagem ColdFusion competente e de qualidade, contudo muitos são
inaceitáveis. Costumo separar estes em três tipos: o primeiro, dos totalmente
irresponsáveis, que não conhecem nada do produto e o instalam/oferecem assim
mesmo. O segundo, dos que instalam e oferecem, mas “limpam as mãos” quando algo
sai errado dizendo: “ColdFusion é inseguro, instável, blá,
blá”, muito comum em locais cuja cultura tecnológica é preconceituosa e
estagnada. O terceiro e último é composto por aqueles que conhecem um pouco da
plataforma, entretanto não de forma satisfatória ou completa. Desconhecem, por
exemplo, a necessidade de se configurar sandboxes. Por isso, num suspiro de bom
senso e sanidade, optam simplesmente por desabilitar tags “sensíveis” tais como
CFFILE, CFDIRECTORY, entre outras, acreditando que assim estarão seguros. Ledo
engano. Leia este post, apenas como exemplo: http://www.cfgigolo.com/archives/2002/11/pintando_e_bord.html
Esta
situação é embaraçosa para todos os desenvolvedores ColdFusion
que se vêm marginalizados e à mercê de provedores de hospedagem ruins e de
segunda mão, alguns que sequer possuem uma licença oficial do software.
O
objetivo deste documento não é ensinar administração de ColdFusion
Server, muito menos segurança
Também
não é objetivo deste documento aprofundar-se em detalhes técnicos e explicações
pormenorizadas. Isso certamente daria um livro, não um documento de poucas páginas.
Encare-o como uma espécie de “receita de bolo”. Lembre-se que este documento
não necessariamente será adequado para o seu caso. Atente à descrição do
ambiente em que estou trabalhando (parágrafo acima) e adapte/use tais
informações de acordo com seu julgamento e experiência.
Estou
aberto a responder quaisquer dúvidas e especificidades deste documento na lista
de discussão ColdFusion Brasil – http://www.coldfusion.org.br. Críticas,
sugestões de melhoria e correções para este também são bem vindas. Cadastre-se
na lista e poste sua dúvida/crítica/sugestão/correção para que todos possam se
beneficiar das respostas (não apenas minhas).
Algo
que precisa estar claro desde já: uma hospedagem compartilhada nunca será 100%
segura. Por mais que se diga o contrário, o fato é que compartilhando recursos
do servidor, riscos inerentes também serão, por assim dizer,
“compartilhados”. Isso porquê em tal ambiente
não existe isolamento total entre usuários e aplicações. Qualquer aplicação
pode causar interferência numa outra aplicação e no servidor todo. Um exemplo
clássico são ataques do tipo DoS (não confundir com
DDoS), propositais ou muitas vezes não - alguns programadores “mãos pesada”
conseguem criar monstros devoradores de CPU e memória sem perceber - onde um
script ou uma aplicação inteira põe o processador em apuros, comprometendo a
performance de todo o servidor.
Caso
você não abra mão de ter um ambiente absolutamente seguro, deverá partir para
uma solução dedicada ou semi-dedicada. O ColdFusion MX oferece a possibilidade de se ter, numa mesma
máquina física, múltiplas instâncias de seu serviço rodando de forma isolada
entre elas. Trata-se de um isolamento tanto em termos de segurança quanto em
termos de performance já que nesta modalidade, cada
instância tem sua JVM própria. Para os que não conhecem Java, o termo JVM é uma
abreviação para Java Virtual Machine, onde o software cria uma abstração
própria que, grosso modo, funciona como se fosse uma máquina exclusiva e
separada.
Para
esta abordagem existe um custo maior tanto operacionalmente quanto em termos de
consumo de recursos da máquina. Trata-se, portanto de uma excelente opção para
planos “semidedicados” ou mesmo “dedicados”,
ainda não oferecidos no Brasil (veja que boa oportunidade!) e em raros casos no
exterior. Por isso não iremos tratá-la neste documento.
Muitos
não sabem, mas existem duas versões comerciais do ColdFusion
Server, uma mais barata, apelidada de Standard (também conhecida como
Professional na versão 6.0) e outra, mais cara, chamada Enterprise. As
diferenças? Para quem desenvolve nenhuma uma vez que o suporte a CFML é
idêntico. No entanto, para quem hospeda, as diferenças são muito importantes e
significativas. O ColdFusion Enterprise oferece
suporte a um número maior de plataformas e bancos de dados. Adicionalmente, a
versão Enterprise suporta a instalação de múltiplas instâncias (mencionadas no
item anterior), sandboxes (contextos) de segurança - indispensáveis numa
hospedagem compartilhada - e otimizações especiais
para o envio de grande quantidade de e-mails. Inclui ainda uma versão completa
do famoso servidor J2EE da Macromedia, o JRun e alguns
outros recursos interessantes. A tabela comparativa das diferenças entre as
versões pode ser encontrada aqui no seguinte link: http://www.macromedia.com/software/coldfusion/productinfo/product_editions/.
Se você está oferecendo ColdFusion MX em ambiente
compartilhado, sua escolha natural deve ser pela versão Enterprise.
Infelizmente muitos provedores, desconhecendo as diferenças (ou não), optam por
comprar a versão "mais barata", Standard.
Lembre-se de que o barato sai caro: uma hospedagem compartilhada na versão Standard é arriscada.
Normalmente
(repetindo: normalmente) desenvolvedores CFML são bem intencionados e não
perdem tempo com tentativas de invasão e ou outras atividades virtuais
ilícitas. Além disso, para explorar vulnerabilidades usando scripts CFML é
necessário que se tenha uma conta no servidor, o que faz do atacante quase
obrigatoriamente um cliente. Isso já é motivo (ou não) para deixar os mal
intencionados do lado de fora, uma vez que prejudicando o servidor ele estará
prejudicando sua própria conta e aplicação. Porém nunca confie na boa índole
(ou capacidade de fazer besteira) de todos eles.
Quem
tem gato em casa (especialmente em apartamento) sabe que eles precisam (e
gostam) de usar uma caixa de areia (ou de granulado especial) para fazer suas
necessidades e enterrá-las de forma higiênica. O conceito de sandboxes no ColdFusion pode ser explicado, de forma rudimentar, fazendo
uma analogia à caixa de areia dos gatos. Nesta caixa isolada seus usuários
poderão fazer o que bem desejarem, de forma “higiênica”, sem sujar ou estragar
o que estiver ao redor. O que isto significa na prática? Significa que tags
como CFFILE, CFDIRECTORY e outras que, potencialmente podem causar
estragos, podem ser habilitadas sem qualquer tipo de problema. O usuário de uma
sandbox devidamente configurada, não terá permissão para “sujar” a conta do
vizinho ou qualquer outro local. Ele não vai conseguir fazer upload de
arquivos, deletar, copiar ou criar diretór ios fora da sua
pasta raiz, da sua sandbox. Porém existem algumas pequenas exceções, mais à
frente vamos falar delas.
Torna-se
claro portanto que toda e qualquer hospedagem
compartilhada deve fazer uso de sandboxes. Por isso pergunto: sandbox security
já está habilitada no seu servidor? Não? Então vamos habilitar:
Uma
vez completado os passos acima, você deve entrar novamente no ColdFusion administrator e verificar se ele criou os dois
diretórios padrões e necessários. Veja a imagem abaixo:
Estes
dois diretórios (ColdFusion CFIDE e ColdFusion
WEB-INF) são necessários para que o ColdFusion funcione perfeitamente. Por isso
eles não podem ser removidos (note a ausência do ícone de deletar lado). É
importante saber que a entrada que aponta para o diretório CFIDE deve
corresponder ao diretório onde estão os arquivos da aplicação “ColdFusion Administrator”. Se a pasta CFIDE estiver em seu
local de instalação padrão o CFMX irá configurá-la corretamente. Entretanto,
caso você tenha trocado a localização da pasta CFIDE será necessário criar uma
nova entrada de sandbox security para esta. Isso pode ser feito de forma
simples: na primeira caixa de diálogo (“Add Security Sandbox”), selecione a
opção já existente para a pasta CFIDE em “New Sandbox, or pick one to copy
from”. Feito isso, especifique (você pode usar o botão “browse server”) a localização da pasta CFIDE que você está usando e
clique em “Add”.
Antes
de começarmos, é necessário fazer uma observação sobre uma prática muito comum
em provedores de hospedagem compartilhados: muitas vezes o nome de pastas base
de usuários são definidas usando uma sintaxe tal como:
“d:\Inetpub\dominio.com.br”. Esta sintaxe é desaconselhável, pois utiliza
caracteres especiais e há casos onde esta sintaxe será lida e interpretada pelo
enginee do CF como sendo “d:\Inetpub\dominio\com\br”.
O
processo de criação de sandboxes é bastante simples. Uma sandbox é criada
sempre sob uma pasta base ou raiz, normalmente a pasta base do usuário no
servidor. Para exemplificar imagine o seguinte cenário:
Diante
de tal cenário, o processo de criação consiste nesses dois passos simples:
a.
Em “Add Security Sandbox”, especifique o caminho completo para a pasta
base do usuário, no nosso caso “d:\sites\alexhubner”;
b.
Clique no botão “Add”.
Feito
isso, a nova sandbox, representada pelo caminho da pasta base, deverá aparecer
na listagem de sandboxes existentes:
O
próximo passo será configurar em detalhes esta sandbox. É aqui que este
documento começa a fazer sentido na medida em que as configurações que
proponho, daqui em diante, foram pensadas visando a melhor segurança do
servidor em ambientes compartilhados.
Ao
se clicar na sandbox em questão, temos uma interface com cinco “orelhas” a saber: “Data Sources”, “CF Tags”, “CF Functions”,
”Files/Dirs” e “Server/Ports”. Veja a imagem abaixo:
O
esquema de funcionamento desta interface é bastante simples. Para todas as
orelhas, na janela esquerda têm-se o que está habilitado e na janela direita o
que está desabilitado. Por padrão, cada nova sandbox terá permissão de acesso
em todas as data sources do servidor e qualquer tag e
função disponíveis. Também poderá acessar qualquer recurso externo (webservices
ou consultas/acessos com CFHTTP, CFFTP etc) uma vez que não existe nenhuma
restrição em “Server/Ports”. A exceção é a manipulação de arquivos que, por
padrão (obviamente), ficará limitada à pasta base do usuário (“d:\sites\alexhubner”). Um clique na orelha “File/Dirs”
evidencia isso:
Perceba
que existem duas entradas para a pasta do usuário. Em teoria bastaria uma
entrada no formato “d:\sites\alexhubner\-“. Note o traço,
que significa que a sandbox tem autorização para ler, escrever, executar e
deletar qualquer arquivo e pasta recursivamente a partir da pasta base. Porém,
por algum motivo que desconheço, o ColdFusion precisa
de ambas entradas para funcionar corretamente. Não me pergunte por que, eu
realmente não sei.
Eu
costumo adicionar uma terceira entrada (não obrigatória) apontando para a pasta
temporária do ColdFusion. Algumas aplicações em CFML
fazem uso desta através da função GetTempDirectory().
Esta pasta e função podem ser usadas para armazenamento temporário de arquivos
Vamos
dar início a um “tour” pelas orelhas e suas configurações recomendadas.
Na
orelha “Data Sources” nós indicaremos ao ColdFusion
quais data sources - conexões JDBC que permitem a interação com bancos de dados
– poderão ser usadas por uma determinada sandbox/conta. Na imensa maioria das
vezes habilitamos àquelas pertencentes apenas à conta de hospedagem em questão.
Imagine que o nosso cliente tem direito apenas a uma data source no seu plano,
a orelha ficaria desta maneira:
Você
já deve estar se perguntando: por que a data source “cfserver_clients” também
está habilitada? Não deveria ser apenas a do cliente? Bem, no meu servidor, por
questões de performance e segurança, costumo
armazenar variáveis de cliente (opção “Client Variables” no Administrator) num
banco de dados de alta capacidade (mySQL, SQL Server etc) em oposição às
alternativas existentes (cookie e registry - mais a frente vamos falar dos
problemas com o registro) – saiba mais neste link: http://mysecretbase.com/ColdFusion_Tutorial_01.cfm.
Desta maneira a sandbox em questão precisa ter acesso à data source responsável
pelo armazenamento de variáveis de cliente no servidor. No nosso caso ela se
chama “cfserver_clients”.
Não
dediquei um item especifico a esta questão, mas saiba
desde já que, para uma configuração segura (e mais rápida também), você deve
armazenar as variáveis de cliente num banco de dados separado, mesmo que isso
seja feito usando uma base de dados em Access, no improvável caso de não
existir um banco de dados mais potente para isso.
Uma
informação adicional que julgo importante: muitos oferecem o Access como opção
“barata” de banco de dados
Chegamos
à parte mais importante deste documento. Você deve se recordar que, mais acima
no item cinco, eu mencionei o fato de existirem algumas exceções à segurança
completa de uma sandbox. Justamente por conta destas exceções algumas tags e
funções CFML precisam estar desabilitadas. Recomendo a leitura da documentação
presente no seu CD ou download de CFMX sobre as tags e funções em questão antes
de prosseguir.
Na
orelha de “CF Tags”, recomendo desabilitar as seguintes tags:
A
orelha “CF Tags” ficaria assim então:
Na
orelha “CF Functions”, recomendo desabilitar as seguintes funções:
A
orelha “CF Functions” ficaria assim então:
No
item anterior sugerimos que as tags CFOBJECT, CFOBJECTCACHE e a função CreateObject fossem desabilitadas. Em versões anteriores ao
CFMX desabilita-las não seria um grande problema, porém estas ganharam um apelo
e utilidade bastante importante nas versões CFMX o que certamente trará dores
de cabeça a você e ao seu cliente. Tenha certeza de que ele vai reclamar o fato
destas não estarem habilitadas, porém existem questões de segurança e
privacidade importantes envolvendo-as, o que as tornam candidatas à
desabilitação. Para explicar o porquê desta recomendação, faz-se necessário uma
breve explicação sobre as funcionalidades das mesmas.
Com
a mudança de plataforma para Java, o ColdFusion
oferece aos seus usuários um leque enorme de possibilidades, a melhor delas:
total integração com o ambiente Java, incluindo execução de classes, EJBs,
custom tags JSP e muitas outras. Esta interação é feita usando-se as tags
CFOBJECT, CFOBJECTCACHE e a função CreateObject. Estas
tags também são usadas com componentes COM, CORBA e outros. Até aqui nenhum
problema, exceto que de forma similar ao que ocorre com a tag CFEXECUTE, é
possível acessar componentes COM e/ou objetos Java maliciosos, que não
necessariamente estarão isolados dentro da sandox. Também é possível acessar
objetos e classes (e métodos) do próprio ColdFusion de
uma forma muito íntima e insegura. Podemos citar algumas tais como recuperar
senhas de data sources, senha do próprio ColdFusion
Administrator (em versões CFMX 6.0 pré Updater 1), variáveis de sessão
existentes em outras aplicações do servidor etc, isso tudo mesmo estando dentro
de um contexto de sandbox. O problema não se limita à possibilidade de explorar
e ler informações sensíveis, mas também de alterar, criar e deletar
configurações diversas. Usando estas tags e a função CreateObject,
é possível, por exemplo, deletar data sources ou criar novas. Pode-se criar
mappings, schedules e uma infinidade de outros recursos inerentes ao ColdFusion Server (lembre-se de que o ColdFusion é um
aplicativo Java). Têm-se também acesso à API Java, existente sob o CFMX, o que
pode trazer problemas uma vez que se trata de um universo complexo e à parte.
Mas
e qual será o motivo da reclamação por parte do cliente se ele não estiver
querendo usar Java? Bem, estas tags podem ser usadas como uma forma elegante (e
cada vez mais presente entre os desenvolvedores) de se programar em CFML como
se fosse uma pseudo-linguagem orientada a objetos.
Também são usadas com freqüência em substituição à tag CFINVOKE para utilizar e
consumir Componentes ColdFusion (arquivos cfc), usados
com freqüência em novas aplicações.
Esta
é uma das minhas mais sérias críticas ao ColdFusion
Server. Não vou citar exemplos nem demonstrar como se pode obter ou alterar
tais informações. Lembre-se de que se o ColdFusion
Administrator, uma aplicação inteiramente feita em CFML (criptografada), é
capaz de alterar e controlar quase todas as configurações do servidor, você
provavelmente poderá fazer o mesmo com a sua aplicação CFML. Desabilitando tais
tags você impede que isso ocorra (lembre-se de que o ColdFusion
Administrator - CFIDE - possui sua sandbox, que foi adicionada automaticamente,
onde estas tags estão habilitadas).
Espero
que as próximas versões do ColdFusion tragam uma
solução para este problema. Até lá, desconheço qualquer maneira de se
contorna-lo sem sacrificar o uso das tags em questão. Já pesquisei bastante
sobre o assunto, contudo sem sucesso. Caso você conheça alguma maneira, por
favor, entre em contato.
A
única forma de se oferecer suporte a estas tags, com total segurança, é através
de múltiplas instâncias do ColdFusion (possibilidade
de configuração citada neste documento). Importante frisar algo: clientes podem
argumentar que sem estas tags habilitadas, não será possível fazer uso dos ColdFusion Components. Isso não é verdade, os mesmos poderão
ser utilizados através da tag CFINVOKE.
Todas
as demais tags, que não recomendamos desabilitar, não oferecem qualquer risco
ao servidor e aos sites/aplicações existentes.
Sou
um pouco radical quando questionado sobre o porquê de desabilitar as tags
CFOBJECT, CFOBJECTCACHE e a função CreateObject.
Respondo de forma bastante simples: “esta é uma hospedagem ColdFusion,
não numa hospedagem Java ou qualquer outra tecnologia. CFML não é uma linguagem
orientada a objetos, use CFINVOKE”. Sugiro fazer o mesmo para acalmar (ou
atiçar) os ânimos de seu cliente.
Bem,
até agora cobrimos 4 das 5 orelhas existentes na
interface de configuração de sandboxes security. Vimos como proteger data
sources, tags, funções e arquivos (nossa primeira explicação). Ficou faltando a quinta “orelha”, chamada “Server/Ports”. As configurações
desta não são tão importantes em termos de segurança uma vez que o consumo de
recursos externos não é muito diferente de se oferecer uma conta de FTP (o que
com certeza todos terão) num servidor. O cliente pode colocar o que bem quiser
dentro da sua conta. Entretanto, se você por acaso (questões de consumo de
banda ou qualquer outro) resolver aplicar restrições nesta “orelha”, tome
ciência de um bug de funcionalidade não documentado pela Macromedia que afeta a
tag CFFTP em contas “sandboxeadas” - http://www.cfgigolo.com/archives/000326.html.
Na
nossa configuração, a orelha “Server/Ports”, sem restrições, ficaria assim:
Assim
como qualquer tecnologia oferecida numa hospedagem compartilhada, existem
muitas considerações a se fazer e detalhes a observar. Não é diferente com o ColdFusion MX Server. Muitas delas, envolvem performance e outras tantas segurança. A imensa maioria não
foi coberta por este documento, que focou apenas a criação de sanboxes e a
necessidade de se usá-las.
Leia
a documentação do produto, participe de listas de discussão, leia os blogs
nacionais e internacionais (principalmente), fique ligado em dicas e
best-pratices encontrados em sites sobre o ColdFusion
(ex: o site do CFUG-SP – http://www.cfugsp.com.br
– oferece o download de apresentações sobre segurança em aplicações ColdFusion
e também sobre performance neste).
Abaixo
seguem algumas últimas recomendações importantes, à luz do que foi apresentado: