OWASP ZAPのコンテナを日本語対応させる

Webアプリケーションの脆弱性検査をするOWASP ZAPというツールを日本語環境で使用するためのメモです。

Docker Hubから入手できるOWASP ZAPのコンテナイメージは日本語フォントが含まれていないため、WebSwingのGUIで言語設定を日本語にすると文字化け(豆腐)してしまいます。

毎回コンテナに入って日本語フォントを追加するのが面倒になったので、Dockerfileでカスタムイメージを作りdocker composeで設定の永続化の指定を行うようにしてみました。

コンテナイメージ作成と起動

Notoフォントを追加インストールする例です。

パッケージマネージャに収録されている別のフォントや、自前でフォントを組み込むこともできます。

Dockerfile

FROM ghcr.io/zaproxy/zaproxy:stable
USER root
RUN  apt-get update && \
     apt-get -y install fonts-noto-cjk
USER zap

docker-compose.yml

version: "3.7"
services:
  zaproxy:
    image: zaproxy-ja
    build:
      context: .
    environment:
      TZ: Asia/Tokyo
    command: zap-webswing.sh
    ports:
      - 8080:8080
      - 8090:8090
    volumes:
      - ./wrk:/zap/wrk
      - ./home:/home/zap

同じディレクトリ内にDockerfiledocker-compose.ymlを置いて、下記コマンドでビルドするとzaproxy-jaというコンテナイメージが作られます。

docker compose build --pull

--pullオプションを付けておくことで、最新のイメージが存在する場合はpullしてからビルドが実行されます。

今回の例ではdocker-compose.ymlを置いたディレクトリ内でボリューム永続化をしているため、あらかじめコンテナ内のzapユーザー(UID=1000)が読み書きできる権限でディレクトリを作成しておきます。

mkdir wrk home
chown 1000:1000 wrk home

準備が完了したので、コンテナを起動します。

docker compose up

この方法で起動したときはCtrl+Cでコンテナを終了できます。

初回の設定

Webブラウザからhttp://localhost:8080/zapにアクセスすることでGUIが起動します。

初回は英語設定になっているので、言語の設定をします。

設定目的でセッションの保存は必要ないので、No. I do not want to persist this session at this moment in timeを選択してStartします。

起動直後

ToolsメニューからOptions...を開きます。

オプション画面を開く

Languageの項目を開き、Languageプルダウンから日本語を選択します。

言語設定

一旦OWASP ZAPを終了し、再度GUIを起動し直すと言語設定が反映されます。

日本語表示で起動

WSL2のAlpine LinuxでDockerを使う

以前WSL2にAlpine Linuxをインストールする手順を紹介しましたが、この環境にDockerを導入してみます。

WSL2でDockerを使用する方法については既に幾つものWebサイトで解説されていますので、後述の自動起動に関する手順など参考にさせていただきました。

情報
2023年7月頃にOpenRCによるdockerdの自動起動に失敗するようになってしまったため、本記事では暫定対応を含めた手順を紹介します。

dockerと関連パッケージ導入

docker-ceとdocker composeの他に、自動起動するためのOpenRCを導入します。

apk add openrc docker docker-cli-compose
openrc sysinit
touch /run/openrc/softlevel
rc-update add docker

一般ユーザー用設定

一般ユーザー権限でdockerを使用できるようにするためには、対象ユーザーをdockerグループに所属させる必要があります。

警告
一般ユーザーがdockerを使用できることは、コンテナを介してホストに対してroot権限を使用できてしまうことを意味します。 基本的には安易に設定しないようにしてください。
addgroup <ユーザー名> docker

自動起動失敗回避

2023年7月頃のdocker-openrcパッケージ更新によりOpenRC経由でのdockerdの起動が失敗してしまうようになりました。

これはAlpine Linuxのissueによるとdockerが生成したネットワークがnetworkingサービスの再起動時に壊れてしまうことに対応するため、dockerとnetworkingに依存関係を設定したことに起因するようです。

