OpenBSDでCGIを動かす

ここでは、OpenBsdでCGIを動かす方法を説明します。
OpenBsdにはウェブサーバhttpd(OpenHttpd)が付属しているため、これを使用します。
httpdはFastCgiに対応していますが、通常のCGIはそのままでは動作しません。
CGIを動作させるには、SlowCgiというツールを使用する必要があります。
SlowCgiは、通常のCGIとFastCgiの橋渡しをします。

興味深いのは、SlowCgiが提供する柔軟性です。
これにより、OpenBsdのセキュリティモデルを維持しつつ、古いCGIスクリプトを活用できます。

KaikoKarehaOrgの設定を例に説明します。

/etc/slowcgi.confは、次のように記述します。

 cgi "/var/www/htdocs/kaiko/cgi-bin"

/etc/httpd.confは、次のように記述します。

 server "kaiko.kareha.org" {
   listen on * port 80
   root "/htdocs/kaiko"
   location "/cgi-bin/*" {
     fastcgi socket "/run/slowcgi.sock"
   }
 }

ディレクトリ/var/www/htdocs/kaikoと/var/www/htdocs/kaiko/cgi-binを作成します。

slowcgiとhttpdを起動します。

 rcctl enable slowcgi
 rcctl start slowcgi
 rcctl enable httpd
 rcctl start httpd

次に、以下のようなシェルスクリプトhello.shを作成し、/var/www/htdocs/kaiko/cgi-bin/に配置します。

 #!/bin/sh
 echo "Content-Type: text/plain"
 echo
 echo hello

chmod +x hello.shで実行権限を付与します。

httpdはChRoot環境で動作しているため、shをコピーしておく必要があります。
/bin/shを/var/www/bin/shにコピーしてください。

このChRoot環境は、セキュリティを強化するためのものであり、プロセスがホストシステムの他の部分に影響を与えないようにします。
ウェブブラウザで https://kaiko.kareha.org/cgi-bin/hello.sh を開いて、期待通りに表示されることを確認します。

----

sh は動的リンクの依存が無いので、単体のファイルをコピーすれば動きます。
動的リンクの依存があるものは、ライブラリもコピーする必要があります。
例えば、 env は2つのライブラリに依存しています。
ldd コマンドで調べることができます。

 # ldd /usr/bin/env
 /usr/bin/env:
 	Start            End              Type  Open Ref GrpRef Name
 	00000132d3b1d000 00000132d3b22000 exe   1    0   0      /usr/bin/env
 	000001354b3b2000 000001354b4b8000 rlib  0    1   0      /usr/lib/libc.so.102.0
 	00000134f27fc000 00000134f27fc000 ld.so 0    1   0      /usr/libexec/ld.so

この場合、 /usr/bin/env を動かすためには、 /usr/lib/libc.so.102.0 と /usr/libexec/ld.so も、適切な場所にコピーする必要があることが分かります。

このプロセスは、依存関係を管理する重要性を示しています。
正確な依存関係を把握することで、システムの安定性を維持しつつ、必要な機能を提供できます。

----

perl を動かすためには、まず /usr/bin/perl と、それが動くように、 ldd で調べたライブラリもコピーする必要があります。
さらに、perlのライブラリも用意する必要があります。
最小とは言えませんが、次のようにするのが簡単です。

 mkdir -p /var/www/usr/libdata
 cp -a /usr/libdata/perl5 /var/www/usr/libdata

このようにして、perl環境をChRoot内に再現することは、他のプログラムやスクリプトを移植する際の一般的な手法です。
この手法は、特にセキュリティが重要なシステムで役立ちます。