Let’s encryptでおウチサーバーの証明書取得

家のサーバーは X server のDNS設定をいじるスクリプトを組んで、サブドメインである irc.noizumi.orgが家のIPアドレスを向くようにDDNSモドキになっている。

HTTPは、監視カメラの zoneminder を外から見れるように元々、ルーターでポート10080番→80番としていて、加えてAUTH DIGESTを掛けているから、外から見放題にはなってなかった。

さて、果たしてポート80番が解放されている必要のある Let’s encrypt で、DIGEST認証が掛かっている httpd の証明書が作れるのか?
まあ、作れるのでこの記事を書いている訳だが 🙂

Let’s encryptは外部からアクセス可能かの判定に、/.well-known ってディレクトリを掘って、そこのファイルを外部から読み出し可能かどうかで、証明書作成者がドメインを使用可能で、有効かを判定している。

ちなみに、もう一つの懸念事項として、Let’s encrypt の certbot が動いているマシンから irc.noizumi.org にアクセスする場合、ルーターが IP masquerade を使用していて、繋げられないというのがある。

確か、iptables になって、POSTROUTING を使用すれば、LANからルーターが接続したPPPoEのグローバルIPアドレスに接続しても、いい感じにプライベートアドレスに変換してアクセス可能にできたはずなのだが、安物ルーターだと仕方がないか。

