F2 के फेल होने पर IP पर प्रतिबंध लगा दिया


18

मैं सार्वजनिक रूप से दृश्यमान सेवाओं के साथ सभी सर्वरों पर fail2ban का उपयोग कर रहा हूं और मुझे आश्चर्य है:

  1. क्या मेजबानों को नियंत्रित करने वाले मेजबानों के बीच प्रतिबंधित आईपी साझा करने का एक आसान तरीका है?
  2. क्या उस डेटा को एकत्र करने और प्रकाशित करने की कोई सेवा है?

मुझे इस सर्वर को स्थापित करने के 1 दिन से अनगिनत लॉगिन प्रयास मिल रहे हैं।


2
इंटरनेट पर आपका स्वागत है। इस सूची को पोस्ट करने का कोई मतलब नहीं है - हम सभी इस स्थिति को अच्छी तरह से जानते हैं।
स्वेन

1
धन्यवाद। मेरा मानना ​​है कि कुछ का वर्णन करते समय उदाहरण अच्छा लगता है। यदि आप बेहतर जानते हैं तो उन्हें अनदेखा करने के लिए स्वतंत्र महसूस करें।
ndemou

मैंने आईपी सूची को हटा दिया है और आपके प्रश्न को एक प्रश्न में बदलने का अवसर लिया है। न केवल सूची को पोस्ट करने का कोई मतलब नहीं है, बल्कि यह सवाल का सुराग भी देता है और तेजी से पुराना हो जाएगा।
20

2
इसके अलावा मेरा सुझाव है कि विफलता 2 एबॉन को हटा दें और इस बारे में देखभाल करना बंद करें। यदि आपने पासवर्ड प्रमाणीकरण बंद कर दिया है, तो बहुत कम और कुछ है जो आप कर सकते हैं। fail2ban अतीत में शोषण किया गया है और एक संभावित सुरक्षा छेद है कि बिल्कुल कोई लाभ प्रदान करता है एक शुद्ध नुकसान जोड़ रहा है।
अपराह्न

@gentent: आपके सुझावों के बारे में: धन्यवाद - मैंने पहले कभी भी असफल 2 शोषण के इतिहास को नहीं देखा। सुरक्षा के लिए S / WI एक बेहतर ट्रैक रिकॉर्ड की उम्मीद करेगा। आपके संपादन के बारे में: मेरा मानना ​​है कि किसी प्रश्न को इतना बदल देना अच्छा नहीं है। यदि यह एक बुरा सवाल है, तो पोस्टर को परिणाम भुगतने होंगे। वैसे भी मैं इसे अभी छोड़ दूंगा।
ndemou

जवाबों:


8

मैंने एक बार इस साइट पर fail2ban डेटा के केंद्रीकरण के लिए एक प्रणाली देखी , और एक संशोधित संस्करण बनाया। डेटाबेस वही है, बू मैंने बदल दिया और कुछ स्क्रिप्ट बनाई।

