#author("2019-05-10T20:48:40+09:00","default:nowsky","nowsky")
*CountryCode IPList [#m5671401]
グローバルIPv4アドレス、ユニキャストIPv6アドレスは、
5つの地域インターネットレジストリ(RIR:Regional Internet Registry)で管理を行っており、
RIRで国別に割り当てたIPアドレスリストは都度更新される形でインターネット公開されている。
|LEFT:80|LEFT:|c
|CENTER:~RIR|CENTER:~IPLIST|
|[[ARIN:+https://www.arin.net/]]| http://ftp.arin.net/pub/stats/arin/delegated-arin-extended-latest|
|[[RIPE NCC:+https://www.ripe.net/]]|http://ftp.ripe.net/pub/stats/ripencc/delegated-ripencc-extended-latest|
|[[APNIC:+https://www.apnic.net/]]|http://ftp.apnic.net/pub/stats/apnic/delegated-apnic-extended-latest|
|[[LACNIC:+https://www.lacnic.net/]]|http://ftp.lacnic.net/pub/stats/lacnic/delegated-lacnic-extended-latest|
|[[AfriNIC:+https://www.afrinic.net/]]|http://ftp.afrinic.net/pub/stats/afrinic/delegated-afrinic-extended-latest|
#author("2023-05-24T23:45:00+09:00","default:nowsky","nowsky")
* logger-exec [#z9e332ec]
#block
apache/audit/PowerDNS等でログをsyslog転送するのは面倒だけど、
ログ監査にはsyslog出力と中央管理が必要になる事が多いです。
しかし、syslogに出力は細工が必要でメンテナンス性が低下してしまい、
本末転倒の状態になります。
 
スクリプトで国別IPアドレスリストが必要になり、RIRのアドレスリストを利用する事があるのだが、
セグメント情報がCIDR形式で記載されていない為、利用する際に工夫が必要となる。
これら配布ファイルをCIDR形式に修正して一般公開しているサイトは多数あるのだが、
ファイルをIPv4/IPv6両方生成しつつ、デュアルスタックで配布サイト運営している所が無かったので公開しました。
複数台のサーバを運用するとログ監査と管理が大変になって来るので、
ローカルのテキストログをリアルタイム取得しながらsyslogに変換しつつ、
rsyslogやsyslog-ng経由でログの転送を行うスクリプトを作ってみました。
 
RHEL本家とRockyLinux等のRHELクローン、
Debian本家と派生ディストリビューション、
openSUSE本家で実際に動かしてログ転送出来る事までは確認済です。
#block(next)
#ref(Network/Script/logger/logger_01.png,40%,left,nowrap)
#block(end)
~
* 参考サイト [#td203809]
- [[世界の国別 IPv4 アドレス割り当てリスト:+http://nami.jp/ipv4bycc/]]
- [[国別 IPv6アドレス割当リスト:+https://foxmaster.jp/ipv6bycc/]]
* 参考サイト [#zbac4450]
- [[ログメッセージをSyslogサーバーに転送したい:+https://ja.stackoverflow.com/questions/22809/%E3%83%AD%E3%82%B0%E3%83%A1%E3%83%83%E3%82%BB%E3%83%BC%E3%82%B8%E3%82%92syslog%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E3%81%AB%E8%BB%A2%E9%80%81%E3%81%97%E3%81%9F%E3%81%84]]
- [[loggerコマンドでsyslogにエラーを出力する方法:+http://kaworu.jpn.org/kaworu/2008-05-27-1.php]]
~
*注意事項 [#ae237f6b]
+ ファイル利用による損益について、&color(#ff0000){一切の責任を負いません};
+ 状況に応じて、アクセス制限・ダウンロードURLの変更・ファイルの公開停止をする場合があります
+ 毎日深夜0時30分頃にファイルを生成しますが、メンテナンスで更新の遅れる事があります
+ ファイルを自動取得する場合、サーバ負荷軽減の為に&color(#ff0000){圧縮ファイルをご利用下さい};
+ CC・セグメント間はタブ区切り、順序はCC・セグメントを昇順でソートしています
~
* ファイル [#g6bbb348]
#iframe(https://www.ns-lab.org/iplist/,style=width:100%;height:240px;,iestyle=width:100%;height:240px;)
- 展開コマンド
 $ gzip    -cd cidr_ipv4.gz  > cidr_ipv4.txt
 $ bunzip2 -cd cidr_ipv4.bz2 > cidr_ipv4.txt
 $ xzcat   -cd cidr_ipv4.xz  > cidr_ipv4.txt
----
~
* 説明 [#cf2e3684]
IPアドレスリストをCIDR形式に整形するスクリプトについて、当サーバで利用している物を公開。
スクリプトはLinuxでの実行を前提にPerlで作成してあります。
ライセンスについて、筆者が作成したスクリプトは好きに改変して問題ありませんが、
*注意事項 [#r1217fe5]
+ ファイル利用による損益について、&color(#ff0000){一切の責任を負いません。};
+ 状況に応じて、インストーラ・スクリプトの公開を停止する場合があります。
+ ライセンスについて、筆者が作成したスクリプトは好きに改変して問題ありませんが、
&color(#ff0000){外部ライブラリのライセンスについてはライブラリ配布元に帰属とします。};
+ 宣伝してくれる心優しい方は、是非[[トップページ:+https://www.ns-lab.org/]]へリンクをお願いします。
~
* 参考サイト [#k7bdaa0a]
- [[Mark Suter:+https://zwitterion.org/software/aggregate-cidr-addresses/]]
- [[AbacusTechnologies:+https://kana.me/entry/ip-ranges-by-country]]
- [[てくにかるむ:+http://multix.jp/delegated-apnic-acl/]]
~
* スクリプト [#ac7a4f0d]
* スクリプト [#u89aa2e8]
|LEFT:80|CENTER:100|LEFT:100|LEFT:200|c
|CENTER:~公開日|~FILE|RIGHT:~SIZE|CENTER:~MD5|CENTER:~更新内容|
|2019/01/02|[[iplist_20190102.zip:https://www.ns-lab.org/files/iplist/iplist_20190102.zip]]|9.9KB|a6a92accfd4b90be44a1df772f4248a0|CIDR変換時のハッシュ処理を最適化|
|2017/12/17|[[iplist_20171217.zip:https://www.ns-lab.org/files/iplist/iplist_20171217.zip]]|9.9KB|6aed24625f0aea04a4e4888a53560f7d|IPリストの圧縮処理を変更|
|2017/12/15|[[iplist_20171215.zip:https://www.ns-lab.org/files/iplist/iplist_20171215.zip]]|9.9KB|b1d878a9d2f8472891b0a24b6b779d25|初公開|
|2023/05/24|[[logger_20230524.tar.gz:https://www.ns-lab.org/files/logger/logger_20230524.tar.gz]]|3.1KB|fa800de7ff48221a5d8d191105d8b95d|ディストリビューション判定の処理を最適化|
|2022/10/09|[[logger_20221009.tar.gz:https://www.ns-lab.org/files/logger/logger_20221009.tar.gz]]|3.2KB|3929dea119c0d67f8790ed08b5cbfb27|systemdユニットファイルの同梱とRHEL9新規対応|
|2019/05/12|[[logger_20190512.tar.gz:https://www.ns-lab.org/files/logger/logger_20190512.tar.gz]]|2.9KB|2cd2a0d318c21a4069690bfc99aa398e|restart時に再起動しない場合がある不具合を修正|
|2019/05/10|[[logger_20190510.tar.gz:https://www.ns-lab.org/files/logger/logger_20190510.tar.gz]]|2.9KB|c07f49574cdbecd8b0d1197e5ab98f3a|初公開|
~
* 初期設定 [#ce578d76]
実行パス・ファイル保存先は変数に直書きしている為、下記に従って実行前に該当箇所を書き換えてください。
また、スクリプトにヘルプも埋め込んであるので、必要に応じて「./script.pl --help」で確認してください。
* インストール [#l17d6314]
RHEL/Debian/openSUSEのクローンディストリビューションに対応するインストーラを同梱していますので、
&color(#ff0000){SELinuxとAppArmorを無効化};してから下記コマンドの通りインストールして下さい。
 # wget "https://www.ns-lab.org/files/logger/logger_latest.tar.gz"
 # tar zxvf logger_latest.tar.gz
 # cd logger
 # ./install.sh
 
#region(&color(#ff0000){make-country-iplist.pl};)
 用途:スクリプト全体の統括、レポートメールの送信
 ---
 $CIDR_ROOT_DIR   = "出力ファイルの保存先"
 $MAIL_FROM       = "メールレポートの送信元アドレス"
 $MAIL_TO         = "メールレポートの宛先アドレス"
 $SCRIPT_ROOT_DIR = "スクリプトの保存ディレクトリ"
 $SCRIPT_OPTION   = "スクリプトの共通オプション"
systemdユニットファイルを手動インストールを行う場合、
下記を参考に各ファイルをコピーしつつ、パーミッションを適切に設定して下さい。
 # cp logger/environment/logger.systemd /etc/sysconfig/logger
 # chown root.root /etc/sysconfig/logger
 # chmod 644 /etc/sysconfig/logger
 
 # cp logger/service/logger.systemd /usr/lib/systemd/system/logger.service
 # chown root.root /usr/lib/systemd/system/logger.service 
 # chmod 644 /usr/lib/systemd/system/logger.service 
 
 # cp logger/logger-exec /usr/local/sbin/
 # chown root.root /usr/local/sbin/logger-exec
 # chmod 755 /usr/local/sbin/logger-exec
 
 # mkdir -p /etc/logger
 # cp logger/logger.conf /etc/logger/
 # chown root.root /etc/logger/logger.conf
 # chmod 644 /etc/logger/logger.conf
 
 # systemctl enable logger.service
 # systemctl daemon-reload
 
initをsystemd同等に動かす時は下記手順になります。
互換性維持の為に残しているファイルなので、通常はsystemdユニットファイルを使って下さい。
 # cp logger/environment/logger.init /etc/sysconfig/logger
 # chown root.root /etc/sysconfig/logger
 # chmod 644 /etc/sysconfig/logger
 
 # cp logger/service/logger.redhat /etc/init.d/logger
 # chown root.root /etc/init.d/logger
 # chmod 755 /etc/init.d/logger
 
 # cp logger/logger-exec /usr/local/sbin/
 # chown root.root /usr/local/sbin/logger-exec
 # chmod 755 /usr/local/sbin/logger-exec
 
 # mkdir -p /etc/logger
 # cp logger/logger.conf /etc/logger/
 # chown root.root /etc/logger/logger.conf
 # chmod 644 /etc/logger/logger.conf
 
 # chkconfig --add logger
 # chkconfig logger on
 # systemctl daemon-reload
~
* 設定ファイル [#n967b95f]
スクリプトを実行するには、下記2ファイルの設定が必要となります。
環境変数についてはデフォルト状態で動作しますが、
スクリプトのログ読込み設定については環境に合わせて再設定して下さい。
#region(&color(#ff0000){/etc/sysconfig/logger};)
 # スクリプトの設定ファイルPATH
 CONFIG="/etc/logger/logger.conf"
 
 # スクリプトのプロセスIDを格納するファイル
 # 設定を変更した場合、起動スクリプト内の設定も変更
 PID="/var/run/logger.pid"
 
 # スクリプトの実行オプション
 # 汎用性を持たせる為に用いている為、実際には初期設定から変更しない
 OPTIONS="-c $CONFIG -p $PID"
#endregion
#region(&color(#ff0000){make-country-getrir.pl};)
 用途:RIRのIPアドレスリスト取得
 ---
 $CIDR_ROOT_DIR   = "出力ファイルの保存先"
#region(&color(#ff0000){/etc/logger/logger.conf};)
 # ログ読込み設定はカンマ区切りで各パラメータを設定
 # 初期状態では、auditログをlocal0に転送する設定例を記載済
 
 # 1個目:リアルタイムで取得するテキストログ
 # 2個目:変換後のsyslogファシリティ
 # 3個目:変換後のsyslogプライオリティ
 # 4個目:変換後の送信元プログラム名(syslogタグ)を変更する
 #        未設定の場合、スクリプト実行ユーザ名(root)になる
 
 /var/log/audit/audit.log,local0,info,audit
#endregion
#region(&color(#ff0000){make-country-modify.pl};)
 用途:IPアドレスリストをCIDR形式に整形
 ---
 $CIDR_ROOT_DIR   = "出力ファイルの保存先"
 
取得したログをリモートサーバにsyslog転送するには、rsyslog・syslog-ngの設定変更も必要になります。
local1の全ログをIPアドレス10.0.0.1、
local2の全ログをIPアドレス10.0.0.2に転送する場合、rsyslogには下記の様な設定を追加して下さい。
#region(&color(#ff0000){/etc/rsyslog.conf};)
 # RemoteServer01
 local1.*    @10.0.0.1
 & ~
 
 # RemoteServer02
 local2.*    @10.0.0.2
 & ~
#endregion
#region(&color(#ff0000){make-country-output.pl};)
 用途:整形済IPアドレスリストのテキスト化、ファイル結合処理
 ---
 $CIDR_SCRIPT     = "外部ライブラリの実行パス"
 $CIDR_ROOT_DIR   = "出力ファイルの保存先"
#endregion
#region(&color(#ff0000){make-country-webdir.pl};)
 用途:整形済IPアドレスリストの圧縮、WEBディレクトリへ複製
 ---
 $IPLIST_OWNER    = "WEB公開ファイルのユーザ"
 $IPLIST_GROUP    = "WEB公開ファイルのグループ"
 $IPLIST_PERMIT   = "WEB公開ファイルのパーミッション"
 $WEB_ROOT_PATH   = "WEB公開ファイルの保存先ディレクトリ"
 $CIDR_ROOT_DIR   = "出力ファイルの保存先"
#endregion
~
* 実行コマンド [#z2b46344]
スクリプト変数を下記内容に設定し、未記載の変数をデフォルトとした場合の実行例。
CPU処理速度にも左右されますが処理完了まで5分程時間が必要となります。
外部ライブラリ(aggregate-cidr-addresses)は、IPv6対応の為に1行書き換えてください。
-変数設定例
 $CIDR_ROOT_DIR   = "/var/iplist";
 $SCRIPT_ROOT_DIR = "/usr/local/bin/iplist";
 $CIDR_SCRIPT     = "/usr/local/bin/iplist/aggregate-cidr-addresses";
 $IPLIST_OWNER    = "www";
 $IPLIST_GROUP    = "www";
 $IPLIST_PERMIT   = "644";
 $WEB_ROOT_PATH   = "/var/www/htdocs";
~
-実行準備
 # cd /usr/local/bin/iplist
 # wget "https://zwitterion.org/software/aggregate-cidr-addresses/aggregate-cidr-addresses"
 # diff aggregate-cidr-addresses.orig aggregate-cidr-addresses
   89c89
   <     print $_->prefix(), "\n";
   ---
   >     print 6 eq $_->version ? $_->print() : $_->prefix(), "\n";
 
 # mkdir /var/iplist
 # chmod 755 make-country-*.pl aggregate-cidr-addresses
 # ls
   aggregate-cidr-addresses  make-country-iplist.pl  make-country-output.pl
   make-country-getrir.pl    make-country-modify.pl  make-country-webdir.pl
~
-実行方法
ローカル用IPリストの生成(WEB公開無し)
 $ ./make-country-iplist.pl
* 実行コマンド [#x6171017]
スクリプトの全設定を行った後、initスクリプトを実行するとloggerが起動します。
起動オプション・停止コマンドは下記の通りとなっています。
- スクリプト起動
 systemctl start logger

- スクリプト停止
 systemctl stop logger

- スクリプト再起動
 systemctl restart logger

 
WEB公開用IPリストの生成
 $ ./make-country-iplist.pl --web
 
ヘルプの表示
 $ ./make-country-iplist.pl --help
スクリプトが正常に起動しつつ、rsyslog・syslog-ngのリモート転送も設定している場合、
ログ転送先(図のサーバB)では下記の様なログを取得する事が出来ます。
ログが転送されて来ない場合、何処かの設定が失敗しているので設定・パーミッションを見直して下さい。
 May 10 00:15:00 server audit: type=CRYPTO_KEY_USER msg=audit(1557414900.XXX:415): pid=*** uid=0 ...
 May 10 00:15:00 server audit: type=CRYPTO_KEY_USER msg=audit(1557414900.XXX:416): pid=*** uid=0 ...
 May 10 00:15:00 server audit: type=CRYPTO_KEY_USER msg=audit(1557414900.XXX:417): pid=*** uid=0 ...