AlmaLinux10 に 不正アクセス検知 swatchdogをインストール・設定

watch yum /dnfインストール出来ない



  Swatchのインストールに必要なperl-File-Tail インストール
[root@falcon21 ~]# dnf install perl-File-Tail -y
メタデータの期限切れの最終確認: 11:18:55 前の 2025年11月22日 00時07分30秒 に実施しました。
引数に一致する結果がありません: perl-File-Tail
エラー: 一致するものが見つかりません: perl-File-Tail


[root@falcon21 ~]# cpan install File::Tail
bash: cpan: コマンドが見つかりませんでした…
コマンド cpan’ を提供するためにパッケージ ‘perl-CPAN’ をインストールしますか? [N/y] y

   :
   :
All tests successful.
Files=3, Tests=15, 63 wallclock secs ( 0.02 usr 0.01 sys + 0.07 cusr 0.02 csys = 0.12 CPU)
Result: PASS
MGRABNAR/File-Tail-1.3.tar.gz
/usr/bin/make test — OK
Running make install for MGRABNAR/File-Tail-1.3.tar.gz
Manifying 1 pod document
Installing /usr/local/share/perl5/5.40/File/Tail.pm
Installing /usr/local/share/man/man3/File::Tail.3pm
Appending installation info to /usr/lib64/perl5/perllocal.pod
MGRABNAR/File-Tail-1.3.tar.gz
/usr/bin/make install — OK


   —– ‘perl-File-Tail が見つからない—–

 cpanmで、試行  cpanmのインストール
[root@falcon21 ~]# yum install perl-App-cpanminus
インストール済み:
perl-App-cpanminus-1.7047-6.el10.noarch perl-CPAN-Meta-Check-0.018-6.el10.noarch
perl-File-pushd-1.016-23.el10.noarch perl-Module-CPANfile-1.1004-22.el10.noarch
perl-Parse-PMFile-0.45-3.el10.noarch perl-String-ShellQuote-1.04-45.el10.noarch
perl-YAML-1.31-7.el10.noarch

完了しました!

File-Tail のインストール
[root@falcon21 ~]# cpanm File::Tail
! Finding File::Tail on cpanmetadb failed.
LWP will support https URLs if the LWP::Protocol::https module
is installed.

[root@falcon21 ~]# cpan install File::Tail
Loading internal logger. Log::Log4perl recommended for better logging
Reading ‘/root/.local/share/.cpan/Metadata’
Database was generated on Sat, 22 Nov 2025 01:17:01 GMT
CPAN: Module::CoreList loaded ok (v5.20250120)
File::Tail is up to date (1.3).


Date::Calc のインストール
root@falcon21:~# cpan install Date::Calc
             :
Result: PASS
STBEY/Date-Calc-XS-6.4.tar.gz
/usr/bin/make test — OK
Running make install for STBEY/Date-Calc-XS-6.4.tar.gz
“/usr/bin/perl” -MExtUtils::Command::MM -e ‘cp_nonempty’ — XS.bs blib/arch/auto/Date/Calc/XS/XS.bs 644
Manifying 1 pod document
Files found in blib/arch: installing files in blib/lib into architecture dependent library tree
Installing /usr/local/lib64/perl5/5.40/auto/Date/Calc/XS/XS.so
Installing /usr/local/lib64/perl5/5.40/Date/Calc/XS.pod
Installing /usr/local/lib64/perl5/5.40/Date/Calc/XS.pm
Installing /usr/local/share/man/man3/Date::Calc::XS.3pm
Appending installation info to /usr/lib64/perl5/perllocal.pod
STBEY/Date-Calc-XS-6.4.tar.gz
/usr/bin/make install — OK


Date::Manip の インストール
root@falcon21:~# cpan install Date::Manip
Appending installation info to /usr/lib64/perl5/perllocal.pod
SBECK/Date-Manip-6.98.tar.gz
/usr/bin/make install — OK

       swatchdog ダウンロード:インストール
    ————————————————  
    https://sourceforge.net/projects/swatch/
https://sourceforge.net/projects/swatch/files/latest/download

Windowsで、ダウンロード、cockpit で、/root へ、アップロード 
       swatchdog-3.2.4.tar.gz
解凍
[root@falcon21 ~]# tar xvfz swatchdog-3.2.4.tar.gz

解凍してできたディレクトリに移動
[root@falcon21 ~]# cd swatchdog-3.2.4

[root@falcon21 swatchdog-3.2.4]# perl Makefile.PL
Generating a Unix-style Makefile
Writing Makefile for swatchdog
Writing MYMETA.yml and MYMETA.json


[root@falcon21 swatchdog-3.2.4]# make
cp lib/Swatchdog/Threshold.pm blib/lib/Swatchdog/Threshold.pm
cp lib/Swatchdog/Throttle.pm blib/lib/Swatchdog/Throttle.pm
cp lib/Swatchdog/Actions.pm blib/lib/Swatchdog/Actions.pm
AutoSplitting blib/lib/Swatchdog/Actions.pm (blib/lib/auto/Swatchdog/Actions)
cp swatchdog blib/script/swatchdog
“/usr/bin/perl” -MExtUtils::MY -e ‘MY->fixin(shift)’ — blib/script/swatchdog
Manifying 1 pod document
Manifying 3 pod documents


