誰かがSSHまたはリモートデスクトップを使用してサーバーにログインしたときに通知を受ける


13

OS X Lion Server 10.7.3を実行しているmac miniサーバーがあります。ほとんど問題なく無人で動作します。ただし、ログによると、サーバーは常に「攻撃」を受けています。ファイアウォールとセキュリティがそれを遅らせているようです。

SSH、管理ツール、またはARDを使用して誰か/誰でもサーバーにログインするたびにメールを送信できるアプリケーション/スクリプトはありますか?

マシンは別の都市のデータセンターで無人で無人で実行されるため、誰かが(純粋な永続化を通じて)パスワードをクラックしたり、システム上の侵害を見つけたりする可能性があることを心配しています。私が警告を受けることを知ることは、私の心を楽にします。


2
本当は答えではないので、コメント:fail2ban([How-Tow](fail2ban.org/wiki/index.php/HOWTO_Mac_OS_X_Server_ ( 10.5))のようなものを使用することを検討しましたか?攻撃を受けたIPを禁止できます。それはあなたがハッキング取得を防ぐのに役立つだろう、彼らは、などを禁止しているどのくらいのルールを設定し、それは、すべてのログイン試行のための電子メールを取得し、その後、多分もっと便利です。。
boretom

回答:


4

最善の防御策は、常に不要なサービスをオフにすることです。リモートデスクトップを使用していない場合:オフにします。HTTPまたはFTPサーバーを使用していない場合:それらをオフにします。実行中のサービスが少なく、侵入者が悪用する可能性のあるエントリポイントが少ない。

ロックダウンのほかに、OS Xに対応した無料のオープンソース製品があり、マシンで侵入検知を行うために確認できます。

鼻水

私は個人的にそれを実行していませんが、侵入検知のためにそれを知って信頼している同僚がいます。BSD互換であるため、OS Xに適しています。Snortを使用するもう1つの利点は、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.

したがって、インストールへの簡略化されたパスが得られ、OS Xに適切に移植され、そこで実行されるという事実に対する信頼が得られます。では自作あなただけ行う必要がインストールさ:

> brew install snort

そして、あなたはそれを始める準備ができています。

Snortコミュニティが提供しているOS Xマシン用のルール作成を開始するために、このSnort for OS X Lion Serverセットアップガイドを確認してください。これは素晴らしいドキュメントであり、ソースからSnortをインストールする手順(必要ありません)に加えて、OS X Lion Serverインスタンスを保護するために行う必要があるすべてのことについて説明しています。Homebrew経由でインストールする場合は、ソースコードからインストールする必要はないため、PDFのセクション5(13ページ)から始めてください。

トリップワイヤー

LinuxマシンでTripwireを実行して、迅速な侵入検知と警告を行いました。それは効果的ですが、セットアップするのは少し獣です。ルールがログファイルと一致したときにアクションを実行できます。もちろん、経験豊富なハッカーは、Tripwireが侵入するとすぐに無効にして、セッションが途切れないようにすることを知っています。

MacWorldのヒントでは、OS XでTripwireを設定する方法について説明しています。それは単純ではなく、この記事はテストされていないことを述べることで終わります。


OS X Lion Serverの適応型ファイアウォールは、人々を締め出す素晴らしい仕事をしました。標準のファイアウォールと比較して、TripwireとSnortにはどのような利点がありますか?努力する価値はありますか?
-bloudraak

1
TripwireとSnortのどちらも、ファイアウォールの代わりになるものではありません。それらは侵入検知システムです。さまざまなアプローチを使用して、システムログで不審なアクティビティを監視し、メールの送信やリモートデーモンのシャットダウン、ネットワークポートのシャットダウンなどの監視結果に基づいてアクションを実行できます。
イアンC.

4

sshを強化して、denyhosts、sshguard、Snort、Barnyard、Base、Swatchをインストールできます。

詳細については、次のリンクを参照してください。

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

  1. ルートおよびパスワードログインをオフにします。

    vi /etc/sshd_config

    PermitRootLogin no
    PasswordAuthentication no
    ChallengeResponseAuthenticatio no

    次にssh-keygen、リモートクライアントでを使用して、サーバーへのリモートログインに使用できる公開/秘密キーを生成します。  

    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とsshguardをインストールします。

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

    sshトラフィックだけでなく、すべてのトラフィックをブロックするようにdenyhostsを構成できます。

  3. Snort、攻撃の世界地図:

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


3

提起された質問に直接答える。誰かが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

grep上記を編集して、必要に応じて独自の固定IPを除外し、メールアドレスを使用します。他の回答のコードの一部を組み合わせて、VNCの失敗を追加できます。


スケジュールに従って実行するスクリプトを作成し、今夜のメールを待っています。
bloudraak

日常的に物事を行う上での問題は、侵入の風をつかむまでに、すでに被害が発生している可能性があることです。
イアンC.

@Ian C.-同意しましたが、メールの頻度はいつでも増やすことができます。さらに、設定した侵入防止対策にある程度の信頼を持たなければなりません。Fail2banのセットアップには非常に合理的な自信があります。
-afragen

2

Fail2banを少し拡張するには、セットアップして実行したら、深夜の直前に実行するスクリプトを使用します。このスクリプトは、ログをスクレイピングし、Fail2banが前日に行ったことをメールで送信します。

スクリプトは次のとおりであり、cronまたはlaunchd plistから実行できます。

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

もちろん、選択したメールアドレスを使用する必要があります。

Fail2banのセットアップは、まったく別の問題です。私はそれについて広範囲に書きました。


0

Xコードコマンドラインコンパイラがインストールされている場合、Mac OS XにGoogle Authenticator PAMプラグインをインストールするのは非常に簡単です。コードと手順は次のとおりです。

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

トークンを初期化(携帯電話でアプリにフィードするコードを生成)すると、マシンを保護するための2要素認証が得られます。初期化されたトークンのないアカウントはログインできません。そのため、rootログインを許可したくない場合は、そのアカウントのキーを初期化しないでください。

しかし、真剣に、DenyHostsのようなものは、SSHをインターネット上で開いておく必要がある場合にのみ意味があります。残念ながら、Mac OS X V10.8以降、AppleのSSHデーモンからtcpwrappersサポートが削除されたため、/ etc / deny.hostsは無視されます。

それを回避するために、MacPortsを使用して最新のopensshデーモンをインストールし、tcpwrappersの全機能を復元し、編集してDenyHostsデーモンを使用して/var/log/system.logを監視し、ログインとパスワードを推測するIPを禁止しました。また、OSをアップグレードするたびにMacPortsを更新し、openssh / DenyHostsを確認/再インストールすることを忘れないでください。

幸運を!


0

これは古い投稿であることに気づきましたが、これはウェブを探索する時間をプログラムしたり節約したりできない人に役立つかもしれないと考えました。昼休みにこれを書いたところです。成功した試行と失敗した試行、および失敗した試行によるブロックされたIPをメールで送信します。プログラムはRubyで書かれています。Sendmailは、メールおよびファイルテールgemと一緒にインストールされます。

以下のソースコード:

#!/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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.