月: 2023年10月 Page 1 of 4

検証:BookStackサイト構築。

Redmineのプラグイン、knowledgebaseのようなWiki編集/公開システム「BookStack」を検証機に入れてみます。

https://www.bookstackapp.com/

前提

こちらが既に動いています。

  • Ubuntu 20.04
  • Apache 2.4系
  • MySQL 8系
  • PHP 8.1系

また、このサイト用のドメインを有しており、ドメインに即した証明書も発行済みです。

さっくりとした手順

  1. composerをインストールします。
  2. DBを作成します。
  3. BookStackをダウンロードします。
  4. BookStackの設定を行います。
  5. Apache設定ファイルを用意します。
  6. Webサービス再起動後、設定を反映します。

Composerインストール

  • インストール
cd /hoge
# 任意の作業ディレクトリに移動します
sudo php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
sudo php composer-setup.php
sudo php -r "unlink('composer-setup.php');"
sudo php composer.phar install --no-dev --optimize-autoloader
  • バージョン確認
composer --version
# バージョンが表示されることを確認します。

DBを作成します。

mysql -u root -p
CREATE DATABASE bookstack;
CREATE USER 'bookstackuser'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON bookstack.* TO 'bookstackuser'@'localhost';
FLUSH PRIVILEGES;
EXIT;

DB名/パスワードはポリシーに応じて適切なものを指定します。

BookStackの配置

  • プログラム配置
cd /home/www-data
# パーティションの都合上、/home/www-dataに置いています。
# 環境に合わせて適切なWebサービス公開ディレクトリを指定してください。

sudo git clone https://github.com/BookStackApp/BookStack.git --branch release --single-branch 
sudo chown -R www-data:www-data BookStack
cd BookStack
  • 設定ファイル編集
sudo cp -pi .env.example .env

教義・信仰に沿ったエディタで以下を編集します。

APP_URL=https://hoge.example.com
# 公開用URLを指定します

# Database details
DB_HOST=localhost
DB_DATABASE=bookstack
DB_USERNAME=bookstackuser
DB_PASSWORD=password
# DB名、パスワードなどは先ほど作成したものです。
  • マイグレート
sudo php artisan key:generate
sudo php artisan migrate --force
sudo php artisan db:seed --force

Web公開用のファイルを作成します。

  • 作成するファイル(要管理者権限)
/etc/apache2/sites-available/bookstack.conf
  • 作成内容
<VirtualHost *:80>
    servername hoge.example.com
    # ドメイン名を指定します
    RewriteEngine On
        RewriteCond %{HTTPS} off
        RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
# HTTPアクセスを強制的にHTTPSにリダイレクトします
</VirtualHost>

<VirtualHost *:443>
    ServerName hoge.example.com
    # ドメイン名を指定します
    CustomLog /var/log/bookstack/bs_access.log combined
    ErrorLog /var/log/bookstack/bs_error.log
    DocumentRoot /home/www-data/BookStack/public
    # 自身の環境に合わせます
    <Directory /home/www-data/BookStack/public>
    # 自身の環境に合わせます
        AllowOverride All
        Require all granted
        Options +FollowSymLinks
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} !-d
        RewriteCond %{REQUEST_FILENAME} !-f
        RewriteRule ^ index.php [L]
    </Directory>

#SSL設定
  SSLEngine on
    Protocols h2 http/1.1
  # SSLを有効化します

SSLCertificateFile /etc/certs/example.com.crt
# SSL証明書を指定します
SSLCertificateKeyFile /etc/private/example.com.key
# 秘密鍵を指定します

# SSLCACertificateFile /etc/certs/example.com.CA.crt
# 中間証明書が発行元から別ファイルで提供されている場合は、この直上をコメントアウトして中間証明書を指定します

#セキュリティヘッダー付与

    Header always set Strict-Transport-Security "max-age=63072000"
    Header set X-Content-Type-Options "nosniff"
    Header always append X-Frame-Options "SAMEORIGIN"
    Header set X-XSS-Protection "1; mode=block"

</VirtualHost>

SSLProtocol             all -SSLv3 -TLSv1 -TLSv1.1 -TLSv1.2
SSLCipherSuite          ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:EC6-GCM-SHA384
SSLHonorCipherOrder     off
SSLSessionTickets       off

SSLUseStapling On
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"

設定を反映させます。

  • 設定ファイル追加
sudo a2ensite bookstack.conf
sudo apache2ctl configtest
# Syntax OKを確認します
  • Webサービス再起動
sudo systemctl restart apache2.service

インストール確認

https://設定したドメイン

でアクセスします。

