Login baseado no dominio do email – segurança email

Pergunta:


Estou pensando em um sistema onde somente usuários que possuem email com domínio empresa.com poderão se cadastrar. Após o cadastro será enviado um email de validação do email.

Até ai tudo bem, consigo verificar facilmente qual é o domínio do email quando o usuário estiver se cadastrando.

Vamos supor também que a pessoa responsável por distribuir os emails do domínio empresa.com tem total controle de todos os emails ativos.

Agora a minha pergunta é, existe alguma falha de segurança que possa permitir que usuários com outros domínios se cadastrem, ou que mascarem o email deles?

Por exemplo, o email [email protected] não é um email real, mas o usuário consegue mascarar o email de modo que [email protected] seja redirecionado para [email protected]?

Existe alguma possibilidade de que um envenenamento de DNS possa afetar a segurança desse sistema?

Veja bem que a pergunta não está relacionada a como implementar e sim quais são as possíveis falhas de seguranças ou ataques que eu posso sofrer, na tentativa de burlar a verificação do domínio do email.

Autor da pergunta Rubico

Guilherme Viebig

O que você quer validar em primeiro plano não é o usuário do e-mail, sim o próprio domínio.

Se o DNS primário estiver comprometido tudo é possível, por isso que essas validações são concretizadas através de registros TXT, sendo possível verificar que o proprietário validou.

Outro ponto é trabalhar com empresas que utilizem SSL com certificação de terceiros, assim a maiorias das aplicações por padrão vão falhar na verificação caso algum host tente impersonar através de ataques de DNS ou comprometimento dos servidores de DNS primários.

Veja como o Google Apps exige o campo TXT:

https://support.google.com/a/answer/183895?hl=pt-BR

Vale também ler mais sobre medidas de segurança de e-mail mais recentes (spf, dkim, dmarc):

http://www.rsdezoito.com.br/blog/spf-dkim-e-dmarc-e-mail-marketing-seguro/

Na verdade não existe uma forma segura de garantir que o email pertença mesmo a empresa. A falha sempre vai estar do lado da empresa, pois se uma pessoa que possui acesso ao DNS fornecer informações a terceiros, ou a senha de acesso ao DNS cair em mãos erradas não há nada que vc possa fazer para garantir a integridade de quem está acessando.

Assim como se vc tivesse um acesso por login e senha normal e a senha cair em mãos erradas não há muito o que fazer.

O que vc pode fazer é dificultar o acesso de possíveis falhas de segurança.

  1. Mapear pela localidade onde é feito a maioria dos acessos de determinado usuário, e assim que for acessado de uma localidade diferente gerar e-mails de confirmação ou aviso aos responsáveis.
  2. Para determinadas empresas que tem IP fixo vc pode validar acessos apenas daqueles IP’s cadastrados para aquela empresa/usuário.

No mais não há muito o que seja feito, a falha sempre estará do lado do usuário/empresa, sites grandes como google, amazon e outros tambem tem problemas em garantir a integridade ou autenticidade de quem está acessando.

Se o domínio empresa.com pertence a empresa dona do software é seguro.
Na verdade a segurança depende de quem é dona do domínio.

Por exemplo, eu tenho meu domínio splitz.com.br, se alguém tentar se cadastrar em algum serviço (Google, Microsoft, etc.) usando meu domínio como [email protected] um e-mail de confirmação vai ser enviado para [email protected], mas como eu sou o dono do domínio sou eu que recebo o e-mail, não o invasor. Resultado: ele não terá seu e-mail confirmado e sua conta não será ativada no serviço

Aconteceu comigo… Tentaram se registrar no Facebook usando meu e-mail [email protected], o resultado é que eu recebi o e-mail de confirmação, confirmei a conta, entrei no Facebook da pessoal (invasor?), mudei a senha dela, e exclui essa minha conta recem criada no Facebook.

Finalizando… quem é dona do domínio faz o que quiser. O invasor teria de ter acesso ao DNS do domínio para causar problemas. Digo ter a senha de acesso ao site Regitro.Br (ou GoDaddy, CentralNic, etc) para modificar as entradas DNS abaixo.

inserir a descrição da imagem aqui

Somente tendo acesso a esta tela o invasor poderia, como você disse mascarar o email de modo que [email protected] seja redirecionado para [email protected]?

Vou tentar responder as duas coisas que você pediu (ou o que eu entendi na pergunta):

Para verificar automaticamente se o email pertence à empresa que quer restringir use o seguinte código:

$verifica = explode(‘@’,$email);

$dominio = $verifica[1];

if($dominio == ‘empresa.com.br’){ return true; }

Agora vamos conversar sobre segurança em emails:
Realmente é seguro, e muito difícil uma pessoa burlar o RECEBIMENTO de um e-mail escolhendo um domínio.
Para alguém burlar o ENVIO de um e-mail usava-se um código muito fácil, que não sei se hoje em dia já foi corrigido. No cabeçalho do email, alguns soft permitem alterar o cabeçalho quando enviar (já fiz isso :). Simplesmente altera onde fica a propriedade from: [email protected] Isto apenas par envio, mas se você enviar um email para aquele email, iso vai ficar parado no SERVIDOR IMAP, que possivelmente não vai encontrar nada.

Ou seja, a pessoa envia emails falsos mas não recebe naquele email falso.

Então esta proposta é SEGURA 😉

— Só lembrando que o início do Facebook foi assim, restrito para quem tivesse emails @edu.com (ou seja apenas estudantes universitários).

