누군가 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) ) 과 같은 것을 사용하는 것을 고려해 보았 습니까? 차단 기간 등에 대한 규칙을 설정합니다. 해킹을 방지하는 데 도움이되며 로그인 시도마다 이메일을받는 것이 더 도움이 될 것입니다.
boretom

답변:


4

최선의 방어는 항상 불필요한 서비스를 끄는 것입니다. 원격 데스크톱을 사용하지 않는 경우 : 끕니다. HTTP 또는 FTP 서버를 사용하지 않는 경우 : 서버를 끄십시오. 서비스 실행이 적고 침입자가 악용 할 수있는 진입 점이 줄어 듭니다.

잠그는 것 외에도 OS X에 적합한 무료 및 오픈 소스 제품이있어 시스템에서 침입 탐지를 수행 할 수 있습니다.

흡입

개인적으로 실행하지는 않았지만 침입 탐지에 대해 알고 신뢰하는 동료가 있습니다. BSD와 호환되므로 OS X에 적합합니다. Snort와 함께 사용할 수있는 또 다른 단점은 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에 잘 이식되어 실행된다는 사실에 대한 신뢰를 얻습니다. Homebrew를 설치 하면 다음 작업 만하면 됩니다.

> brew install snort

이제 시작할 준비가되었습니다.

이 체크 아웃 OS X 라이온 서버 설치 가이드를 위해 스 노트를 Snort를 커뮤니티이 OS X 컴퓨터에 대한 규칙을 쓰기 시작하는 제공. 이 문서는 훌륭한 문서이며, 소스에서 Snort를 설치하는 것 외에도 (필요하지는 않음) OS X Lion 서버 인스턴스를 보호하기 위해 수행해야하는 모든 작업에 대해 설명합니다. Homebrew를 통해 설치하는 경우 소스 코드에서 설치하는 것에 대해 걱정할 필요가 없으므로 PDF의 섹션 5 (13 페이지)에서 시작하십시오.

트립 와이어

Linux 컴퓨터에서 Tripwire 를 실행 하여 빠른 침입 탐지 및 경고를 수행했습니다. 효과적이지만 설정하는 것은 약간의 야수입니다. 규칙이 로그 파일과 일치 할 때 작업을 수행 할 수 있습니다. 물론 정통한 해커는 침입하자마자 Tripwire를 비활성화하여 세션이 중단되는 것을 막을 것입니다.

MacWorld 힌트 는 OS X에서 Tripwire를 설정하는 것에 대해 설명합니다 . 그것은 간단하지 않으며 기사는 테스트되지 않았다는 언급으로 끝납니다.


OS X Lion 서버 적응 형 방화벽은 사람들을 차단하는 데 큰 도움이되었습니다. Tripwire와 Snort는 표준 방화벽에 비해 어떤 이점이 있습니까? 노력할만한 가치가 있습니까?
bloudraak

1
Tripwire 또는 Snort는 방화벽 대체품이 아닙니다. 이들은 침입 탐지 시스템입니다. 이들은 의심스러운 활동에 대해 시스템 로그를 모니터링하기 위해 여러 가지 접근 방식을 사용하며, 이메일 전송 또는 원격 데몬 종료 또는 네트워크 포트 종료와 같은 결과 모니터링을 기반으로 조치를 취할 수 있습니다.
Ian C.

4

ssh를 강화하고 거부 호스트, 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. 거부 호스트 및 sshguard를 설치하십시오.

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

    ssh 트래픽뿐만 아니라 모든 트래픽을 차단하도록 거부 호스트를 구성 할 수 있습니다.

  3. 스 노트, 세계 공격 맵 :

    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

일상적인 일을하는 데 따르는 어려움은 침입의 바람을 잡을 때 이미 피해를 입었을 수 있습니다.
Ian C.

@Ian C.-동의하지만 이메일 빈도를 늘릴 수 있습니다. 또한 설정 한 침입 방지 조치에 대한 믿음이 있어야합니다. Fail2ban 설정에 대해 매우 합리적인 수준의 확신을 가지고 있습니다.
afragen

2

Fail2ban 의 비트를 확장하기 위해 일단 설정되고 실행되면 자정 직전에 실행되는 스크립트가있어 로그를 긁어 내고 Fail2ban이 전날에했던 일을 이메일로 보냅니다.

스크립트는 다음과 같으며 cron 또는 실행 된 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 OTP 플러그인을 설치하는 것은 매우 간단합니다. 코드와 지침은 다음과 같습니다.

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

토큰을 초기화하면 (휴대 전화의 앱에 공급하는 코드 생성) 컴퓨터를 보호하기위한 2 단계 인증이 제공됩니다. 초기화 된 토큰이없는 계정은 로그인 할 수 없으므로 루트 로그인을 허용하지 않으려면 해당 계정의 키를 초기화하지 마십시오.

그러나 진지하게 DenyHosts와 같은 것은 인터넷에서 SSH를 열어 두어야한다면 의미가 있습니다. 불행히도 Mac OS X V10.8부터 Apple의 제거 된 tcpwrappers가 SSH 데몬에서 지원되므로 /etc/deny.hosts는 무시합니다.

이 문제를 해결하기 위해 MacPorts를 사용하여 최신 openssh 데몬을 설치하고 전체 tcpwrappers 기능을 복원하고 DenyHosts 데몬을 편집하고 사용하여 /var/log/system.log를 모니터링하고 로그인 및 암호를 추측하는 IP를 금지했습니다. . 또한 OS를 업그레이드 할 때마다 MacPorts를 업데이트하고 openssh / DenyHosts를 확인 / 재설치하는 것을 잊지 마십시오.

행운을 빕니다!


0

나는 이것이 오래된 게시물이라는 것을 알고 있지만 이것은 웹을 검색하는 시간을 프로그래밍하거나 저장할 수없는 누군가를 도울 수 있다고 생각했습니다. 방금 점심 시간에 이것을 썼습니다. 성공하지 못한 시도를 통해 IP를 차단하고 성공 및 실패한 시도를 이메일로 보냅니다. 이 프로그램은 루비로 작성되었습니다. Sendmail은 메일 및 파일 꼬리 보석과 함께 설치됩니다.

아래 소스 코드 :

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