OpenBSD in OpenBSD

Windows10機に、McAfee リブセーフ っていう、ワクチンソフトが同梱されてた。 レノボもなかなかやるな。セキュリティに気を使ってくれていると思ってた。

そしたら、今となって、今後も使うなら金払えって言ってきたぞ。そういうあんたは、 トロイの木馬に分類されるウィルスの類ですかい? (よくあるよね、こういうの)

一体幾ら払ったらいいの? 製品名を頼りに マカフィーへ行ってみたぞ。

3年間で1万円。今なら5408円お得。一日わずか10円ですってさ。その上、何台でも インストールしてもいいよってさ。オイラーみたいに1台しか対象機器がないと、なんだか 損した気分になる。1台限定でいいから、お値段控えめな、某スーパーみたいなの無いの?

無料のお試し版をアンインストール/インストールしながら使うって言う、せこい使い方は 出来るのかな? 試しにやってみようか。

今まで使っていて、検出された脅威は全く無し。火壁でブロックされたのが少し有るって 状況。(攻撃元のIPは報告してくれるのに、どんなポートを叩いてるかってのは無し。 これって欠陥品じゃなかろうか)7機では別のワクチンソフトを使っているけど、脅威の検出は全く無し。

本当にワクチンで利くんですかねぇ?

インフルエンザ予防接種と一緒で、気休めなんじゃない。

識者に聞いたら、ウィルスバスターがお勧めとか。別な人に聞いたら、ウィルスバスターの クラウド版を使ってるとか。人気ありますなあ。ちゃんとMSのIME辞書にも登録されてる ぐらいだから、バスターとMSは癒着してるな。レノボはマカフィーと癒着してて、ユーザーがマカフィーを 採用してくれるとリベートが入る仕組みなんだな。

で、採用してくれないと、何で買わないと、某国のガイドみたいに脅かしてくるとな。

vmm

再び技評のBSD界隈の話題だけど、過去に OpenBSDハイパーバイザvmm(4),開発ブランチへマージなんてのが紹介されてた。

そして、最近では、用意が整ったので、 OpenBSDプロジェクト、ハイパーバイザ機能「VMM」をデフォルトで有効化へ---「OpenBSD 6.1」からデフォルトで利用できる見込みなんていう、アナウンスがなされていた。

テオ親分の専制政治は、即断即決で小気味よい。最近逝去された、タイの国王みたいに、 皆から愛される稀有な人だな。

OpenBSD in OpenBSD

柿と同じように熟しているなら、少々のフライングも許されるだろう。(オリンピックみたいに 即失格と言う事も無いし)

先達がおられたので、トレースしてみる。 OpenBSD vmmを動かしてみる

使える前提条件、dmesgに出て来るCPUの性格にVMX機能が有るか?は、普通に設定した VMWARE Playerでは、その機能がoffになっている。

プロセッサーの仮想化エンジンの所で、Intel VT-x/EPT の所をチェックしておこう。 なお、FreeBSDでのbhyveを使う場合も、この機能が必要になる。

じゃ、例に倣ってやってみる。オイラーはマルチプロセッサーで動かしているので、 コメントを外すのは、GENERICファイルだけど、実際のconfigは、 config GENERIC.MP とやればいいのかな? 参考までに、カーネルの製造時間を 測ってみた。

text    data    bss     dec     hex
9093180 266328  663552  10023060        98f094
    3m57.33s real     1m01.10s user     2m50.59s system

早速走らせてみると、

bash-4.3# vmd
bash-4.3# vmctl start "myvm" -c -k /bsd.rd -m 512M
vmctl: starting without disks
vmctl: starting without network interfaces
Connected to /dev/ttyp3 (speed 9600)

~#      send break
~$      pipe local command to remote host
~>      send file to remote host
~C      connect program to remote host
~D      de-assert DTR line briefly
~R      start recording to file
~S      set speed
~X      send file with XMODEM
~?      get this summary

[EOT]
bash-4.3# pkill vmd

メッセージが出てくるはずなんだけど、接続しましたでだんまり。

