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 |
***********************************************************************