投稿者: manualmaton Page 128 of 294

Mod_SecurityのIPアドレス調査。(IPアドレスごとのカウント)

2022年12月現在、「Mod_Securityが検知したIPアドレスネガティブリストに放り込む」は達成しました。

  • これら検知したIPはどこの国からか?
  • 日々、どのぐらいの数、不審なアクセスが来ているのか?

を把握するため、シェルスクリプトを書きました。(前回はこちらです)

やりたいこと

  1. Mod_securityが検知したエラーログからIPアドレスのみを抜き出す
  2. 検出したIPアドレスがどこの国からアクセスしたかを調査してcsvファイルに出力する
  3. 同じIPアドレスごとに件数を数え、降順で並べ替える
  4. cronで定期実行する

本項でやること

  1. 同じIPアドレスごとに件数を数え、降順で並べ替える

前提と準備

以下の環境です。

  • Ubuntu 20.04とCentOS 7以降で動作を確認しました。

前回の「エラーログからIPアドレスのみを抽出し、アクセス元の国を付与する」スクリプトが導入されていることが条件です。

スクリプト生成

参考

chatGPTの力を借りました。何度か質問を変え、動作確認しつつコマンドを足しています。

1. スクリプトを作成します。

vi ip_count.sh
スクリプト内容
#!/bin/bash

# ip_list.csv.YYYYMMDDを読み込んで、IPアドレスをキー、国を値とする連想配列を作成します
declare -A countries
while read -r line; do
  # CSVの1列目をIPアドレス、2列目を国とします
  ip=$(echo $line | cut -d',' -f1)
  country=$(echo $line | cut -d',' -f2)
  # 連想配列に格納します
  countries[$ip]=$country
done < ip_list.`date +%Y%m%d`.csv

# 結果を格納するための変数を定義します
result=""

# 連想配列を反復処理します
for ip in "${!countries[@]}"; do
  # 各IPアドレスの件数を数えます
  count=$(grep -c $ip ip_list.`date +%Y%m%d`.csv)
  # 件数、IPアドレス、国をカンマ区切りで結合します
  line="$count,$ip,${countries[$ip]}"
  # 結果に追加します
  result="$result\n$line"
done

# カウントした結果をcounted_ip.YYYYMMDD.csvに出力します
echo -e $result > counted_ip.`date +%Y%m%d`.csv

### ↑ここまでchatGPTが作成したスクリプト↑ ###

# 最終結果をsorted_ip.`date +%Y%m%d`.csvに出力します
# LC_ALL=Cを設定しないと日本語で書かれた国名の並べ替えがうまくいきませんでした
cat counted_ip.`date +%Y%m%d`.csv |LC_ALL=C sort -n -r > sorted_ip.`date +%Y%m%d`.csv

# 最終結果以外のログファイルを削除します
# 必要に応じて無効化してください
rm ip.`date +%Y%m%d`.csv
rm ip_list.`date +%Y%m%d`.csv
rm counted_ip.`date +%Y%m%d`.csv

exit 

スクリプトに実行権限を付与します。

chmod +x ip_count.sh

動作確認

任意のディレクトリに以下のファイルがあることを確認します。

  • ip_check.sh スクリプトが生成したログip_list.YYYYMMDD.csv
  • ip_count.sh スクリプト

スクリプト実行

./ip_count.sh

スクリプト実行結果

出力先(上記例ではスクリプトを配置したディレクトリ)に以下のファイルが出力されます。

  • sorted_ip.YYYYMMDD.csv (以下の様に、アクセスごとの件数とIPアドレスとアクセス元の国を記述し、アクセス数の降順で並べ替えたファイル)
100, AAA.BBB.CCC.DDD,シンガポール
30, AAA.BBB.CCC.DDD,ベトナム
20,AAA.BBB.CCC.DDD,中国
  • 同時に、以下のファイルが消去されます。
  • ip.YYYYMMDD.csv (エラーログからIPアドレスのみを抜き出したファイル)
  • ip_list.YYYYMMDD.csv (IPアドレスにアクセス元を追記したファイル)
  • counted_ip.YYYYMMDD.csv (IPアドレスごとのカウントを行ったファイル)

合間に余計なファイルが含まれるので、ここはもっとスマートに書きたいです。