何度かやってるうちに動きだした。

bash-4.3# vmctl start "myvm" -c -k /bsd.rd -m 512M
vmctl: starting without disks
vmctl: starting without network interfaces
Connected to /dev/ttyp3 (speed 9600)
Copyright (c) 1982, 1986, 1989, 1991, 1993
        The Regents of the University of California.  All rights reserved.
Copyright (c) 1995-2016 OpenBSD. All rights reserved.  http://www.OpenBSD.org

OpenBSD 6.0 (RAMDISK_CD) #2100: Tue Jul 26 13:05:59 MDT 2016
    deraadt@amd64.openbsd.org:/usr/src/sys/arch/amd64/compile/RAMDISK_CD
RTC BIOS diagnostic error 20<config_unit>
real mem = 520093696 (496MB)
avail mem = 502673408 (479MB)
mainbus0 at root
 :
erase ^?, werase ^W, kill ^U, intr ^C, status ^T

Welcome to the OpenBSD/amd64 6.0 installation program.
(I)nstall, (U)pgrade, (A)utoinstall or (S)hell?

どうも、裏でcuを使って、端末と接続してるみたい。どうやら、cuの使い方を 勉強しておくべきだろうな。上でチルダで始まるのが、それだけど。

下記は、例によってpstreeから抜粋。

 |           \-+= 38193 sakae -/usr/local/bin/bash
 |             \-+= 30310 root bash
 |               \--= 51627 root /usr/bin/cu -l /dev/ttyp3 -s 9600
 |-+= 66262 root vmd
 | |-+= 71098 _vmd vmd: vmm (vmd)
 | | \--- 30318 _vmd vmd: myvm (vmd)
 | \--= 08129 _vmd vmd: control (vmd)

手を変えて、 vmctlのマニュアル例に倣ってやってみた。

bash-4.3# vmctl create disk.img -s 500M
bash-4.3# vmctl start "myvm" -m 512M -c  -i 1 -d disk.img -k /bsd.rd

インストールが始まるんだけど、NICの設定をどうするか例が無いので、IPアドレスを 振れず。この状態では、ネットワークインストールもおぼつかない。 これはもう、諦めモード突入。

この時、別端末で、VMの状態をモニターしておくか。

[ob: ~]$ vmctl status
   ID   PID VCPUS    MAXMEM    CURMEM          TTY NAME
    2 83232     1     512MB     182MB   /dev/ttyp3 myvm
[ob: ~]$ vmctl stop 2
vmctl: command failed: Operation not permitted
[ob: ~]$ su -m
Password:
bash-4.3# vmctl stop 2
vmctl: terminated vm 2 successfully
bash-4.3# vmctl status
   ID   PID VCPUS    MAXMEM    CURMEM          TTY NAME
bash-4.3#

モニターは一般ユーザー権限で出来るけど、仮想マシンを止めようとすると、そんなの 無理よと止められた。(当たり前です)で、rootになってから停止。これで、 起動してにっちもさっちもいかなかったマシンが停止出来た。

最初に作ったdisk.imgは、内容が全てゼロだったんだけど、インストールの真似事を したら、何らかのデータが書き込まれていたぞ。これ、動いていた証拠になるかしらん。

man tap とかやると、ちゃんと説明が出て来るんで、NICに関してはFreeBSD並みの事は 実現していそうだな。前回のおさらいを兼ねてやってみるかな。

tap

今までOpenBSD6.0の言いなりでプロセスを動かしていたけど、ちと余計なやつがいるので 下記のファイルを用意して、抑制したよ。

[ob: ~]$ cat /etc/rc.conf.local
smtpd_flags=NO
sndiod_flags=NO
pflogd_flags=NO
ntpd_flags=NO
##sysctl kern.usermount=1

仮想PCのDISKにOSをインストールする例が、 Planet OpenBSD に投稿されてた。 Operating a vmm(4) guest on OpenBSD-current 参考にしてみる。 仮想PCを起動して、host名を聞いてきたら、下記の設定をして先に進めとな。