以下のログイン画面が出れば成功です。

  • admin@admin.com
  • password

が初期パスワードです。ログイン後、直ちにアカウント情報を設定してください。

今後

  • 現在運用しているサイトへのインストール
  • セキュリティ強化
  • 画像保存ディレクトリの設定

等を行っていきます。

ボードゲーム『グラスロード』開封と百均グッズによる整理。

先だっての統率者&ボードゲーム会で非常に気に入った『グラスロード』。入手したので開けていきます。

外観

ガラス職人が特徴的な外観

箱はいわゆるアグリコラサイズです。

開封

カードが少なくタイルが多め

プレイ時にコンポーネントの量はつかんでいたものの、かなり多めのタイル類。

これらを整理/分類していきます。

コンポーネント一覧

タイル類

  • 地形タイル
  • 建物タイル
  • 個人ボード
  • 共通ボード
  • 資源ボード

と、種類も数も多かったです。

資源ボード

本作のメインシステム、ダイヤルによる資源トラックです。資源を管理するだけではなく、レンガとガラスを自動的に生産するというメモリも兼ねています。

カード

ウヴェ・ローゼンベルクのゲームにしてはカードが少ないです。各色15枚ずつ、それらの内容は固定でした。

収納

上述したように、タイルが多くてカードが少ないために収納は単純な部類でした。

タイル類の収納

仕切り付きのケースに収めました。ジャストフィットというわけではありませんが、そこそこ隙間なく入りました。

資源コマの収納

小さいタッパーに一緒に入れます。頻繁に出し入れしないので、これで十分です。

カードの収納

カードスリーブはボードゲームサイズ。TCGケース(スリム)に入れていきます。

全体的な収納

隙間が割合に残ったものの、取りあえず全て入りました。

改良の余地はまだあるので、今後の課題です。

茶こし、刷新。

この、割れないティーポットを使い始めて10ヶ月ほど経過。

その頑丈さとメンテナンスのしやすさに感動しておりましたが、問題が発生しました。

破れた茶こし

ステンレス製の茶こしに穴。ここまで来ると補修も難しいなと思い、代替案を探しました。

回転式茶こし

そこで、10数年前にこの茶こしを買っていたことを思い出しました。ポット備え付けと同じくステンレス製ですが、編み込みがしっかりしているので破れにくいという感じ。

この最大の特徴は

このようにカップに引っかけられること。

思った以上に深いので、ポットから飛び出た茶葉もしっかりキャッチ。

抽出した後は受け皿が開店して、そのままテーブルに置くことができます。

最近使い始めた茶こしつきマグボトルにもジャストサイズなのも嬉しい誤算です。

これによって、また、ティータイムが楽しみになりました。

Bingによるシェルスクリプト。(UFW遮断)

概要

先だってChatGPTが書いた

  1. IPアドレスを尋ねる
  2. IPアドレスそのままか、/24ごとブロックするか、/16ごとブロックするかを0~2で質問(空白エンターは0)
  3. 実行前に内容を確認する。yなら続行、nなら中止
  4. 1~2に沿ってufw deny処理を行う
  5. 「ルールを付け加えました。他のIPブロックしますか?」の分岐を出す。yなら1に戻る。nなら次の処理
  6. ufw reloadを行う
  7. 現在のブロック状況を出しますか? yならufw status numberedを表示。nなら終了メッセージを出す

このスクリプト、Bingが書くとどうなるかを試してみました。

Bingの出力結果

  • bing_ufw_deny.sh
#!/bin/bash

# ループフラグを設定
loop=true

# ループ開始
while $loop; do
    # IPアドレスを尋ねる
    echo "ブロックしたいIPアドレスを入力してください。"
    read ip

    # IPアドレスの形式をチェック
    if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
        # IPアドレスそのままか、/24ごとブロックするか、/16ごとブロックするかを0~2で質問
        # 空エンターは0
        echo "IPアドレスをそのままブロックする場合は0、/24ごとブロックする場合は1、/16ごとブロックする場合は2を入力してください。"
        echo "何も入力しない場合は0とみなします。"
        read option

        # オプションに応じてIPアドレスを変換
        case $option in
            1)
                # /24ごとブロックする場合
                ip=${ip%.*}.0/24
                ;;
            2)
                # /16ごとブロックする場合
                ip=${ip%.*.*}.0.0/16
                ;;
            *)
                # その他の場合はIPアドレスそのまま
                ;;
        esac

        # 実行前に内容を確認する。yなら続行、nなら中止
        echo "ufw deny from $ip to any を実行します。よろしいですか? (y/n)"
        read confirm

        if [[ $confirm == [yY] ]]; then
            # yならufw deny処理を行う
            sudo ufw deny from $ip to any
            echo "ルールを付け加えました。"
        else
            # nなら中止メッセージを出す
            echo "処理を中止しました。"
        fi

        # 「ルールを付け加えました。他のIPブロックしますか?」の分岐を出す。yなら1に戻る。nなら次の処理
        echo "他のIPをブロックしますか? (y/n)"
        read loop

        if [[ $loop == [yY] ]]; then
            # yならループフラグをtrueにして1に戻る
            loop=true
        else
            # nならループフラグをfalseにしてループを抜ける
            loop=false
        fi

    else
        # IPアドレスの形式が不正な場合はエラーメッセージを出す
        echo "正しいIPアドレスを入力してください。"
    fi

