Recevoir une notification lorsque quelqu'un se connecte à un serveur en utilisant SSH ou Remote Desktop

13

J'ai un mini-serveur mac exécutant OS X Lion Server 10.7.3. Il fonctionne à peu près sans problème sans problème. Cependant, le serveur est constamment "attaqué" selon les journaux. Il semble que le pare-feu et la sécurité tiennent le coup.

Existe-t-il une application / un script qui peut m'envoyer un e-mail chaque fois qu'une personne / une personne se connecte au serveur à l'aide de SSH, des outils d'administration ou d'ARD?

Étant donné que la machine fonctionne sans surveillance, sans tête dans un centre de données dans une autre ville, je crains que quelqu'un (par pure persistance) parvienne à déchiffrer un mot de passe ou à trouver un compromis sur le système. Savoir que je serai alerté me rassérénera.

bloudraak
la source
2
Pas vraiment une réponse donc un commentaire: avez-vous envisagé d'utiliser quelque chose comme fail2ban ([How-Tow] ( fail2ban.org/wiki/index.php/HOWTO_Mac_OS_X_Server_(10.5) )? De cette façon, vous pouvez interdire les IP dont vous êtes attaqué. définir les règles pour la durée de leur interdiction, etc. Cela vous aiderait à éviter d'être piraté. Et c'est peut-être plus utile que d'obtenir un e-mail pour chaque tentative de connexion.
boretom

Réponses:

4

Votre meilleure défense est toujours de désactiver les services inutiles. Si vous n'utilisez pas le bureau à distance: désactivez-le. Si vous n'utilisez pas les serveurs HTTP ou FTP: désactivez-les. Moins de services en cours d'exécution, moins de points d'entrée pouvant être exploités par des intrus.

En plus de le verrouiller, il existe des produits gratuits et open source compatibles avec OS X que vous pouvez consulter pour effectuer une détection d'intrusion sur votre machine.

Renifler

Bien que je ne l'ai pas personnellement exécuté, j'ai des collègues qui le connaissent et lui font confiance pour la détection d'intrusion. Il est compatible BSD, ce qui en fait un bon choix pour OS X. Un autre avantage de Snort est qu'il est disponible en tant que package 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.

Vous obtenez donc un chemin d'installation simplifié et certains font confiance au fait qu'il se connecte bien à OS X et y fonctionne. Avec Homebrew installé, il vous suffit de faire:

> brew install snort

Et vous êtes prêt à commencer.

