Recibir una notificación cuando alguien inicie sesión en un servidor mediante SSH o Escritorio remoto

Tengo un servidor mac mini con OS X Lion Server 10.7.3. Prácticamente funciona sin supervisión y sin problemas. Sin embargo, el servidor está bajo un "ataque" constante según los registros. Parece que el cortafuegos y la seguridad están aguantando.

¿Hay alguna aplicación/secuencia de comandos que pueda enviarme un correo electrónico cada vez que alguien/cualquiera inicie sesión en el servidor mediante 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 pueda (a través de la persistencia pura) lograr descifrar una contraseña o encontrar un compromiso en el sistema. Saber que me alertarán me tranquilizará.

No es realmente 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. Usted establece las reglas sobre cuánto tiempo están prohibidos, etc. Te ayudaría a evitar ser pirateado. Y eso es quizás más útil que recibir un correo electrónico para cada intento de inicio de sesión.

Respuestas (6)

Su mejor defensa es siempre desactivar los servicios innecesarios. Si no está utilizando el escritorio remoto: desactívelo. Si no está utilizando los servidores HTTP o FTP: desactívelos. Menos servicios en ejecución, menos puntos de entrada para posibles intrusos.

Además de bloquearlo, hay algunos productos gratuitos y de código abierto que son compatibles con OS X que puede consultar para realizar la detección de intrusos 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 intrusos. Es compatible con BSD, por lo que se adapta bien a OS X. Otra ventaja de usar 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.

Por lo tanto, obtiene una ruta simplificada para la instalación y cierta 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 usted está listo para comenzar con él.

Consulte esta guía de configuración de Snort para OS X Lion Server que proporciona la comunidad de Snort para comenzar a escribir reglas para su máquina OS X. Es un excelente documento y, además de guiar la instalación de Snort desde la fuente (que no es necesario que haga), habla sobre todas las cosas que debe hacer en su instancia de OS X Lion Server para ayudar a protegerla. 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.

cable trampa

Ejecuté Tripwire en máquinas Linux para realizar una detección y alerta rápida de intrusos. Es efectivo, pero es un poco difícil de configurar. Puede realizar acciones cuando las reglas se comparan con los archivos de registro. Por supuesto, un hacker inteligente sabrá cómo deshabilitar Tripwire tan pronto como ingresen para que no terminen con su sesión interrumpida.

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

El cortafuegos adaptable OS X Lion Server ha hecho un gran trabajo manteniendo a la gente fuera. ¿Qué beneficio me da Tripwire y Snort en comparación con el firewall estándar? ¿Vale la pena el esfuerzo?
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 en función de los resultados del monitoreo, como enviarle un correo electrónico o apagar demonios remotos o cerrar puertos de red.

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

Vea estos enlaces para más detalles:

https://discusiones.apple.com/hilo/3565475 https://discusiones.apple.com/hilo/4473229?tstart=0

  1. Desactive los inicios de sesión de raíz 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. Instale 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://discusiones.apple.com/thread/4473229?tstart=0

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.

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

Para ampliar un poco más sobre Fail2ban , una vez que está configurado y funcionando, tengo un script que ejecuto justo antes de la medianoche que extrae los registros y me envía un correo electrónico con lo que Fail2ban ha estado haciendo el día anterior.

El script es el siguiente y se puede ejecutar desde cron o un plist de launchd.

#!/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 de su elección.

Configurar Fail2ban es otra cuestión. He escrito mucho al respecto.

Es bastante simple instalar el complemento PAM de Google Authenticator en Mac OS X si tiene instalado el compilador de línea de comando de 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 tiene sentido si tiene 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, lo cual fue un movimiento tonto, si me preguntas, eliminar una función de seguridad.

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

¡Buena suerte!

Me doy cuenta de que esta es una publicación anterior, pero pensé que esto podría ayudar a alguien que no puede programar o ahorrarle tiempo explorando la web. Acabo de escribir esto en mi hora de almuerzo y enviaré por correo electrónico los intentos exitosos y fallidos, así como las IP bloqueadas a través de intentos fallidos. El programa está escrito en Ruby. Sendmail se instala junto con las gemas de cola de correo y 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     'root@localhost.com'
    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,'youremail@gmail.com',445) if line.match(/ssh.*accepted password.*$/i)

    puts line if line.match(/ssh.*failed password.*$/i)
    sendMail('Failed SSH attempt',line,'youremail@gmail.com',445) if line.match(/ssh.*failed password.*$/i)

    puts line if line.match(/sshguard.*$/i)
    sendMail('SSH IP Blocked', line,'youremail@gmail.com',445) if line.match(/sshguard.*$/i)
  end
end