done

# ufw reloadを行う
echo "ufw reload を実行します。"
sudo ufw reload

# 現在のブロック状況を出しますか? yならufw status numberedを表示。nなら終了メッセージを出す
echo "現在のブロック状況を表示しますか? (y/n)"
read status

if [[ $status == [yY] ]]; then
    # yならufw status numberedを表示する
    sudo ufw status numbered
else
    # nなら終了メッセージを出す
    echo "スクリプトが終了しました。"
fi

体感として

Bingはネットワークアドレスの切り出しが素直です。

  • Bingの場合
        # オプションに応じてIPアドレスを変換
        case $option in
            1)
                # /24ごとブロックする場合
                ip=${ip%.*}.0/24
                ;;
            2)
                # /16ごとブロックする場合
                ip=${ip%.*.*}.0.0/16
                ;;
            *)
                # その他の場合はIPアドレスそのまま
                ;;
        esac
  • ChatGPTの場合
    # ネットワークアドレスに変換
    if [[ -n "$block_cidr" ]]; then
        if [[ $block_option == "1" ]]; then
            # /24で区切る場合
            network_address=$(echo $ip_address | cut -d'.' -f1-3)
            # CIDR表記の生成 (/24)
            cidr_notation="$network_address.0$block_cidr"
        elif [[ $block_option == "2" ]]; then
            # /16で区切る場合
            network_address=$(echo $ip_address | cut -d'.' -f1-2)
            # CIDR表記の生成 (/16)
            cidr_notation="$network_address.0.0$block_cidr"
        fi
    else
        cidr_notation="$ip_address"
    fi

と、シンプルになっています。

蛇足ですが、ChatGPTはこの処理にたどり着くまで5回ぐらいの錯誤を繰り返しました。

なので、このケースで言えばBingはよりユーザーの意図をくみ取ったと考えられます。

こちらの選択肢もあると分かったという収穫。

ChatGPTによるシェルスクリプト。(対話式のUFWブロック)

概要

不正アクセス対策として役立つUFW。これによる不審なIPアドレスの遮断をもっと効率的に行うようにしてみました。

このスクリプトを書い(てもらっ)た背景

攻撃者は複数のIPアドレスから同時に不正アクセスをしてくるパターンが多々あり、

ufw deny from xxx.yyy.1.1
ufw deny from aaa.bbb.0.2

とやるより、

ufw deny from xxx.yyy.1.0/24
ufw deny from aaa.bbb.0.0/16

と、ネットワークアドレスごと遮断した方が効率的だからです。

前提

  • 既にUFWが稼働していること。
  • サービス指定ではなく、あらゆるアクセスを拒絶するという合意が当事者で取れていること。

ChatGPTへの質問と回答

提示した要件

  1. IPアドレスを尋ねる
  2. IPアドレスそのままか、/24ごとブロックするか、/16ごとブロックするかを0~2で質問(空エンターは0)
  3. 実行前に内容を確認する。yなら続行、nなら中止
  4. 1~2に沿ってufw deny処理を行う
  5. 「ルールを付け加えました。他のIPブロックしますか?」の分岐を出す。yなら1に戻る。nなら次の処理
  6. ufw reloadを行う
  7. 現在のブロック状況を出しますか? yならufw status numberedを表示。nなら終了メッセージを出す

出てきたスクリプト

  • ufw_deny.sh
#!/bin/bash

# ユーザーからIPアドレスとブロック範囲を入力してもらい、
# UFWを使用して指定した範囲のIPアドレスをブロックするスクリプトです。