[root@falcon21 swatchdog-3.2.4]# make test
PERL_DL_NONLAZY=1 “/usr/bin/perl” “-MExtUtils::Command::MM” “-MTest::Harness” “-e” “undef *Test::Harness::Switches; test_harness(0, ‘blib/lib’, ‘blib/arch’)” t/*.t
t/01cpan_modules.t .. ok
All tests successful.
Files=1, Tests=1, 0 wallclock secs ( 0.02 usr 0.00 sys + 0.02 cusr 0.00 csys = 0.04 CPU)
Result: PASS


[root@falcon21 swatchdog-3.2.4]# make install
Manifying 1 pod document
Manifying 3 pod documents
Installing /usr/local/share/perl5/5.40/auto/Swatchdog/Actions/autosplit.ix
Installing /usr/local/share/perl5/5.40/Swatchdog/Threshold.pm
Installing /usr/local/share/perl5/5.40/Swatchdog/Throttle.pm
Installing /usr/local/share/perl5/5.40/Swatchdog/Actions.pm
Installing /usr/local/share/man/man1/swatchdog.1
Installing /usr/local/share/man/man3/Swatchdog::Actions.3pm
Installing /usr/local/share/man/man3/Swatchdog::Threshold.3pm
Installing /usr/local/share/man/man3/Swatchdog::Throttle.3pm
Installing /usr/local/bin/swatchdog
Appending installation info to /usr/lib64/perl5/perllocal.pod

[root@falcon21 swatchdog-3.2.4]# cd


—————-


swatchdog を起動

[root@falcon21 ~]# swatchdog &
[1] 5429
[root@falcon21 ~]# swatchdog: cannot find /root/.swatchdogrc. Please create it or specify an alternate configuration file. Exiting.
swatchdog: /root/.swatchdogrc が見つかりません。作成するか、別の設定ファイルを指定してください。終了します。

swatchdogrc 名で設定ファイルを作成

[root@falcon21 ~]# vi .swatchdogrc
# ログファイル /var/log/syslog を監視
#watchfor /WARN/
#exec echo “Warning detected: ” $0
#exec mail -s “Warning in syslog” root@falcon21.space < /dev/null

# ログファイル /var/log/auth.log を監視
#watchfor /FAILED/
#exec echo “Authentication failed: ” $0
#exec mail -s “Authentication failure” root@falcon21.space < /dev/null

# ログファイル /var/log/httpd/error.log を監視
watchfor /error/
exec echo “httpd error: ” $0
exec mail -s “httpd error” root@falcon21.space < /dev/null
watchfor = /checksum/,/sendmail/,/biff/,/afpd/
ignore
watchfor = /(panic|halt)/
mail=root@falcon21.space
bell=4

watchfor = /INVALID|REPEATED|INCOMPLETE/i
mail=root@falcon21.space

watchfor = /err/i
mail=root@falcon21.space

watchfor = /warning/i
mail=root@falcon21.space

watchfor = /denied/i
mail=root@falcon21.space

watchfor = /fail/i
mail=root@falcon21.space

watchfor = /Warn/i
mail=root@falcon21.space

watchfor = /refuse/i
mail=root@falcon21.space

watchfor = /LOGIN/i
mail=root@falcon21.space

watchfor = /passwd/i
mail=root@falcon21.space

watchfor = /telnetd/i
mail=root@falcon21.space

watchfor = /-root/i
mail=root@falcon21.space
----------------
<pre>/var/log/secure で、同一IPアドレスからの不正アクセス規制スクリプト作成  

root@falcon21:~# vi swatchdogatrm
#!/bin/bash

# アクセス規制解除予約削除処理
#
# 引数で指定した回数以上の不正アクセスを記録したIPアドレスのアクセス規制解除予約を削除して
# 該当IPアドレスからのアクセスを永久に規制する
# 引数に0を指定した場合は不正アクセス記録回数のみ表示して規制解除予約の削除は行わない

[ $# -ne 1 ] && echo "usage is ${0} cnt" && exit 1
for atq in `atq|awk '{print $1}'`
do
    at -c ${atq}|grep "iptables -D INPUT -s " > /dev/null 2>&1 || continue
    ip=`at -c ${atq}|grep "iptables -D INPUT -s "|sed -e 's/.*iptables -D INPUT -s \([^ ]*\) -j DROP.*/\1/p' -e d`
    if [ ${1} -eq 0 ];then
        echo -e "${ip}\t`cat /var/log/secure/${ip}|wc -l`"
    else
        cnt=`cat /var/log/swatchdog/${ip}|wc -l`
        [ ${cnt} -ge ${1} ] && \
        atrm ${atq} && echo -e "${ip}\\t`cat /var/log/secure/${ip}|wc -l`"
    fi
done</pre>

[root@falcon21 ~]# chmod 700 swatchdogatrm

***********************************************************************


swatchdog を起動


[root@falcon21 ~]# swatchdog &
[1] 6271
[root@falcon21 ~]#
*** swatchdog version 3.2.4 (pid:177716) started at 2026年 1月 29日 木曜日 10:59:31 JST

httpd error: /root/.swatchdog_script.177716
s-nail: Null message body; hope that’s ok
メッセージ本文が空です。問題ないでしょうか

Ctl + C で抜ける


