同一サーバ上で2つめのredmineを構築。

redmineはプロジェクトごとに機能の増減やアクセス権を増やせるものの、諸般の事情で「全く別のドメインで新たにredmineを構築する」必要がありました。

以下の手順でうまくいったので、メモとして残します。

環境

  • Ubunut 20.04 (AWS Lightsailインスタンス上)
  • 既に以下のredmineを立ち上げ済み
    • redmine 4.2
    • ruby 2.7
    • mysql 8.0.31

rubyのバージョンの関係で4.2系をインストールすることにします。また、既に動いている環境なのでapacheやmysqlの初期設定は行っていません。

立ち上げ手順

前提

  1. 新たなドメインを取得しているものとします。
  2. mysqlは同一サーバ上にあり、管理者権限を持っているものとします。
  3. この段階ではhttpsを行わないので、グローバル環境で実施する際は早急にSSL化を行ってください。
  4. また、筆者が使いたいプラグインの関係上、4.2をインストールします。

さっくりとした概要

次の内容を実施します。

  1. 新たなredmine用のデータベースを新規で作る。
  2. 現行とは別のディレクトリ上にredmineのプログラムを展開する。
  3. apacheのバーチャルホスト機能で新規redmineの機能を

注意事項

  • 現行のredmineをredmine.sample.com/redmine
  • 新しいredmineをredmine2.sample.com/redmine2

で稼働させます。

現行稼働している時に新しいものを立ち上げる場合は、現行環境のバックアップを取るなどの施策を行ってください。

以下、管理者権限で行います。

redmine用DB/ユーザ作成

mysql -uroot -p
CREATE DATABASE redmine2 character set utf8mb4;
CREATE USER 'redmine2'@'localhost' IDENTIFIED BY 'パスワード';
GRANT ALL ON redmine2.* TO 'redmine2'@'localhost';
flush privileges;
exit

redmine取得

ソースダウンロード

mkdir /var/lib/redmine2
chown -R www-data:www-data /var/lib/redmine2
sudo -u www-data svn co https://svn.redmine.org/redmine/branches/4.2-stable /var/lib/redmine2

configファイル編集

cp -pi /var/lib/redmine2/config/database.yml.example /var/lib/redmine2/config/database.yml
vi /var/lib/redmine2/config/database.yml
編集ファイル内容

productionの部分を以下のように変更します。

production:
  adapter: mysql2
  database: redmine2
  host: localhost
  username: redmine2
  password: "パスワード"
  encoding: utf8mb4

redmineインストール

cd /var/lib/redmine2
sudo -u www-data bundle install --without development test --path vendor/bundle
sudo -u www-data bundle exec rake generate_secret_token
sudo -u www-data RAILS_ENV=production bundle exec rake db:migrate
sudo -u www-data RAILS_ENV=production REDMINE_LANG=ja bundle exec rake redmine:load_default_data

設定ファイル編集

vi /etc/apache2/sites-available/redmine2.conf
設定ファイル内容
<VirtualHost *:80>
  ServerName redmine2.sample.com

Alias /redmine2 /var/lib/redmine2/public
<Location /redmine2>
PassengerBaseURI /redmine2
PassengerAppRoot /var/lib/redmine2
Require all granted
</Location>

  ErrorLog /var/log/apache2/redmine2.sample.com_error.log
  CustomLog /var/log/apache2/redmine2.sample.com_access.log combined
</VirtualHost>

リダイレクトなどで軽くハマり、この設定に落ち着きました。この後、SSL化の手順を実施します。

設定ファイル有効化

a2ensite redmine2.conf
apache2ctl configtest
# Syntax OKを確認します。
systemctl  reload apache2.service

アクセス確認

http://redmine2.sample.com/redmine2

でログインします。

Mod_SecurityのIPアドレス調査。(Cronによる自動実行)

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

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

を把握するため、シェルスクリプトを書きました。(今回で一端終了です)

やりたいこと

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

本項でやること

  1. cronで定期実行

前提

  • エラーログからIPアドレスを抜き出しアクセス元の国を抜き出すスクリプト
  • そのIPアドレスをカウントして降順に表示するスクリプト

が用意されていること。(前回前々回で提示)

また、

  • apacheのログが日ごとにローテーションされていること
  • redmineの稼働サーバに導入しているので、ログ表示プラグインで閲覧できる

も想定しています。

スクリプト作成

cron用に一部手を加えます。

エラーログからIPアドレスを抜き出してアクセス元の国を付与

ip_check.sh

スクリプト内容

#!/bin/bash

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

# ログの格納場所に移動
cd /var/lib/redmine/log

# error.logからIPアドレスだけを抜き出します
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がない場合にエラーを返します
# この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

chown www-data:www-data ip.`date +%Y%m%d`.csv
chown www-data:www-data ip_list.`date +%Y%m%d`.csv

exit

アクセス元の国を付与したリストを集計するスクリプト

ip_count.sh

スクリプト内容

#!/bin/bash

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

cd /var/lib/redmine/log

# 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

chown www-data:www-data sorted_ip.`date +%Y%m%d`.csv

exit

Cron配置

sudo crontab -e -u root

定期実行

0 7 * * * /スクリプト配置パス/ip_check.sh && /スクリプト配置パス/ip_count.sh

これで、指定した時刻に

  1. IPアドレスの抜き出し
  2. IPアドレスの集計

を行うようにしてくれます。

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

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

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

Page 113 of 280

Powered by WordPress & Theme by Anders Norén