Ser notificado quando alguém fizer login em um servidor usando SSH ou Área de Trabalho Remota

13

Eu tenho um servidor mini mac executando o OS X Lion Server 10.7.3. É executado praticamente sem supervisão, sem problemas. No entanto, o servidor está sob constante "ataque" de acordo com os logs. Parece que o firewall e a segurança estão aguentando.

Existe algum aplicativo / script que possa me enviar um email sempre que alguém / alguém fizer login no servidor usando SSH, Admin Tools ou ARD?

Como a máquina funciona sem supervisão, sem cabeça em um datacenter em uma cidade diferente, estou preocupado que alguém possa (por pura persistência) conseguir quebrar uma senha ou encontrar um comprometimento no sistema. Saber que serei alertado deixará minha mente mais tranquila.

bloudraak
fonte
2
Não é realmente uma resposta, portanto, um comentário: você já pensou em usar algo como fail2ban ([How-Tow] ( fail2ban.org/wiki/index.php/HOWTO_Mac_OS_X_Server_(10.5) )? Dessa forma, você pode banir os IP dos quais é atacado. definir as regras para quanto tempo eles são proibidos, etc. Ele iria ajudá-lo a evitar ser hackeado E isso é talvez mais útil, em seguida, recebendo um e-mail para cada tentativa de login..
boretom

Respostas:

4

Sua melhor defesa é sempre desativar serviços desnecessários. Se você não estiver usando a área de trabalho remota: desligue-o. Se você não estiver usando os servidores HTTP ou FTP: desative-os. Menos serviços em execução, menos pontos de entrada para possíveis invasores explorarem.

Além de bloqueá-lo, existem alguns produtos gratuitos e de código aberto compatíveis com o OS X, que você pode observar para fazer a detecção de intrusões em sua máquina.

Snort

Embora eu não o tenha executado pessoalmente, tenho colegas que o conhecem e confiam na detecção de invasões. É compatível com BSD, o que o torna um bom ajuste para o OS X. Outra vantagem do Snort é que ele está disponível como um pacote Homebrew :

> brew info snort
snort 2.9.0.5
http://www.snort.org
Depends on: daq, libdnet, pcre
Not installed
https://github.com/mxcl/homebrew/commits/master/Library/Formula/snort.rb

==> Caveats
For snort to be functional, you need to update the permissions for /dev/bpf*
so that they can be read by non-root users.  This can be done manually using:
    sudo chmod 644 /dev/bpf*
or you could create a startup item to do this for you.

Portanto, você obtém um caminho simplificado para a instalação e confia no fato de que ele é portado corretamente para o OS X e é executado lá. Com o Homebrew instalado, você só precisa fazer:

> brew install snort

E você está pronto para começar.

Confira este guia de configuração do Snort para OS X Lion Server que a comunidade Snort fornece para começar a escrever regras para sua máquina OS X. Esse é um ótimo documento e, além de acompanhar a instalação do Snort a partir do código-fonte (o que você não precisa fazer), ele fala sobre tudo o que você deve fazer na instância do OS X Lion Server para ajudar a protegê-lo. Se você instalar via Homebrew, comece na Seção 5 (página 13) no PDF, pois você não precisa se preocupar em instalá-lo a partir do código-fonte.

Tripwire

Já corri Tripwire em máquinas Linux para fazer detecção de intrusão rápida e alertas. É eficaz, mas é um pouco difícil de montar. Ele pode executar ações quando as regras são correspondidas nos arquivos de log. Obviamente, um hacker experiente saberá desativar o Tripwire assim que invadir, para não acabar com a sessão interrompida.

As negociações dica MacWorld sobre a criação de Tripwire no OS X . Não é simples e o artigo termina com a menção de que não foi testado.

Ian C.
fonte
O firewall adaptável do OS X Lion Server fez um ótimo trabalho mantendo as pessoas de fora. Que benefício o Tripwire e o Snort me oferecem em comparação com o firewall padrão? Vale a pena o esforço?
bloudraak
1
O Tripwire ou o Snort não são substitutos de firewall. Eles são sistemas de detecção de intrusão. Eles usam várias abordagens diferentes para monitorar os logs do sistema em busca de atividades suspeitas e podem executar ações com base em resultados de monitoramento, como enviar um e-mail a você, desligar daemons remotos ou fechar portas de rede.
Ian C.
4

Você pode proteger o ssh e instalar denyhosts, sshguard e Snort, Barnyard, Base e Swatch.

Veja estes links para detalhes:

https://discussions.apple.com/thread/3565475 https://discussions.apple.com/thread/4473229?tstart=0

  1. Desative os logins de root e senha:

    vi /etc/sshd_config

    PermitRootLogin no
    PasswordAuthentication no
    ChallengeResponseAuthenticatio no

    Em seguida, use ssh-keygenno cliente remoto para gerar chaves públicas / privadas que podem ser usadas para efetuar login remotamente no servidor:  

    client$ ssh-keygen -t rsa -b 2048 -C client_name [Securely copy ~/.ssh/id_rsa.pub from client to server.] server$ cat id_rsa.pub > ~/.ssh/known_hosts  

  2. Instale denyhosts e sshguard.

    • sudo port install denyhosts sshguard
    • sudo port load denyhosts
    • sudo port load sshguard

    Você pode configurar denyhosts para bloquear todo o tráfego, não apenas o tráfego ssh.

  3. Snort, com um mapa mundial de ataques:

    https://discussions.apple.com/thread/4473229?tstart=0

sss
fonte
3

Para responder diretamente à pergunta colocada. Eu tenho outro script que me envia e-mails, novamente, por volta da meia-noite, se alguém fizer login com êxito via ssh.

#!/usr/bin/env bash

mm=`date +%b`
dd=`date $1 +%d`
dd=`expr $dd`
if [ "$dd" -ge "10" ]
  then 
    dt=`echo "$mm $dd"` 
  else 
    dt=`echo "$mm  $dd"` 
fi

cat /var/log/secure.log | grep -E '(Accepted|SUCCEEDED)'| grep -E -v '(my.ip.address|192.168.1)' | grep "$dt" >> /tmp/access_granted

/usr/bin/mail -E -s "Access granted" email@myserver.com < /tmp/access_granted
rm /tmp/access_granted

Edite o item grepacima para excluir seu próprio IP fixo, se desejar, e usar seu endereço de email. Você pode combinar parte do código na minha outra resposta para adicionar falhas ao VNC.

afragen
fonte
Eu criei o script para executar em uma programação e estou aguardando o email desta noite.
bloudraak
O problema de fazer as coisas diariamente é que, quando você percebe a invasão, o dano já pode estar causado.
Ian C.
@Ian C. - concordou, mas você sempre pode aumentar a frequência do email. Além disso, você precisa ter alguma fé nas medidas de prevenção de intrusões que você configurou. Tenho um grau de confiança bastante razoável na minha instalação do Fail2ban.
afragen
2

Para expandir um pouco o Fail2ban , uma vez configurado e em execução, tenho um script que corro pouco antes da meia-noite que raspa os logs e me envia por e-mail o que o Fail2ban está fazendo no dia anterior.

O script é o seguinte e pode ser executado a partir do cron ou de uma lista de inicialização.

#!/usr/bin/env bash

mm=`date +%b`
dd=`date $1 +%d`
dd=`expr $dd`
if [ "$dd" -ge "10" ]
  then 
    dt=`echo "$mm $dd"` 
  else 
    dt=`echo "$mm  $dd"` 
fi

cat /var/log/system.log | grep "$dt" | grep org.fail2ban | grep -v COMMAND > /tmp/fail2ban_deny
cat /var/log/fail2ban.log | grep -E '(WARN|ERR|rotation|target)' | grep `date $1 +%Y-%m-%d` >> /tmp/fail2ban_deny
cat /var/log/ipfw.log | grep TCP | grep "$dt" >> /tmp/fail2ban_deny
cat /var/log/secure.log | grep VNC | grep FAILED | grep "$dt" >> /tmp/fail2ban_deny


/usr/bin/mail -E -s "Fail2ban ipfw" email@yourserver.com < /tmp/fail2ban_deny
rm /tmp/fail2ban_deny

Obviamente, você precisará usar o endereço de e-mail de sua escolha.

A configuração do Fail2ban é outra questão. Eu escrevi extensivamente sobre isso.

afragen
fonte
0

É bastante simples instalar o plug-in PAM do Google Authenticator no Mac OS X se você tiver o compilador de linha de comando de código X instalado. O código e as instruções estão aqui:

https://code.google.com/p/google-authenticator/wiki/PamModuleInstructions

Depois de inicializar seu token (gerar um código que você alimenta para o aplicativo no seu telefone), você terá uma autenticação de dois fatores para proteger sua máquina. Qualquer conta sem um token inicializado não poderá fazer login, portanto, se você não deseja permitir o login raiz, não inicialize uma chave para essa conta.

Mas, falando sério, algo como DenyHosts faz sentido se você tiver que manter o SSH aberto na Internet. Infelizmente, desde o Mac OS X V10.8, o tcpwrappers da Apple removeu o suporte do daemon SSH, por isso ignora o /etc/deny.hosts, que foi uma jogada idiota, se você me perguntar, removendo um recurso de segurança.

Para contornar isso, usei o MacPorts para instalar um daemon openssh atualizado e restaurar a funcionalidade completa do tcpwrappers, editei e usei o daemon DenyHosts para monitorar /var/log/system.log e banir IPs que estão adivinhando logins e senhas . E não se esqueça de atualizar o MacPorts e verificar / reinstalar o openssh / DenyHosts toda vez que você atualizar o sistema operacional.

Boa sorte!

user2895719
fonte
0

Percebo que este é um post antigo, mas achei que isso poderia ajudar alguém que não pode programar ou economizar tempo vasculhando a web. Acabei de escrever isso no meu horário de almoço e ele enviará por e-mail tentativas bem-sucedidas e com falha, bem como IPs bloqueados por meio de tentativas com falha. O programa está escrito em Ruby. O Sendmail é instalado junto com as gemas de correio e de cauda de arquivo.

Código fonte abaixo:

#!/usr/local/bin/ruby

require 'mail'
require 'file-tail'

def sendMail(mail_subject,mail_body,dest_email,port)
  Mail.defaults do
    delivery_method :smtp, address: "localhost", port: port
  end

  mail = Mail.new do
    from     '[email protected]'
    to        dest_email
    subject   mail_subject
    body      mail_body
  end

  mail.delivery_method :sendmail
  mail.deliver
end

File.open('/var/log/auth.log') do |log|
  log.extend(File::Tail)
  log.interval = 10
  log.backward(1)
  log.tail do |line| 
    puts line if line.match(/ssh.*accepted password.*$/i)
    sendMail('New SSH Connection',line,'[email protected]',445) if line.match(/ssh.*accepted password.*$/i)

    puts line if line.match(/ssh.*failed password.*$/i)
    sendMail('Failed SSH attempt',line,'[email protected]',445) if line.match(/ssh.*failed password.*$/i)

    puts line if line.match(/sshguard.*$/i)
    sendMail('SSH IP Blocked', line,'[email protected]',445) if line.match(/sshguard.*$/i)
  end
end
Aguevara
fonte