WSL2にAlpine Linuxのminirootfsをインポートした環境ではnetworkingサービスは使用されず、設定ファイルが存在しないためnetworkingの起動に失敗します。そのため、dockerの起動前提を満たせないことになりdockerサービスの起動に失敗してしまいます。

暫定対応として、dockerサービスの起動定義ファイル(/etc/init.d/docker)を、依存関係が追加されたときのコミットを参照して以前の状態に手動で戻します。

/etc/init.d/dockerdepend内のnetを削除します。

 depend() {
-	need sysfs cgroups net
+	need sysfs cgroups
 	after firewall
 }

これで、OpenRCからdockerが起動できるようになります。

自動起動設定

Windowsから以下のコマンドを実行することでOpenRCが起動し、OpenRCによってdockerサービスが起動します。

wsl -d Alpine -u root --exec /sbin/openrc sysinit

この方法では、タスクスケジューラーなどでWindowsログイン時に上記コマンドを実行してあげる運用が考えられます。

また、Microsoft Store版WSLではディストリビューション起動時にコマンドを自動実行する機能が追加されています。

情報
コマンド自動実行機能はWindows 11のinbox版WSLで追加された機能ですが、Store版WSL正式リリースによりWindows 10にバックポートされた形になります。

今更ながら WSL2 の Alpine で Docker 環境構築という記事に/etc/wsl.conf[boot]セクションに起動コマンドを設定する方法について書かれていました。通常はこちらの手順で自動起動するのが使い勝手が良いと思います。

FessでWEB+DB PRESSのPDF検索システムを構築する

オープンソース全文検索サーバー Fessが強力なので、DockerコンテナでWEB+DB PRESS総集編のPDFを検索できる環境を構築してみました。お手軽な反面、だいぶはまったので設定した内容をメモしてみます。

起動前の準備

LinuxにDocker導入済みなので、基本的な導入手順は公式ページのインストール手順の「設定」の項目以降に沿って行いました。必要なのはLinuxに対するvm.max_map_countの設定と、compose.yamlcompose-opensearch2.yamlの入手です。

Fessのバージョン14.7ではすんなり起動できましたが、後に14.8にバージョンが上がっていたので試してみたらうまくいかず。そのため14.7でしばらく運用するつもりです。

情報
composeコマンド実行する度に2つのyamlファイルを指定するのは面倒なので、compose-opensearch2.yamlからcompose.override.yamlにシンボリックリンクを張っておくとファイル名指定が省略できて楽です。

設定ファイルの取得

Fessのデフォルト設定では、10MBまでのファイルをインデックス作成対象にしています。

今回、検索対象にするPDFのファイルサイズが大きい(50〜60MB)ため、Fessでインデックスを作成できるように設定する必要があります。設定ファイルの所在が複数のディレクトリに分散しているので、コンテナイメージから変更するファイルを取得して、編集したファイルをマウントして上書きします。

また、サムネイル作成用のシェルスクリプトに不備があったため、ついでに直しておきます。

書き換えが必要な設定ファイルは次のとおりです。

  • /etc/fess/fess_config.properties
  • /usr/share/fess/app/WEB-INF/classes/crawler/contentlength.xml
  • /usr/share/fess/bin/generate-thumbnail
情報
Fess 14.11.0のコンテナイメージではgenerate-thumbnailのシェルスクリプトの不備が修正されていました。
修正済みのコンテナイメージを使用する場合はgenerate-thumbnailに関する手順は不要になりますので読み飛ばしてください。(2023/11/11)

設定ファイルを置くためのディレクトリを作成しておきます。

mkdir fsetc fscrawler fspatch

コンテナを単純に起動して、必要なファイルを取り出します。

docker run -d -it --rm --name fess ghcr.io/codelibs/fess:14.7.0
docker cp fess:/etc/fess/fess_config.properties ./fsetc/
docker cp fess:/usr/share/fess/app/WEB-INF/classes/crawler/contentlength.xml ./fscrawler/
docker cp fess:/usr/share/fess/bin/generate-thumbnail ./fspatch/
docker stop fess

