encryption disk
Table of Contents
NAT
仮想マシンを起動するエイリアスを登録した。
alias i3='doas vmctl start -cL -m 1G -i1 -d /mnt/VM/i3 -d /mnt/VM/pkg i386'
これでワンタッチで起動してくる。仮想マシンの端末は、-c がついているんで、 ttyなコンソールになる。このコンソールをtmuxで増量すればいいんだな。実際に やってみると、一見正常のような挙動を示すけど、emacsを動作させると、途端に 怪しい状況に陥いる。そう、最悪なタイミングで、最悪にもハングするんだ。 こんな不幸は無いぞ。
だったら、この仮想マシンをサーバーの扱いにして、河豚板側からsshすればいいじゃん。 クリチカルな事は、仮想マシンのコンソールから行なうって事でいいだろう。
> 仮想マシンの中のsshdに接続するには、どうやれば良いですか。何となく、pf.conf > に追加が必要とは思うんでが。qemuだとコマンドラインで > qemu-system-i386 -m 96 -nographic -no-fd-bootchk -s \ > -net nic -net user,hostfwd=tcp::2022-:22 \ > -hda disk > ssh -p 2022 localhost ホストからだったら、単純に ssh 100.64.1.3 ですかね(アドレスは違ってるかも。実地に確認願います)。
との事なので、河豚板からsshすると、
eq$ ssh 100.64.1.3 ssh: connect to host xxx.xxx.xxx.xxx port 22: Operation timed out
何で? 接続先は伏せ字にしたけど、愛用してるサーバー機だ。
eq$ ping -c 3 100.64.1.3 PING 100.64.1.3 (100.64.1.3): 56 data bytes 64 bytes from 100.64.1.3: icmp_seq=0 ttl=255 time=2.087 ms 64 bytes from 100.64.1.3: icmp_seq=1 ttl=255 time=0.858 ms 64 bytes from 100.64.1.3: icmp_seq=2 ttl=255 time=0.654 ms
基本に返って、導通試験。問題ないなあ。
eq$ ssh -v 100.64.1.3 OpenSSH_9.9, LibreSSL 4.0.0 debug1: Reading configuration data /home/sakae/.ssh/config debug1: Reading configuration data /etc/ssh/ssh_config debug1: Connecting to xxx.xxx.xxx.xxx [xxx.xxx.xxx.xxx] port 22. ^C
sshにdebug-modeが有った事を思い出した。識者に相談。
> pfctl -d として、PFを無効化してみたら、sshはどうなりますか?
やってみたけど、やはり上記と同様のエラーになった。
ならばsshに代わるサーバーを仮想側で動作させておいて、そこに送信してみるか。 そんな都合の良いアプリは有る? 脳内の引き出しを引っかき回してみる。2つ出てきた。 gdbを入れたんで、それに小判鮫のごとくついて来たpython。こやつなら、簡易の Webサーバーになるな。河豚板側には、w3mも存在してる事だし。
もう一つは、ncって言う、万能なネットワークツール。今回はこれを使ってみる。 仮想側で、サーバーを立てる。
i3$ nc -l 9696
太陽活動の活発化に伴ってオーロラが見えたりする年だったので、太陽黒点に あやかって、ポート番号はクログロにしてみた。-l は、待受してからねって意味だ。
なお、太陽活動は11年周期で活発になる。これで喜ぶのは、アマチュア無線家だ。 電離層での電波の反射がハンパナイ状態になって、思わぬエリアと通信できるから だ。普通は嫌われ者。人工衛星が故障する、通信障害が発生する、送電線に 異常電流が発生しその影響で、大規模停電が発生する事が有るからだ。 なんたって、送電線は長大なアンテナと見做せるからね。 なお、11年周期ってのは、変動する数値。過去には、14年とか9年の周期ってのが あったそうだ。屋久島の長寿杉の年輪分析で判明してる。
ncを思い出したのは、脳のリフレッシュの為です。オイラーの脳はDRAMですから、常に リフレッシュしていないと、記憶が蒸発してしまいます。待てDRAMじゃなくてROMだろう。 石頭で、新たな情報を記憶できない。昔に焼いた昭和の記憶しか入っていない奴。 いや、神のご威光が照射されると、すっかり昔の事を忘却して、言われるままを記憶 しちゃう事だってあるぞ。そう紫外線で消去できる、EEPROMかも知れないな。 神の意向で、投資とかに手を出さないようにね。年寄はすぐに信じるからなあ。
ああ、無駄話だったわい。河豚板側から、電文を送信してみる。
eq$ echo QTH is Fuguita | nc -w 2 100.64.1.3 9696
こちらの住所(QTH)は河豚板ですってね。ちゃんと先方へ届いたよ。なお、-w 2は、
-w timeout Connections which cannot be established or are idle timeout after timeout seconds. The -w flag has no effect on the -l option, i.e. nc will listen forever for a connection, with or without the -w flag. The default is no timeout.
こんな意味合いがある。
こうなると、sshに個別の問題が有るとしか思えない。さきほどのdebug情報を見ると .ssh/configを参照してる。
eq$ cat .ssh/config Hostname xxx.xxx.xxx.xxx Host ob User sakae Port
ああ、これを参照しちゃって、コマンドライン入力が無視されたんか。3ヶ月の短期 記憶を辿れば、emacs+trumpで、リモートにあるファイルを編集する実験に使った ものだった。情けないなあ、メッセージは、ちゃんと読もうよ。
もう一つの灯台下暗し例。NAT出来ないと騒いでた。が、man vmctlを熟読すると
LOCAL INTERFACES Local interfaces can be used to easily configure VM networking without needing to manually assign network addresses. A local interface is added to a VM using the -L option to the 'vmctl start' command and results in If NAT is desired, the net.inet.ip.forwarding sysctl(8) must also be set to 1.
ちゃんと説明されてるじゃん。もう、コピペ野郎ってのがバレバレだな。 心を新たにして、NATの威力を確認。
i3# syspatch i3# syspatch syspatch: cdn.openbsd.org: no address associated with name
上段は、pfctl -eの状態の時、下段はpfctl -dして、無効にした時。アドレス解決が できなくて、失敗してる。
本家の暗号化disk
前回は、暗号化をやった。おさらいでインストール中の暗号部分の設定を取り出してみた。
: Available disks are: sd0. Which disk is the root disk? ('?' for details) [sd0] Encrypt the root disk with a (p)assphrase or (k)eydisk? [no] p Configuring the crypto chunk sd0... No valid MBR or GPT. Use (W)hole disk MBR, whole disk (G)PT or (E)dit? [whole] Setting OpenBSD MBR partition to whole sd0...done. New passphrase:123456 Re-type passphrase:123456 sd1 at scsibus2 targ 1 lun 0: <OPENBSD, SR CRYPTO, 006> sd1: 1023MB, 512 bytes/sector, 2096560 sectors Configuring the root disk sd1... No valid MBR or GPT. Use (W)hole disk MBR, whole disk (G)PT or (E)dit? [whole] Setting OpenBSD MBR partition to whole sd1...done. The auto-allocated layout for sd1 is: # size offset fstype [fsize bsize cpg] a: 1006.5M 64 4.2BSD 2048 16384 1 # / b: 17.2M 2061408 swap c: 1023.7M 0 unused Use (A)uto layout, (E)dit auto layout, or create (C)ustom layout? [a] /dev/rsd1a: 1006.5MB in 2061344 sectors of 512 bytes 5 cylinder groups of 202.50MB, 12960 blocks, 25920 inodes each /dev/sd1a (b2529a82099d82c1.a) on /mnt type ffs (rw, asynchronous, local) :
これと絡めてインストール・スクリプトを参照してみる。場所は、 src/distrib/miniroot/install.sub
encrypt_root() { local _args _chunk=$ROOTDISK while :; do ask 'Encrypt the root disk with a (p)assphrase or (k)eydisk?' no case $resp in # Retry on failure to allow passphrase or skip. [kK]*) pick_keydisk || continue _args=-k$KEYDISK break ;; [pP]*) $AI || break ask_passphrase 'New passphrase?' _args=-s break ;; echo "\nConfiguring the crypto chunk $_chunk...\n" md_prep_fdisk $_chunk echo 'RAID *' | disklabel -w -A -T- $_chunk # Standard input is ignored in interactive mode. print -r -- "$_passphrase" | bioctl -Cforce -cC -l${_chunk}a $_args softraid0 >/dev/null unset _passphrase # No volumes existed before asking, but we just created one. ROOTDISK=$(get_softraid_volumes) ROOTDEV=${ROOTDISK}a SWAPDEV=${ROOTDISK}b echo "\nConfiguring the root disk $ROOTDISK...\n" }
この手続は、 do_install
の比較的前段階から呼び出されている。
河豚板での暗号化disk
河豚板でも暗号化を提供しているので、コードを見ておく。
FuguIta/rdroot/boottmp/usrfadm と言うshell scriptの中。
if echo "$disklabel" | grep -q 'd:.*RAID'; then notice 'Setting up for data store encryption' # setup passphrase file # rm -f $enc_ppfile local def_umask=`umask` umask 077 echo "$enc_pp1" > $enc_ppfile chmod 0600 $enc_ppfile umask $def_umask unset enc_pp1 # create a crypto volume # bioctl -p $enc_ppfile -c C -l /dev/${scandev}d softraid0 rm -f $enc_ppfile # check and get created device # datdev=$(bioctl -i softraid0 \ | awk "/^softraid.*CRYPTO\$/ { dev=\$(NF-1) } /<${scandev}d>\$/ { datdev=dev } END { print datdev }")
暗号化に必要なフレーズを事前に準備。そしてその扱いには厳しい制限が課されている。
-p passfile Passphrase file used when crypto volumes are brought up. This file must be root owned and have 0600 permissions.
2to3
前回、暗号化されたdiskから、johnで必要な情報を取り出す pythonスクリプトを試した。あの時は、最終的にpython2を入れてお茶を濁して しまった。ちょっと悔しいので、python3でも動作する様に改造してみたい。
そんなの、2to3 ってスクリプトに任せてしまえ。
eq$ 2to3 openbsd_softraid2john.py /usr/local/bin/2to3:3: DeprecationWarning: lib2to3 package is deprecated and may not be able to parse Python 3.10+ from lib2to3.main import main RefactoringTool: Skipping optional fixer: buffer RefactoringTool: Skipping optional fixer: idioms RefactoringTool: Skipping optional fixer: set_literal RefactoringTool: Skipping optional fixer: ws_comma RefactoringTool: No changes to openbsd_softraid2john.py RefactoringTool: Files that need to be modified: RefactoringTool: openbsd_softraid2john.py eq$ python3 -V Python 3.11.10
さすがにこの変換器のお役目は終了したみたいだ。いや、python3が地道に進化してて、 それに 2to3 を追従させるのが面倒になったんだろう。2から3への劇的な変化に 見回れた時は重宝したんだけどね。こうなったら人力で変換だな。
なお、python3.15だかで、文字のエンコードがutf-8に完全に移行するらしい。また 阿鼻叫喚な声が上がるかな。どうせなら2to3の時に、やっておけば良かったものの。 図体が大きくなりすぎて、そこまで手が回らなかったのか。
誰もがpythonを使う最大の理由は、AIブームだな。numpyが隠れた主役だろう。これを 使いたいばっかりで、親のpythonが選択されるってのが巷のpythonバブルに拍車を かけているはず。誰もpythonが好きで使ってる訳では無いと思うよ(個人の感想)。
Run pdb (like this): python3 -m pdb openbsd_softraid2john.py /mnt/VM/a6 (Pdb) b process_file : (Pdb) p start 40960 (Pdb) p headers[260] 2 (Pdb) headers[284] 0
上記の様にif式を使って、意に沿わない場合は終了する様に仕組まれている(ソースを 参照の事)。if式をコメントに追い遣って先に進めると、核心部分が出てくる。
a6:$openbsd-softraid$2093489994$Traceback (most recent call last): File "/ram/home/sakae/./openbsd_softraid2john.py", line 89, in <module> process_file(sys.argv[i]) File "/ram/home/sakae/./openbsd_softraid2john.py", line 72, in process_file sys.stdout.write(hexlify(headers[2424:2552]) + "$") # salt ~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~ TypeError: can't concat str to bytes
--- /mnt/my/src/john-1.9.0-jumbo-1/run/openbsd_softraid2john.py Sun Nov 24 16:33 :00 2024 +++ openbsd_softraid2john.py Sun Dec 8 07:19:33 2024 @@ -1,4 +1,4 @@ -#!/usr/local/bin/python2.7 +#!/usr/local/bin/python3 # -*- coding: utf-8 -*- # # Copyright (c) 2014 Thiébaud Weksteen <thiebaud at weksteen dot fr> @@ -39,21 +39,21 @@ def process_file(filename): - headers = open(filename).read()[:0xaa0 + 81920] - start = headers.find("marcCRAM") + headers = open(filename, 'rb').read()[:0xaa0 + 81920] + start = headers.find(b"marcCRAM") if start != -1: headers = headers[start:] - if headers[:8] != "marcCRAM": + if headers[:8] != b"marcCRAM": sys.stderr.write(filename + " : Wrong magic\n") return - if headers[72:81] != "SR CRYPTO": + if headers[72:81] != b"SR CRYPTO": sys.stderr.write(filename + " : Wrong RAID type\n") return - if headers[260] != "\x01": + if headers[260] != 1: sys.stderr.write(filename + " : Wrong optional header type\n") return - if headers[284] != "\x02": + if headers[284] != 2: sys.stderr.write(filename + " : Wrong encryption type\n") return @@ -69,13 +69,13 @@ # num_iterations and salt come from the "scm_kdfhint" field num_iterations = struct.unpack("<I", headers[2420:2424])[0] sys.stdout.write(str(num_iterations) + "$") - sys.stdout.write(hexlify(headers[2424:2552]) + "$") # salt + sys.stdout.write(hexlify(headers[2424:2552]).decode() + "$") # salt # masked keys, sr_meta_crypto structure - sys.stdout.write(hexlify(headers[364:2412]) + "$") + sys.stdout.write(hexlify(headers[364:2412]).decode() + "$") # HMAC, chk_hmac_sha1 field - sys.stdout.write(hexlify(headers[2676:2696])) + sys.stdout.write(hexlify(headers[2676:2696]).decode()) sys.stdout.write("$%s\n" % sr_crypto_genkdf_type)
cutter
上のコードに、こんなのが出てくる。
headers = open(filename, 'rb').read()[:0xaa0 + 81920] start = headers.find(b"marcCRAM")
diskの冒頭から 0xaa0 + 81920 までを読み込んでくれって言うスライスだよな。 これだけのサイズ中に、暗号を紐解く情報が入ってるって事だ。ならば、最初から このサイズ分だけのファイルを用意しておけば、無駄を省けるはず。
こういう場合は普通、ddコマンドを使う。
eq$ gdb -q (gdb) p (0xaa0 + 81920) $1 = 84640
終端をgdbで計算(16進数、10進数の混合演算もなんのその)。そして、それを適用する。
eq$ dd if=/mnt/VM/a6 of=minia6 bs=1 count=84640 84640+0 records in 84640+0 records out 84640 bytes transferred in 0.273 secs (310017 bytes/sec)
もっとシンプルに指定できる。
eq$ < /mnt/VM/a6 dd count=84640 bs=1 > out
その他、オクタルダンプして、それをxxdで元に戻すって方法が有る。
eq$ od -An -N 84640 -t x1 /mnt/VM/a6 | xxd -r -p > output
pythonだって、一行野郎を駆使できます。
python3 -c 'import sys; sys.stdout.buffer.write(open("/mnt/VM/a6", "rb").read(84640))' > out
そんじゃ、任意の位置から任意のサイズを切り出せって場合は? ddではskipって指定 も併用できるんで、難なくこなせる。もう、ddの一人勝ちですよ。
応用
なんで切り出しか? dd便利だよーーの実例を示す為? いいえ、もっと切実な問題 解決への一歩なのさ。そう、diskをhexdumpしたかったから。1Gのそれを扱うんじゃ、 取り回しが悪い。必要な部分だけ相手なら、気楽なものだ。検索自在なhexeditなんて のが公開されてる(これに手を染めるようだと、バイナリアン認定です)。
が、このアプリは河豚板には不在。仮想マシンに入れてある。仮想マシンに1Gのファイル(disk) を、転送するって無駄の極みだ。必要部分だけって、ならざるを得ない。
で、転送したのをhexeditで開いてみたぞ。
0000A000 6D 61 72 63 43 52 41 4D 06 00 00 00 0C 00 00 00 marcCRAM........ 0000A010 DE F9 DD EA F4 85 42 87 A1 EA 34 0A 5D BB AF 78 ......B...4.]..x 0000A020 01 00 00 00 00 00 00 00 02 00 00 00 00 02 00 00 ................ 0000A030 00 00 00 00 43 00 00 00 B0 FD 1F 00 00 00 00 00 ....C........... 0000A040 4F 50 45 4E 42 53 44 00 53 52 20 43 52 59 50 54 OPENBSD.SR CRYPT 0000A050 4F 00 00 00 00 00 00 00 30 30 36 00 00 00 00 00 O.......006..... 0000A060 3E A2 75 63 96 59 2A 1D D8 C0 1A 46 43 4A 43 3E >.uc.Y*....FCJC> 0000A070 73 64 31 00 00 00 00 00 00 00 00 00 00 00 00 00 sd1............. 0000A080 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0000A090 00 00 00 00 10 02 00 00 07 00 00 00 00 00 00 00 ................ 0000A0A0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ 0000A0B0 73 64 30 61 00 00 00 00 00 00 00 00 00 00 00 00 sd0a............
emacs with xsel
前回xselを利用してコピペする方法を探った。が、ペースト動作がCUI版のemacs では無視されてしまってたので、下記を創造した。
(defun paste-from-xsel () "Paste clipboard content into the current buffer using xsel." (interactive) (let ((clipboard-content (shell-command-to-string "xsel --clipboard --output"))) (if (not (string-empty-p clipboard-content)) (insert clipboard-content) (message "Clipboard is empty or xsel is not working.")))) (global-set-key (kbd "C-c y") 'paste-from-xsel)
etc
河豚板の作者さんが公開された一級の資料。昔読んだ事がある カッコウはコンピュータに卵を産む を彷彿されますよ。
カッコウの作者さんは、ほとんど孤独な戦いだったけど、河豚板の作者さんは 良き仲間に恵まれて、楽しい苦労だったに違いない(外野がとやかく言う事じゃ ないけど)。
README
月に向かえ!―最新心理学が明かす「アポロ計画」を成し遂げた人たちのマインドセット
なんて本を読んだ。題名通りなんだけど。帯に格好いい文言がでてた。
NASAで教わった 『早く行きたいなら一人で行けばいい。でも遠くへ行きたいなら 仲間と行け。』を思いだした。
困難な事を成し遂げるには8つのマインドセットが重要との事。
- 情熱を燃やす。2. イノベーションを生みだす。….
2.の例として、こんな練習問題が出てた。
犬、蛇、イルカ、熊、金魚、虎。 これらの動物を貴方なりの解釈で、2つのグループに 分けてください。それぞれのグループは3つの動物になるようにします。
例として、4足動物のグループと、それ以外の動物グループ。オイラーは2分別しか できなかった。老化かしら?