次にやること

  1. cronによる定期実行化
  2. redmineのプラグインredmine_logsで閲覧できるように設定

Mod_SecurityのIPアドレス調査。(アクセス元の国を抜き出す)

2022年12月現在、「Mod_Securityが検知したIPアドレスネガティブリストに放り込む」は達成しました。

  • これら検知したIPはどこの国からか?
  • 日々、どのぐらいの数、不審なアクセスが来ているのか?

を把握するため、シェルスクリプトを書きました。

やりたいこと

  1. Mod_securityが検知したエラーログからIPアドレスのみを抜き出す
  2. 検出したIPアドレスがどこの国からアクセスしたかを調査してcsvファイルに出力する
  3. 同じIPアドレスごとに件数を数え、降順で並べ替える
  4. cronで定期実行する

本項でやること

  1. Mod_securityが検知したエラーログからIPアドレスのみを抜き出す
  2. 検出したIPアドレスがどこの国からアクセスしたかを調査してcsvファイルに出力する

前提と準備

以下の環境です。

  • Ubuntu 20.04とCentOS 7以降で動作を確認しました。

nslookupコマンドが実装されていること

which nslookup
# パスがあれば実装されています。
nslookupがない場合のインストール
sudo apt-get install dnsutils

スクリプト生成

参考

以下のスクリプトをベースにしています。

https://raintrees.net/news/11

本スクリプトの作成者様と、IPアドレスと国の対応を結びつけるサービスの作成者様にこの場を借りて御礼申し上げます。

1. 国コードとアドレスを対応させたCSVを作成します。

以下のようなCSVを作成します。

vi country_list.csv
ファイル内容
AC,アセンション島
AD,アンドラ
AE,アラブ首長国連邦
AF,アフガニスタン
AG,アンティグア・バーブーダ
AI,アンギラ
AL,アルバニア
etc...

作成に当たっての参照先:

https://memorva.jp/memo/website/domain_cctld_country_code.php

スクリプトを作成します。

vi ip_check.sh
スクリプト内容
#!/bin/sh

# error.logのディレクトリを指定する場合は指定して下さい
# error.logからIPアドレスだけを抜き出して同ディレクトリのip.YYYYMMDD.csvに保存します
cat ./error.log | awk 'match($0,/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/) { print  substr($0, RSTART, RLENGTH) }' | sort > ip.`date +%Y%m%d`.csv

listfile="./ip.`date +%Y%m%d`.csv"
# ip.YYYYMMDD.csvファイルがない場合にエラーを返します
if [ ! -f $listfile ]; then
        echo "ファイル $listfile が存在しないので終了します。"
        exit 1
fi

country_list="./country_list.csv"
# 国コード,国の名前が書かれたcountry_list.csvがない場合にエラーを返します
if [ ! -f $country_list ]; then
        echo "ファイル $country_list が存在しないので終了します。"
        exit 1
fi

# IPアドレスに国名を付与したファイルを定義します。(ip_list.YYYYMMDD.csv)
result_file="./ip_list.`date +%Y%m%d`.csv"
cat /dev/null > $result_file

cat ${listfile} | while read line
do
                # IPアドレスを逆順に並び替えます。(例: 1.2.3.4 → 4.3.2.1
                ip_revers=`echo ${line}|awk -F'.' '{print $4,".",$3,".",$2,".",$1}'|sed -e 's/ //g'`
                # 並び替えたIPアドレスをcc.wariate.jpに並び替えて、国コードを抜き出します。(JP,CH,ESなど
                country_code=`nslookup -type=TXT ${ip_revers}.cc.wariate.jp | grep '"'|awk -F'"' '{print $2}' `
                # 国コードをcountry_list.csvから参照して国名を抜き出します。
                country_name=`cat ${country_list} | grep ${country_code} | cut -d"," -f 2`

                # 次の行は標準出力に返す処理を行います。cron処理する場合は#をつけて作動しないようにします。
                 echo "${line},${country_name}"
                # IPアドレス,国名の形式にして同ディレクトリのip_list.YYYYMMDD.csvに保存します
                echo "${line},${country_name}" >> $result_file
        sleep 1
done

exit

スクリプトに実行権限を付与します。

