ব্যর্থ 2ban নিষিদ্ধ আইপিগুলি ভাগ করে নেওয়া


18

আমি সর্বজনীনভাবে দৃশ্যমান পরিষেবাদি সহ সমস্ত সার্ভারগুলিতে ব্যর্থ 2ban ব্যবহার করছি এবং আমি অবাক হই:

  1. সেখানে একটা Is সহজ হোস্ট আমি নিয়ন্ত্রণ মধ্যে নিষিদ্ধ আইপিগুলি ভাগ করার জন্য উপায়?
  2. সেখানে ডেটা সংগ্রহ এবং প্রকাশের জন্য কি কোনও পরিষেবা আছে?

এই সার্ভারটি সেট আপ করার 1 দিন থেকে আমি অগণিত লগইন প্রচেষ্টা পেয়ে যাচ্ছি।


2
ইন্টারনেটে স্বাগতম এই তালিকা পোস্ট করার কোনও অর্থ নেই - আমরা সকলেই এই পরিস্থিতিটি খুব ভাল করে জানি।
সোভেন

1
ধন্যবাদ। আমি বিশ্বাস করি যে কোনও কিছুর বর্ণনা দেওয়ার সময় উদাহরণগুলি থাকা ভাল। যদি আপনি আরও ভাল জানেন তবে এগুলিকে অবহেলা করতে দ্বিধা বোধ করবেন।
এনডেমো

আমি আইপি তালিকাটি সরিয়ে নিয়েছি এবং আপনার প্রশ্নটিকে একটি প্রশ্নে পরিণত করার সুযোগ নিয়েছি। কেবল তালিকা পোস্ট করার কোনও অর্থ নেই, এটি প্রশ্নকেও ছড়িয়ে দেয় এবং দ্রুত পুরানো হয়ে যায়।
gparent

2
এছাড়াও আমার পরামর্শ হ'ল ব্যর্থতা 2 সরান এবং এ সম্পর্কে যত্ন নেওয়া বন্ধ করুন। আপনি যদি পাসওয়ার্ড প্রমাণীকরণ বন্ধ করে রেখেছেন তবে অন্য খুব কম আপনি করতে পারেন। ব্যর্থ 2ban অতীতে ব্যবহার করা হয়েছে এবং সম্ভাব্য সুরক্ষা গর্ত যুক্ত করা যা একেবারেই কোনও সুবিধা দেয় না এটি নেট ক্ষতি loss
gparent

@ গার্জেন্ট: আপনার পরামর্শ সম্পর্কে: ধন্যবাদ - আমি এর আগে ইতিহাসের ব্যর্থতা 2 শোনে কখনও দেখিনি। সুরক্ষার জন্য এস / ডাব্লুআই আরও ভাল ট্র্যাক রেকর্ড আশা করবে। আপনার সম্পাদনাগুলি সম্পর্কে: আমি বিশ্বাস করি না যে কোনও প্রশ্নকে এত বেশি পরিবর্তন করা ভাল। যদি এটি একটি খারাপ প্রশ্ন হয় তবে পোস্টার এর পরিণতি ভোগ করতে দিন। যাই হোক আমি এখন যেমন আছে তেমনি রেখে দেব leave
nddou

উত্তর:


8

আমি একবার এই সাইটে ব্যর্থ 2 বন ডেটা কেন্দ্রীয় করার জন্য একটি সিস্টেম দেখেছি এবং একটি পরিবর্তিত সংস্করণ তৈরি করেছি। ডাটাবেস একই, বু আমি পরিবর্তন করে কিছু স্ক্রিপ্ট তৈরি করেছি।

আমার সিস্টেমে 4 টি উপাদান রয়েছে:

  1. ব্যর্থ 2ban ডাটাবেস

    এটি একটি মাইএসকিউএল ডাটাবেস যা কেবল একটি টেবিলযুক্ত 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

    এই ফাইলটি / ইত্যাদি / ফেলফল 2 এ যায় এবং এতে ডাটাবেস কনফিগারেশন এবং জেল নির্বাচন রয়েছে।

    
    <?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');
    
    ?>
    

এই ফাইলগুলি তৈরি করুন এবং ব্যর্থ 2ban থেকে কনফিগারেশনটি পরিবর্তন করুন:

actionban = .....পিএইচপি স্ক্রিপ্ট শুরু করার জন্য একটি নতুন সারি যুক্ত রেখার পরে :

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

আপনার সমস্ত সার্ভারে এই কাঠামোটি ব্যবহার করা নিশ্চিত করবে যে প্রতিবার কোনও হোস্ট একটি সার্ভারে নিষিদ্ধ হয়ে গেলে অন্যান্য সমস্ত সার্ভারও এটি নিষিদ্ধ করবে।


