Recibir notificaciones cuando alguien inicia sesión en un servidor utilizando SSH o Escritorio remoto

13

Tengo un servidor mini mac con OS X Lion Server 10.7.3. Funciona prácticamente sin supervisión sin problemas. Sin embargo, el servidor está bajo "ataque" constante según los registros. El cortafuegos y la seguridad se mantienen al parecer.

¿Hay alguna aplicación / script que pueda enviarme un correo electrónico cada vez que alguien / alguien inicie sesión en el servidor utilizando SSH, Herramientas de administración o ARD?

Dado que la máquina funciona sin supervisión, sin cabeza en un centro de datos en una ciudad diferente, me preocupa que alguien (por pura persistencia) logre descifrar una contraseña o comprometer el sistema. Saber que me alertarán me tranquilizará.

bloudraak
fuente
2
Realmente no es una respuesta, por lo tanto, un comentario: ¿ha considerado usar algo como fail2ban ([How-Tow] ( fail2ban.org/wiki/index.php/HOWTO_Mac_OS_X_Server_(10.5) )? De esa manera puede prohibir las IP desde las que es atacado. establecer las reglas para el tiempo que están prohibidas, etc. sería de gran ayuda a prevenir ser atacado Y eso es tal vez más útiles a continuación, obtener un correo electrónico para cada intento de inicio de sesión..
boretom

Respuestas:

4

Su mejor defensa es siempre desactivar los servicios innecesarios. Si no está utilizando el escritorio remoto: apáguelo. Si no está utilizando los servidores HTTP o FTP: apáguelos. Menos servicios en funcionamiento, menos puntos de entrada para posibles intrusos para explotar.

Además de bloquearlo, hay algunos productos gratuitos y de código abierto que son compatibles con OS X que puede observar para detectar intrusiones en su máquina.

Bufido

Aunque no lo he ejecutado personalmente, tengo colegas que lo conocen y confían en él para la detección de intrusiones. Es compatible con BSD, por lo que es una buena opción para OS X. Otra ventaja de Snort es que está disponible como un paquete 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.

Entonces obtienes una ruta simplificada para la instalación y algo de confianza en el hecho de que se adapta bien a OS X y se ejecuta allí. Con Homebrew instalado solo necesitas hacer:

> brew install snort

Y ya está listo para comenzar.

Consulte esta guía de configuración de Snort para OS X Lion Server que la comunidad de Snort proporciona para comenzar a escribir reglas para su máquina con OS X. Es un documento excelente y, además de explicar cómo instalar Snort desde el origen (que no es necesario que hagas), habla sobre todas las cosas que debes hacer en tu instancia de OS X Lion Server para ayudar a protegerlo. Si instala a través de Homebrew, comience en la Sección 5 (página 13) en el PDF, ya que no necesita preocuparse por instalarlo desde el código fuente.

Tripwire

Me he encontrado Tripwire en máquinas Linux para hacer una rápida detección de intrusiones y alertas. Es efectivo pero es un poco una bestia para configurar. Puede realizar acciones cuando las reglas coinciden con los archivos de registro. Por supuesto, un hacker inteligente sabrá deshabilitar Tripwire tan pronto como intervenga para que no terminen con su sesión interrumpida.

La sugerencia de conversaciones MacWorld sobre la configuración de Tripwire en OS X . No es simple y el artículo termina mencionando que no ha sido probado.

Ian C.
fuente
El cortafuegos adaptativo de OS X Lion Server ha hecho un gran trabajo al mantener alejadas a las personas. ¿Qué beneficio me brindan Tripwire y Snort en comparación con el firewall estándar? ¿Vale la pena el esfuerzo?
bloudraak
1
Ni Tripwire ni Snort están destinados a ser reemplazos de firewall. Son sistemas de detección de intrusos. Utilizan un montón de enfoques diferentes para monitorear los registros de su sistema en busca de actividad sospechosa y pueden tomar medidas basadas en resultados de monitoreo como enviarle un correo electrónico o cerrar demonios remotos o cerrar puertos de red.
Ian C.
4

Puede endurecer ssh e instalar denyhosts, sshguard y Snort, Barnyard, Base y Swatch.

Vea estos enlaces para más detalles:

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

  1. Desactiva los inicios de sesión de root y contraseña:

    vi /etc/sshd_config

    PermitRootLogin no
    PasswordAuthentication no
    ChallengeResponseAuthenticatio no

    Luego, use ssh-keygenen el cliente remoto para generar claves públicas / privadas que se pueden usar para iniciar sesión de forma remota en el 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. Instalar denyhosts y sshguard.

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

    Puede configurar denyhosts para bloquear todo el tráfico, no solo el tráfico ssh.

  3. Snort, con un mapa mundial de ataques:

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

sss
fuente
3

Para responder directamente a la pregunta planteada. Tengo otra secuencia de comandos que me envía un correo electrónico, nuevamente, alrededor de la medianoche, si alguien inicia sesión con éxito a través de 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 lo grepanterior para excluir su propia IP fija, si lo desea, y para usar su dirección de correo electrónico. Puede combinar parte del código en mi otra respuesta para agregar fallas para VNC.

Afragen
fuente
Creé el script para ejecutarlo en un horario y estoy esperando el correo electrónico de esta noche.
bloudraak
El problema de hacer las cosas a diario es que cuando te enteras de la intrusión, el daño ya puede estar hecho.
Ian C.
@Ian C. - estuvo de acuerdo, pero siempre puede aumentar la frecuencia del correo electrónico. Además, debe tener fe en las medidas de prevención de intrusiones que configure. Tengo un grado de confianza muy razonable en mi configuración Fail2ban.
Afragen
2

Para ampliar un poco en Fail2ban , una vez que está configurado y en ejecución, tengo un script que ejecuté justo antes de la medianoche que borra los registros y me envía un correo electrónico de lo que Fail2ban ha estado haciendo el día anterior.

El script es el siguiente y puede ejecutarse desde cron o desde una lista de inicio.

#!/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, deberá utilizar la dirección de correo electrónico que elija.

Configurar Fail2ban es un problema completamente diferente. He escrito mucho sobre eso.

Afragen
fuente
0

Es bastante sencillo instalar el complemento PAM de Google Authenticator en Mac OS X si tiene instalado el compilador de la línea de comandos del código X. El código y las instrucciones están aquí:

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

Una vez que inicialice su token (genere un código que alimenta a la aplicación en su teléfono), tendrá autenticación de dos factores para proteger su máquina. Cualquier cuenta sin un token inicializado no podrá iniciar sesión, por lo que si no desea permitir el inicio de sesión raíz, no inicialice una clave para esa cuenta.

Pero en serio, algo como DenyHosts simplemente tiene sentido si tienes que mantener SSH abierto en Internet. Desafortunadamente, desde Mac OS X V10.8, Apple eliminó la compatibilidad con tcpwrappers del demonio SSH, por lo que ignora /etc/deny.hosts, que fue un movimiento tonto, si me preguntas, eliminando una característica de seguridad.

Para evitar eso, utilicé MacPorts para instalar un demonio openssh actualizado y restaurar la funcionalidad completa de tcpwrappers, edité y utilicé el demonio DenyHosts para monitorear /var/log/system.log y prohibir IP que adivinan inicios de sesión y contraseñas . Y no olvide actualizar MacPorts y verificar / reinstalar openssh / DenyHosts cada vez que actualice el sistema operativo.

¡Buena suerte!

usuario2895719
fuente
0

Me doy cuenta de que esta es una publicación antigua, pero pensé que esto podría ayudar a alguien que no puede programar o ahorrarles tiempo recorriendo la web. Acabo de escribir esto en mi hora de almuerzo y enviará correos electrónicos con intentos exitosos y fallidos, así como IP bloqueadas a través de intentos fallidos. El programa está escrito en Ruby. Sendmail se instala junto con el correo y las gemas de cola de archivo.

Código fuente a continuación:

#!/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
fuente