chmod +x ip_check.sh

動作確認

任意のディレクトリに以下のファイルがあることを確認します。

  • error.log (またはスクリプトにログのパスを記載)
  • ip_check.sh スクリプト
  • country_list.csv

スクリプト実行

./ip_check.sh

スクリプト実行結果

出力先(上記例ではスクリプトを配置したディレクトリ)に以下のファイルが出力されます。

  • ip.YYYYMMDD.csv (エラーログからIPアドレスのみを抜き出したファイル)
  • ip_list.YYYYMMDD.csv (以下の様に、IPアドレスとアクセス元の国を記述したファイル)
AAA.BBB.CCC.DDD,シンガポール
AAA.BBB.CCC.DDD,ベトナム
AAA.BBB.CCC.DDD,中国

次にやること

  1. このスクリプトの実行結果を元に件数ごとにまとめて並べ替えるスクリプトの作成
  2. cronによる定期実行化

絞りと背景。

今日は簡単な検証です。

発端は11月に撮影したこの、LAMYとfigmaライザを併せた絵をもう一度撮りたい、でした。

そこで適当にペンケースやら背景を並べていき、

撮影した1st takeがこちら。以前よりもペンやらをより強調したいのですがボケがやや強め。

そこで、カメラを絞り優先にして明かりも足して2nd take。

近づいてきたので、表情を変えての3rd takeです。

これによって、ペンもフィギュアも両方ともある程度ピントが合った状態で撮影できたという次第。

Nextcloudのリリース判定。

そもそも、このNextcloudを導入しようと思っていたきっかけは「Dropboxの代わりにならないか」でした。

なので、それを判定です。

スマートフォンの画像をアップロードできるか

→ 問題なし。出先からアップロード出来ないという問題がありますが、逆に無線Wi-Fiルータの帯域を消費せずに住みます。

表示速度などは大丈夫か

→ やはり問題なし。むしろローカル環境なので(インターネット回線に左右されないので)回線速度は良好。プレビューが少しもたつくかなぐらいですが誤差の範囲内です。

システムリソースに負荷がかからないか

→ アップロードした画像にタグ付けや顔認識をする「recognize」のせいで、ロードアベレージが常時10を超える事態が導入直後から1週間以上続きました。

ですが、その処理が無事に終わったあとは収束を見せています。

データの冗長化はどうなっているか

→ こちらも、lsyncによるデータのリアルタイム動機により解決。

結論

10年以上用いていたDropboxを解約するに至りました。(というよりも、並行期間中、Dropboxが使えないことに不便は感じていません)

あと、やることがあるとするならこのサーバ自体のスペックアップとデータストレージの増強ぐらいかなと。

Nextcloudが稼働している小型PC[Chuwi Herobox pro]

買い足し、チョい足し。-百均グッズの撮影用小物(その36)-

こちらののれん、とても使い勝手が良かったので

もう一つ足すことに決定です。この「のれん」には鰻屋のものもあったので

漫画のシーンを少し再現といったところです。

また、先のリンク先でも上げたのれんやら看板はどちらかというと昭和的な雰囲気が漂うので

昭和のキャラクターにも合うことが改めて判明です。

週末に遊んだボードゲーム。

割と軽めのチョイスでした。

タッジーマッジー

ソロで何度か遊んだゲームをようやく対人で。たった18枚のカード、2回の変速ドラフトの後に得点計算。

カードのコンボや、相手がどんなコンボを狙ってくるかを見越した上でのカードチョイスが絶妙でした。

ブロックス Duo

シンプルなルールと白熱のアブストラクトが楽しめる定番ゲーム、蓋利用を実施。

見通しの良いプレイ時間もちょうどよかったです。

紅茶ロマン紀行

今年遊んだ中でも一二を争う面白さだったボードゲーム『紅茶ロマン紀行』。

今回は最速でダージリンを取得して圧倒できました。

軽めのゲームでも十分にリフレッシュできました。

定期作業のチケット化。(redmine_チケットテンプレート)

やりたいこと

このワイルドカード証明書発行は自動発行ではありません。また、ローカル証明書としても保存したいので結構やることがあります。

現時点での運用案

redmineのチケットテンプレートとすることで、手順をチケットに流し込むことにしました。

