segurança em rails
DESCRIPTION
Nesta palestra mostrarei as mais comuns falhas de segurança cometidas por desenvolvedores em projetos Ruby on Rails, e como as evitar. por de Marcello Castellani no 1° RS on RailsTRANSCRIPT
![Page 2: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/2.jpg)
O palestrante (eu)
• Desenvolvedor de software desde 1989;• Membro do NetBeans Translation Team;• Um dos fundadores do grupo de usuários
de Ruby de SP;• Idealizador do evento Ruby + Rails no
mundo real.
![Page 3: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/3.jpg)
O que é segurança?
• Confiabilidade• Integridade• Confidencialidade
![Page 4: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/4.jpg)
Confiabilidade
• Em geral, confiabilidade (definição sistêmica) é a capacidade de uma pessoa ou sistema de realizar e manter seu funcionamento em circunstâncias de rotina, bem como em circunstâncias hostis e inesperadas.
• http://pt.wikipedia.org/wiki/Confiabilidade
![Page 5: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/5.jpg)
Integridade
• Em segurança da informação integridade significa ter a disponibilidade de informações confiáveis, corretas e dispostas em formato compatível com o de utilização, ou seja, informações íntegras.
• http://pt.wikipedia.org/wiki/Integridade
![Page 6: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/6.jpg)
Confidencialidade
• Confidencialidade é a propriedade de que a informação não estará disponível ou divulgada a indivíduos, entidades ou processos sem autorização.
• http://pt.wikipedia.org/wiki/Confidencialidade
![Page 7: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/7.jpg)
O que é segurança?
• Confiabilidade• Integridade• Confidencialidade
![Page 8: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/8.jpg)
![Page 9: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/9.jpg)
![Page 10: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/10.jpg)
![Page 11: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/11.jpg)
![Page 12: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/12.jpg)
![Page 13: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/13.jpg)
Sessões
![Page 14: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/14.jpg)
HTTP É UM PROTOCOLO QUE NÃO MANTÉM ESTADO
Sessões fazem com o estado seja mantido.
![Page 15: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/15.jpg)
O Que é uma sessão?
• Uma sessão consiste em um hash de valores e um id de sessão, geralmente uma string com 32 caracteres, para identificar o hash.
• Cada cookie enviado para o browser do usuário inclui o id de sessão.
• No caminho inverso, o browser enviará o id de sessão para o servidor em cada request.
![Page 16: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/16.jpg)
Pra que serve uma sessão?
• A maioria das aplicações precisam ter controle sobre alguns aspectos relacionados ao estado de um usuário particular como um carrinho de compras ou o id do usuário atualmente autenticado.
• Sem a ideia de sessões, o usuário teria que se identificar a cada nova requisição.
![Page 17: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/17.jpg)
Seqüestro/Roubo de sessão
![Page 18: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/18.jpg)
Ethereal/Wireshark
![Page 19: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/19.jpg)
Rails e Sessões
• O Rails fornece vários métodos para salvar os dados de sessões, incluindo o ActiveRecordStore e o CookieStore.
• O ActiveRecordStore salva os dados da sessão numa tabela no banco de dados.
• O CookieStore salva os dados da sessão como um cookie no cliente.
![Page 20: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/20.jpg)
Por que não usar cookies?• Outro exemplo clássico de problema com
cookies é o “replay de cookies”.
![Page 21: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/21.jpg)
Replay de cookies
![Page 22: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/22.jpg)
Replay de cookies
![Page 23: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/23.jpg)
Como evitar?
• A melhor solução contra ataques de replay é não guardar este tipo de informação no cookie de sessão, mas sim no banco de dados.
• Neste caso guarde os créditos no banco de dados o id do usuário atual na sessão (pode ser até num cookie, apesar de eu nunca achar uma boa idéia usar cookies).
![Page 24: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/24.jpg)
Evitar cookies na minha aplicação
• Para não usar cookies em sua aplicação vá em config/initializers/session_store.rb e use:
ActionController::Base.session_store = :active_record_store
![Page 25: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/25.jpg)
Fixação de sessão
![Page 26: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/26.jpg)
Como evitar?
• Uma única linha de código salva sua vida nesses casos:
reset_session
![Page 27: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/27.jpg)
user_sessions_controller.rb
def create
reset_session
@client_session = ClientSession.new(params[:client_session])
if @client_session.save
flash[:notice] = "Login successful!"
redirect_back_or_default '/'
else
flash[:notice] = "Invalid login name or password."
render :action => :new
end
end
![Page 28: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/28.jpg)
Outras maneiras de proteger-se
• salvar propriedades específicas do usuário na sessão,
• verificá-las a cada novo request, • negar acesso se a informação não bater.
![Page 29: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/29.jpg)
Não use o IP para salvar dados
• Ao salvar o endereço IP, você deve ter em mente que existem provedores de serviços de Internet ou grandes organizações que colocam seus usuários atrás de proxies. Estes proxies podem mudar durante a duração de uma sessão, logo estes usuários não serão capazes de utilizar sua aplicação, ou apenas poderão usá-la de forma limitada.
![Page 30: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/30.jpg)
Resumo sobre sessões
• Use authlogic ou algo parecido para gerenciar logins em seu software.
• Use algoritmos de criptografia complexos, nada de hashes. O BCrypt é a melhor opção.
• Reinicie sempre a sessão antes de a criar.• Evite usar cookies sempre que possível.• Evite usar o IP para manter dados em
sessões.
![Page 31: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/31.jpg)
Boas práticas em sessões
• Não guarde dados críticos na sessão.• Não guarde objetos muito grandes
em uma sessão.• Evite usar cookies para armazenar
dados da sessão.
![Page 32: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/32.jpg)
BCrypt
http://gom-jabbar.org/articles/2008/12/03/why-you-should-use-bcrypt-to-store-your-passwords
![Page 33: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/33.jpg)
Mais sobre criptografia
![Page 34: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/34.jpg)
Cross-Site reference forgery (CSRF)
![Page 35: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/35.jpg)
Como funciona
• Bob navega por um fórum de discussão e visualiza uma mensagem criada por um hacker onde existe um elemento HTML de imagem forjado. O elemento referencia um comando na aplicação de gerenciamento de projetos de Bob, ao invés de um arquivo de imagem.
<img src="http://www.webapp.com/project/1/destroy"/>• A sessão de Bob em www.webapp.com ainda está ativa,
porque ele não fez seu logout alguns minutos atrás.• Por acessar a mensagem, o navegador encontra uma tag
de imagem. Ele tenta carregar a imagem suspeita a partir de www.webapp.com. Como explicado anteriormente, ele também enviará o cookie com id de sessão válido.
![Page 36: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/36.jpg)
Como funciona
• A aplicação web em www.webapp.com verifica a informação do usuário no respectivo hash de sessão e destroy o projeto com ID 1. Ele então retorna a página com o resultado da operação, o que é um resultado inesperado para o navegador, logo ele não irá exibir a imagem.
• Bob não percebe o ataque — Mas alguns dias mais tarde ele percebe que o projeto número um se foi.
![Page 37: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/37.jpg)
Cross-Site reference forgery (CSRF)
![Page 38: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/38.jpg)
Como evitar?
• Saiba como usar o HTTP:• Get serve para perguntas, como uma
pesquisa ou operação de leitura;• Post server para executar ordens.• É muito importante conhecer HTTP pois
ele é a base de aplicações internet.• É muito importante conhecer o Rest, pois
o Rails faz uso de Rest o tempo todo.
![Page 39: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/39.jpg)
“Every developer working with the Web needs to read this book.”
David Heinemeier Hansson, creator of the Rails framework
![Page 40: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/40.jpg)
Injection
• Injeção é uma categoria de ataques que introduzem código malicioso ou parâmetros em uma aplicação web de forma a executar estes códigos dentro do contexto de segurança da aplicação. Os exemplos mais proeminentes de injeção são o cross-site scriptintg (XSS) e o SQL injection.
![Page 41: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/41.jpg)
Injection não é algo simples
• Injeção é algo complicado, porque um mesmo código ou parâmetro pode ser malicioso em um contexto e completamente inofensivo em outro. Um contexto pode ser um script, uma query ou linguagem de programação, o shell ou um método do Ruby/Rails.
![Page 42: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/42.jpg)
SQL Injection no banco de dados de usuários do Speedy, em 10 de julho de 2009
http://telefonica.ath.cx/
![Page 43: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/43.jpg)
SQL INJECTION NÃO É EXCLUSIVIDADE DO RAILS
O site da telefonica é em PHP.
![Page 44: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/44.jpg)
USUÁRIOS SEMPRE SÃO A PARTE MAIS FRÁGIL DA SEGURANÇA
E não há nada que você possa fazer.
![Page 45: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/45.jpg)
Seu site?
![Page 46: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/46.jpg)
Gerenciamento de usuários
• Exija a autenticação de usuários usando plugins prontos para isso, como o Authlogic;
• No cadastramento de seu usuário, exija que o mesmo digite duas vezes a senha e o e-mail;
• Crie regras para que o usuário não crie senhas como “eu” ou “senha”.
![Page 47: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/47.jpg)
![Page 48: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/48.jpg)
Mais informações
• http://guias.rubyonrails.pro.br/security.html • Conheça o site: http://www.rorsecurity.info/• Conheça o Nessus: http://www.nessus.org/
![Page 49: Segurança em Rails](https://reader034.vdocuments.mx/reader034/viewer/2022052523/5560fa03d8b42a0e408b4d6a/html5/thumbnails/49.jpg)