3

সুতরাং আমি একই আইপি ঠিকানা দেখার পরে এটি কীভাবে করতে হবে তা নিয়ে একগুচ্ছ গবেষণা করেছি যা একের পর এক আমার ওয়েব সার্ভারের ক্লাস্টারে আঘাত করে। যেহেতু আমি এডাব্লুএস ব্যবহার করছি আমি অনুভব করেছি যে আমার 5 টি সার্ভার পরীক্ষার প্রথম দু'দিনে কোনও সহজ উপায় এবং এটি সুন্দরভাবে কাজ করতে পারে।

আমি প্রথমে প্রস্তাবিত জিনিসটি সাময়িকভাবে SELinux অক্ষম করা হচ্ছে, আমরা শেষে এটি মোকাবিলা করব। আমি কোনও সেলিনাক্স বিশেষজ্ঞ নই তবে আমি এখন পর্যন্ত কী কাজ করেছি।

প্রাথমিক প্রয়োজনটি একটি ভাগ করা ফাইল উত্স, আমি এডাব্লুএস ইএফএস ব্যবহার করি। নতুন ড্রাইভটি সরবরাহ ও মাউন্ট হয়ে যাওয়ার পরে, আমি /etc/fail2ban/fail2ban.conf এর ভিতরে লগটারেজেটটি ইএফএস ড্রাইভের একটি সাবফোল্ডারে পরিবর্তন করেছি।

logtarget = /efsmount/fail2ban/server1.log

তারপরে আমি একটি সহজ ফিল্টার লিখে এটিকে /etc/fail2ban/filter.d/fail2ban-log.conf এ রেখেছি