一度作ってしまえば後は新規チケットとして発行し、それに沿って行けば抜け漏れがありません。(redmineのリマインド機能も利用します)

また、テンプレートそのものを直すことで後の手順変更にも対応可能です。

設定したテンプレート

  • ドメインはsample.domainとしています。
  • 実施時期はLet's Encryptの更新サイクルに合わせています。
  • 作成年月を後で修正することがないように変数化しています。
  • apacheとnginxの設定ファイルの証明書/秘密鍵参照先はそれぞれシンボリックリンク先なので、リンクを貼り替えるだけで証明書が更新できるようにしています。
### 概要

Let's EncryptのSSLワイルドカード証明書を発行して更新する。

### 実施時期

毎年
- 3月
- 6月
- 9月
- 12月

### 実施手順 (AWS Lightsailサーバ)

#### 作業ディレクトリ作成

```bash
mkdir -p /home/work/ssl$(date +%Y%m)
cd /home/work/ssl$(date +%Y%m)
```

#### 証明書発行

```bash
sudo certbot certonly --manual \
    --preferred-challenges dns-01 \
    --server https://acme-v02.api.letsencrypt.org/directory \
    -m メールアドレス \
    -d *.sample.domain
```

1. コマンド発行後、TXTレコードの登録指示がある。
1. AWS管理コンソールにログインする
1. 指示があったTXTレコードを登録
1. 以下のコマンドで結果が返ってくるまでしばらく待つ

```bash
nslookup -type=TXT _acme-challenge.sample.domain
```
→ 結果が返ってきたらEnter。証明書が更新される。

#### 証明書を作業ディレクトリにコピー

```bash
sudo cp -pi /etc/letsencrypt/live/sample.domain-0001/fullchain.pem ./sample.domain.crt.$(date +%Y%m)
sudo cp -pi /etc/letsencrypt/live/sample.domain-0001/privkey.pem ./sample.domain.key.$(date +%Y%m)
```

#### 証明書の整合性を確認

```bash
openssl x509 -noout -dates -subject -in sample.domain.crt.$(date +%Y%m)
# 期限が延びていることを確認

openssl x509 -in sample.domain.crt.$(date +%Y%m) -noout -modulus | md5sum
openssl rsa -in sample.domain.key.$(date +%Y%m) -noout -modulus | md5sum
# 証明書-秘密鍵のハッシュ値が同じであることを確認

openssl x509 -issuer_hash -noout -in sample.domain.crt.$(date +%Y%m)
sed -n -e'1d' -e'/BEGIN/,$p' sample.domain.crt.$(date +%Y%m) | openssl x509 -subject_hash -noout
# 証明書-中間証明書の発行元のハッシュ値が同じであることを確認
```

### 実施手順 (apache/nginxサーバ)

#### 証明書を格納する(nginx/apache共通)

ここからは管理者権限で実施する。

```
cd /etc/certs/
# 証明書ファイルを格納したディレクトリに移動します

vi sample.domain.crt.$(date +%Y%m)
# AWSサーバで発行した証明書を貼り付けます

ls -l
# *以下を確認します*
# 更新したLet's Encyrptの証明書ファイルがあること
# 証明書のシンボリックリンクの向き先が前回更新年月であること

ln -sf sample.domain.crt.$(date +%Y%m) sample.domain.crt 

ls -l
# *以下を確認します*
# 証明書のシンボリックリンクの向き先が*今回*更新年月であること
```


#### 秘密鍵を格納する(nginx/aapche共通)

```bash
cd /etc/private
# SSL秘密鍵を格納したディレクトリに移動します

vi sample.domain.key.$(date +%Y%m)
# AWSサーバで発行した秘密鍵を貼り付けます

ls -l
# *以下を確認します*
# 更新したLet's Encyrptの秘密鍵ファイルがあること
# 証明書の秘密鍵の向き先が前回更新年月であること

ln -sf sample.domain.key.$(date +%Y%m) sample.domain.key 

ls -l

# *以下を確認します*
# 証明書の秘密鍵の向き先が*今回*更新年月であること
```

#### 設定反映 

##### nginxの場合

```bash
nginx -t
# syntax is okを確認
systemctl restart nginx
systemctl status nginx
# 再起動後、正常に稼働していることを確認
```