エラー ログが1づつメール送信される・・・確認


[root@falcon21 ~]# swatchdog &
[1] 6042
[root@falcon21 ~]# Can’t locate Date/Parse.pm in @INC

(you may need to install the Date::Pa rse module) (@INC entries checked: /usr/local/lib64/perl5/5.40 /usr/local/share/perl5/5.40 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 ) at /usr/local/bin/swatchdog line 30.
BEGIN failed–compilation aborted at /usr/local/bin/swatchdog line 30.

/usr/local/bin/swatchdog の 30 行目で、@INC に Date/Parse.pm が見つかりません

(Date::Parse モジュールをインストールする必要がある可能性があります)

(@INC エントリはチェック済み:
/usr/local/lib64/perl5/5.40 /usr/local/share/perl5/5.40 /usr/lib64/perl5/vendor_perl

/usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5)。

BEGIN が失敗しました – /usr/local/bin/swatchdog の 30 行目でコンパイルが中止されました。

————

      Date::Parse モジュールをインストール

[root@falcon21 ~]# perl -MCPAN -e shell
Terminal does not support AddHistory.

To fix that, maybe try> install Term::ReadLine::Perl


cpan shell — CPAN exploration and modules installation (v2.36)
Enter ‘h’ for help.

cpan[1]> install Date::Parse
Reading ‘/root/.local/share/.cpan/Metadata’
Database was generated on Sun, 11 Jan 2026 22:29:01 GMT
Running install for module ‘Date::Parse’
Fetching with HTTP::Tiny:
https://cpan.org/authors/id/A/AT/ATOOMIC/TimeDate-2.33.tar.gz
Checksum for /root/.local/share/.cpan/sources/authors/id/A/AT/ATOOMIC/TimeDate-2.33.tar.gz ok
Scanning cache /root/.local/share/.cpan/build for sizes
………………………………………………………………….DONE
Configuring A/AT/ATOOMIC/TimeDate-2.33.tar.gz with Makefile.PL
Checking if your kit is complete…
Looks good
Generating a Unix-style Makefile
Writing Makefile for Date::Parse
Writing MYMETA.yml and MYMETA.json
ATOOMIC/TimeDate-2.33.tar.gz
/usr/bin/perl Makefile.PL — OK
Running make for A/AT/ATOOMIC/TimeDate-2.33.tar.gz
cp lib/Date/Language/Turkish.pm blib/lib/Date/Language/Turkish.pm
cp lib/Date/Language/Brazilian.pm blib/lib/Date/Language/Brazilian.pm
cp lib/Date/Language/Sidama.pm blib/lib/Date/Language/Sidama.pm
cp lib/Date/Language/Romanian.pm blib/lib/Date/Language/Romanian.pm
cp lib/Date/Language/Amharic.pm blib/lib/Date/Language/Amharic.pm
cp lib/Date/Language/Russian.pm blib/lib/Date/Language/Russian.pm
cp lib/Date/Language/Oromo.pm blib/lib/Date/Language/Oromo.pm
cp lib/Date/Language/Spanish.pm blib/lib/Date/Language/Spanish.pm
cp lib/Date/Language/Greek.pm blib/lib/Date/Language/Greek.pm
cp lib/Date/Language/TigrinyaEthiopian.pm blib/lib/Date/Language/TigrinyaEthiopian.pm
cp lib/Date/Language/Gedeo.pm blib/lib/Date/Language/Gedeo.pm
cp lib/Date/Language/English.pm blib/lib/Date/Language/English.pm
cp lib/Date/Language/Swedish.pm blib/lib/Date/Language/Swedish.pm
cp lib/Date/Language/Danish.pm blib/lib/Date/Language/Danish.pm
cp lib/Date/Language/Chinese.pm blib/lib/Date/Language/Chinese.pm
cp lib/Date/Language/Austrian.pm blib/lib/Date/Language/Austrian.pm
cp lib/Date/Language/Somali.pm blib/lib/Date/Language/Somali.pm
cp lib/Date/Language/French.pm blib/lib/Date/Language/French.pm
cp lib/Date/Format.pm blib/lib/Date/Format.pm
cp lib/Date/Language/Icelandic.pm blib/lib/Date/Language/Icelandic.pm
cp lib/Date/Language/Bulgarian.pm blib/lib/Date/Language/Bulgarian.pm
cp lib/Date/Language/Czech.pm blib/lib/Date/Language/Czech.pm
cp lib/Date/Language/TigrinyaEritrean.pm blib/lib/Date/Language/TigrinyaEritrean.pm
cp lib/Date/Language/Tigrinya.pm blib/lib/Date/Language/Tigrinya.pm
cp lib/Date/Language/Russian_cp1251.pm blib/lib/Date/Language/Russian_cp1251.pm
cp lib/Date/Language/Occitan.pm blib/lib/Date/Language/Occitan.pm
cp lib/Date/Language/Chinese_GB.pm blib/lib/Date/Language/Chinese_GB.pm
cp lib/Date/Language/Hungarian.pm blib/lib/Date/Language/Hungarian.pm
cp lib/TimeDate.pm blib/lib/TimeDate.pm
cp lib/Date/Language/Norwegian.pm blib/lib/Date/Language/Norwegian.pm
cp lib/Date/Language/Finnish.pm blib/lib/Date/Language/Finnish.pm
cp lib/Date/Parse.pm blib/lib/Date/Parse.pm
cp lib/Time/Zone.pm blib/lib/Time/Zone.pm
cp lib/Date/Language/Dutch.pm blib/lib/Date/Language/Dutch.pm
cp lib/Date/Language/Afar.pm blib/lib/Date/Language/Afar.pm
cp lib/Date/Language/Russian_koi8r.pm blib/lib/Date/Language/Russian_koi8r.pm
cp lib/Date/Language.pm blib/lib/Date/Language.pm
cp lib/Date/Language/Italian.pm blib/lib/Date/Language/Italian.pm
cp lib/Date/Language/German.pm blib/lib/Date/Language/German.pm
Manifying 7 pod documents
ATOOMIC/TimeDate-2.33.tar.gz
/usr/bin/make — OK
Running make test for ATOOMIC/TimeDate-2.33.tar.gz
PERL_DL_NONLAZY=1 “/usr/bin/perl” “-MExtUtils::Command::MM” “-MTest::Harness” “-e” “undef *Test::Harness::Switches; test_harness(0, ‘blib/lib’, ‘blib/arch’)” t/*.t
t/cpanrt.t … ok
t/date.t ….. ok
t/format.t … ok
t/getdate.t .. ok
t/lang.t ….. ok
All tests successful.
Files=5, Tests=509, 0 wallclock secs ( 0.04 usr 0.01 sys + 0.19 cusr 0.02 csys = 0.26 CPU)
Result: PASS
Terminal does not support GetHistory.
Lockfile removed.
ATOOMIC/TimeDate-2.33.tar.gz
/usr/bin/make test — OK
Running make install for ATOOMIC/TimeDate-2.33.tar.gz
Manifying 7 pod documents
Installing /usr/local/share/perl5/5.40/TimeDate.pm
Installing /usr/local/share/perl5/5.40/Date/Format.pm
Installing /usr/local/share/perl5/5.40/Date/Parse.pm
Installing /usr/local/share/perl5/5.40/Date/Language.pm
Installing /usr/local/share/perl5/5.40/Date/Language/Turkish.pm
Installing /usr/local/share/perl5/5.40/Date/Language/Brazilian.pm
Installing /usr/local/share/perl5/5.40/Date/Language/Sidama.pm
Installing /usr/local/share/perl5/5.40/Date/Language/Romanian.pm
Installing /usr/local/share/perl5/5.40/Date/Language/Amharic.pm
Installing /usr/local/share/perl5/5.40/Date/Language/Russian.pm
Installing /usr/local/share/perl5/5.40/Date/Language/Oromo.pm
Installing /usr/local/share/perl5/5.40/Date/Language/Spanish.pm
Installing /usr/local/share/perl5/5.40/Date/Language/Greek.pm
Installing /usr/local/share/perl5/5.40/Date/Language/TigrinyaEthiopian.pm
Installing /usr/local/share/perl5/5.40/Date/Language/Gedeo.pm
Installing /usr/local/share/perl5/5.40/Date/Language/English.pm
Installing /usr/local/share/perl5/5.40/Date/Language/Swedish.pm
Installing /usr/local/share/perl5/5.40/Date/Language/Danish.pm
Installing /usr/local/share/perl5/5.40/Date/Language/Chinese.pm
Installing /usr/local/share/perl5/5.40/Date/Language/Austrian.pm
Installing /usr/local/share/perl5/5.40/Date/Language/Somali.pm
Installing /usr/local/share/perl5/5.40/Date/Language/French.pm
Installing /usr/local/share/perl5/5.40/Date/Language/Icelandic.pm
Installing /usr/local/share/perl5/5.40/Date/Language/Bulgarian.pm
Installing /usr/local/share/perl5/5.40/Date/Language/Czech.pm
Installing /usr/local/share/perl5/5.40/Date/Language/TigrinyaEritrean.pm
Installing /usr/local/share/perl5/5.40/Date/Language/Tigrinya.pm
Installing /usr/local/share/perl5/5.40/Date/Language/Russian_cp1251.pm
Installing /usr/local/share/perl5/5.40/Date/Language/Occitan.pm
Installing /usr/local/share/perl5/5.40/Date/Language/Chinese_GB.pm
Installing /usr/local/share/perl5/5.40/Date/Language/Hungarian.pm
Installing /usr/local/share/perl5/5.40/Date/Language/Norwegian.pm
Installing /usr/local/share/perl5/5.40/Date/Language/Finnish.pm
Installing /usr/local/share/perl5/5.40/Date/Language/Dutch.pm
Installing /usr/local/share/perl5/5.40/Date/Language/Afar.pm
Installing /usr/local/share/perl5/5.40/Date/Language/Russian_koi8r.pm
Installing /usr/local/share/perl5/5.40/Date/Language/Italian.pm
Installing /usr/local/share/perl5/5.40/Date/Language/German.pm
Installing /usr/local/share/perl5/5.40/Time/Zone.pm
Installing /usr/local/share/man/man3/Date::Format.3pm
Installing /usr/local/share/man/man3/Date::Language.3pm
Installing /usr/local/share/man/man3/Date::Language::Bulgarian.3pm
Installing /usr/local/share/man/man3/Date::Language::Hungarian.3pm
Installing /usr/local/share/man/man3/Date::Parse.3pm
Installing /usr/local/share/man/man3/Time::Zone.3pm
Installing /usr/local/share/man/man3/TimeDate.3pm
Appending installation info to /usr/lib64/perl5/perllocal.pod
ATOOMIC/TimeDate-2.33.tar.gz
/usr/bin/make install — OK

cpan[2]>

   SWATCHDOG 設定   
SWATCHDOG 設定ファイル格納ディレクトリ作成
[root@falcon21 ~]# mkdir /etc/swatchdog
SWATCHDOG ログ切替え設定ファイル作成 [root@falcon21 ~]# vi /etc/logrotate.d/swatchdog /var/log/swatchdog/swatchdog.log { missingok notifempty sharedscripts postrotate /etc/rc.d/init.d/swatchdog restart > /dev/null || true endscript }


         

<pre>SWATCHアクションスクリプト作成

[root@falcon21 ~]# vi /usr/local/bin/swatchdog_action.sh
#!/bin/bash

# SWATCHアクションスクリプト
#
# 引数1:ログ区切り文字を指定
# 引数2:ログ内IPアドレス位置を指定
# 引数3:該当IPアドレスからのアクセスを規制する場合blockを指定

PATH=/bin:/sbin:/usr/bin

# 規制IPアドレス情報メール通知先設定
# ※メール通知しない場合は下記をコメントアウト
mail=root

# 異常終了処理関数定義
error_exit () {
    (echo From: root@`hostname -d`
     echo "Subject: `basename ${0}` aborted."
     echo
     echo ${LOG}) | \
    `which sendmail` -t root
    exit 1
}

# ログを標準入力から取得
read LOG

# ログからIPアドレスを抽出
IPADDR=`echo $LOG|awk -F "$1" "{print $"$2"}"`

# IPアドレスがループバックアドレス(IPv6)の場合は終了
[ "$IPADDR" = "::1" ] && exit

echo "$IPADDR"|grep "^[0-9]*\." > /dev/null 2>&1
if [ $? -eq 0 ]; then
    # IPアドレスから始まる場合
    IPADDR=`echo "$IPADDR"|sed -e 's/\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\).*/\1/p' -e d`