話はそれたが、DIGEST認証に穴を作って、/.well-known/* のアクセスがあったら、認証しないという設定にしてやる。

[/etc/apache2/conf-available/auth_digest.conf]

<Location />
    AuthType Digest
    AuthName "irc.noizumi.org"
    AuthUserFile /etc/apache2/.htdigest
    SetEnvIf Request_URI "^/.well-known/*" valid-url
    <RequireAny>
      Require valid-user
      Require ip 192.168.
      Require env valid-url
    </RequireAny>
</Location>

他にも .htdigest ファイルを作ってるけど、それは割愛。

# a2enconf auth_digest で有効化
わしの場合は元々有効になっているので、auth_digest.conf を弄るだけ。

そして、サーバーへ Let’s encrypt をインストール
# apt install certbot python-certbot-apache

# certbot –apache

参考:Certbot を使い3分で無料の SSL 証明書を取得する

nginx を apache に読み替えて設定。幸い、certbot から直接 irc.noizumi.org へのアクセスは無いようで、問題なく設定できた。

証明書の確認や、自動更新、テストなどは次のサイトが参考になる。

参考:Let’sEncryptの取得&自動更新設定してみた

さすがプロだけあって、論理的で分かりやすい。

ついでに、irc もSSLを稼働。ngircd の設定にちょっと躓いたりもしたが、

[Global]
Ports = 6667

[SSL]
CertFile = /etc/ngircd/cert/fullchain.pem
KeyFile = /etc/ngircd/cert/privkey.pem
Ports = 6697, 9999

を追加する事でいけた。
ルーターのポートフォワードは、非SSLが6667、SSLが6697で、9999はフォワードしてないので、外部からは繋げられない。

Let’s encryptが作成した証明書ファイルは、所有者が root:root で、privkey.pem は root 権限のみ読めるファイルなので、ircの権限で動作するngircdには読む事ができない。

そこで、/etc/ngircd/cert にコピーして、irc:irc の所有者にした。

証明書の自動更新の設定もしたが、ngircd の証明書もコピーするようにしてある。cp の上書きなので、所有者の再設定をしなくてもいいはず。

gpsdの長年の疑問解決

gpsdというgpsのデータを流してくれるプログラムがあるのだが、起動オプションに-G を付ければ、あらゆるネットワークインターフェースで受け付けしてくれるはずだった。

しかし、Debian 7あたりから外部から接続できなくなった。
どうやら systemd が余計な事をしてくれていて、ローカルホスト以外を受け付けないように邪魔しているようなのだが、新しく導入されたシステムなので解決方法が分からなかった。

今日、検索してやっと解決方法を見つけた

But we aren’t there yet. gpsd may be listening on all interfaces, but systemd’s hold on the socket means gpsd can’t hear anything on interfaces other than the loopback. We have to tell systemd to allow gpsd to hear other interfaces. We run systemctl edit --full gpsd.socket. Then we can edit it. After editing, the [Socket] stanza looks like so:

[Socket]
ListenStream=@RUNDIR/gpsd.sock
ListenStream=[::1]:2947
# ListenStream=127.0.0.1:2947
ListenStream=0.0.0.0:2947
SocketMode=0600

When you are done editing, systemctl does what it needs to do internally to preserve your changes from being over-written during upgrades. It also does the equivalent of a systemctl daemon-reload for you.

We now restart both gpsd units like so:

systemctl restart gpsd.socket gpsd.service

こんなもんわかるかボケ!

これでやっとデスクトップマシンの地図表示プログラムで、サーバーからデータを取得してGPSの現在位置を表示できる。

自宅固定だからほぼ動かないけど、測定誤差でふらふら動くから結構おもしろい。

【Raspberry PI4】設定メモ

※取り敢えず、やった事のメモなのであまり参考にならないと思う。
日本語入力
$ sudo apt install fcitx-mozc

zoneminder
$ sudo apt install apache2 mariadb-server
$ sudo mysql_secure_installation
$ sudo apt install php libapache2-mod-php php-mysql
$ sudo apt install zoneminder vlc-plugin-base

VNC
GUIの「Raspberry PIの設定」ではグレーアウトしていて変更できないので、端末からコマンドで設定。

$ sudo raspi-config
→5 Intafacing Options→P3 VNC→「はい」
/var/log/syslog で libbcm_host.so が無いと怒られる。/opt/vc/lib に存在するけど、/etc/ld.so.conf にpath追加して、ldconfig するも変わらず。

How to Install VNC on Raspberry Pi OS (64 bit)
https://www.tomshardware.com/how-to/install-vnc-raspberry-pi-os

標準の設定が使えないから、tightvncserver を入れて回避するしかないようだ

IRC
$ sudo apt install ngircd

ircbotの為にJREインストールだけど、JDK入れちゃう。
GUIはOFFにする予定なのでheadless
# apt install default-jdk-headless

以下のパッケージが新たにインストールされます:
ca-certificates-java default-jdk-headless default-jre-headless java-common
openjdk-11-jdk-headless openjdk-11-jre-headless

その他
# apt install php-xml
# apt install samba
# smbpasswd -a noizumi
# apt install ntp
# apt install gpsd gpsd-clients
# apt install bind9
# apt install exim4
# apt install cron-apt

# apt install dovecot-imapd

Mixed mbox and Maildirの設定はドキュメントの通りでOKでだった。
これでサブフォルダー掘り放題や 🙂

Raspberry PI4到着

早速、64bit beta を入れて動かしている。
HDD起動は四苦八苦したけど何とかHDDブートできるようになった。

やった事は、Raspberry Pi 4 の 64bit版と USB Bootを参考にさせて貰って、HDDにSDカードコピーをやったけど、USBからブートできなかった。

そこで、SDの/boot/cmdline.txt 編集してハードディスクのカーネル起動指定して、/etc/fstab もハードディスクの領域をマウントするように書き換え。

再起動して、sudo apt update && sudo apt  upgrade やって、sudo rpi-update をやったら、SDカードなしでもUSB HDDブートするようになった。

GUI環境だが、chroniumというブラウザで、abema.tv も観られるし、艦これも動く。

Abema TVはハードウェアデコーダがあるせいかスムーズに動いているが、Youtubeの1080p動画は読み込みマークが頻繁に出て視聴に耐えられなかった。

艦これはもっさりしていて、Intel Atom X5と同等くらいかな? という感じで、遊べない事はないけど、感覚的に操作に追いついていない感じ。

監視カメラサーバーの環境構築しようと syaptic パッケージマネージャ入れて、zoneminder を検索すると……ありませんでした。

ARMの32bit版パッケージがあるから 64bit beta でも当然あると考えたのが甘かったわ。

【皇紀2680年6月7日 12:49追加】
https://wiki.zoneminder.com/Debian_10_Buster_with_Zoneminder_1.32.3_the_Easy_Way?title=Debian_10_Buster_with_Zoneminder_1.32.3_the_Easy_Way&oldid=15622

debian buster の Multimedia Repositoryを追加してないだけだった orz

【/皇紀2680年6月7日 12:49追加】

Raspberry PI4 8GBこうにう

KSYで、スターターキットV1をこうにう。
RSのページも見たが、売り切れで10月まで入らんとか書いてあったので、ちと高いけど、セットになってるのを買った(13,640円)

サーバー止まると監視カメラも記録できないし、ファイルサーバーも使えないので、早急にサーバーを立てる必要がある。10月まで待っておれん。

ただ、問題は、PI4って、USBのハードディスクブートできるのかねえ。
サクっと検索した限りではイケるっぽいので、今まで eSATAで使ってたハードディスクケースはUSBにしないといかんな。

監視カメラダウン?

zoneminder で監視カメラの運用をしているが、ふと見てみると、2月19日以降映像が撮れていない。

ディスク容量80%で古いやつを自動削除する設定にしているが、filter の設定見てみると100件該当があり、それが何らかの理由で削除できずにデッドロックしてるのかな? と思い、削除するも変わらず。

監視カメラの raspberry pi 3 をチェックすると、応答なし……。
ssh に応答しないとなると、ディスプレイとキーボード繋がないとどうなっているのか分からないが、面倒なので電源ブチ(^^;;

raspberry pi 3 は、SDカード延命の為、ログ類はシステムシャットダウンを実行すると、SDカードに書き戻すが、電源ブチではRAMDISK上で揮発してしまう。
なので、応答無しになっていた理由は分からず。

暫くシステムアップデートやってなかったし、長期間再起動してなかったから、メモリーリークのアプリケーションがメモリ食い潰したのかなあ。

という訳で、raspberry pi に自動アップデートをやってくれる cron-apt をどうにう。
ファイルサーバの openrd ultimate で導入しているが、セキュリティアップデートは自動で適用してくれ、カーネルは「更新あるで」とメールで通知してくれる。

いや、「更新あるで」と関西弁では言ってくれないが(^^;、次の様な感じ。

The following NEW packages will be installed:
  linux-image-4.9.0-12-marvell

ただ、こいつはメールシステムが動いていないと通知してくれないので、raspberry pi 3に exim4 のスマートホストによるメール配送を設定。

# dpkg-reconfigure exim4-config

raspberry pi 3 でメール読まないので、全部 noizumi@silverfox.p.noizumi.org へ配送。スマートホストは openrd ultimateのIPアドレスを設定。
※@は全角に変えてます。以後、コピペ注意

openrd ultimate の exim4 もスマートホストの設定だが、メールを受信する設定になっているので、raspberry pi 3 からメールを投げれば届くはず。

メールの運用にはDNSが必要で、DNSはローカルで立てているから、raspberrypi.p.noizumi.org の正引きと逆引きを設定。

raspberry pi 3 の端末から、noizumi@silverfox.p.noizumi.org へメール送ったら届いたので、apt cron がメール投げても多分、大丈夫。

cron-apt の設定で、 /etc/cron-apt/config を編集

# Configuration for cron-apt. For further information about the possible
# configuration settings see /usr/share/doc/cron-apt/README.gz.
MAILTO="noizumi@silverfox.p.noizumi.org"
MAILON="upgrade"

確か前に openrd ultimate の設定弄っていい感じにニギッたはずなので、設定をパクる!次のファイルを追加

[/etc/cron-apt/actions.d/5-security]

upgrade -y -o APT::Get::Show-Upgraded=true

[etc/cron-apt/config.d/5-security]

OPTIONS="-o quiet=1 -o APT::Get::List-Cleanup=false -o Dir::Etc::SourceList=/etc/apt/sources.list.d/security.list -o Dir::Etc::SourceParts=\"/dev/null\""

確かこの設定はセキュリティアップデートを問答無用で適用する為に設定したはずなので、これで危ない穴はパッチ提供時に即座に適用されるはず。

設定が終わったので、取り敢えず cron-apt の手動実行

# /usr/sbin/cron-apt

更新したばっかりだったので、メールは飛ばず。/var/log/cron-apt/log を確認

CRON-APT RUN [/etc/cron-apt/config]: Sat Mar 14 09:39:21 JST 2020
CRON-APT ACTION: 0-update
CRON-APT LINE: /usr/bin/apt-get -o quiet=1 update -o quiet=2
CRON-APT ACTION: 3-download
CRON-APT LINE: /usr/bin/apt-get -o quiet=1 autoclean -y
Reading package lists...
Building dependency tree...
Reading state information...
Del libqt5opengl5 5.7.1+dfsg-3+rpi1+deb9u1 [133 kB]
<中略>
CRON-APT LINE: /usr/bin/apt-get -o quiet=1 dist-upgrade -d -y -o APT::Get::Show-Upgraded=true
Reading package lists...
Building dependency tree...
Reading state information...
Calculating upgrade...
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
CRON-APT ACTION: 5-security
CRON-APT LINE: /usr/bin/apt-get -o quiet=1 upgrade -y -o APT::Get::Show-Upgraded=true
Reading package lists...
Building dependency tree...
Reading state information...
Calculating upgrade...
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

autoclean やってくれるのね。問題は無い模様。

カーネルはさすがに自動でやっちゃうと、起動不能になる可能性もあるので、メールで通知が来たら手動で行おうと思う。

カーネル更新も自動で行ないたい場合は、/etc/cron-apt/action.d/3-download の -d オプションを削ればOK。

OpenRD Ultimateお陀仏

debian 8→9へアップデートしたところ、カーネルのNANDフラッシュ書き込みでエラーが出た。

[ 6508.167779] __nand_correct_data: uncorrectable ECC error
[ 6508.173165] end_request: I/O error, dev mtdblock0, sector 8
[ 6508.178767] Buffer I/O error on device mtdblock0, logical block 1

NANDフラッシュは起動時に読み込まれる起動プログラムが書いてあるところで、そいつの書き込み失敗という事は、もう寿命という事だな。

起動はするが、Debian 9 で、カーネルは4.9.0なのに
Linux silverfox 3.16.0-10-kirkwood #1 Debian 3.16.70-1 (2019-07-22) armv5tel GNU/Linux

なんてのが動いている。多分、NANDに書き込まれているカーネルだろう。

1GbpsのEthernetでファイルサーバーにしていたが、置き換えるとしたら、1Gbps Etherになった raspberry pi 4 かな。

まだ発売してないから、発売したら早速置き換えよう。

Raspberry pi 3アップグレード jassie→stretch

情報源: [メモ] (らずぱい) Raspbian: Jessie から Stretchへアップグレード – Qiita

このページを参考にアップグレード。更新時間は 2.5時間位。

途中新しい設定への上書き確認があり、次の様にした。

  1. 設定ファイル ‘/etc/systemd/timesyncd.conf’ N
  2. 設定ファイル ‘/etc/skel/.bashrc’ Y
  3. 設定ファイル ‘/etc/login.defs’ Y
  4. 設定ファイル ‘/etc/ntp.conf’ N
  5. 設定ファイル ‘/etc/lightdm/lightdm-gtk-greeter.conf’ Y
  6. 設定ファイル ‘/etc/lightdm/lightdm.conf’ Y

*.dpkg-old *.dpkg-dist と現在のファイルを比較して内容を確認

1. は時刻サーバーを
Servers=192.168.11.254 ntp.nict.go.jp
に変更したものだけなので、元のファイルでOK
2. は弄ってないので、新設定ファイル上書きOK
3. はPATH関係だが、/usr/local/sbin は使ってないから新設定ファイル上書きOK
4. は時刻サーバー設定関係なので、元のファイルでOK
5. 6.はGUIを使ってないので、新設定ファイル上書きOK

Raspberry Pi3設定メモ

自分の投稿を参考に、mjpg-streamerの最新版を取ってきてコンパイル。
必要なライブラリ等はインストール済なので、mjpg-streamerだけ。

# mv mjpg-streamer mjpg-streamer.old
# svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer
# cd mjpg-streamer/
# make USE_LIBV4L2=true clean all

起動スクリプトは /root/bin/camera_stream.sh に記述してあって
#!/bin/bash
cd /root/mjpg-streamer
./mjpg_streamer -i “./input_uvc.so -f 16 -r 640×360 -d /dev/video0 -y -n” -o “./output_http.so -w ./www -p 8081” >/dev/null 2>&1 &

これを、/etc/rc.local から呼び出してraspberry pi 3が起動した際に起動させている。

Raspberry pi3のWifi

新しい無線LANルータの環境になったので、IEEE802.11nで接続したら、今までIEEE802.11g の 56Mbps だったRaspberry pi3 のWifi も高速化できるかなと思って、新無線LANルータ用に接続設定を作成。

繋いでみたが、72.2Mbpsになる。
IEEE802.11nって150Mbpsとかじゃないの? なんで? と色々調べたら、謎が解けた。

実は、今までIEEE802.11nを詳しく理解して居なかったのだが、「IEEE802.11nとは」を読んだら分かった。物によって、150Mbpsだったり、300Mbpsだったり、600Mbpsだったりするのはボンディングとストリーム数が関係する訳ね。

安物の無線LANドングルだと、1ストリームの40MHzの帯域幅で 150Mbpsくらい。
Raspberry pi3 は Broadcom の BCM43430 で、今どきありがちな安物Wifi の firmwareドライバをPCで制御するSDIO方式。

性能的には、150Mbpsくらい行けるはずなのだが、
/lib/firmware/brcm/brcmfmac43430-sdio.txt の先頭には次の文言がある。

# NVRAM file for BCM943430WLSELG
# 2.4 GHz, 20 MHz BW mode

2.4GHz の 20MHz Band Width modeって、要は 72.2Mbpsが最大速度な訳ね。
1ストリームでも40MHz使えば、150Mbpsまで速度アップが見込めるから、今後のlinuxのfirmwareの更新に期待しよう。

raspberry pi3 ログをramdisk化

ラズパイ壊れた?

結局、micro SDが壊れてたっぽい。

正常起動確率50%位でだましだまし動かしてたが、新しいmicro SDにしたら起動確率100%になった。

二年位で寿命とは情けない。とはいえ、/var/log に毎日ゴリゴリ書き込んでるんだからしょうがないか。

そこで!

Ubuntu 9.04 on USB Memory

こいつの出番。
/etc/init.d/ramdisklog を作成。

#! /bin/sh
### BEGIN INIT INFO
# Provides:          ramdisklog
# Required-Start:    $local_fs
# Required-Stop:     $local_fs
# X-Start-Before:    $syslog
# X-Stop-After:      $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Use ramdisk log tmp 
# Description:       Debian init script for the ramdisklog log&tmp move to
#                    ramdisk
### END INIT INFO
#
# Author:	Yuji Noizumi <webmaster_at_noizumi.org>
#

PATH=/bin:/usr/bin:/sbin:/usr/sbin

. /lib/lsb/init-functions

case "$1" in
  start)
	mkdir -p /mnt/tmp
	mkdir -p /mnt/var/tmp
	mkdir -p /mnt/var/log
	mount -t tmpfs /dev/shm /mnt/tmp
	mount -t tmpfs /dev/shm /mnt/var/tmp
	mount -t tmpfs /dev/shm /mnt/var/log

	/usr/bin/rsync -a /var/log/ /mnt/var/log

	mount --bind /mnt/tmp /tmp
	mount --bind /mnt/var/tmp /var/tmp
	mount --bind /mnt/var/log /var/log
	chmod -R 1777 /var/tmp
	chmod -R 1777 /tmp

	log_daemon_msg "Moved log&tmp to Ramdisk" "ramdisklog"
	log_end_msg $?
    ;;
  stop)
	log_daemon_msg "Write back Ramdisk log to /var/log" "ramdisklog"
	umount -l /tmp
	umount -l /var/tmp
	umount -l /var/log
	/usr/bin/rsync -a –delete /mnt/var/log/ /var/log
	log_end_msg $?
    ;;
  force-reload|restart)
    $0 stop
    $0 start
    ;;
  *)
    echo "Usage: /etc/init.d/ramdisklog {start|stop|restart|force-reload}"
    exit 1
    ;;
esac

exit 0

ramdisk 作って log コピーして、その ramdisk を bind で/var/logに被せるというしくみ。

# insserv ramdisklog

ついでにswapも無効化
# insserv -r dphys-swapfile

# reboot
で完了。

root@raspberrypi:~# df -h
ファイルシス   サイズ  使用  残り 使用% マウント位置
/dev/root         28G  8.2G   19G   31% /
devtmpfs         458M     0  458M    0% /dev
tmpfs            462M     0  462M    0% /dev/shm
tmpfs            462M  6.3M  456M    2% /run
tmpfs            5.0M  4.0K  5.0M    1% /run/lock
tmpfs            462M     0  462M    0% /sys/fs/cgroup
/dev/mmcblk0p6    63M   22M   42M   35% /boot
/dev/shm         462M     0  462M    0% /tmp
/dev/shm         462M     0  462M    0% /var/tmp
/dev/shm         462M  1.4M  461M    1% /var/log
tmpfs             93M     0   93M    0% /run/user/1000

マウント状況はこんな感じ。