[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

তারপরে ব্যর্থতা 2 আবার চালু করুন

sudo fail2ban-client reload

এ পর্যন্ত সব ঠিকই! কোনও বেদনাদায়ক অংশটি সেলইনাক্স নয়। আমি বিফল 2banকে কিছুটা দৌড়ানোর পরে আমি এই কমান্ডটি চালিয়েছি যা ফিল্টারগুলির মাধ্যমে ব্যর্থ 2বানকে অনুমতি দেয়।

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

অডিটলিগ আপনাকে এই আদেশটি চালাতে বলবে

sudo semodule -i fail2ban-nfs.pp

আমি এখনও আমার সেলইনাক্স লগগুলি এখানে এবং সেখানে পরীক্ষা করে দেখছি যে আরও কোনও অস্বীকার আছে কিনা তা দেখতে। কারও কাছে কীভাবে অন্য কোনও পদ্ধতির সাথে সেই পরিষ্কার SELinux পাওয়া যায় তা সম্পর্কে টিপস রয়েছে যা দুর্দান্ত।

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

এই মুহুর্তে আমি ব্যর্থ 2ban পুনরায় চালু করার সময় ত্রুটিগুলি পেয়েছিলাম। জেল.লোকালে অ্যাকশন = অ্যাকশন_ এমডব্লুএল ব্যবহার করার সময় একটি ত্রুটি রয়েছে। কিছুক্ষণ গুগল করার পরে আমি এটি পেয়েছি যা এখন পর্যন্ত কাজ করছে। লগপথের লাইনটি একাধিক ফাইলের দিকে নির্দেশিত করার কারণে লাইনটি ভেঙে যা পড়েছি তা থেকে। আমি কমা, ফাঁকা স্থান ইত্যাদির সাহায্যে চেষ্টা করেছি আর কিছুই_অ্যাকশন_ এমডব্লিউএল দিয়ে কাজ করে নি।

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 আবার চালু করতে ভুলবেন না!


আপনার মত, আমি ব্যর্থ 2ban এ প্রচুর প্রচেষ্টা বিনিয়োগ করেছি (আমি এই প্রশ্নটি পোস্ট করেছি) তবে আরও কিছু গবেষণা করার পরে আমি ফেলপ্যাব্যান অপসারণের বিষয়ে gparent পরামর্শ নিয়েছি (প্রশ্নের মন্তব্য দেখুন)
এনডেমো

2

আমি সবেমাত্র এটি বাস্তবায়ন করেছি এবং এখনও পর্যন্ত এটি ভালভাবে কাজ করছে বলে মনে হচ্ছে। তবে, আমাকে কিছু পিএইচপি আপডেট করতে হয়েছিল কারণ মূল উত্তরের স্ক্রিপ্টগুলি হ্রাস করা ফাংশন ব্যবহার করে।

আপডেট হওয়া স্ক্রিপ্টগুলি এখানে

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

অন্যথায় ব্যর্থ 2ban শুরু হবে না। আমি আশা করি এটি যে কাউকে এটি মোতায়েন করার চেষ্টা করছে তাদের সহায়তা করবে।


1

একটি বিকল্প fail2banহয় DenyHosts যা সিঙ্ক্রোনাইজেশন কার্যকারিতা দিয়ে আসে। ইনস্টলেশন মোটামুটি অনুরূপ fail2ban, আরও তথ্যের জন্য সাইবারসিটির টিউটোরিয়াল দেখুন

সমস্যাটি হ'ল সিঙ্ক্রোনাইজেশন পরিষেবাটি কেন্দ্রীভূত এবং সার্ভার সাইডের উত্স কোডটি উপলব্ধ বলে মনে হচ্ছে না, তাই আপনি সহজেই নিজের ড্যানিহোস্ট পরিষেবাটি শুরু করতে পারবেন না এবং আপনাকে তৃতীয় পক্ষের উপর নির্ভর করতে হবে (যা কারওর জন্য ভাল হতে পারে) ব্যবহারের ক্ষেত্রে).



0

হ্যাঁ এবং হ্যাঁ দুটোই করা যায়।

আইপিগুলির তালিকা ভাগ করে নেওয়ার জন্য আপনাকে একটি উপযুক্ত প্রক্রিয়া আবিষ্কার করতে হবে। আপনি উদাহরণস্বরূপ আডাব্লুএস ব্যবহার করছেন তবে আপনি এস 3 এর সুবিধা নিতে পারেন। আপনি লিনাক্স হোস্টগুলির মধ্যে 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?

সন্দেহ নেই অনেক উপায়ে। উপরের স্ক্রিপ্ট (গুলি) ডেটাটি কোনও ডিবিতে ফেলে দিন এবং ক্লায়েন্টদের সেগুলি থেকে পড়তে হবে, নতুন নিয়মের জন্য পোলিং করুন এবং আসার সাথে সাথে এগুলি চালনা করুন The হোস্টগুলি তথ্য জমা দিচ্ছে, উদাহরণস্বরূপ এই ক্ষেত্রে:

  1. 12:00 এ সার্ভার 1 বলছে "এখন হোস্ট এক্স নিষিদ্ধ করুন", এবং "এক ঘন্টার মধ্যে নিষিদ্ধ হোস্ট এক্স"।
  2. 12:45 এ সার্ভার 2 বলছে "এখন হোস্ট এক্স নিষিদ্ধ করুন", এবং "এক ঘন্টার মধ্যে নিষিদ্ধ হোস্ট এক্স"।
  3. ওভারল্যাপটির অর্থ সার্ভার 3 হোল্ডার এক্সকে এক ঘন্টার জন্য নিষিদ্ধ করবে, নির্দেশ অনুসারে যদি অনুসরণ করে তবে এক ঘন্টা + 45 মিনিট নয়।

তবে এটি একটি উল্লেখযোগ্য সমস্যা হওয়া উচিত নয় এবং আপনি যদি ডাটাবেসটির সাথে আরও কিছু চালাক হন তবে আপনি একাধিক সাবমিশনগুলি আরও পরিষ্কারভাবে পরিচালনা করতে পারবেন যদি আপনি সিদ্ধান্ত নেন যে এটি প্রচেষ্টাটির পক্ষে উপযুক্ত।

জনসাধারণের পরিষেবা হিসাবে চালানো আপনাকে অ্যাডমিন ঝামেলার জগতে উন্মুক্ত করবে যদিও:

  • আপনি যদি প্রচুর ব্যবহারকারী অর্জন করেন তবে ব্যান্ডউইথ এবং অন্যান্য সংস্থানগুলি পরিচালনা করা।
  • অর্থপ্রদানের পদ্ধতিগুলি সাজানো এবং প্রয়োগ করা আপনার কোনও উপায়ে অ্যাক্সেসের জন্য চার্জ করে রিসোর্সিং ইস্যুটি মোকাবেলা করার চেষ্টা করা উচিত।
  • আপনার ডাটাবেসকে দূষিত করার প্রয়াস নিয়ে কাজ করা, একজন খারাপ অভিনেতা কোনও বাণিজ্যিক প্রতিবন্ধী বা ব্ল্যাকমেল প্রচেষ্টা হিসাবে তালিকার সাবস্ক্রাইব করা স্থানগুলি থেকে প্রতিযোগীকে নিষিদ্ধ করার চেষ্টা করছেন।
  • যখন কাউকে নিষিদ্ধ করা হয় এবং মনে হয় সেগুলি হওয়া উচিত নয় complaints
  • ডিডোএস আক্রমণগুলি মোকাবেলা করা হবে যা যদি আসবে তবে যদি আপনার পরিষেবাটি কারও কারও বোটকে অসুবিধা দেওয়ার ক্ষেত্রে সফল হয়।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.