while true; do
    # IPアドレスを尋ねる
    read -p "ブロックしたいIPアドレスを入力してください: " ip_address

    # ブロック範囲を尋ねる
    read -p "IPアドレスをそのままブロックする場合は0、/24ごとにブロックする場合は1、/16ごとにブロックする場合は2を入力してください(空エンターは0): " block_option

    # 入力が空の場合はデフォルトで0(IPアドレスそのまま)とする
    block_option=${block_option:-0}

    # ブロック範囲を計算
    case $block_option in
        1) block_cidr="/24" ;;
        2) block_cidr="/16" ;;
        *) block_cidr="" ;;
    esac

    # ネットワークアドレスに変換
    if [[ -n "$block_cidr" ]]; then
        if [[ $block_option == "1" ]]; then
            # /24で区切る場合
            network_address=$(echo $ip_address | cut -d'.' -f1-3)
            cidr_notation="$network_address.0$block_cidr"
        elif [[ $block_option == "2" ]]; then
            # /16で区切る場合
            network_address=$(echo $ip_address | cut -d'.' -f1-2)
            cidr_notation="$network_address.0.0$block_cidr"
        fi
    else
        cidr_notation="$ip_address"
    fi

    # 設定内容を確認する
    echo "以下の内容でブロックを行います:"
    echo "IPアドレス: $cidr_notation"

    read -p "よろしいですか?(y/n): " confirm

    # ユーザーが処理を続行しない場合、スクリプトを終了する
    if [[ $confirm != "y" && $confirm != "Y" ]]; then
        echo "処理を中止しました。"
        exit 0
    fi

    # ブロックルールをufwに追加
    sudo ufw deny from "$cidr_notation"

    # エラーがあった場合はエラーメッセージを表示して終了
    if [[ $? -ne 0 ]]; then
        echo "ERROR: 不正なソースアドレス"
        exit 1
    fi

    echo "ルールを付け加えました。"

    # 他のIPをブロックするか尋ねる
    read -p "他のIPをブロックしますか?(y/n): " continue_blocking
    if [[ $continue_blocking != "y" && $continue_blocking != "Y" ]]; then
        break
    fi
done

# ufwを再読み込みする
sudo ufw reload

# ブロック状況を確認するか尋ねる
read -p "現在のブロック状況を確認しますか?(y/n): " check_status
if [[ $check_status == "y" || $check_status == "Y" ]]; then
    sudo ufw status numbered
fi

# 終了メッセージを出す
echo "IPブロックを終了しました。"

このスクリプトを

chmod +x ufw_deny.sh

とすれば作成は完了です。

スクリプトの動き

./ufw_deny.sh
ブロックしたいIPアドレスを入力してください:
# IPアドレスを入力します

IPアドレスをそのままブロックする場合は0、/24ごとにブロックする場合は1、/16ごとにブロックする場合は2を入力してください(空エンター
は0): 
# IPアドレスのレンジを
# IPアドレスそのまま:0
# /24(255.255.255.0)で区切る:1
# /16(255.255.0.0)で区切る:2

IPアドレス:
よろしいですか? (y/n):
# 先ほどのIPを表示します。ネットワークアドレスの場合は、/24 /16で区切って表示します。
# 内容を確認します。
# y を入力後、ufwの処理が走ります。一般ユーザーの場合はsudoパスワードが訊かれます。

ルールを追加しました
ルールを付け加えました。
# ufw deny from (入力したIP/NWアドレス)を実行します。

他のIPをブロックしますか?(y/n): 
# 続行するかを訊きます。yの場合はIPアドレスから始まります。

ファイアウォールを再読込しました
現在のブロック状況を確認しますか?(y/n):
# yの場合は sudo ufw status numberedを実行します。

と、

  • IPアドレス→ネットワークアドレスへの変換
  • UFW DENYに追加
  • UFWルールの読込
  • 設定後のルール表示

まで一元管理してくれます。

ボードゲーム『アグリコラ』ソロプレイを兼ねてのコンデジ検証。

こちらの7年前に購入したコンパクトデジカメ、ちょっとした記録にちょうどいいということで更に検証してみました。

そこで、室内で撮影機会の多いボードゲーム記録です。

『アグリコラ』ソロプレイ

『アグリコラ』プレイ開始

まずは、外観を撮影。特に設定をしなくても隅々まで写してくれる描写は記録にピッタリです。

プレイ後

アグリコラ自体の記録は以下の通り。割と堅実に得点を重ねられました。

得点合計

57

得点詳細

項目得点
54
33
94
野菜44
未開拓地00
家畜:羊84
家畜:猪74
家畜:牛53
柵内の厩22
木の部屋00
レンガの部屋00
石の部屋48
家族515
カード66
ボーナス00

プレイした後の盤面撮影

分割

この盤面撮影における分割機能はやっぱり便利。しかも、頭をフルに使った後でも特に気を遣わず、ダイヤル操作だけでこれが撮影できるのはありがたいです。