bash-4.3# ifconfig bridge0 add em0 add tap0 up

tap0が勝手に出来ていた。そして上記を実行すると、bridge0が出来て、下記のように なった。

tap0: flags=8942<BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
        lladdr fe:e1:ba:d4:92:36
        index 8 priority 0 llprio 3
        groups: tap
        status: active
bridge0: flags=41<UP,RUNNING>
        index 9 llprio 3
        groups: bridge
        priority 32768 hellotime 2 fwddelay 15 maxage 20 holdcnt 6 proto rstp
        em0 flags=3<LEARNING,DISCOVER>
                port 1 ifpriority 0 ifcost 0
        tap0 flags=3<LEARNING,DISCOVER>
                port 8 ifpriority 0 ifcost 0

tap0がupしてなくていいのかな? activeになっているから、それでいいのだー、かも 知れいないけど。

案の定、dhcpでアドレスは取れず。ならば固定アドレスを振ろう。VMWAREのDHCPがプール してるアドレスを勝手に使ったら、sshを切られちゃったぞ。それ以外を設定したら、 先に進んだ。

途中で、DNSサーバーのアドレスって言われて、出てこず、思わず、8.8.8.8って答え ちゃった。後で考えたら。/etc/resolv.confに答えが書いてあるのね。すっかり失念 してた。

それから、もう一つ、共通の出入り口はいくつですかっても、聞かれた。これは調べ方を 知ってるぞ。netstat -r ね。

先へ進んだけど、だんまりしちゃった。

/dev/rsd0a: 2047.3MB in 4192896 sectors of 512 bytes
11 cylinder groups of 202.47MB, 12958 blocks, 25984 inodes each
/dev/sd0a (61bde4531abf33ea.a) on /mnt type ffs (rw, asynchronous, local)

Let's install the sets!
Location of sets? (disk http or 'done') [http]
HTTP proxy URL? (e.g. 'http://proxy:8080', or 'none') [none]
(Unable to get list from ftp.openbsd.org, but that is OK)
HTTP Server? (hostname or 'done') www.ftp.ne.jp
Server directory? [pub/OpenBSD/6.0/amd64] OpenBSD/6.0/amd64

やっぱり、NICが正常に動いていないんだな。ごちゃごちゃやってたら、パニクった。 なかなか、こういうのは見られないので、記念に貼っておく。

Netmask for vio0? [255.255.255.0]
IPv6 address for vio0? (or 'rtsol' or 'none') [none] uvm_fault(0xffffffff8172b6d0, 0x38, 0, 2) -> e
fatal page fault in supervisor mode
trap type 6 code 2 rip ffffffff812b8802 cs 8 rflags 10246 cr2  38 cpl 7 rsp ffff80000e3e2ce8
panic: trap type 6, code=2, pc=ffffffff812b8802
syncing disks... done

dump to dev 17,1 not possible
rebooting...

参考までにFreeBSDのそれを上げておく。

bridge0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        ether 02:b8:a8:da:7f:00
        nd6 options=9<PERFORMNUD,IFDISABLED>
        groups: bridge
        id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
        maxage 20 holdcnt 6 proto rstp maxaddr 2000 timeout 1200
        root id 00:00:00:00:00:00 priority 32768 ifcost 0 port 0
        member: tap0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
                ifmaxaddr 0 port 4 priority 128 path cost 2000000
        member: em0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
                ifmaxaddr 0 port 1 priority 128 path cost 20000
tap0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=80000<LINKSTATE>
        ether 00:bd:a9:e2:f6:00
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
        media: Ethernet autoselect
        status: active
        groups: tap
        Opened by PID 910

やっぱり、tap0はupして、activeになっているなあ。そして、仮想PCが落ちると statusは、no carrier に変化した。仮想PC側に属している事が明確だな。 そうか、そういう手が、調べる糸口になるかな。まてまて、それだけの事で 何の手がかりになる? ひょっとしたらブリッジって名前のHUBがおんぼろかも 知れないぞ。