##### apacheの場合

```bash
apache2ctl configtest
# Syntax okを確認
systemctl restart apache2
systemctl status apache2
# 再起動後、正常に稼働していることを確認
```

#### 反映確認

ブラウザで証明書が延びていることを確認

chatGPTが作成したシェルスクリプト。

こちらにより、apacheのバーチャルファイルをAIで作成できると知り、そこから更に発展させました。

作成して欲しいと思った機能

こちらのスクリプトで抜き出したIPアドレスを、

  • 10.0.0.0/24
  • 10.3.3.0/24
  • 172.28.3.0/24
  • 192.168.1.0/24

のように、ネットワークアドレスにした上でNWごとにブロックできないかと思い立ち、その前段として「IPをソートしてネットワークアドレスを付与できないか」

と、以下のようにして書いてもらいました。

AIへの質問

192.168.1.3
192.168.1.2
10.0.0.2
10.3.3.2
10.3.3.254
172.28.3.4
172.28.3.5

などのIPアドレスが書かれたテキストファイルip.txtがあります。

これを読み込んだ後にソートして

192.168.1.0/24
192.168.1.0/24
10.0.0.0/24
10.3.3.0/24
10.3.3.0/24
172.28.3.0/24
172.28.3.0/24

とネットワークアドレスに変換後、

10.0.0.0/24
10.3.3.0/24
172.28.3.0/24
192.168.1.0/24

と重複を排除し、アドレスごとに改行した上でnetwork.txtに出力するシェルスクリプトを書いてください。

AIの回答

以下のようなシェルスクリプトを作成することで、指定した要件を満たすことができます。

#!/bin/bash

# ip.txtを読み込んで、1行ごとに処理する
while read line; do
  # IPアドレスを/24のサブネットマスクで分割する
  network=$(echo "$line" | cut -d "." -f 1-3).0/24

  # 分割したサブネットアドレスを出力する
  echo "$network"
done < ip.txt | sort | uniq > network.txt

上記のスクリプトでは、ip.txtを読み込んで1行ごとに処理しています。

その後、cutコマンドを使用して、IPアドレスを"."で分割し、最初の3つのフィールドを取り出します。

最後に、取り出したフィールドに".0/24"を追加して、サブネットアドレスを生成します。

生成したサブネットアドレスをsortコマンドでソートし、uniqコマンドで重複を除外した上で、network.txtに出力するようにしています。

作成結果

以下、作成しました。

vi script.sh
# 上記のスクリプトを貼り付けて保存
chmod +x script.sh
# 平行してIPアドレスを抜き出したip.txtを用意します
./script.sh

で、予想通りの出力が得られました。

後は少しずつ応用していけば、まるごとブロックしたり他のセキュリティソフトとの連携も可能になります。

スケールと焦点距離。

この記事の続きとなります。

  • 百均グッズの背景
  • スケールモデルと背景

につづき、ちょっとした検証を行いました。

Take 1-1. ピンポケ

figmaとねんどろいどのライザを併せて撮ったものの、最初のテイクはものの見事に失敗。

全体の距離が合っていません。そこで

Take 1-2. 顔の距離を合わせる

そこで、ピントが合うように両者の距離を合わせたところ、両方とも顔がクリアに写せました。

Take 2-1. 違うスケールミニチュアと併せる

ラジコンのミニを用いましたけれども、こちらも印象がぼやけます。特に右後方に光が回っていません。

Take 2-2. ねんどろいど同士で併せる

そこで、figmaと併せるのではなく別のねんどろいどと並べ、ミニの「目線」と併せてみました。

被写体、風景、レンズが並ぶと検証項目が多くなります。

スケールモデルと背景。

以前のエントリーでちらっと見せていたこちら、入手報告を忘れていました。

スクーター(vespa)の1/12スケールモデル。

  • figmaとスケールが一致していること
  • 車のスケールモデルと異なり場所を取らないこと

が購入の決め手です。

実際に載せてみると違和感なし。特に、広角レンズを購入したことにより「広がる背景」でも全体にピントが合ってきました。

前述したように、「何気ない街角の風景」に説得力が増してきました。

Page 128 of 294

Powered by WordPress & Theme by Anders Norén