Benachrichtigung erhalten, wenn sich jemand mit SSH oder Remote Desktop bei einem Server anmeldet

Ich habe einen Mac Mini-Server, auf dem OS X Lion Server 10.7.3 ausgeführt wird. Es läuft so gut wie unbeaufsichtigt ohne Probleme. Allerdings wird der Server laut den Logs ständig „angegriffen“. Die Firewall und die Sicherheit halten anscheinend stand.

Gibt es eine Anwendung/ein Skript, das mir eine E-Mail senden kann, wenn sich jemand/jeder über SSH, Admin Tools oder ARD beim Server anmeldet?

Da die Maschine unbeaufsichtigt und kopflos in einem Rechenzentrum in einer anderen Stadt läuft, mache ich mir Sorgen, dass es jemandem (durch reine Beharrlichkeit) gelingt, ein Passwort zu knacken oder eine Kompromittierung des Systems zu finden. Zu wissen, dass ich benachrichtigt werde, wird mich beruhigen.

Nicht wirklich eine Antwort, daher ein Kommentar: Haben Sie darüber nachgedacht, so etwas wie fail2ban ([How-Tow] ( fail2ban.org/wiki/index.php/HOWTO_Mac_OS_X_Server_(10.5) ) zu verwenden? Auf diese Weise können Sie IPs sperren, von denen Sie angegriffen werden Legen Sie die Regeln fest, wie lange sie gesperrt werden usw. Es würde Ihnen helfen, Hackerangriffen vorzubeugen, und das ist vielleicht hilfreicher, als bei jedem Anmeldeversuch eine E-Mail zu erhalten.

Antworten (6)

Ihre beste Verteidigung besteht immer darin, unnötige Dienste zu deaktivieren. Wenn Sie Remote Desktop nicht verwenden: Deaktivieren Sie es. Wenn Sie die HTTP- oder FTP-Server nicht verwenden: schalten Sie sie aus. Weniger laufende Dienste, weniger Angriffspunkte für potenzielle Eindringlinge.

Abgesehen davon, dass Sie es sperren, gibt es einige kostenlose und Open-Source-Produkte, die OS X-freundlich sind und die Sie sich ansehen können, um Einbruchserkennung auf Ihrem Computer durchzuführen.

Schnauben

Obwohl ich es nicht persönlich betrieben habe, habe ich Kollegen, die es kennen und denen es für die Erkennung von Eindringlingen vertraut. Es ist BSD-kompatibel und passt daher gut zu OS X. Ein weiterer Vorteil von Snort ist, dass es als Homebrew -Paket verfügbar ist:

> 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.

Wenn Homebrew installiert ist, müssen Sie nur Folgendes tun:

> brew install snort

Und Sie sind bereit, damit anzufangen.

Das ist ein großartiges Dokument und neben der Anleitung zur Installation von Snort aus dem Quellcode (was Sie nicht tun müssen) spricht es über all die Dinge, die Sie tun sollten, um Ihre OS X Lion Server-Instanz zu schützen.

Stolperdraht

Ich habe Tripwire auf Linux-Rechnern ausgeführt, um eine schnelle Erkennung und Alarmierung von Eindringlingen durchzuführen. Es ist effektiv, aber es ist ein bisschen wie ein Biest einzurichten. Es kann Aktionen ausführen, wenn Regeln mit Protokolldateien abgeglichen werden. Natürlich weiß ein versierter Hacker, dass er Tripwire deaktivieren muss, sobald er eindringt, damit seine Sitzung nicht unterbrochen wird.

Der MacWorld-Hinweis spricht über die Einrichtung von Tripwire unter OS X. Es ist nicht einfach und der Artikel endet mit der Erwähnung, dass es nicht getestet wurde.

Die adaptive Firewall von OS X Lion Server hat großartige Arbeit geleistet, um Menschen fernzuhalten. Welchen Vorteil habe ich durch Tripwire und Snort gegenüber der Standard-Firewall? Lohnt sich der Aufwand?
Weder Tripwire noch Snort sind als Firewall-Ersatz gedacht. Sie sind Intrusion-Detection-Systeme. Sie verwenden eine Reihe verschiedener Ansätze zur Überwachung Ihrer Systemprotokolle auf verdächtige Aktivitäten und können auf der Grundlage der Überwachungsergebnisse Maßnahmen ergreifen, z. B. E-Mails an Sie senden oder Remote-Daemons abschalten oder Netzwerkports schließen.

Sie können ssh härten und denyhosts, sshguard und Snort, Barnyard, Base und Swatch installieren.

Siehe diese Links für Details:

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

  1. Deaktivieren Sie Root- und Passwort-Logins:

    vi /etc/sshd_config

    PermitRootLogin no
    PasswordAuthentication no
    ChallengeResponseAuthenticatio no

    Verwenden Sie dann ssh-keygenauf dem Remote-Client, um öffentliche/private Schlüssel zu generieren, die für die Remote-Anmeldung beim Server verwendet werden können:  

    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. Denyhosts und sshguard installieren.

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

    Sie können Denyhosts so konfigurieren, dass der gesamte Datenverkehr blockiert wird, nicht nur der SSH-Datenverkehr.

  3. Snort, mit einer Weltkarte der Angriffe:

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

Um die gestellte Frage direkt zu beantworten. Ich habe ein weiteres Skript, das mir gegen Mitternacht erneut eine E-Mail sendet, wenn sich jemand erfolgreich über ssh anmeldet.

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

Bearbeiten Sie das grepObige, um Ihre eigene feste IP auszuschließen, wenn Sie möchten, und um Ihre E-Mail-Adresse zu verwenden. Sie können einen Teil des Codes in meiner anderen Antwort kombinieren, um Fehler für VNC hinzuzufügen.

Ich habe das Skript so erstellt, dass es nach einem Zeitplan ausgeführt wird, und ich warte auf die E-Mail von heute Abend.
Das Problem bei der täglichen Arbeit besteht darin, dass der Schaden möglicherweise bereits angerichtet ist, wenn Sie Wind von dem Eindringen bekommen.
@Ian C. - einverstanden, aber Sie können die Häufigkeit der E-Mail jederzeit erhöhen. Außerdem müssen Sie Vertrauen in die Intrusion Prevention-Maßnahmen haben, die Sie eingerichtet haben. Ich habe ein sehr vernünftiges Maß an Vertrauen in mein Fail2ban-Setup.

Um Fail2ban etwas zu erweitern : Sobald es eingerichtet ist und ausgeführt wird, habe ich ein Skript, das ich kurz vor Mitternacht ausführe, das die Protokolle löscht und mir per E-Mail sendet, was Fail2ban am Vortag getan hat.

Das Skript sieht wie folgt aus und kann von cron oder einer launchd plist ausgeführt werden.

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

Sie müssen natürlich die E-Mail-Adresse Ihrer Wahl verwenden.

Das Einrichten von Fail2ban ist ein ganz anderes Thema. Ich habe ausführlich darüber geschrieben.

Es ist ziemlich einfach, das Google Authenticator PAM-Plugin unter Mac OS X zu installieren, wenn Sie den X-Code-Befehlszeilen-Compiler installiert haben. Code und Anleitung sind hier:

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

Sobald Sie Ihr Token initialisiert haben (einen Code generieren, den Sie der App auf Ihrem Telefon zuführen), verfügen Sie über eine Zwei-Faktor-Authentifizierung, um Ihr Gerät zu schützen. Jedes Konto ohne initialisierten Token kann sich nicht anmelden. Wenn Sie also keine Root-Anmeldung zulassen möchten, initialisieren Sie keinen Schlüssel für dieses Konto.

Aber im Ernst, so etwas wie DenyHosts macht nur Sinn, wenn Sie SSH im Internet offen halten müssen. Leider hat Apple seit Mac OS X V10.8 die tcpwrappers-Unterstützung aus dem SSH-Daemon entfernt, sodass /etc/deny.hosts ignoriert wird, was, wenn Sie mich fragen, ein dummer Schachzug war, der eine Sicherheitsfunktion entfernte.

Um dies zu umgehen, habe ich MacPorts verwendet, um einen aktuellen openssh-Daemon zu installieren und die vollständige tcpwrappers-Funktionalität wiederherzustellen, den DenyHosts-Daemon bearbeitet und verwendet, um /var/log/system.log zu überwachen und IPs zu sperren, die Logins und Passwörter erraten . Und vergessen Sie nicht, jedes Mal, wenn Sie das Betriebssystem aktualisieren, MacPorts zu aktualisieren und openssh/DenyHosts zu überprüfen/neu zu installieren.

Viel Glück!

Mir ist klar, dass dies ein alter Beitrag ist, aber ich dachte, dies könnte jemandem helfen, der nicht programmieren oder Zeit beim Durchsuchen des Internets sparen kann. Ich habe dies gerade in meiner Mittagspause geschrieben und es werden erfolgreiche und fehlgeschlagene Versuche sowie gesperrte IPs über fehlgeschlagene Versuche per E-Mail benachrichtigt. Das Programm ist in Ruby geschrieben. Sendmail wird zusammen mit den Mail- und File-Tail-Gems installiert.

Quellcode unten:

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