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á.
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.
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.
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.
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
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-keygen
en 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
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.
Snort, con un mapa mundial de ataques:
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 grep
anterior 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.
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
aburrir