else
    # IPアドレス以外から始まる場合
    IPADDR=`echo "$IPADDR"|sed -e 's/.*[^0-9]\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\).*/\1/p' -e d`
fi

# IPアドレスをピリオドで分割
addr1=`echo $IPADDR|cut -d . -f 1`
addr2=`echo $IPADDR|cut -d . -f 2`
addr3=`echo $IPADDR|cut -d . -f 3`
addr4=`echo $IPADDR|cut -d . -f 4`

# IPアドレスチェック※取得失敗時はroot宛にメール通知して終了
expr "${addr1}" + 1 > /dev/null 2>&1 ; [ $? -ge 2 ] && error_exit
expr "${addr2}" + 1 > /dev/null 2>&1 ; [ $? -ge 2 ] && error_exit
expr "${addr3}" + 1 > /dev/null 2>&1 ; [ $? -ge 2 ] && error_exit
expr "${addr4}" + 1 > /dev/null 2>&1 ; [ $? -ge 2 ] && error_exit

# IPアドレスがプライベートIPアドレスの場合は終了
if [ "$IPADDR" = "127.0.0.1" ]; then
    exit
elif [ $addr1 -eq 10 ]; then
    exit
elif [ $addr1 -eq 172 ] && [ $addr2 -ge 16 ] && [ $addr2 -le 31 ]; then
    exit