man hostname.ifすると、ブリッジのアドレスを設定する例が出てくるけど、この場合、 必要あるのかな? IPv6版のdhcp指定は、rtsol って言うんか。知らなかったな。 ああ、まれに有るという、DHCPの相性問題だったりして。

ネットワークのお勉強

まだインストールを諦めきれない、往生際の悪いオイラーは、基本に立ち返ってみる事に した。インストール用のカーネル /bsd.rd は、インストールやアップデートの他 シェルに落ちてトラシュー出来るようになってる。

で、shellに落ちて確認

# ifconfig -a
lo0: flags=8008<LOOPBACK,MULTICAST> mtu 32768
        llprio 3
        groups: lo
vio0: flags=8b43<UP,BROADCAST,RUNNING,PROMISC,ALLMULTI,SIMPLEX,MULTICAST> mtu 1500
        lladdr fe:e1:ba:d0:01:1a
        llprio 3
        media: Ethernet autoselect
        status: active
# dhclient vio0
DHCPDISCOVER on vio0 - interval 3
DHCPDISCOVER on vio0 - interval 8

取り合えず、固定IPを振ってから、親にピンしてみる。

# ifconfig vio0 xxx.xxx.xxx.xxx netmask 255.255.255.0
# ping yyy.yyy.yyy.yyy
round-trip min/avg/max/std-dev = 0.431/321.022/983.034/408.816 ms
--- yyy.yyy.yyy.yyy ping statistics ---
25 packets transmitted, 25 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 0.431/356.609/1954.534/512.315 ms

pingにべらぼうな時間がかかっている。でも一応、疎通確認が出来たんで、方向は 間違っていないんだな。

ちょっと、ネットワークのお勉強。

OpenBSD FAQ - Networking

ああ、デフォルトゲートウェイなんてのも有ったな。でも、簡易型のシステムなんで netstatなんて言う素敵なコマンドが入っていなくて、確認出来ず。 でも、ゲートウェイを設定/確認するコマンドが入っているはず。

OpenBSD Change, Add or Display Default Gateway

こんなページを紹介された。そのものずばりの routeってのがあるのね。確認したら、 入っていた。で、showしたら、defaultが勿論設定されていなかった。

はて、どうやって設定するんだ? それはね、参考例が /etc/netstart にあるから それを見れ。

# Look for default routes in /etc/mygate.
[[ -z $dhcpif ]] && stripcom /etc/mygate | while read gw; do
                [[ $gw == @(*:*) ]] && continue
                route -qn delete default >/dev/null 2>&1
                route -qn add -host default $gw && break
done

で、設定してから、ピンしたけど、変化無し。オイラーのパケットはEME(月面反射) して、返ってくるのだろうか?

--- yyy.yyy.yyy.yyy ping statistics ---
14 packets transmitted, 14 packets received, 0.0% packet loss
round-trip min/avg/max/std-dev = 0.431/320.567/1689.168/527.630 ms

相変わらず、dhcpでアドレスは取れず。他に調べる事有るかな?

苦し紛れに、インストールに使われる関係者を、列挙してみる。

# echo $PATH
/sbin:/bin:/usr/bin:/usr/sbin:/
# ls /sbin /bin /usr/bin /usr/sbin
/bin:
arch     chmod    dd       eject    ln       mt       rm       sha512   sync
cat      cp       df       hostname ls       mv       sh       sleep    tar
chgrp    date     ed       ksh      mkdir    pax      sha256   stty

/sbin:
bioctl       fdisk        ifconfig     mount_cd9660 newfs        restore
chown        fsck         init         mount_ext2fs newfs_msdos  route
dhclient     fsck_ffs     kbd          mount_ffs    ping         sysctl
disklabel    fsck_msdos   mknod        mount_msdos  ping6        umount
dmesg        halt         mount        mount_udf    reboot

/usr/bin:
egrep   fgrep   grep    gzcat   less    sed
encrypt ftp     gunzip  gzip    more    signify

/usr/sbin:
chroot       installboot  pwd_mkdb