मेरे सिस्टम में 4 घटक हैं:

  1. 2 डेटाबेस में विफल

    यह एक MySQL डेटाबेस है जिसमें केवल एक टेबल है erp_core_fail2ban:

    CREATE TABLE IF NOT EXISTS 'erp_core_fail2ban' (
      'id' bigint(20) unsigned NOT NULL AUTO_INCREMENT,
      'hostname' varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
      'created' datetime NOT NULL,
      'name' text COLLATE utf8_unicode_ci NOT NULL,
      'protocol' varchar(16) COLLATE utf8_unicode_ci NOT NULL,
      'port' varchar(32) COLLATE utf8_unicode_ci NOT NULL,
      'ip' varchar(64) COLLATE utf8_unicode_ci NOT NULL,
      PRIMARY KEY ('id'),
      KEY 'hostname' ('hostname','ip')
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    
  2. fail2ban.php

    जब भी किसी होस्ट को प्रतिबंधित किया जाता है, तो वह डेटाबेस को पॉप्युलेट करेगा:

    
    <?php
    require_once("/etc/fail2ban/phpconfig.php");
    
    $name = $_SERVER["argv"][1];
    $protocol = $_SERVER["argv"][2];
    $port = $_SERVER["argv"][3];
    if (!preg_match('/^\d{1,5}$/', $port))
        $port = getservbyname($_SERVER["argv"][3], $protocol);
    $ip = $_SERVER["argv"][4];
    
    $hostname = gethostname();
    
    $query = "INSERT INTO 'erp_core_fail2ban' set hostname='" . addslashes($hostname) . "', name='" . addslashes($name) ."', protocol='" . addslashes($protocol) . "', port='" . addslashes($port) . "', ip='" . addslashes($ip) . "', created=NOW()";
    $result = mysql_query($query) or die('Query failed: ' . mysql_error());
    mysql_close($link);
    exit;
    ?>
    
  3. cron2ban

    आप इसे हर मिनट, क्रेसबब पर चलाने के लिए डालते हैं। यह अंतिम जोड़े गए मेजबानों को पुनः प्राप्त करेगा, और उन्हें प्रतिबंधित करेगा।

    
    <?php
    // phpconfig.php will have database configuration settings
    require_once("/etc/fail2ban/phpconfig.php");
    
    // file with only a line, containing the last id banned
    $lastbanfile="/etc/fail2ban/lastban";
    
    $lastban = file_get_contents($lastbanfile);
    
    // select only hosts banned after last check
    $sql = "select id, ip from erp_core_fail2ban where id > $lastban";
    $result = mysql_query($sql) or die('Query failed: ' . mysql_error());
    mysql_close($link);
    
    while ($row = mysql_fetch_array($result)) {
            //
            $id = $row['id'];
            $ip = $row['ip'];
    
    
        exec("fail2ban-client set $jail banip $ip");
    
    } // $id contains the last banned host, add it to the config file file_put_contents($lastbanfile, $id); ?>
  4. phpconfig

    यह फ़ाइल / etc / fail2ban पर जाती है और इसमें डेटाबेस कॉन्फ़िगरेशन और जेल चयन होता है।

    
    <?php
    // jail to be used
    $jail = "ssh";
    
    // file to keep the last ban
    $lastbanfile="/etc/fail2ban/lastban";
    
    // database configuration
    $dbserver="localhost";
    $dbuser="root";
    $dbpass="root";
    $dbname="fail2ban";
    
    // connect to database
    $link = mysql_connect($dbserver, $dbuser, $dbpass) or die('Could not connect: ' . mysql_error());
    mysql_select_db($dbname) or die('Could not select database');
    
    ?>
    

उन फ़ाइलों को बनाएँ और fail2ban से कॉन्फ़िगरेशन बदलें:

actionban = .....PHP स्क्रिप्ट को लागू करने के लिए एक नई पंक्ति के साथ लाइन के बाद :

/root/fail2ban.php <name> <protocol> <port> <ip>

अपने सभी सर्वरों पर इस संरचना का उपयोग करने से यह आश्वस्त होगा कि हर बार जब एक होस्ट एक सर्वर पर प्रतिबंध लगाता है, तो अन्य सभी सर्वर भी इसे प्रतिबंधित कर देंगे।


3

इसलिए मैंने एक ही आईपी एड्रेस को एक के बाद एक वेब सर्वर के मेरे क्लस्टर को हिट करने के बाद ऐसा करने के बारे में अनुसंधान का एक गुच्छा किया। चूंकि मैं AWS का उपयोग कर रहा हूं, मुझे लगा कि 5 सर्वरों के परीक्षण के मेरे पहले दो दिनों में एक आसान तरीका और इसकी खूबसूरती से काम हो सकता है।

पहली बात जो मैं सुझाता हूं कि वह अस्थायी रूप से SELinux को अक्षम कर रहा है, हम इसके साथ अंत में निपटेंगे। मैं एक SELinux विशेषज्ञ नहीं हूँ, लेकिन मैंने अभी तक क्या काम किया है।

प्राथमिक आवश्यकता एक साझा फ़ाइल स्रोत है, मैं AWS EFS का उपयोग करता हूं। एक बार जब नई ड्राइव का प्रावधान और माउंट हो जाता है, तो मैंने EFS ड्राइव में एक सबफ़ोल्डर में /etc/fail2ban/fail2ban.conf के अंदर logtarget बदल दिया।

logtarget = /efsmount/fail2ban/server1.log

फिर मैंने एक साधारण फ़िल्टर लिखा और उसे /etc/fail2ban/filter.d/fail2ban-n.ff में रखा।

[Definition]

failregex = .* Ban <HOST>

ignoreregex =

फ़िल्टर को /etc/fail2ban/jail.local पर जोड़ा गया

[fail2ban-log]
enabled = true
port = http,https
findtime = 86400 ; 1 day
logpath  = /efsmount/fail2ban/server1.log
        /efsmount/fail2ban/server2.log
        /efsmount/fail2ban/server3.log
        /efsmount/fail2ban/server4.log
maxretry = 1

तब विफल 2b पुनरारंभ हुआ

sudo fail2ban-client reload

अब तक सब ठीक है! कोई भी दर्दनाक हिस्सा SELinux नहीं है। के बाद मैं एक बिट के लिए विफल करने के लिए चलाते हैं, मैं इस कमांड को चलाया जो फ़िल्टर के माध्यम से विफल 2 बटन की अनुमति देगा।

sudo grep fail2ban /var/log/audit/audit.log | sudo audit2allow -M fail2ban-nfs

Audit2allow आपको इस कमांड को चलाने के लिए कहेगा

sudo semodule -i fail2ban-nfs.pp

मैं अभी भी अपने SELinux लॉग को यहाँ और वहाँ देख रहा हूँ कि क्या कोई और खंडन है या नहीं। अगर किसी के पास इस बात पर टिप है कि उस स्पष्ट SELinux को दूसरी विधि से कैसे प्राप्त किया जाए जो कि भयानक हो।

sudo cat /var/log/audit/audit.log |grep fail2ban |grep denied

इस बिंदु पर मुझे अभी भी त्रुटियाँ मिल रही थीं जब असफल 2 बार पुनरारंभ करना। जेल में कार्रवाई करते समय एक बग होता है। जरा सी गुगली के बाद मुझे यह मिला जो अब तक काम कर रहा है। कई फ़ाइलों की ओर इशारा करते हुए लॉगपाथ निर्देश में लाइन टूटने के कारण मैंने जो भी पढ़ा है। मैंने अल्पविराम, रिक्त स्थान, आदि के साथ प्रयास किया।

action_mwm = %(banaction)s[name=%(__name__)s, bantime="%(bantime)s", port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
             %(mta)s-whois-matches[name=%(__name__)s, dest="%(destemail)s", chain="%(chain)s"]

action = %(action_mwm)s

SELinux को वापस चालू करना न भूलें!


आप की तरह, मैंने विफलता 2ब्बन में बहुत प्रयास किया है (मैंने इस प्रश्न को पोस्ट किया है), लेकिन थोड़ा और शोध के बाद मैंने असफलतापूर्ण सलाह को विफल 2बान हटाने के लिए लिया है (प्रश्न पर टिप्पणी देखें)
ndemou

2

मैंने अभी इसे लागू किया है और अब तक यह अच्छी तरह से काम कर रहा है। हालाँकि, मुझे कुछ php को अपडेट करना पड़ा क्योंकि मूल उत्तर में लिपियों में पदावनत कार्य का उपयोग होता है।

यहाँ अद्यतन स्क्रिप्ट हैं

phpconfig.php

#!/usr/bin/php
<?php
// jail to be used
$jail = "ssh";

// file to keep the last ban
$lastbanfile="/etc/fail2ban/lastban";

// database configuration
$dbserver="[your.mysql.hostname]";
$dbport="[sql.port.default.is.3306]";
$dbuser="[sql.user";
$dbpass="[sql.password]";
$dbname="[sql.table]";

// connect to database
$link = mysqli_connect($dbserver, $dbuser, $dbpass, $dbname, $dbport) or die('Could not connect: ' . mysqli_error());
mysqli_select_db($link,$dbname) or die('Could not select database');

?>

fail2ban.php

#!/usr/bin/php 
<?php
require_once("/etc/fail2ban/phpconfig.php");

$name = $_SERVER["argv"][1];
$protocol = $_SERVER["argv"][2];
$port = $_SERVER["argv"][3];
if (!preg_match('/^\d{1,5}$/', $port))
    $port = getservbyname($_SERVER["argv"][3], $protocol);
$ip = $_SERVER["argv"][4];

$hostname = gethostname();

$query = "INSERT INTO erp_core_fail2ban (hostname,created,name,protocol,port,ip) VALUES ('$hostname',NOW(),'$name','$protocol','$port','$ip')";
echo $query;
$result = mysqli_query($link,$query) or die('Query failed: ' . mysqli_error($link));
mysqli_close($link);
exit;
?>

cron2ban.php

#!/usr/bin/php
<?php
// phpconfig.php will have database configuration settings
require_once("/etc/fail2ban/phpconfig.php");

// file with only a line, containing the last id banned
$lastbanfile="/etc/fail2ban/lastban";

$lastban = file_get_contents($lastbanfile);
// select only hosts banned after last check
$sql = "SELECT id,ip FROM erp_core_fail2ban WHERE id > $lastban";
$result = mysqli_query($link,$sql) or die('Query failed: ' . mysqli_error($link));
mysqli_close($link);

while ($row = mysqli_fetch_array($result)) {
        //
        $id = $row['id'];
        $ip = $row['ip'];

    exec("fail2ban-client set $jail banip $ip");


}

// $id contains the last banned host, add it to the config file
file_put_contents($lastbanfile, $id);
?>

इसके अलावा, जहाँ भी आप विफलता 2ban.php क्रिया को रखते हैं, उसके ऊपर उतनी ही रेखा होनी चाहिए, जितनी ऊपर हो। उदाहरण के लिए:

actionban = ...
            /etc/fail2ban/fail2ban.php

अन्यथा fail2ban प्रारंभ नहीं होगा। मुझे उम्मीद है कि यह किसी को भी इसे लागू करने की कोशिश करने में मदद करता है।


1

के लिए एक वैकल्पिक fail2banहै denyhosts जो एक तुल्यकालन कार्यक्षमता के साथ आता है। स्थापना काफी हद तक समान है fail2ban, अधिक जानकारी के लिए साइबरसाइट के ट्यूटोरियल को देखें

समस्या यह है कि सिंक्रनाइज़ेशन सेवा केंद्रीकृत है और सर्वर साइड का स्रोत कोड उपलब्ध नहीं लगता है, इसलिए आप आसानी से अपनी खुद की DenyHosts सेवा शुरू नहीं कर सकते हैं और आपको 3rd पार्टी पर भरोसा करना होगा (जो कुछ के लिए ठीक हो सकता है बक्सों का इस्तेमाल करें)।


FWIW सिंक सेवा का लिंक आज नीचे है
ndemou

0

हाँ और हाँ। दोनों किया जा सकता है।

आईपी ​​की सूची साझा करने के लिए आपको एक उपयुक्त तंत्र खोजने की आवश्यकता है। यदि आप उदाहरण के लिए AWS का उपयोग कर रहे हैं तो आप s3 का लाभ उठा सकते हैं। आप लिनक्स होस्ट या सभी मेजबानों के लिए एक डेटाबेस के बीच rsync का उपयोग कर सकते हैं। आप अपने पसंदीदा प्रोग्रामिंग भाषा के साथ एक सेवा को दस्तक दे सकते हैं जो एक आरामदायक एपीआई प्रदान करता है जो आपकी पसंद है।

यदि सार्वजनिक रूप से सूची को साझा करने के संदर्भ में आप एक वेबसाइट बना सकते हैं और एक साधारण टेक्स्ट फ़ाइल की मेजबानी कर सकते हैं, तो कुछ पहले से ही ऐसी सूची प्रदान करते हैं (भीड़ नहीं है जो मुझे पता है)। अपनी खुद की साइट / सेवा कैसे बनाई जाए यह एक उत्तर के दायरे से बाहर होगा, हालांकि ऐसा करना बहुत मुश्किल नहीं होना चाहिए।


0
Is there an easy way to share banned IPs between hosts I control?

एक काफी मैनुअल सेटअप कॉन्फ़िगरेशन को बदलना होगा जो iptablesनियमों को अपडेट करने के लिए कॉल करता है ताकि यह आपके स्वयं के डेविजिंग की एक स्क्रिप्ट को कॉल करे जो मेजबान की सूची के माध्यम से लूप करता है (एक फ़ाइल से पढ़ें?) और iptablesएसएसएच के माध्यम से प्रत्येक पर कॉल करता है । आपको इस काम के लिए कॉन्फ़िगर किए गए सभी होस्टों के बीच कुंजी-आधारित स्थिति की आवश्यकता होगी। कठपुतली जैसे व्यवस्थापक स्वचालन उपकरण इसे स्थापित करना और इसे आसान बनाए रख सकते हैं। यह बहुत कुशल नहीं होगा, लेकिन जब तक आप भारी मात्रा में जांच करने वाले ट्रैफ़िक (और / या मेजबानों की एक बड़ी संख्या) नहीं देखते हैं, तब मुझे यकीन है कि यह काफी अच्छा होगा। यदि आपके पास केवल कुछ होस्ट हैं, तो आपको एक फ़ाइल के माध्यम से लूप करने की भी आवश्यकता नहीं है: प्रत्येक को क्रम में दूसरों को कॉल करने के लिए कॉन्फ़िगर करें। स्क्रिप्टिंग का प्रयास कम से कम होगा।

Is there a way to share banned IPs publicly?

इसमें कोई शक नहीं कई तरीके हैं। क्या स्क्रिप्ट (ओं) के ऊपर डेटा को DB में गिरा दिया गया है और ग्राहकों को उस से पढ़ा है, नए नियमों के लिए मतदान कर रहे हैं और उन्हें चला रहे हैं कि वे आते हैं। सरल "एक नियम चलाते हैं जैसा कि आप देखते हैं" सही नहीं होगा यदि कई मेजबान जानकारी जमा कर रहे हैं, उदाहरण के लिए यह मामला:

  1. 12:00 सर्वर 1 में "प्रतिबंध मेजबान एक्स अब", और "एक घंटे में मेजबान मेजबान एक्सन" कहते हैं।
  2. 12:45 पर सर्वर 2 कहता है, "अब होस्ट X पर प्रतिबंध लगाओ", और "एक घंटे में मेजबान होस्ट करें"।
  3. ओवरलैप का मतलब है कि सर्वर 3 एक घंटे के लिए होस्ट एक्स पर प्रतिबंध लगाएगा, न कि आदेश में दिए निर्देशों का पालन करने पर एक घंटा + 45 मिनट।

लेकिन यह एक महत्वपूर्ण समस्या नहीं होनी चाहिए, और यदि आप डेटाबेस के साथ थोड़ा और अधिक चतुर हो जाते हैं तो आप कई सबमिशन को अधिक सफाई से प्रबंधित कर सकते हैं यदि आपने तय किया कि यह प्रयास के लायक है।

चल रहा है कि एक सार्वजनिक सेवा के रूप में आप हालांकि व्यवस्थापक परेशानी की दुनिया के लिए खुल जाएगा:

  • बैंडविड्थ और अन्य संसाधनों का प्रबंधन यदि आप बहुत सारे उपयोगकर्ता प्राप्त करते हैं।
  • भुगतान के तरीकों को व्यवस्थित करना और लागू करना आपको किसी तरह से एक्सेस करने के लिए चार्जिंग समस्या से निपटने का प्रयास करना चाहिए।
  • अपने डेटाबेस को प्रदूषित करने के प्रयासों से निपटते हुए, एक बुरा अभिनेता जो एक प्रतियोगी को व्यावसायिक असुविधा या ब्लैकमेल प्रयास के रूप में सूची की सदस्यता लेने वाले स्थानों से प्रतिबंधित करने की कोशिश कर रहा है।
  • जब किसी पर प्रतिबंध लगाया जाता है, तो शिकायतों से निपटना और सोचता है कि उन्हें नहीं होना चाहिए।
  • DDoS आक्रमणों जो के साथ काम करेंगे , तो आपकी सेवा किसी के बॉट असुविधाजनक में सभी सफल पर है आते हैं।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.