fess_config.propertiesの編集

クローラーが使用するメモリの上限を増やします。今回はホストマシンの搭載メモリがが32GBあるので4GBを最大値として設定しました。

jvm.crawler.options-Xmxを編集します。

-Xmx4096m

contentlength.xmlの編集

デフォルトではクロール対象のファイルサイズは10MBまでとなっていました。また、HTML用に2.5MBの定義があるので、これをコピーしてPDF用の定義を作成します。今回は250MBまでのPDFをクロール対象に含めるようにします。

                <postConstruct name="addMaxLength">
                        <arg>"application/pdf"</arg>
                        <arg>262144000</arg><!-- 250M -->
                </postConstruct>
訂正
当初80MBまでで想定していましたが、200MB超えのPDFが含まれていたためクロール対象の設定を250MBまでに変更しました。(2023/5/17)

generate-thumbnailの編集

このファイルは設定ファイルではありません。検索結果に表示されるサムネイルを作成するスクリプトなのですが、内部で使用しているコマンドが生成するファイル名とスクリプトが想定しているファイル名が一致せず処理が失敗してしまいます。

問題の特定と解決をされていたfessでthumbnail画像が生成されない問題というページがありましたので、こちらを参照させていただき該当箇所を修正してサムネイルが作られるようにします。

pdftoppmコマンドのオプションに-l 1を指定している箇所を-singlefileに変更します。

pdftoppm -png -singlefile "${target_file}" ${tmp_png_prefix}

compose.ymlの編集

変更を加えたファイルをコンテナにマウントするための定義を追加します。

    volumes:
      - ./fsetc/fess_config.properties:/etc/fess/fess_config.properties
      - ./fscrawler/contentlength.xml:/usr/share/fess/app/WEB-INF/classes/crawler/contentlength.xml
      - ./fspatch/generate-thumbnail:/usr/share/fess/bin/generate-thumbnail
      - /srv/docs/webdbpress/:/srv/docs/webdbpress:ro

検索対象にしたいWEB+DB PRESSのDVDの内容は/srv/docs/webdbpressに格納しておいて、コンテナ内の同パスに読み取り専用でマウントすることにします。

Fess起動とクロール設定

下準備を済ませているので、以下のコマンドで起動できます。

docker compose up -d

起動には少し時間がかかります。

起動後は管理者パスワードを設定し、管理画面のメニューからクローラーファイルシステムを選択します。

新規作成からファイルクロールの設定を開いて、最低限必要な項目を設定します。

項目名
名前webdbpress
パスfile:/srv/docs/webdbpress/webdb_pdf

クロール設定後、管理画面上部のクローラー実行からDefault Crawlerのジョブ画面を開き、今すぐ開始ボタンを押せばインデックス作成が始まります。

Alpine Linuxのパッケージ管理とシステム更新

Alpine Linuxのパッケージ管理についてまとめます。

パッケージリストの更新

apk update

更新可能なパッケージの確認

apk upgrade -s

upgradeサブコマンドの-sオプション(冗長表記は--simulate)を指定することで更新可能なパッケージのインストール済みバージョンと更新後のバージョンを確認できます。

オプション名通りシミュレートなので、実際にはパッケージ更新は実行されません。

更新可能なパッケージの更新

apk upgrade

稼働中のデーモンが更新された場合は、rc-service <デーモン名> restartで再起動して更新を反映させましょう。

LinuxカーネルやmuslなどのOSの根幹になるパッケージが更新された場合は、rebootでシステム全体を再起動しましょう。

パッケージの追加

apk add <パッケージ名>

パッケージ名は複数指定可能です。

パッケージの削除

apk del <パッケージ名>

パッケージ名は複数指定可能です。

パッケージの検索

apk search <パッケージ名>

パッケージ名は複数指定可能です。

一般ユーザー権限でも実行可能です。

インストール済みパッケージの表示

apk list -I