elif [ $addr1 -eq 192 ] && [ $addr2 -eq 168 ]; then
    exit
fi

# ホスト名取得
dig -x $IPADDR | grep "ANSWER SECTION:" > /dev/null 2>&1
if [ $? -eq 0 ]; then
    HOST=`dig -x $IPADDR | grep -A 1 "ANSWER SECTION:" | tail -n 1 | awk '{print $5}'`
else
    HOST="unknown"
fi

# 不正アクセスログメッセージをIPアドレス別ログファイルに記録
echo $LOG >> /var/log/swatchdog/$IPADDR

# IPアドレス別ログファイルから累積不正アクセス数取得
cnt=`cat /var/log/swatchdog/$IPADDR | wc -l`

# 該当IPアドレスからの累積不正アクセス数が3回ごとまたは
# 引数でblockと指定された場合アクセス規制
if [ $(( $cnt % 3 )) -eq 0 ] || [ $# -eq 3 -a  "$3" = "block" ]; then
    # 該当IPアドレスからのアクセスを拒否するルールを挿入
    iptables -I INPUT -s $IPADDR -j DROP
    [ -f /root/deny_ip ] && echo $IPADDR >> /root/deny_ip

    # 上記ルールを24時間後に削除するスケジュールを登録
    echo "iptables -D INPUT -s $IPADDR -j DROP > /dev/null 2>&1" | \
    at now+24hour > /dev/null 2>&1
    [ -f /root/deny_ip ] && \
    echo "sed -i '/^$IPADDR$/d' /root/deny_ip > /dev/null 2>&1 ; \
    sed -i '/ $IPADDR /d' /etc/sysconfig/iptables > /dev/null 2>&1" | \
    at now+24hour > /dev/null 2>&1

    # アクセス規制IPアドレス情報をメール通知
    [ "$mail" != "" ] && \
        (echo From: root@`hostname -d`
         echo "Subject: Blocked access from $IPADDR($HOST)"
         echo
         cat /var/log/swatchdog/$IPADDR
         echo
         whois $IPADDR) | \
        `which sendmail` -t $mail

    echo "`date` $IPADDR($HOST) $cnt Blocked!"
else
    echo "`date` $IPADDR($HOST) $cnt"
fi

----------------

swatchdogアクションスクリプトへ実行権限付加

[root@falcon21 ~]# chmod 700 /usr/local/bin/swatchdog_action.sh </pre>
<pre>/var/log/secure監視用設定ファイル作成
[root@falcon21 ~]# vi /etc/swatchdog/secure.conf

# logfile /var/log/secure

# アクセス無許可ホストからのSSHログイン失敗を検知したら該当ホストからのアクセスを24時間規制
# ※/etc/hosts.deny、/etc/hosts.allowでアクセス許可ホストを制限していることが前提
watchfor /sshd.*refused/
    pipe "/usr/local/bin/swatchdog_action.sh '\\\\(|\\\\)' 2 block"
    threshold track_by=/sshd.*refused/,type=limit,count=1,seconds=10

# アクセス許可ホストからのユーザー名誤りによるSSHログイン失敗を3回検知するごとに該当ホストからのアクセスを24時間規制
watchfor /sshd.*Failed password for invalid user/
    pipe "/usr/local/bin/swatchdog_action.sh ' ' 13"
    threshold track_by=/sshd.*Failed password for invalid user/,type=limit,count=3,seconds=10

# アクセス許可ホストからのパスワード誤りによるSSHログイン失敗を3回検知するごとに該当ホストからのアクセスを24時間規制
watchfor /sshd.*Failed password for/
    pipe "/usr/local/bin/swatchdog_action.sh ' ' 11"
    threshold track_by=/sshd.*Failed password for/,type=limit,count=3,seconds=10

# アクセス許可ホストからのDovecotログイン失敗を3回検知するごとに該当ホストからのアクセスを24時間規制
# ※メールサーバー構築済であること
watchfor /auth: pam_unix\(dovecot:auth\): authentication failure/
    pipe "/usr/local/bin/swatchdog_action.sh '=' 7"
    threshold track_by=/auth: pam_unix\(dovecot:auth\): authentication failure/,type=limit,count=3,seconds=10</pre>
<pre>      
      /var/log/maillog監視設定


/var/log/maillog監視用設定ファイル作成
[root@falcon21 ~]# vi /etc/swatchdog/maillog.conf
# logfile /var/log/maillog

# メールサーバーへの不正中継アクセスを検知したら該当ホストからのアクセ
スを24時間規制
# ※メールサーバー構築済であること
watchfor /postfix\/smtpd.*Relay access denied;/
    pipe "/usr/local/bin/swatchdog_action.sh '\\\\[|\\\\]' 4 block"
    threshold track_by=/postfix\/smtpd.*Relay access denied;/,type=limit,count=1,seconds=10

# メールサーバーのSASL認証失敗を3回検知するごとに該当ホストからのアク>セスを24時間規制
# ※メールサーバー構築済であること
watchfor /postfix\/smtpd.*SASL .* authentication failed:/
    pipe "/usr/local/bin/swatchdog_action.sh '\\\\[|\\\\]' 4"
    threshold track_by=/postfix\/smtpd.*SASL .* authentication failed:/,type=limit,count=3,seconds=10

</pre>
<pre>SWATCH起動スクリプト作成

[root@falcon21 ~]# vi /etc/rc.d/init.d/swatchdog
#!/bin/bash
#
# swatchdog
#
# chkconfig: 2345 90 35
# description: swatchdog start/stop script

# Source function library.
#. /etc/rc.d/init.d/functions

PATH=/sbin:/usr/local/bin:/bin:/usr/bin

mkdir -p /var/log/swatchdog

start() {
    # Start daemons.
    ls /var/run/swatchdog_*.pid > /dev/null 2>&1
    if [ $? -ne 0 ]; then
        echo -n "Starting swatchdog"
        pno=0
        for conf in /etc/swatchdog/*.conf
        do
            pno=`expr $pno + 1`
            WATCHLOG=`grep "^# logfile" $conf | awk '{ print $3 }'`
            swatchdog --config-file $conf --tail-file $WATCHLOG \
            --script-dir=/tmp --awk-field-syntax --use-cpan-file-tail --daemon \
            --pid-file /var/run/swatchdog_$pno.pid \
            >> /var/log/swatchdog/swatchdog.log 2>&1
            RETVAL=$?
            [ $RETVAL != 0 ] && return $RETVAL
        done
        echo
        [ $RETVAL = 0 ] && touch /var/lock/subsys/swatchdog
        return $RETVAL
    else
        echo "swatchdog is already started"
    fi
}

stop() {
    # Stop daemons.
    ls /var/run/swatchdog_*.pid > /dev/null 2>&1
    if [ $? -eq 0 ]; then
        echo -n "Shutting down swatchdog"
        for pid in /var/run/swatchdog_*.pid
        do
           kill $(cat $pid)
           rm -f $pid
        done
        echo
        rm -f /var/lock/subsys/swatchdog /tmp/.swatchdog_script.*
    else
        echo "swatchdog is not running"
    fi
}

status() {
    ls /var/run/swatchdog_*.pid > /dev/null 2>&1
    if [ $? -eq 0 ]; then
        echo -n "swatchdog (pid"
        for pid in /var/run/swatchdog_*.pid
        do
           echo -n " `cat $pid`"
        done
        echo ") is running..."
    else
        echo "swatchdog is stopped"
    fi
}

case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        stop
        start
        ;;
  status)
        status
        ;;
   *)
        echo "Usage: swatchdog {start|stop|restart|status}"
        exit 1
esac

exit $RETVAL

----------------

SWATCH起動スクリプトへ実行権限付加
[root@falcon21 ~]# chmod +x /etc/rc.d/init.d/swatchdog</pre>

SWATCH起動
[root@falcon21 ~]# systemctl enable –now swatchdog
swatchdog.service is not a native service, redirecting to systemd-sysv-install.
Executing: /usr/lib/systemd/systemd-sysv-install enable swatchdog
swatchdog.service はネイティブサービスではないため、systemd-sysv-install にリダイレクトされます。
実行中: /usr/lib/systemd/systemd-sysv-install enable swatchdog
Failed to execute /usr/lib/systemd/systemd-sysv-install: そのようなファイルやディレクトリはありません
[root@falcon21 ~]# /etc/rc.d/init.d/swatchdog start
/etc/rc.d/init.d/swatchdog: 行 9: /etc/rc.d/init.d/functions: そのようなファイルやディレクトリはありません
Starting swatchdog

root@falcon21:~# vi /etc/rc.d/init.d/swatchdog
9 #. /etc/rc.d/init.d/functions    コメント化

[root@falcon21 ~]# /etc/rc.d/init.d/swatchdog start
Starting swatchdog/etc/rc.d/init.d/swatchdog: 行 25: /var/log/swatch/swatchdog.log: そのようなファイルや ディレクトリはありません
   *** /var/log/swatch/swatchdog.log:を修正 /var/log/swatchdog/swatchdog.log:


[root@falcon21 ~]# /etc/rc.d/init.d/swatchdog start
Starting swatchdog
  正常スタート
SWATCHDOG起動スクリプトをcheconfigへ登録
[root@falcon21 ~]# chkconfig –add swatchdog
bash: chkconfig: コマンドが見つかりませんでした…
コマンド chkconfig’ を提供するためにパッケージ ‘chkconfig’ をインストールしますか? [N/y] y

chkconfig-1.30-2.el10.x86_64 A system tool for maintaining the /etc/rc*.d hierarchy
変更したまま継続しますか? [N/y] y


* キューで待機中…
* 認証を待ち受け中…
* キューで待機中…
* パッケージをダウンロード中…
* データを要求中…
* 変更をテスト中…
* パッケージのインストール中…

[root@falcon21 ~]# chkconfig –add swatchdog    
 エラー無し


SWATCHDOG自動起動設定
[root@falcon21 ~]# chkconfig swatchdog on


SWATCHDOG自動起動設定確認
[root@falcon21 ~]# chkconfig –list swatchdog

注記: この出力に含まれるのは SysV サービスのみです。ネイティブな
  systemd サービスは含まれません。SysV の設定データはネイティブな
   systemd 設定で上書きされる場合があります。

  systemd サービスを一覧表示する場合は
  # systemctl list-unit-files
 
  特定のターゲットで有効になっているサービスを確認する場合は
  systemctl list-dependencies target を使用します。

swatchdog  0:off   1:off   2:on   3:on   4:on   5:on   6:off

—————-

systemd サービスを一覧表示   
[root@falcon21 ~]# systemctl list-dependencies swatchdog
swatchdog.service
● ├─system.slice
● └─sysinit.target
● ├─dev-hugepages.mount
● ├─dev-mqueue.mount
●├─dracut-shutdown.service
○ ├─fips-crypto-policy-overlay.service
○ ├─iscsi-onboot.service
○ ├─iscsi-starter.service
● ├─kmod-static-nodes.service
○ ├─ldconfig.service
● ├─lvm2-lvmpolld.socket
● ├─lvm2-monitor.service
○ ├─multipathd.service
● ├─plymouth-read-write.service
● ├─plymouth-start.service
● ├─proc-sys-fs-binfmt_misc.automount
○ ├─selinux-autorelabel-mark.service
● ├─sys-fs-fuse-connections.mount
● ├─sys-kernel-config.mount
● ├─sys-kernel-debug.mount
● ├─sys-kernel-tracing.mount
○ ├─systemd-ask-password-console.path
○ ├─systemd-binfmt.service
○ ├─systemd-boot-random-seed.service
○ ├─systemd-confext.service
○ ├─systemd-firstboot.service
○ ├─systemd-hibernate-clear.service
○ ├─systemd-hwdb-update.service
○ ├─systemd-journal-catalog-update.service
● ├─systemd-journal-flush.service
● ├─systemd-journald.service
○ ├─systemd-machine-id-commit.service
● ├─systemd-modules-load.service
● ├─systemd-network-generator.service
○ ├─systemd-pcrmachine.service
○ ├─systemd-pcrphase-sysinit.service
○ ├─systemd-pcrphase.service
○ ├─systemd-pstore.service
● ├─systemd-random-seed.service
○ ├─systemd-repart.service
● ├─systemd-sysctl.service
○ ├─systemd-sysext.service
○ ├─systemd-sysusers.service
● ├─systemd-tmpfiles-setup-dev-early.service
● ├─systemd-tmpfiles-setup-dev.service
● ├─systemd-tmpfiles-setup.service
○ ├─systemd-tpm2-setup-early.service
○ ├─systemd-tpm2-setup.service
● ├─systemd-udev-trigger.service
● ├─systemd-udevd.service
○ ├─systemd-update-done.service
● ├─systemd-update-utmp.service
● ├─cryptsetup.target
● ├─integritysetup.target
● ├─local-fs.target
● │ ├─-.mount
● │ ├─boot-efi.mount
● │ ├─boot.mount
● │ ├─home.mount
● │ ├─systemd-remount-fs.service
● │ └─tmp.mount
● ├─swap.target
● │ └─dev-disk-by\x2duuid-5325b837\x2db6a6\x2d4277\x2d8143\x2dce48286cc194.swap
● └─veritysetup.target
アクセス規制解除予約削除処理スクリプト作成
[root@falcon21 ~]# vi swatchdogatrm
#!/bin/bash

# アクセス規制解除予約削除処理

# # 引数で指定した回数以上の不正アクセスを記録したIPアドレスのアクセス規制解除予約を削除して
# 該当IPアドレスからのアクセスを永久に規制する
# 引数に0を指定した場合は不正アクセス記録回数のみ表示して規制解除予約の削除は行わない

[ $# -ne 1 ] && echo “usage is ${0} cnt” && exit 1
for atq in `atq|awk ‘{print $1}’`
do
at -c ${atq}|grep “iptables -D INPUT -s ” > /dev/null 2>&1 || continue
ip=`at -c ${atq}|grep “iptables -D INPUT -s “|sed -e ‘s/.*iptables -D INPUT -s \([^ ]*\) -j DROP.*/\1/p’ -e d`
if [ ${1} -eq 0 ];then echo -e “${ip}\t`cat /var/log/swatchdog/${ip}|wc -l`”
else
cnt=`cat /var/log/swatchdog/${ip}|wc -l`
[ ${cnt} -ge ${1} ] && \
atrm ${atq} && echo -e “${ip}\\t`cat /var/log/swatchdog/${ip}|wc -l`”
fi
done


一旦再起動して
[root@falcon21 ~]# reboot


不正アクセス記録回数の多い順にアクセス規制解除待ちIPアドレスを表示 
[root@falcon21 ~]# sh swatchdogatrm 0|sort -n -k 2 -r
80.94.92.166 4
207.154.233.29 4
161.35.94.112 4
60.211.241.242 3
45.153.34.87 3
193.46.255.99 3
193.46.255.217 3
193.32.162.157 3
185.156.73.233 3


3回以上の不正アクセスを記録したIPアドレスからのアクセスを永久に規制
[root@falcon21 ~]# sh swatchdogatrm 3
45.153.34.87 3
193.32.162.157 3
193.46.255.99 3
193.46.255.217 3
185.156.73.233 3
80.94.92.166 4
161.35.94.112 4
207.154.233.29 4
60.211.241.242 3


削除を確認
[root@falcon21 ~]# sh swatchdogatrm 0|sort -n -k 2 -r
80.94.93.233 3

                     

スクリプトコマンドsh swatchdogatrm 3 を etc/crontab に書き込み毎日定時実行する。

[root@falcon21 ~]# crontab -e

00 01 * * * perl /usr/sbin/pflogsumm -e -d yesterday /var/log/maillog | mail -s ‘Logwatch for Postfix’ root
00 02 * * * perl /usr/local/awstats/wwwroot/cgi-bin/awstats.pl -update -config=falcon21.space
05 02 * * * perl /usr/local/awstats/wwwroot/cgi-bin/awstats.pl -output=pagetype -config=falcon21.space
00 05 * * * sh swatchdogatrm 3 -e -d yesterday /var/log/swatchdog | mail -s ‘swatchdog log’ root
~
crontab: installing new crontab
Backup of root’s previous crontab saved to /root/.cache/crontab/crontab.bak

swatchdog のマニュアル ページ
man swatchdog

やっと、成功 2025年12月29日 19:32:51

サーバー再構築後 確認は 2026年1月29日 17:01:09

***********************************************************************


プロセスIDを特定して停止する [root@falcon21 ~]# ps -ef | grep swatchdog
root    6271    6232  0  10:31 pts/0   00:00:00 /usr/bin/perl /usr/local/bin/swatchdog
root    6272    6271  0  10:31 pts/0   00:00:00 /usr/bin/perl /root/.swatchdog_script.6271
root    7769    6232  0  12:59 pts/0   00:00:00 grep –color=auto swatchdog

[root@falcon21 ~]# kill 6271
Caught a SIGTERM — sending a TERM signal to 6272
[root@falcon21 ~]# kill 6272
-bash: kill: (6272) – そのようなプロセスはありません
[1]+ 終了 swatchdog

—————-

名前を指定して一括停止する [root@falcon21 ~]# pkill swatchdog



***********************************************************************