Consultez ce guide de configuration Snort pour OS X Lion Server fourni par la communauté Snort pour commencer à écrire des règles pour votre machine OS X. C'est un excellent document et, en plus de parcourir l'installation de Snort depuis la source (ce que vous n'avez pas besoin de faire), il parle de toutes les choses que vous devez faire pour votre instance OS X Lion Server pour aider à la protéger. Si vous installez via Homebrew, commencez à la section 5 (page 13) du PDF car vous n'avez pas à vous soucier de l'installer à partir du code source.

Tripwire

J'ai exécuté Tripwire sur des machines Linux pour effectuer une détection et une alerte rapides des intrusions. C'est efficace mais c'est un peu bête à mettre en place. Il peut effectuer des actions lorsque des règles sont comparées à des fichiers journaux. Bien sûr, un pirate averti va savoir désactiver Tripwire dès qu'il s'introduit pour ne pas se retrouver avec sa session interrompue.

Les pourparlers de soupçon MacWorld sur la mise en place Tripwire sur OS X . Ce n'est pas simple et l'article se termine en mentionnant qu'il n'a pas été testé.

Ian C.
la source
Le pare-feu adaptatif d'OS X Lion Server a fait un excellent travail pour garder les gens à l'écart. Quels avantages Tripwire et Snort m'apportent par rapport au pare-feu standard? Cela en vaut-il la peine?
bloudraak
1
Ni Tripwire ni Snort ne sont censés être des remplacements de pare-feu. Ce sont des systèmes de détection d'intrusion. Ils utilisent un tas d'approches différentes pour surveiller les journaux de votre système afin de détecter toute activité suspecte et peuvent prendre des mesures en fonction des résultats de la surveillance, comme l'envoi de courriels ou la fermeture de démons distants ou la fermeture de ports réseau.
Ian C.
4

Vous pouvez durcir ssh et installer denyhosts, sshguard et Snort, Barnyard, Base et Swatch.

Voir ces liens pour plus de détails:

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

  1. Désactivez les connexions root et mot de passe:

    vi /etc/sshd_config

    PermitRootLogin no
    PasswordAuthentication no
    ChallengeResponseAuthenticatio no

    Ensuite, utilisez ssh-keygensur le client distant pour générer des clés publiques / privées qui peuvent être utilisées pour se connecter à distance au serveur:  

    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. Installez denyhosts et sshguard.

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

    Vous pouvez configurer denyhosts pour bloquer tout le trafic, pas seulement le trafic ssh.

  3. Snort, avec une carte du monde des attaques:

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

sss
la source
3

Répondre directement à la question posée. J'ai un autre script qui m'envoie, encore une fois, vers minuit, si quelqu'un réussit à se connecter 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

Modifiez ce qui grepprécède pour exclure votre propre IP fixe, si vous le souhaitez, et pour utiliser votre adresse e-mail. Vous pouvez combiner une partie du code dans mon autre réponse pour ajouter des échecs pour VNC.

afragen
la source
J'ai créé le script pour qu'il s'exécute selon un calendrier et j'attends le courrier électronique de ce soir.
bloudraak
Le problème avec faire les choses au quotidien, c'est qu'au moment où vous avez vent de l'intrusion, les dommages peuvent déjà être causés.
Ian C.
@Ian C. - d'accord, mais vous pouvez toujours augmenter la fréquence des e-mails. De plus, vous devez avoir une certaine confiance dans les mesures de prévention des intrusions que vous mettez en place. J'ai un degré de confiance très raisonnable dans ma configuration Fail2ban.
afragen
2

Pour développer un peu sur Fail2ban , une fois qu'il est configuré et en cours d'exécution, j'ai un script que j'exécute juste avant minuit qui gratte les journaux et m'envoie par courrier électronique ce que Fail2ban a fait la veille.

Le script est le suivant et peut être exécuté à partir de cron ou d'une liste de lancement.

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

Vous devrez évidemment utiliser l'adresse e-mail de votre choix.

La configuration de Fail2ban est un tout autre problème. J'ai beaucoup écrit à ce sujet.

afragen
la source
0

Il est assez simple d'installer le plug-in PAM de Google Authenticator sur Mac OS X si le compilateur de ligne de commande de code X est installé. Le code et les instructions sont ici:

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

Une fois que vous avez initialisé votre jeton (générez un code que vous introduisez dans l'application sur votre téléphone), vous aurez une authentification à deux facteurs pour protéger votre machine. Tout compte sans jeton initialisé ne pourra pas se connecter, donc si vous ne souhaitez pas autoriser la connexion root, n'initialisez pas de clé pour ce compte.

Mais sérieusement, quelque chose comme DenyHosts n'a de sens que si vous devez garder SSH ouvert sur Internet. Malheureusement, depuis Mac OS X V10.8, Apple a supprimé le support tcpwrappers du démon SSH, il ignore donc /etc/deny.hosts, ce qui était une décision stupide, si vous me demandez, de supprimer une fonction de sécurité.

Pour contourner ce problème, j'ai utilisé MacPorts pour installer un démon openssh à jour et restaurer toutes les fonctionnalités de tcpwrappers, j'ai édité et utilisé le démon DenyHosts pour surveiller /var/log/system.log et interdire les adresses IP qui devinent les connexions et les mots de passe . Et n'oubliez pas de mettre à jour MacPorts et de vérifier / réinstaller openssh / DenyHosts chaque fois que vous mettez à niveau le système d'exploitation.

Bonne chance!

user2895719
la source
0

Je me rends compte qu'il s'agit d'un ancien message, mais j'ai pensé que cela pourrait aider quelqu'un qui ne peut pas programmer ou lui faire gagner du temps à parcourir le Web. Je viens d'écrire ceci lors de ma pause déjeuner et il enverra par e-mail les tentatives réussies et échouées ainsi que les adresses IP bloquées via les tentatives échouées. Le programme est écrit en Ruby. Sendmail est installé avec les gemmes de courrier et de queue de fichier.

Code source ci-dessous:

#!/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
la source