一般ユーザー権限でも実行可能です。

Alpine Linux 3.17頃までは順不同で出力されていたような。apk list -I | sortでソートすると見やすくなります。

ディストリビューションのバージョンアップ対応

公式の手順はこちら Upgrading Alpine

パッケージリストの取得元URLは/etc/apk/repositoriesに以下のように設定されています。

https://dl-cdn.alpinelinux.org/alpine/v3.18/main
https://dl-cdn.alpinelinux.org/alpine/v3.18/community

URLにディストリビューションのバージョン番号が含まれているため、該当個所を書き換えれば新バージョンに移行できます。

また、バージョン番号の代わりにlatest-stableを指定することで常に最新のディストリビューションのパッケージを取得できるようになります。その他、edgeを指定すると開発版パッケージを取得できます。

/etc/apk/repositories書き換え後は以下のコマンドで更新、再起動を実施します。

apk update
apk upgrade --available
sync
reboot

WSL2にAlpine Linuxをインストールする

WSL2にAlpine Linuxをインストールして、一般ユーザーでログインできるように設定します。

WSL2の有効化

2022/11にMicrosoft StoreのWSLが正式版になったので、Windowsインボックス版ではなくStore版を使います。Store版ではWindows 10でもWindows 11のインボックス版以降に追加された機能が使用可能になります。

インストールは、管理者権限のコマンドプロンプトから下記コマンドで行えます。(参考: WSL を使用して Windows に Linux をインストールする)

wsl --install

Microsoftのサイトに書かれていますが、上記コマンドを実行すると既定のディストリビューションとしてUbuntuがインストールされます。Alpine Linuxだけ使えれば充分という場合はMicrosoft Storeから直接Windows Subsystem for Linuxをインストールするのが良いかもしれません。

Alpine Linuxのインストール

この手順では、Alpine LinuxのDownloadsページより入手可能なMini root filesystemのアーカイブファイルを使用します。各種CPUアーキテクチャ用のファイルが用意されていますが、WSL2での使用を目的とするならまず間違いなくx86_64を選択することになるでしょう。自分の環境に合ったアーカイブファイルをダウンロードしてください。

ダウンロードしたMini root filesystemのアーカイブファイルを次のコマンドでインポートします。

wsl --import Alpine C:\wsl\alpine alpine-minirootfs-3.18.0-x86_64.tar.gz --version 2

このコマンド例では次のような指定をしています。

  • WSLでのディストリビューション名 Alpine
  • インポート先ディレクトリ C:\wsl\alpine
  • Mini root filesystemのアーカイブファイル alpine-minirootfs-3.18.0-x86_64.tar.gz
  • 使用するWSLのバージョン 2

Alpine Linux起動

Windowsターミナルを使用している場合は、プロファイルが自動的に作成されます。

コマンドプロンプトでは次のコマンドで起動できます。

wsl -d Alpine

Alpine Linuxが起動し、画面がashに切り替わります。

既存パッケージの更新

apk update
apk upgrade

apk updateでパッケージリストを更新し、apk upgradeで更新されたパッケージをインストールします。

通常使用でも、定期的に実行するのが望ましいです。

suを使用可能にする

passwd
apk add busybox-suid

一般ユーザからrootにスイッチする場合、rootにパスワードが設定されて入る必要があります。デフォルトではrootのパスワードは設定されていないので、ここで設定しておきます。

suコマンド自体は最初からbusyboxのシンボリックリンクとして用意されていますが、busyboxにはsuidの設定がないため、一般ユーザが呼び出しても権限不足となりsuコマンドが失敗します。busybox-suidはsuidが必要になるコマンドをbusyboxに代わって提供します。

一般ユーザー作成

adduser <ユーザー名>

デフォルトユーザー設定

/etc/wsl.confを作成して、以下の内容を書き込みます。

[user]
default = <ユーザー名>

次回Alpine Linux起動時から反映されます。

Alpine Linuxでopen-vm-toolsを自動起動する

導入

apk add open-vm-tools
apk add open-vm-tools-guestinfo
apk add open-vm-tools-deploypkg

サービス登録

rc-update add open-vm-tools boot

直ちに起動する場合

rc-service open-vm-tools start

注意
Alpine Linux 3.9からopen-vm-toolsのパッケージがcommunityリポジトリに移っていました。インストール直後の状態でパッケージが見つからない場合はリポジトリ設定を見直してcommunityリポジトリが有効になっているか確認してください。

2022-10-10追記
https://wiki.alpinelinux.org/wiki/Open-vm-tools を参照し導入するパッケージ追加、サービス登録コマンド修正

Zabbix更新

Zabbix 3.0がリリースされたので、2.4からアップデート。

公式ドキュメントでは、サーバとエージェントを停止後バイナリを上書き導入してサーバを起動すればデータベースが自動移行されるとのこと。

CentOS 7環境にて以下のコマンドでさっくりアップデート。

systemctl stop zabbix-agent
systemctl stop zabbix-server
yum remove zabbix-release
rpm -ivh http://repo.zabbix.com/zabbix/3.0/rhel/7/x86_64/zabbix-release-3.0-1.el7.noarch.rpm
yum clean all
yum update
systemctl start zabbix-server
systemctl start zabbix-agent

yum clean allを実行しないと、新しいバージョンを検出してくれなかった。

Fedora Server 21 + MATE Desktop

やってみたことの記録(ところどころうろ覚え)

Fedora Server 21を通常インストール 追加のコンポーネントは特になし

インストール後CUIで起動 まずは全パッケージ更新

yum update

早速MATEをインストール→失敗

yum groups install 'MATE Desktop'

インストール済みのfedora-release-serverパッケージとfedora-release-nonproductパッケージがコンフリクトしていたので削除

yum remove fedora-release-server.noarch

firewalldを依存で巻き込むが、構わず一緒に削除

改めてyum groups install ‘MATE Desktop’

デフォルトではmulti-userで立ち上がるのでXが立ち上がらない

systemctl get-default
multi-user.target

grapicalに変更

systemctl set-default graphical.target

再起動

shutdown -r now

再起動後Xのログイン画面が起動

ついでに各種ディレクトリを英字表記に

LANG=C xdg-user-dirs-gtk-update

LXDEやKDEなど、他のデスクトップ環境でも同様にインストールできそう

OSごとに違うtracerouteのコマンド名

紛らわしいのでメモ

ネットワークの経路を調べるtracerouteだが、OSごとにコマンド名が違ってとても紛らわしい

OSコマンド名
Windowstracert
Linuxtraceroute
z/OStracerte

他のOSではどうなんだろうか。見つけたらメモしておこう。

LinuxからPPTPサーバへVPN接続

Web検索すればそれなりに情報が出てくるものの、断片的すぎてそのまま自分の環境に適用できなかった。

今回対象にするディストリビューションはRed Hat Enterprise Linux 6.1。この環境をVPNクライアントにする。

まずはPPTP接続の為のパッケージを追加。インストールメディアより"Point-to-Point Tunneling Protocol (PPTP) Client" (pptp-1.7.2-8.1.el6)をインストールする。

次にVPN接続の認証に使うユーザ情報を設定する。

/etc/ppp/chap-secretsに以下の情報を追加。

USERNAME	*	PASSWORD	*

VPNに接続するには、以下のコマンドを実行する。

コマンド実行後に仮想インタフェース"ppp0"が作られる。

pppd debug noauth nodetach noipdefault defaultroute name USERNAME require-mppe require-mppe-40 require-mppe-128 pty &quot;/usr/sbin/pptp HOSTIP --nolaunchpppd --loglevel 2&quot;

以下のコマンドを実行し、ルーティング設定を追加する。ここで追加した設定は、VPN接続解除時に自動的に削除される。

route add -net IPADDRESS netmask SUBNETMASK ppp0

接続解除は、実行中のpppdを中断(Ctrl-C)すれば、後始末までしてくれる。