投稿者: manualmaton Page 123 of 289

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とスケールが一致していること
  • 車のスケールモデルと異なり場所を取らないこと

が購入の決め手です。

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

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

Ubuntu 22.04でZabbix 6.2(MySQL/nginx構成)を設定するときにハマったこと。

以下の環境でZabbixを導入してみましたが、いくつかハマったことがあったのでメモを残しておきます。

導入した環境

  • Ubuntu 22.04
  • 導入しようとしたZabbix : 6.2
  • MySQL / nginx構成
  • 他サービス未導入(OSインストールと初期設定を終えたのみです)
  • ドメイン登録済みです。
  • ワイルドカードSSL証明書を発行済みです。

導入手順(ハマりポイント込み)

前提

  • 全て管理者権限で実施しています。
  • パッケージ管理は基本的にaptitudeを利用しています。
  • ローカルNWで設定しているのでufwなどは考慮していません。

参考URL

Zabbixレポジトリを追加してインストールします。

aptitude update
aptitude upgrade
wget https://repo.zabbix.com/zabbix/6.2/ubuntu/pool/main/z/zabbix-release/zabbix-release_6.2-1+ubuntu22.04_all.deb
dpkg -i zabbix-release_6.2-1+ubuntu22.04_all.deb
aptitude update
aptitude install zabbix-server-mysql zabbix-frontend-php zabbix-nginx-conf zabbix-sql-scripts zabbix-agent

MySQLの初期設定

aptitude install mysql-server
systemctl start mysql
systemctl enable mysql

必要に応じて: mysql_secure_installation

参考 https://level69.net/archives/28557
vi /etc/mysql/mysql.conf.d/mysqld.cnf
追記内容
#末尾に以下を追加
default_authentication_plugin=mysql_native_password

設定後にmysqlサービス再起動

systemctl restart mysql

MySQL rootパスワード設定

mysql -u root -p
# 未設定のためパスワードは不要です
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'パスワード';
#パスワードは任意のものを入力ください
flush privileges;
exit

mysql初期設定

mysql_secure_installation
初期設定内容
Enter password for user root: 
# 上記で設定したパスワードを入力します

VALIDATE PASSWORD COMPONENT can be used to test passwords
and improve security. It checks the strength of password
and allows the users to set only those passwords which are
secure enough. Would you like to setup VALIDATE PASSWORD component?

Press y|Y for Yes, any other key for No: 
# Yを入力してEnter

There are three levels of password validation policy:

LOW    Length >= 8
MEDIUM Length >= 8, numeric, mixed case, and special characters
STRONG Length >= 8, numeric, mixed case, special characters and dictionary                  file

Please enter 0 = LOW, 1 = MEDIUM and 2 = STRONG:
# ポリシーに合わせて0/1/2を入力(ローカル環境のため0としました)

Estimated strength of the password: 50 
Change the password for root ? ((Press y|Y for Yes, any other key for No) : 
# 既に設定しているのでn

By default, a MySQL installation has an anonymous user,
allowing anyone to log into MySQL without having to have
a user account created for them. This is intended only for
testing, and to make the installation go a bit smoother.
You should remove them before moving into a production
environment.

Remove anonymous users? (Press y|Y for Yes, any other key for No) : 
# anonymousユーザーを削除するためY

Normally, root should only be allowed to connect from
'localhost'. This ensures that someone cannot guess at
the root password from the network.

Disallow root login remotely? (Press y|Y for Yes, any other key for No) : 
# rootユーザのリモートログインを禁止するためY

Remove test database and access to it? (Press y|Y for Yes, any other key for No) : 
# テストDBを削除するためY

Reload privilege tables now? (Press y|Y for Yes, any other key for No) : 
# 設定を反映するためy

MySQLでZabbix用のユーザーを作成

mysql -uroot -p
# 上記で設定したパスワードを入力します
CREATE DATABASE zabbix character set utf8mb4;
CREATE USER 'zabbix'@'localhost' IDENTIFIED BY 'パスワード';
# 任意のパスワードを設定
GRANT ALL ON redmine.* TO 'zabbix'@'localhost';
flush privileges;
exit

ハマりポイント1:SQL実行時にエラーが出る

ERROR 1419 (HY000) at line 2123: You do not have the SUPER privilege and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)

と出たので、設定をしておきます。

対処方法
mysql -uroot -p

rootでmysqlにログイン後、以下を実行します。

SHOW VARIABLES LIKE 'log_bin_trust_function_creators';
# OFF を確認
set global log_bin_trust_function_creators=1;
# 設定を有効化
 SHOW VARIABLES LIKE 'log_bin_trust_function_creators';
 # ONを確認

ハマりポイント2: インポート用SQLが存在しない(正しい手順を後述)

Webサイトの手順によると、

zcat /usr/share/doc/zabbix-sql-scripts/mysql/server.sql.gz | mysql -uzabbix -p zabbix

とありますが、該当ディレクトリにmysql用のSQLが存在しません。

対処方法
apt reinstall zabbix-sql-scripts

として、sqlを再インストールします。

updatedb
 locate server.sql.gz
 →  /usr/share/zabbix-sql-scripts/mysql/server.sql.gz

SQLをインポートします。

zcat /usr/share/zabbix-sql-scripts/mysql/server.sql.gz | mysql -uzabbix -p zabbix
# zabbixのDBパスワードを入力します。

Zabbixの設定を行います。

vi /etc/zabbix/zabbix_server.conf
追記/編集内容
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix

nginx用のconfファイルを設定します。

vi /etc/zabbix/nginx.conf
編集内容
        listen          443 ssl http2 default_server;
        # ポートを443のみで受け付けるようにします。
        server_name     ドメイン名;

        ssl_certificate "/SSL証明書と中間証明書を結合したファイル";
        ssl_certificate_key "秘密鍵ファイル";
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-SHA";
        ssl_prefer_server_ciphers off;
        ssl_session_cache shared:SSL:1m;
        ssl_session_timeout 10m;

設定内容を確認します。

nginx -t
# Syntax OKを確認します

設定内容を反映します。

systemctl restart zabbix-server zabbix-agent nginx php8.1-fpm
systemctl enable zabbix-server zabbix-agent nginx php8.1-fpm

セットアップ確認

ブラウザから

https://ドメイン名/setup.php

が表示されれば問題ないです。その後、Next Stepに進んでください。

Page 123 of 289

Powered by WordPress & Theme by Anders Norén