Se o “invasor” tiver acesso aos emails desta empresa, e criar um redirecionamento, ele poderá burlar isso sem problemas.

Partindo do principio que trata-se de uma empresa com domínio próprio, seguem algumas ideias:

  1. Checagem de SPF

Você pode fazer verificações pelos registros de SPF e DNS para o domínio. Checando o SPF do domínio, você consegue obter os IPs dos MX da empresa. Você pode

algoritmo:
dns_get_record (“dominio.com”, DNS_TXT);
localize os registros com v=spf1
localize nesta linha todos os IPs e ponha em um array
por exemplo se no MX constar: 200.10.20.30
restrinja os cadastros para a rede 200.10.20.__

  1. Checagem de Whois

Pode obter os IPs do domínio da empresa, e verificar o IP de quem está acessando. Fazendo um WHOIS no IP de quem está acessando lhe confirmará quem é o dono do IP, se a empresa usar IP fixo. Você pode restringir acessos de provedores de banda larga como GVT, OI, etc.. Ou então simplesmente não fazer a consulta nestes casos.

algoritmo:
gethostbyname (“dominio.com”)
aplica um whois no domínio
filtra pelo nome da organização

  1. Mapear o histórico de IPs

Você pode simplesmente fazer um banco de dados com o histórico de IPs usados por cada domínio (usuários com emails @dominio.com) ao acessar o sistema. Assim pode ver se estão na mesma rede sempre. Caso algum acesso “fuja” ao padrão de rede, pode bloquear o usuário especificamente.

Por exemplo:

[email protected] – IP 200.10.20.30
[email protected] – IP 200.10.20.32
[email protected] – IP 200.10.20.37

Pode usar um pattern de frequencia para “200.10.20”.

[email protected] – IP 177.81.10.20 – Bloquear (IP totalmente diferente)

Fonte

Related Posts:

Qual a diferença entre AppCompatActivity e Activity? – android android-activity
Pergunta: Qual a diferença da AppCompatActivity para Activity ? A partir de qual versão a AppCompatActivity foi adicionada ao Android? Autor da pergunta Luhhh A diferença reside ...
Como abreviar palavras em PHP? – php string
Pergunta: Possuo informações comuns como nome de pessoas e endereços, e preciso que elas contenham no máximo 30 caracteres sem cortar palavras. Exemplo: 'Avenida Natalino João Brescansin' ...
Qual é a finalidade de um parêntese vazio numa declaração Lambda? – c# expressões-lambda característica-linguagem
Pergunta: Criei um exemplo de uma declaração Lambda sem argumentos, entretanto, estou com duvidas referente a omissão do parêntese vazio () na declaração. Veja o exemplo: class ...
Boas práticas para URI em API RESTful – api rest restful
Pergunta: Estou com dúvida em relação às URIs de alguns recursos da api que estou desenvolvendo. Tenho os recursos projetos e atividades com relação 1-N, ...
Dúvidas sobre a integração do MySQL com Java – java mysql netbeans
Pergunta: Estou criando um sistema no NetBeans, utilizando a linguagem Java e o banco de dados MySQL. Escrevi o seguinte código para realizar a conexão ...
Qual é a finalidade da pasta Model do framework Inphinit? – php inphinit
Pergunta: No Inphinit micro-framework existe a pasta Model que fica dentro da pasta application, e nela é onde ficam as classes, mas eu estou muito ...
Uso do ‘@’ em variáveis – javascript typescript coffeescript
Pergunta: Vejo em algumas linguagens que compilam para javascript, como TypeScript e CoffeeScript, o uso do @ em variáveis, como também, casos em que o ...
Qual tamanho máximo um arquivo JSON pode ter? – json arquivo
Pergunta: Vou dar um exemplo para conseguir explicar minha duvida: Preciso recuperar informação de imagens vindas de uma API, esse banco de imagens me retorna JSON's ...
O que é Teste de Regressão? – terminologia engenharia-de-software testes
Pergunta: Na matéria de Teste de Software o professor abordou um termo chamado Teste de Regressão, isto dentro da disciplina de teste de software. Sendo ...
O que é um construtor da linguagem? – php característica-linguagem
Pergunta: Em PHP, já li e ouvi várias vezes a respeito dos Construtores da Linguagem. Os casos que sempre ouvi falar deles foi em casos ...
Função intrínseca para converter numérico para string – cobol
Pergunta: Estou a tentar saber se existe alguma função intrínseca do COBOL para converter um data numérico para string sem precisar usar a cláusula REDEFINES: ( ...
Porque usar implements? – java android
Pergunta: Qual a diferença entre usar btn.setOnClickListener(new OnClickListener() { e public class MainActivity extends Activity implements OnClickListener{ Estive fazendo um curso de Android e meu professor falou que ...
O que é XHTML e quando deve ser usado? – html xml xhtml
Pergunta: O que eu sei é que o XHTML precisa ser XML válido. Isso implica, por exemplo, que todas as tags precisam ser fechadas. Por ...
Uma placa aceleradora de vídeo pode melhorar o desempenho não-gráfico? [fechada] – desempenho
Pergunta: Para desenvolver em Ruby on Rails, eu utilizo aqui uma máquina virtual do VirtualBox com Ubuntu Server 14.04 sem interface gráfica instalada. Recentemente descobri uma ...
Concat() VS Union() – c# .net
Pergunta: Qual a diferença entre Concat() e Union() ? Quando usar Concat() e quando usar Union() ? Somente pode ser usado em list ? ...

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *