BSD を試してみよう、パート 5/7: OpenBSD に Nginx + Wordpress をセットアップ! もうすぐ!

BSD を試してみよう、パート 5/7: OpenBSD に Nginx + Wordpress をセットアップ! もうすぐ!

オープンBSDこれは、BSD シリーズのオペレーティング システムに関する 7 部構成のシリーズの第 5 部です。

パート 5: BSD を試してみよう、パート 5/7: OpenBSD で Nginx + WordPress をセットアップする! もうすぐ!

OpenBSDは私にとって特別な存在です。多くの時間を費やし、その特徴を理解してきました。

OpenBSDは、Theo de Raadt氏が他人とうまく付き合えないという理由でNetBSDからフォークして始まりました。冗談です。冗談ですが、それが由来です。OpenBSDのアイデンティティは常に「セキュア」であり、その焦点と評判は伝説的なものです。オペレーティングシステム全体にわたって、暗号化は徹底的であり、ランダム化は至る所で行われ、安全なデフォルトが選択されています。OpenBSDは実戦でテストされており、継続的にコードを監査し、多くの目と多くのファジングツールで攻撃しています。OpenBSDは、OpenSSH(おそらく皆さんが使用しているSSH)、OpenBGPD、LibreSSL、OpenSMPTD、OpenNTPD、pfファイアウォールなど、他の多くの重要なプロジェクトの母体でもあります。

OpenBSD で気に入っている点は次のとおりです。

  • 各バージョンごとに最高の曲が1曲ずつ付いてきます!ええ、本当です。私のお気に入りは3.6のPonderosa Puffです。OpenBSD リリースソング トップ10の記事もぜひご覧ください。
  • 私にとってOpenBSDはシステム管理者向けのオペレーティングシステムです。サービスの停止、開始、有効化といった基本的な操作は、Linuxと同じくらい簡単にOpenBSDでも行えます。パッケージのインストールもLinuxと同じくらい簡単です。ルートファイルシステムのバックアップ設定は事前に設定されています。システムスクリプトの多くはPerlで記述されています。などなど。
  • ドキュメントは<シェフのキス>
  • まだ触っていませんが、OpenBSDで作成されたハイパーバイザーが含まれています
  • 私はセキュリティの専門家ではありませんが、これまで読んだ情報やプロジェクトの評判から判断すると、OpenBSDは有能な人材が管理すれば非常に安全だと考えています。だからといって、他のオペレーティングシステムも有能な人材が管理すれば非常に安全ではないということではありません。
  • 私はBSDの中でこのロゴが一番好きですが、それは私個人の意見です。

気に入らない点:

  • OpenBSDは他のオペレーティングシステムに比べて遅いという評判があります。初期の頃は、OpenBSDのSMPサポートが貧弱だったことが原因だったと思います。一方で、OpenBSDは競合OSよりもはるかに多くのハードウェアで動作し、セキュリティ強化にも多大な努力を払っているので…
  • インストーラーは問題ありませんが、ディスクのセットアップが少し原始的です。
  • 私の経験では、プロジェクトのコアコードから離れるほど、問題が発生する可能性が高くなります。下のCertbotの例をご覧ください。これはOpenBSDのせいだけではありませんが、ユーザーベースが小さく、移植の優先事項になることは決してありません。さらに、セキュリティと正確性に関して奇抜でうるさいため、他のオペレーティングシステムを念頭に設計されたパッケージはしばしば問題を引き起こします。十分にテストされていない0.01%のユーザーが常に存在するのです。
  • その文化はちょっと恥ずかしいです。

OpenBSD の文化は、特に初心者に優しいというわけではありません。ドキュメントが非常に優れているので、それを読むだけで十分です。疑問の答えがそこに見つからない場合は、ソース コードを調べる必要があります。

開発者たちは特にコミュニティ志向ではありません。このOSを作っているのは開発者です。気に入ったらサポートすればいいのですが、開発者たちはやりたいことをやるだけです。「彼らのやりたいこと」と「継続的なコミュニティサポート」の間には葛藤がありますが、前者が勝つこともあると思います。

OpenBSD に関しては、良い経験も悪い経験もありました。ファイアウォールを OpenBSD で運用したことがありますが、全く機能しませんでした。また、RAID-1 ファイルサーバーも OpenBSD で長年運用していました。初期の頃は、VM 上で OpenBSD を動作させるには特別なパラメータが必要だったようですが、最近は問題なく動作するようになりました。その一方で、長年にわたり、一部のボード(Beagle など)で OpenBSD を操作していた際に、奇妙なクラッシュやダンプが頻繁に発生しました。

amd64 用に OpenBSD 7.5をインストールしています。

OpenBSD 右ディスク

cd75.iso から起動しています。OpenBSD のミラーシステムの使い方を見せようと思い、ファイルセットを含まない .iso を意図的に選択したか、間違った .iso を選択したかのどちらかです。

OpenBSDの有名なプロンプト

ああ、あの有名な青地に黒地に白い文字…なぜかは分からないけど、定番の配色だよね。そして、あの有名なプロンプト!

OpenBSD インストール

OpenBSD インストーラは GUI ベースではありません。TUI ベースでもありません。スクロールするアンケート形式です。

再びDHCPを使用していますが、基本的には簡単なフォームに記入するだけです。インターフェースは最も使いやすいとは言えませんが、非常に効率的です。

それでも、テキスト インターフェースで基本的な質問に答えられない場合は、OpenBSD はおそらく適していません。

OpenBSD パーティショニング

面白いですね…GPTではなくMBRがデフォルトになっていますね。つまり、今のところGPTをデフォルトにしているのはNetBSDだけですね!

正直に言うと、こういう細分化は面倒だし、間違いも起こりやすい。「ルートディレクトリを50GB、スワップに2GB、残りは/appsに置け」なんて簡単には言えない。一日中こんなことをやってたら、きっと自然にできるようになるんだろうけど…まあ、そうでもないかもしれない。

OpenBSD は権限と機能を適切にレイアウトするため、私は自動レイアウトを使用します。これは推奨されています。OpenBSD を実行するときは通常、/data と呼ばれる (L) スライスを作成し、そこにアプリなどを配置します。

OpenBSD パーティション分割完了

パーティション分割がとても速いですね!ファイルシステムの属性の違いに注目してください。次はセットを見てみましょう。

「http」と入力すると、ミラーから選択するオプションが表示されました。

OpenBSD ピックミラー

OpenBSD ピックセット

最近では、すべてをインストールしない理由はありません。Xをインストールしておくと便利です。なぜなら、いずれXを必要とするパッケージに出会うことになるからです。

'bsd' はカーネルです。'bsd.mp' はマルチプロセス用のカーネルです。2024年にはマルチプロセスがデフォルトになると思われるかもしれませんが、OpenBSD は多様なハードウェアで動作することを覚えておいてください。bsd.rd はレスキューカーネルです。

OpenBSD セット完了

これらを非常に早く読み終えました。

OpenBSDの再起動

おめでとう!

ここでミスを犯してしまいました。VultrパネルでISOファイルを削除する必要があることは分かっていました(「CDイジェクト」をシミュレートするためです)。それで実際にそうしてみたのですが、VultrでISOファイルを削除するとVMが再起動することを思い出しました。これはちょっとおかしいポリシーだと思いますが、Vultrパネルの仕組みはそういうものなのです。

OpenBSDで最初に「(R)eboot」を実行していたら、新しいファイルシステムがアンマウントされていたはずです。そうならなかったので、再起動時に…

OpenBSD fs はクリーンではない

すべて順調に回復しました。

OpenBSD の起動成功

そして起動しました!

初回起動時に特別な処理が行われることに注意してください。それが何なのか気になったのですが…rc.firsttime は存在しません。実際、ちょっと分かりにくいですね。rc.firsttime が存在するのはインストール完了後、初回起動が完了する前だけです。調べてみたところ、ファームウェアのアップデートを実行し、syspatch を呼び出してシステムに利用可能なパッチがあるかどうかを通知しているようです。

もちろん、ブートのたびにカーネルが再リンクされ、ランダム化されます。

セキュアレベル

OpenBSDにはセキュアレベルの概念があります。FreeBSDもこれを実装しています。NetBSDのモデルはもう少し原始的です。ここではOpenBSDのモデルについて説明します。

カーネルにはセキュアモードと呼ばれる設定があります。セキュリティレベルは-1から2のスケールで、セキュリティレベルが上がるにつれて高くなります。-1と0では、追加のセキュリティは適用されません。セキュリティレベル1(デフォルト)では、いくつかの新しい機能が有効になります。

  • /dev/mem/dev/kmemを開けません

  • マウントされたファイルシステムのrawディスクデバイスは読み取り専用です

  • システムの不変および追加専用のファイルフラグは削除できない可能性があります

  • 一部のsysctl変数は変更できません

  • GPIOピンはロックダウンされています

セキュアレベル 2 では、上記のすべてに加えて、時間を戻すことはできず、ファイアウォール ルールを変更することもできません。

なぜセキュアレベル2が必要なのでしょうか?おそらく、起動時にルールが読み込まれるルーターをお使いののでしょう。ログは追記のみに設定されており、再起動しないとファイアウォールルールを変更できません。もしそのルーターが侵害された場合、ログから何が起こったかを確認できる可能性がはるかに高くなり、攻撃者はルールを変更できなくなります。

周りを見回す

openbsd# df -h
ファイルシステムサイズ 使用済み 使用可能容量 マウント先
/dev/sd0a 986M 122M 815M 14% /
/dev/sd0k 24.3G 18.0K 23.0G 1% /home
/dev/sd0d 3.9G 14.7M 3.7G 1% /tmp
/dev/sd0f 6.7G 1.4G 4.9G 23% /usr
/dev/sd0g 986M 303M 634M 33% /usr/X11R6
/dev/sd0h 8.8G 146K 8.4G 1% /usr/local
/dev/sd0j 5.8G 2.0K 5.5G 1% /usr/obj
/dev/sd0i 2.5G 2.0K 2.3G 1% /usr/src
/dev/sd0e 6.9G 10.5M 6.5G 1% /var

推奨サイズをすべて満たした後、残ったものはすべて/homeにダンプされました。インストール時に変更することもできましたが、今のところは問題ありません。

普段は/webを作成しますが、私は大きなパーティションを1つにまとめるタイプなので、十分な容量があります。しかし、/は1GB未満なので、ここではうまくいきません。この点については後で説明します。

ちなみに、OpenBSD にはデフォルトで wheel グループがありますが、無効になっています(ユーザーが登録されていないため)。「wheel」は、/etc/group 内のグループと同様に、su で root にアクセスできるユーザーをリストするグループです。このグループが空の場合、制限はなく、root のパスワードを知っている人なら誰でも su できます。OpenBSD は、wheel グループに誰も登録されていない状態で出荷されます。

ソフトウェアのインストール

FreeBSDと同様に、OpenBSDにもPortsとPackagesがあります。Portsが必要な場合は、ports.tar.gzをダウンロードして展開し、Ports階層を作成する必要があります。その後、必要なアプリケーションを起動し、configure/make/make installを実行できます。

この例ではパッケージを使用します。wget を試してみましょう。

 openbsd# pkg_add wget
quirks-7.14:updatedb-0p0: 正常
quirks-7.14 2024-05-28T20:13:45Z に署名
quirks-7.14: 大丈夫
wget-1.21.4p0:libiconv-1.17: 正常
wget-1.21.4p0:gettext-runtime-0.22.5: 正常
wget-1.21.4p0:libunistring-0.9.7: 正常
wget-1.21.4p0:libidn2-2.3.0p0: 正常
wget-1.21.4p0:libpsl-0.21.1: 正常
wget-1.21.4p0:bzip2-1.0.8p0: 正常
wget-1.21.4p0:pcre2-10.37p2: 正常
wget-1.21.4p0: 正常
オープンBSD# 

OpenBSD、よくやった。とにかく動く。以前は、何らかのPKG環境変数を最初に設定する必要があったと思うけど、それがなくなり、pkg_add(そしてその類似機能であるpkg_delete、pkg_searchなど)がそのまま使えるようになったのは嬉しい。

MariaDBを試してみましょう。

 openbsd# pkg_info -Q mariadb
mariadb-client-10.9.8v1
mariadb サーバー 10.9.8p0v1
mariadb-テスト-10.9.8v1
p5-DBD-MariaDB-1.23
openbsd# pkg_add mariadb-server mariadb-client
quirks-7.14 2024-05-28T20:13:45Z に署名
mariadb-server-10.9.8p0v1:xz-5.4.5: 正常
mariadb-server-10.9.8p0v1:lz4-1.9.4: 正常
mariadb-server-10.9.8p0v1:zstd-1.5.5: 正常
mariadb-server-10.9.8p0v1:snappy-1.1.10p1: 正常
mariadb-server-10.9.8p0v1:lzo2-2.10p2: 正常
mariadb-server-10.9.8p0v1:nghttp2-1.58.0: 正常
mariadb-server-10.9.8p0v1:ngtcp2-1.3.0: 正常
mariadb-server-10.9.8p0v1:nghttp3-1.2.0: 正常
mariadb-server-10.9.8p0v1:curl-8.7.1: 正常
mariadb-server-10.9.8p0v1:libxml-2.12.7: 正常
mariadb-server-10.9.8p0v1:mariadb-client-10.9.8v1: 正常
mariadb-server-10.9.8p0v1:p5-Params-Util-1.102: 正常
mariadb-server-10.9.8p0v1:p5-Module-Runtime-0.016p0: 正常
mariadb-server-10.9.8p0v1:p5-Math-Base-Convert-0.11p0: 正常
mariadb-server-10.9.8p0v1:p5-Clone-0.46: 正常
mariadb-server-10.9.8p0v1:p5-SQL-Statement-1.414: 正常
mariadb-server-10.9.8p0v1:p5-FreezeThaw-0.5001p0: 正常
mariadb-server-10.9.8p0v1:p5-MLDBM-2.05p0: 正常
mariadb-server-10.9.8p0v1:p5-Net-Daemon-0.49: 正常
mariadb-server-10.9.8p0v1:p5-PlRPC-0.2020p0: 正常
mariadb-server-10.9.8p0v1:p5-DBI-1.643p0: 正常
mariadb-server-10.9.8p0v1:p5-DBD-MariaDB-1.23: 正常
mariadb-server-10.9.8p0v1: 正常
ランニングタグ: OK
次の新しい rcscripts がインストールされました: /etc/rc.d/mysqld
詳細についてはrcctl(8)を参照してください。
新規および変更された Readme:
	/usr/local/share/doc/pkg-readmes/mariadb-server

したがって、私は個人的には MariaDB にはこれらの Perl モジュールは必要ないと考えていますが、どうやら OpenBSD には必要なようです。

「rcscripts」の行に注目してください。MariaDBを起動しましょう。/etc/rc.d/mariadb の方がいいとも思いますが、互換性の問題は理解できます。

 openbsd# rcctl で mysqld を起動します
mysqld(正常)
オープンBSD#

OpenBSD さん、お辞儀をしてください。(でも、下を見てください…実際はお辞儀はしていません)。

それで、どちらがお好みですか?

 rcctl で mysqld を起動する
rcctl mysqld を起動する

「rcctl start」の方が「自然な英語」で、階層的な流れになっているという利点があります。まずコマンド名、次にコマンドに実行させたい内容、そして最後にターゲットを指定します。一方、「rcctl mysql start」は、上矢印キーで「start」を「stop」に簡単に置き換えることができます。

選択肢…

この時点でNginxとPHPをインストールします。しかし、OpenBSDにはユニークな選択肢があります。これは独自のWebサーバーを構築した唯一のBSDです。その名も、なんとOpenHTTPDです。

openbsdhandbook.comという興味深いサイトでこのHOWTOを見つけました。このサイトの存在理由が分かりません。「about」ページが見つからなかったのですが、WordPressにOpenHTTPDを使用しているようです。

私はNginxを使い続けます。

 openbsd# pkg_add certbot nginx php php-cgi fcgi php-curl php-mysqli php-zip unzip
quirks-7.14 2024-05-28T20:13:45Z に署名
certbot-2.9.0:sqlite3-3.44.2: 正常
certbot-2.9.0:libffi-3.4.4p1: OK
certbot-2.9.0:python-3.10.14: 正常
certbot-2.9.0:py3-ConfigArgParse-1.5.3p1: 正常
certbot-2.9.0:py3-zopeevent-4.5.0p0: 正常
certbot-2.9.0:py3-zopeinterface-5.5.2: 正常
certbot-2.9.0:py3-zopecomponent-4.2.2p8: 正常
certbot-2.9.0:py3-six-1.16.0p3: 正常
certbot-2.9.0:py3-configobj-5.0.8: 正常
certbot-2.9.0:py3-parsedatetime-2.6p1: 正常
certbot-2.9.0:py3-setuptools-68.0.0v0: 正常
certbot-2.9.0:py3-cparser-2.21: 正常
certbot-2.9.0:py3-cfi-1.16.0: OK
certbot-2.9.0:py3-cryptography-42.0.5: 正常
certbot-2.9.0:py3-openssl-24.0.0: 正常
certbot-2.9.0:py3-josepy-1.14.0: 正常
certbot-2.9.0:py3-distro-1.8.0: 正常
certbot-2.9.0:py3-tz-2024.1: 正常
certbot-2.9.0:py3-pyRFC3339-1.1p2: 正常
certbot-2.9.0:py3-brotli-1.0.9p3: 正常
certbot-2.9.0:py3-certifi-2023.7.22: 正常
certbot-2.9.0:py3-idna-3.6: 正常
certbot-2.9.0:py3-urllib3-1.26.15: 正常
certbot-2.9.0:py3-charset-normalizer-3.3.2: 正常
certbot-2.9.0:py3-requests-2.31.0: 正常
certbot-2.9.0:py3-requests-toolbelt-0.10.1: 正常
certbot-2.9.0:py3-acme-2.9.0: 正常
certbot-2.9.0: 正常
nginx-1.24.0p0: 正常
あいまい: PHPのパッケージを選択してください
0: 
	1: php-8.1.28
	2: php-8.2.19
	3: php-8.3.7
あなたの選択: 3
php-8.3.7:femail-1.0p1: 正常
php-8.3.7:femail-chroot-1.0p3: 正常
php-8.3.7:鬼車-6.9.9: 正常
php-8.3.7:capstone-5.0: 正常
php-8.3.7:libsodium-1.0.19: 正常
php-8.3.7:argon2-20190702p0: 正常
php-8.3.7: 正常
あいまい: php-cgiのパッケージを選択してください
0: 
	1: php-cgi-8.1.28
	2: php-cgi-8.2.19
	3: php-cgi-8.3.7
あなたの選択: 3
php-cgi-8.3.7: 正常
fcgi-2.4.0p18:p5-FCGI-0.82: 正常
fcgi-2.4.0p18: 大丈夫
あいまい: php-curl のパッケージを選択してください
0: 
	1: php-curl-8.1.28
	2: php-curl-8.2.19
	3: php-curl-8.3.7
あなたの選択: 3
php-curl-8.3.7: 正常
あいまい: php-mysqli のパッケージを選択してください
0: 
	1: php-mysqli-8.1.28
	2: php-mysqli-8.2.19
	3: php-mysqli-8.3.7
あなたの選択: 3
php-mysqli-8.3.7: 正常
あいまい: php-zip のパッケージを選択してください
0: 
	1: php-zip-8.1.28
	2: php-zip-8.2.19
	3: php-zip-8.3.7
あなたの選択: 3
php-zip-8.3.7:libzip-1.8.0p0: 正常
php-zip-8.3.7: 正常
あいまい: 解凍するパッケージを選択してください
0: 
	1: 解凍-6.0p17
	2: unzip-6.0p17-iconv
あなたの選択: 1
unzip-6.0p17: 正常
次の新しい rcscripts がインストールされました: /etc/rc.d/nginx /etc/rc.d/php83_fpm
詳細についてはrcctl(8)を参照してください。
新規および変更された Readme:
	/usr/local/share/doc/pkg-readmes/femail-chroot
	/usr/local/share/doc/pkg-readmes/nginx
	/usr/local/share/doc/pkg-readmes/php-8.3

いいですね。PHPはまだ設定されていません。設定するには以下が必要です。

 openbsd# ls /etc/php-8.3                                                                             
openbsd# cp /etc/php-8.3.sample/* /etc/php-8.3                                                       
オープンBSD# 

私としては、賢明なデフォルトを希望します。

php-fpm には www プールが既に設定されています。これについては後ほど詳しく説明します。

始めましょう:

 openbsd# rcctl php83_fpm を起動します 
php83_fpm(正常)
openbsd# rcctl php83_fpm を有効にする
openbsd# ps ax |grep php
59013 ?? S 0:00.01 php-fpm-8.3: マスタープロセス (/etc/php-fpm.conf) (php-fpm-8.3)
43846 ?? Ic 0:00.00 php-fpm-8.3: プール www (php-fpm-8.3)
12243 ?? Ic 0:00.00 php-fpm-8.3: プール www (php-fpm-8.3)

エングス

標準の nginx.conf には、sites-available/sites-enabled などは一切ありません。/etc/nginx/sites を作成し、blog.lowend.party の基本エントリを追加しました。

nginxがインストールされているにもかかわらず存在しない/var/log/nginxを作成し、次に/var/log/nginx/blog.lowend.party/{access,error}.logを作成しました

nginxはどのようにログをローテーションするのでしょうか? newsyslogです。/etc/newsyslog.confを見てください。テーブルなので、OpenHTTPDのエントリと同じように、/var/log/nginx/blog.lowend.party/access.logなどの行を追加する必要があるようです。しかし、多くのサイトではすぐに面倒になってしまうでしょう。manページにはワイルドカードに関する記述がありません。

OpenHTTPD用の/var/wwwに影響を与えたくなかったので、/var/nginx/blog.lowend.partyを作成しました。/webを/var/nginxにシンボリックリンクしました。

そして何も機能しなくなりました。

次のようなエラーが発生しました:

2024/05/29 16:25:24 [エラー] 44074#0: *1 open() "/web/blog.lowend.party/index.html" 
失敗 (2: そのようなファイルまたはディレクトリはありません)、クライアント: xxxx、サーバー: blog.lowend.party、 
リクエスト: "GET /index.html HTTP/1.1"、ホスト: "blog.lowend.party"

わかりました。おそらく私のシンボリックリンクが気に入らないのでしょう。

 2024/05/29 16:38:08 [エラー] 48621#0: *4 "/var/nginx/blog.lowend.party/index.html" 
見つかりません (2: そのようなファイルまたはディレクトリはありません)、クライアント: xxxx、サーバー: 
blog.lowend.party、リクエスト: "GET / HTTP/1.1"、ホスト: "149.28.120.232"

しばらく頭を悩ませていました。wwwのシェルを/bin/bashに変更し、そこに切り替えてそのファイルにアクセスしてみましたが、問題は発生しませんでした。wwwのシェルを元に戻し、頭を悩ませました。

では、ファイルに完全にアクセスできるのに、実行中のデーモンがアクセスできない状況とはどのような状況でしょうか?

chroot。

以下は OpenBSD の nginx のマニュアル ページです。

 -uデフォルトでは、 nginx はデーモンを実行しているユーザーのホームディレクトリ(通常は「www」)またはnginx.conf内のユーザーのホームディレクトリに chroot(2) します  -uオプションこの動作を無効にし、 nginx を元の「安全でない」動作に戻します

まあ、本当に…

これはNginx 1.24です。Nginx 1.22をインストールした私のDebian 12.5システムでは、マニュアルページにそのようなオプションはありません。そして、そのボックスでは:

# nginx -u
nginx: 無効なオプション: “u”

したがって、これは 1.24 で追加されたか (可能性あり)、OpenBSD がこれを含めるようにパッチを当てたかのいずれかです。

とにかく、wwwは/var/www(ホームディレクトリ)にchrootされています。Nginxのchrootを無効にするのは適切ではないと思われるので、Webルートを以下に移動しました。

とにかく、php-fpm の設定を調べてみると、たまたまその中にある /var/www/run/php-fpm.sock のソケットで実行されていることがわかります。

とにかく、Nginxのサイト定義を変更しました。/var/www/nginx/blog.lowend.partyを作成し、サイトのWebルートを次のように設定しました。

  /nginx/blog.lowend.party;

htdocs は触りたくなかったんです(OpenHTTPD の管轄なので)。/var/www/html もありますが、OpenHTTPD について調べていないので、nginx を専用の場所に置くのがベストだと思いました。

その後…

OpenBSD 静的 OK

さて、これで静的HTMLの作成は完了です。次はphp-fpmに取り掛かりましょう。

php-fpm の定義では/var/www/run/php-fpm.sock にソケットがあるとされていますが、サイトが /run/php-fpm.sock を参照するように Nginx を設定する必要がありました。デーモンが非特権ユーザー (www) に落ちるまでの処理はすべて、通常の絶対パスで参照できます。しかし、www になった後は chroot 参照を使用する必要があります。

OpenBSD PHP-FPM の成功

OK、php-fpm が起動して実行されました。

マリアDB

mysql_secure_installation を実行すると次の結果が得られました:

 bash-5.2# mysql_secure_installation 

注意: このスクリプトのすべての部分を実行することは、すべてのMariaDBで推奨されます。
      本番環境で使用されているサーバーです。各手順をよくお読みください。

MariaDBにログインしてセキュリティを確保するには、現在の
ルートユーザーのパスワード。MariaDBをインストールしたばかりで、
まだルートパスワードを設定していない場合は、ここで Enter キーを押します。

ルートの現在のパスワードを入力してください (なしの場合は入力してください): 
エラー 2002 (HY000): ソケット '/var/run/mysql/mysql.sock' 経由でローカルサーバーに接続できません (2)
ルートの現在のパスワードを入力してください (なしの場合は入力してください): 

ふーん。それで…

 # rcctl で mysqld を起動します
mysqld(正常)
# ps ax | grep my
# ps ax | grep mar
# ls -l /var/run/mysql/
合計 0

つまり、rcctl の -1 は OpenBSD を指しています。デーモンが起動しない場合は、デーモンの起動に使用しているツールが起動しなかったことを通知してくれるはずです。

 openbsd# cd /var/log
openbsd# grep -i mysql メッセージ 
5月29日 15:15:04 openbsd groupadd[86986]: 新しいグループが追加されました: name=_mysql, gid=502
5月29日 15:15:04 openbsd useradd[19098]: 新しいユーザーが追加されました: name=_mysql, uid=502, gid=502, home=/nonexistent, shell=/sbin/nologin
5月29日 15:42:14 openbsd pkg_add: php-mysqli-8.3.7を追加しました
openbsd# grep -i mysqlデーモン
オープンBSD# 

ああああああああ…

これは標準の/etc/my.cnfです

[クライアント-サーバー]
#socket=/var/run/mysql/mysql.sock
#ポート=3306

# これはすべてのMariaDBクライアントに渡されます
[クライアント]
#パスワード=私のパスワード

# MariaDB サーバー
[mysqld]
# すべてのネットワークアドレスをリッスンするには、「bind-address = *」を使用します
バインドアドレス=localhost
# データを保存するディレクトリ
#データ=/var/mysql
# これは、すべてのログ、エラー、およびレプリケーションファイルに使用されるプレフィックス名です
#ログベース名=mysqld
# ログ記録
#一般ログ
#スロークエリログ

general-log のコメントを解除しました。変化はありません。

/var/lib/mysql も /var/mysql もないようです。しかし、mysql_install_db コマンドはあります。これを実行してみましょう。

 openbsd# mysql_install_db 
警告: ホスト 'openbsd.my.domain' を /usr/local/bin/resolveip で検索できませんでした。
これはおそらくlibcライブラリが100%互換性がないことを意味します
このバイナリMariaDBバージョンでは、MariaDBデーモンであるmysqldが動作するはずです。
通常は、ホスト名の解決が機能しないことを除けば、問題ありません。
つまり、ホスト名の代わりにIPアドレスを使う必要があるということです
MariaDB 権限を指定する場合!
'/var/mysql' に MariaDB/MySQL システム テーブルをインストールしています...
わかりました


全権限アカウントが 2 つ作成されました。
1つはroot@localhostで、パスワードはありませんが、
接続するにはシステムの「root」ユーザーである必要があります。例えば、sudo mysql を使用します。
2番目は_mysql@localhostで、パスワードはありませんが、
接続するにはシステムの '_mysql' ユーザーである必要があります。
接続後、必要に応じてパスワードを設定できます。
パスワードとsudoなしでこれらのユーザーのいずれかとして接続できる

MariaDB ナレッジベースについては、https://mariadb.com/kb をご覧ください。

MariaDB デーモンは次のコマンドで起動できます。
/etc/rc.d/mysqld を起動します

問題が発生した場合は、https://mariadb.org/jira までご報告ください。

MariaDB の最新情報は https://mariadb.org/ で入手できます。

MariaDB の強力で活気のあるコミュニティに参加することを検討してください。
参加する

そしてその後は実行されました:

 83277 p0  Sp      0:00.02 /bin/sh /usr/local/bin/mariadbd-safe
32870 p0  S        0:00.18 /usr/local/libexec/mariadbd --basedir=/usr/local --datadir=/var/mysql --pl

本当に、それはパッケージのインストールの一部として実行されるべきではないでしょうか? 適切なデフォルトと動作するソフトウェアを期待しています。

これで、mysql_secure_installation を実行してデータベースとユーザーを作成できます。WordPress の最新の.zip を解凍した後、以下のコマンドを実行します。

OpenBSD WordPressへようこそ

サートボット

もちろん、http を使っていますが、https を使いたいです。「certbot」パッケージをインストールしました。動作するか確認してみましょう。

 openbsd# certbot --authenticator webroot --installer nginx --webroot-path /var/www/nginx/blog.lowend.party
デバッグログを /var/log/letsencrypt/letsencrypt.log に保存しています
要求されたnginxプラグインがインストールされていないようです

うーん。Debianにはpython3-certbot-nginxパッケージがあるけど、OpenBSDにはそんなの無いんだ。

 openbsd# man certbot
男性: マニュアルに certbot のエントリがありません。

残念ですね。Linuxマシンでcertbotのマニュアルを見てみましょう。「 certbot plugins」コマンドがあるのですが、案の定、Nginxプラグインはインストールされていません。

pip でインストールしたと思うのですが…?グーグルで調べたら apt コマンドばかり出てきました、笑。

ちなみに、OpenBSD 7.5 には Python 3.10 が付属しています。

 openbsd# pip3 certbot-nginx をインストール
エラー: 外部管理環境

× この環境は外部で管理されています
╰─> このPythonインストールはpkg_add(1)によって管理されます。
    
    Pythonパッケージをシステム全体にインストールするには、OSパッケージを使用します。
    可能です。たとえば、「pkg_add py3-somepackage」です。
    
    それ以外の場合、パッケージで入手できないソフトウェアについては、
    「venv」(仮想環境、参照)を作成することをお勧めします。
    https://docs.python.org/3/library/venv.html) にアクセスしてインストールしてください。
    スタンドアロンアプリケーションの場合、pipx(py3-pipxパッケージ内)は
    これを管理するのに役立ちます。

ああ、残念だ。

わかりました。それで…

 openbsd# mkdir -p /usr/local/python3-venv/certbot-venv
python3 -m venv /usr/local/python3-venv/certbot-venv
. /usr/local/python3-venv/certbot-venv/bin/activate
pip3 certbot-nginx をインストール

…失敗した

収集されたパッケージの車輪の構築:暗号化

…Rustコンパイラがインストールされていなかったからです。そう、どうやらLet's Encryptを使うにはRustコンパイラが必要なようです。

 pkg_add 錆

その後

暗号化用ホイールの構築 (pyproject.toml)

永遠にかかった。緊張感!悲しいかな、Rustのエラーだらけで終わり、最後はこうなった。

原因:
        プロセスが正常に終了しませんでした: `/tmp/pip-install-g1i5s24a/cryptography_6751bdb65bd643328c0d0dd2cb9623e6/src/rust/target/release/build/cryptography-cffi-69dd56dd49fae026/build-script-build` (終了ステータス: 101)
        --- 標準出力
        cargo:rustc-check-cfg=cfg(python_implementation, values("CPython", "PyPy"))
        貨物:環境が変更された場合の再実行=PYO3_PYTHON
        貨物:変更された場合の再実行=../../_cffi_src/
        cargo:変更された場合再実行=../../cryptography/__about__.py
        cargo:rustc-cfg=python_implementation="CPython"
      
        --- 標準エラー出力
        スレッド 'main' が cryptography-cffi/bu​​ild.rs:63:49 でパニックになりました:
        openssl include パスが見つかりません
        注: バックトレースを表示するには、`RUST_BACKTRACE=1` 環境変数で実行してください。
      エラー: `cargo rustc --lib --message-format=json-render-diagnostics --manifest-path src/rust/Cargo.toml --release -v --features pyo3/extension-module --crate-type cdylib --` がコード 101 で失敗しました
      [出力終了]
  
  注: このエラーはサブプロセスから発生するものであり、pip の問題ではない可能性があります。
  エラー: 暗号化ホイールの構築に失敗しました
暗号化の構築に失敗しました
エラー: pyproject.toml ベースのプロジェクトをインストールするために必要な暗号化用のホイールをビルドできませんでした

私は手に負えない状況に陥っています。

CPU は 1 つですか?

いろいろと調べていたら、トップページを見てもCPUが1つしか表示されませんでした。Vultrパネルで確認してみると、VMには確かに2つのCPUがプロビジョニングされていました。

では、OpenBSD システムにいくつの CPU が搭載されているかをどうやって確認するのでしょうか? /proc がありません。dmesg には次のように表示されます。

 cpu0: Intel Xeon プロセッサー (Skylake、IBRS)、2594.04 MHz、06-55-04
cpu1: Intel Xeon プロセッサー (Skylake、IBRS)、2593.97 MHz、06-55-04

おそらく正しい答えはsysctl(1)でしょう。これを実行すると、以下のsysctl値を含むすべてのsysctl値がダンプされます。

 hw.ncpufound=2
hw.allowpowerdown=1
hw.smt=0
hw.ncpuオンライン=1

えぇぇぇ……!?オンラインCPUが1つだけ? dmesgでは表示されるのにtopでは表示されないのと、こんな感じで一致します。

OpenBSD トップ1

OpenBSDトップ

では、cpu1 に何が起こったのでしょうか? dmesg を見てみましょう:

 OpenBSD 7.5 (GENERIC.MP) #82: 2024年3月20日水曜日 15:48:40 MDT
    [email protected]:/usr/src/sys/arch/amd64/compile/GENERIC.MP
実メモリ = 2130554880 (2031MB)
利用可能なメモリ = 2045083648 (1950MB)
ランダム: ブートブロックからの適切なシード
ルートのmpath0
scsibus0 at mpath0: 256 ターゲット
ルートの mainbus0
メインバス0のbios0
bios0のacpi0: ACPI 1.0
acpi0: スリープ状態 S3 S4 S5
acpi0: テーブル DSDT FACP APIC HPET WAET
acpi0: ウェイクアップデバイス
acpi0のacpitimer0: 3579545 Hz、24ビット
acpimadt0 at acpi0 addr 0xfee00000: PC-AT互換
mainbus0 の cpu0: apid 0 (ブートプロセッサ)
cpu0: Intel Xeon プロセッサー (Skylake、IBRS)、2594.04 MHz、06-55-04
cpu0: FPU、VME、DE、PSE、TSC、MSR、PAE、MCE、CX8、APIC、SEP、MTRR、PGE、MCA、CMOV、PAT、PSE36、CFLUSH、MMX、FXSR、SSE、SSE2、HTT、SSE3、PCLMUL、SSSE3、FMA3、CX16、PCID、SSE4.1、SSE4.2、x2APIC、MOVBE、POPCNT、DEADLINE、AES、XSAV E、AVX、F16C、RDRAND、HV、NXE、PAGE1GB、RDTSCP、LONG、LAHF、ABM、FSGSBASE、BMI1、AVX2、SMEP、BMI2、ERMS、INVPC ID、AVX512F、AVX512DQ、CLWB、AVX512CD、AVX512BW、AVX512VL、PKU、IBRS、IBPB、SSBD、ARAT、XSAVEOPT、メルトダウン
cpu0: 32KB 64b/ライン 8ウェイ Dキャッシュ、32KB 64b/ライン 8ウェイ Iキャッシュ、4MB 64b/ライン 16ウェイ L2キャッシュ、16MB 64b/ライン 16ウェイ L3キャッシュ
cpu0: smt 0、コア 0、パッケージ 0
mtrr: Pentium Pro MTRR サポート、8 つの可変範囲、88 の固定範囲
cpu0: apicクロックは1000MHzで動作しています
mainbus0 の cpu1: apid 1 (アプリケーション プロセッサ)
cpu1: Intel Xeon プロセッサー (Skylake、IBRS)、2593.97 MHz、06-55-04
CPU1: FPU、VME、DE、PSE、TSC、MSR、PAE、MCE、CX8、APIC、SEP、MTRR、PGE、MCA、CMOV、PAT、PSE36、CFLUSH、MMX、FXSR、SSE、SSE2、HTT、SSE3、PCLMUL、SSSE3、FMA3、CX16、PCID、SSE4.1、SSE4.2、x2APIC、MOVBE、POPCNT、DEADLINE、AES、XSAV E、AVX、F16C、RDRAND、HV、NXE、PAGE1GB、RDTSCP、LONG、LAHF、ABM、FSGSBASE、BMI1、AVX2、SMEP、BMI2、ERMS、INVPC ID、AVX512F、AVX512DQ、CLWB、AVX512CD、AVX512BW、AVX512VL、PKU、IBRS、IBPB、SSBD、ARAT、XSAVEOPT、メルトダウン
cpu1: 32KB 64b/ライン 8ウェイ Dキャッシュ、32KB 64b/ライン 8ウェイ Iキャッシュ、4MB 64b/ライン 16ウェイ L2キャッシュ、16MB 64b/ライン 16ウェイ L3キャッシュ
cpu1: smt 1、コア 0、パッケージ 0
mainbus0 の ioapic0: apid 0 pa 0xfec00000、バージョン 11、24 ピン
acpi0のacpihpet0: 100000000 Hz
acpi0 の acpiprt0: バス 0 (PCI0)
acpi0の「ACPI0006」は構成されていません
acpi0 PCI0 の acpipci0
acpi0の「PNP0A06」が構成されていません
acpi0の「PNP0A06」が構成されていません
acpi0の「PNP0A06」が構成されていません
acpi0の「QEMU0002」は構成されていません
acpicmos0 acpi0
acpi0の「ACPI0010」は構成されていません
acpicpu0 acpi0: C1(@1 停止!)
acpi0 の acpicpu1: C1(@1 停止!)
cpu0: Skylake AVX MDS 回避策を使用
mainbus0 の pvbus0: KVM、Hyper-V 10.0
pvbus0 の pvclock0
hyperv0 at pvbus0hyperv0: vmbusメッセージの投稿が18で失敗しました
メインバス0のバス0のPCI0
pchb0、pci0、dev 0、function 0、"Intel 82441FX"、rev 0x02
pcib0、pci0、dev 1、function 0、「Intel 82371SB ISA」、rev 0x00
pciide0 at pci0 dev 1 function 1 "Intel 82371SB IDE" rev 0x00: DMA、チャネル0は互換性に接続、チャネル1は互換性に接続
pciide0: チャネル 0 が無効 (ドライブなし)
atapiscsi0、pciide0 チャネル 1 ドライブ 0
scsibus1 at atapiscsi0: 2 つのターゲット
cd0 at scsibus1 targ 0 lun 0: <QEMU, QEMU DVD-ROM, 2.5+> 取り外し可能
cd0(pciide0:1:0): PIOモード4、DMAモード2を使用
uhci0 at pci0 dev 1 function 2 "Intel 82371SB USB" rev 0x01: apic 0 int 11
piixpm0、pci0、dev 1、function 3、"Intel 82371AB Power"、rev 0x03: apic 0 int 9
iic0 piixpm0
vga1 at pci0 dev 2 function 0 "Bochs VGA" rev 0x02
wsdisplay0 at vga1 mux 1: コンソール (80x25、vt100 エミュレーション)
wsdisplay0: 画面1~5を追加(80x25、vt100エミュレーション)
virtio0 at pci0 dev 3 function 0 "Qumranet Virtio Network" rev 0x00
virtio0 の vio0: アドレス 56:00:04:f0:55:23
virtio0: VQ あたり msix
azalia0 at pci0 dev 4 function 0 "Intel 82801I HD Audio" rev 0x03: apic 0 int 11
azalia0: コーデックが見つかりません
virtio1 at pci0 dev 5 function 0 "Qumranet Virtio Storage" rev 0x00
vioblk0 の virtio1
vioblk0のscsibus2: 1つのターゲット
scsibus2 targ 0 lun 0 の sd0: <VirtIO、ブロックデバイス、>
sd0: 66560MB、512バイト/セクター、136314880セクター
virtio1: VQあたりmsix
virtio2 at pci0 dev 6 function 0 "Qumranet Virtio Memory Balloon" rev 0x00
viomb0 の virtio2
virtio2: apic 0 int 10
virtio3 at pci0 dev 7 function 0 "Qumranet Virtio RNG" rev 0x00
viornd0 の virtio3
virtio3: VQ あたり msix
「Intel 6300ESB WDT」rev 0x00、pci0 dev 8、function 0 が未構成
pcib0 の isa0
isadma0 の isa0
fdc0、isa0 ポート 0x3f0/6、irq 6、drq 2
pckbc0、isa0 ポート 0x60/5、irq 1、irq 12
pckbc0 の pckbd0 (KBD スロット)
pckbd0 の wskbd0: コンソールキーボード、wsdisplay0 を使用
pckbc0 の pms0 (補助スロット)
wsmouse0、pms0 mux 0
isa0 ポート 0x61 の pcppi0
pcppi0 の spkr0
uhci0 の usb0: USB リビジョン 1.0
uhub0 at usb0 構成 1 インターフェース 0 "Intel UHCI ルートハブ" rev 1.00/1.00 アドレス 1
uhidev0 at uhub0 ポート 1 構成 1 インターフェース 0 "QEMU QEMU USB タブレット" rev 2.00/0.00 アドレス 2
uhidev0: iclass 3/0
ums0 at uhidev0: 3つのボタン、Z方向
ums0 mux 0 の wsmouse1
ルートのvscsi0
vscsi0のscsibus3: 256個のターゲット
ルートのsoftraid0
scsibus4 at softraid0: 256 ターゲット
sd0a のルート (5f3c9329743bf957.a)、sd0b のスワップ、sd0b のダンプ
警告: /mnt が正しくアンマウントされませんでした
fdc0 ドライブ 1 の fd0: 密度不明

cpu1 がオフラインになっている理由を示す実際のメッセージはありません。

7.5テンプレートを使って、同じスペックの別のVultr VMを起動してみました。上部に表示されているのは以下のとおりです。

オープンBSD

VM 上の OpenBSD では常に特別なパラメータが必要になるようだと言ったことを覚えていますか...

いいえ、実際にはVultrは2コアとして認識していますが、OpenBSDはハイパースレッディングを検知し、 OpenBSDはハイパースレッディングが許容できないセキュリティリスクをもたらすと判断して無効化しています。両方のCPUを有効にするには、以下の手順を実行してください。

 openbsd# sysctl hw.smt=1
ハードウェア変数: 0 -> 1

その後:

OpenBSDトップ

確かに、Vultrテンプレートはこれを/etc/sysctl.confに置きます

ただし、CPU を無効にする場合、dmesg はもう少し明確にできると思います。

ポート

Nginxのchroot化について興味があったので、portsをインストールしてみました。使い方はFAQにコピー&ペーストで書いてあります。解凍すると、portsにはインストールできるソフトウェアがたくさんあり、バイナリパッケージはそこから構築されます。www/nginx/patchesを見てみたら、 patch-man_nginx_8というファイルを見つけました。これは-uフラグについて説明しています。

次に、/usr/ports/www/nginx で「make」を実行すると、さまざまな「OpenBSD パッチを適用」メッセージが表示されます。

出発前に: pf

OpenBSD はかつて IPFilter を使用していたことで有名ですが、ライセンス条件が変更された後、彼らは 1 つの素晴らしいハッカソンでゼロから代替品を作成しました。pf は OpenBSD だけでなく、他のすべての BSD (FreeBSD、DragonFlyBSD、NetBSD)、macOS、iOS などでも使用されています。

If you've done one firewall, you've done them all in my opinion but I'm sure if I worked on networks and firewalls all day long I'd see the differences. pf has a good reputation.

The default pf.conf and also /etc/examples/pf.conf both show ways how to setup your firewall rules. Here's is another:

 # Set macros for port numbers. pf uses the term 'macros'
SSH_PORT = 22
HTTP_PORT = 80

# Define interfaces
ext_if = "vio0"

# Set default policy
set block-policy drop

# Skip loopback interface
set skip on lo0

# Allow inbound SSH and HTTP traffic
pass in on $ext_if proto tcp from any to any port $SSH_PORT
pass in on $ext_if proto tcp from any to any port $HTTP_PORT

# Block all other inbound traffic
block in on $ext_if

結論

I learned a lot in this, mainly because I've never used OpenBSD as a web server before. I'm not sure it's the platform's strengths, though I'm sure with some research I could have got certbot working (manually if necessary). BTW, there's no cron job put in place for certbot renewals.

The experience with Certbot above is not atypical of my experiences with OpenBSD over the years. You do learn a lot, but what is easy on Linux often requires a lot of manual work. In this case, instead of a single pkg_add, you install pip, build a venv, install modules, install rust, and it still fails. Now, true, maybe the real answer here is that I should build a certbot plugins package for OpenBSD on Nginx. Or use OpenHTTPD.

OpenBSD's assumption is that you are a very good sysadmin. When I started back on SunOS, building your own kernel, downloading and compiling software from scratch, etc. was considered sysadmin work. There was no package manager per se. OpenBSD to me harkens back to that era, but in between there's been an explosion of complexity in software.

In its core domain, OpenBSD works very well. And of course there are developers who've got OpenBSD laptops with X-windows and people can do nearly everything with it. But I think for me it's going to remain as my firewall/edge/jump server/bastion host go-to, not as a daily app server.

おすすめの記事