フィルター撮影

ミラーレス譲りのフィルター撮影もビルトイン。

総じて

  • テーブルをフルに使うゲームも外観を撮影できて
  • 分割により細かい状況を捉えることができて
  • ビルトインのフィルターも楽しい

と、ボードゲームの撮影時にも使えるカメラと判明です。

ボードゲーム『チューリングマシーン』開封とセットアップ。

前に入手していたのを、今のタイミングで開封です。

外観

『チューリングマシーン』外箱外観

中箱寄りの箱。パンチカードをテーマにしているということもあって、外箱に穴が空いているのが特徴です。

コンポーネント一覧

カードが多めでボール紙は少なめ
  • カード(判定カードと要件カード)
  • 検証機/パンチカードホルダー
  • パンチカード
  • ついたて
  • スコアシート
  • ホワイトボードマーカー

で、比較的シンプル目でした。

要件カードはユーロサイズ。判定カードはマーカーに書き込むという特性があるためにスリーブは入れにくいです。

収納

ある程度キチッと納められる内箱

収納についてはほぼいじるところがありませんでした。内側の仕切りで区切られているのが好印象です。

セットアップ

カードを同心円状に並べます

セットアップはお題に沿って行う必要があるため、やや大変。(特に判定カードは番号を並べていく必要があります)

ただ、ゲームシステムは比較的単純。

単純なのに論理力が問われる凄いゲームというのが第一印象。

ゲーム内容に関しては改めてレビューします。

百均グッズによる情報カードスタンド。

机の上での参照がしやすくなりました。

メタルスタンドとマグネット

「何かに使えそうだ」と過去に購入していたアイアンメモスタンドが、本来の使われ方をすることになりました。

使い方

単にマグネットで止めるだけです。

このマグネットはマーカーも兼ねていますので、ToDoの記録なんかにももってこい。

また、質量がそれなりにあるので散らばったり机から落ちるということもありません。

統率者&ボードゲーム(2023年10月)

4人で統率者&ボードゲーム会がありました。

統率者

  • グレムリンの神童、ジンバル
  • 工匠の主任、ウルザ
  • 高名な者、ミシュラ

それぞれ使いましたがいずれも敗北。相手の統率者ダメージで一撃死という敗北もありました。

最初に展開しすぎて一掃されたというヘイトコントロールも課題となりました。

ボードゲーム

サラダマスター

拮抗したゲームでした。後一手及ばず敗北です。

グラスロード

前から気になっていた中量級ゲームをインスト兼ねて回す機会に恵まれました。

  • リソース管理
  • カードのバッティング
  • バリアブルフェイズオーダー

が絶妙に組み合わさっていて、これは自分でも欲しいと思ったほどです。

タイガー&ドラゴン

最後の最後で「1」上がりによる勝利が決まったので満足です。

ここのところ、諸々煮詰まっていたので、とてもよい気分転換になりました。

WordPress改修。(プラグインの見直し)

自分のWordpressを見直すことにしました。

やったこと

  • JetPackからの脱却
  • よく読まれている記事セクションの追加
  • 自動TOC作成の改善
  • 問い合わせフォームの追加

JetPackからの脱却

強力な機能であることには間違いないのですが、以下の理由により脱却です。

  • X(Twitter)と連携されなくなった
    • 割と重めのウェイトです。2023年のゴタゴタで更新時に反映されなくなったので、使う理由がほぼなくなりました。
  • アクセス解析がうまくいっている
    • Web解析システムMatomoの導入により、JetPackの解析機能は代替できると判断です。

脱却の手順

先人の知恵に頼りました。

https://iyusuke.net/jetpack-goodbye/

  1. 脱JetPack
  2. SiteGuardプラグインによるセキュリティ強化

を同時に行いました。

よく読まれている記事セクションの追加

これは1ヶ月ほど前から導入。

こちらを入れました。

サイトの右ペインに、人気記事が自動的に表示されるようになりました。

自動TOC作成の改善

記事冒頭に作られる目次作成、前は別のプラグインを使っていたものの、Wordpress自体のバージョンと合わなくなったのかうまく機能しなくなりました。

そこで、こちらに差し替え。今のところうまくいっています。

問い合わせフォームの追加

先ほどの脱JetPackの記事にあったものをそのまま利用。各種設定を行いました。

改修によって

かなり動作が軽くなりました。「ちょっともっさりしているかな?」思っていたWordpressもまだまだチューニングできると思った次第です。

Page 1 of 4

Powered by WordPress & Theme by Anders Norén