sshファミリー

図書館からニュートン誌も借りてきていたんだ。三角関係編。 色々な関連関数が紹介されてた。受験の為の必須事項ですからね。

数学ナビゲーションについてにも紹介がある。受験対策用雑誌の片棒を担いでいるのかな。ちょいと試してみる。

三角関数で引数に与える数値は、ラジアンって決まってる。馴染みが薄いんだよな。平凡な頭でも理解出来るように、360進数で与えるようにしよう。題材は2倍角の公式あたり。

julia> d = pi / 180
0.017453292519943295

julia> 2 * sin(30d) * cos(30d)
0.8660254037844386

julia> sin(60d)
0.8660254037844386

最初に度をラジアンに変換するための定数を定義する。それから、sin(60度)を求めたい。 60度の半分の角度30度を使って、sin,cosすると、求まるとな。

juliaでは、数値と変数(定数)の掛け算の場合、掛け算記号を省略できる。で、変数名をdなんていう風に定義しておくと、30度は、30dのように、書ける。これで、障壁が無くなったな。

大きい度ーの場合はどうよ?

julia> sin(1000d)
-0.9848077530122079

julia> 2 * sin(500d) * cos(500d)
-0.984807753012208

360度を超えても成り立つとな。ぐるぐると360度で一回りしてくれるんで、どんなに大きい角度でも大丈夫。やったね。

そんじゃ、cos用の倍角関数は?

            2       2
cos 2a = cos a - sin a

なんて風に、括弧嫌いなhaskell風に書いてあるのは許せるとして、べき乗が変な所に付いている。全くもう、こういう書き方をするから、数学嫌いな生徒を量産するんだよ。

julia> cos(60d)
0.5000000000000001

julia> cos(30d)^2 - sin(30d)^2
0.5000000000000002

脳内変換に時間を要しますよ。

本当にHaskellは数式通りに書けるの?

Prelude> d = pi / 180
Prelude> cos(30*d)^2 - sin(30*d)^2
0.5000000000000002

どうしても括弧必要。この原因は、関数はすぐ右隣の1つの値と強力に結合するから。先に引数を計算しておきたい場合、括弧をつけて計算の優先順位をあげる。

じゃ、事前にラジアンの数値を求めておく

Prelude> a = 30*d
Prelude> sin a
0.49999999999999994
Prelude> cos ^2 a - sin ^2 a

<interactive>:7:1: error:
    • Non type-variable argument in the constraint: Num (a -> a)
      (Use FlexibleContexts to permit this)
    • When checking the inferred type
        it :: forall a. (Floating a, Num (a -> a)) => a -> a
Prelude> cos a ^2 - sin a ^2
0.5000000000000002

やっぱり脳内変換必要。

そんじゃ、 maximaでは

(%i1) d: %pi / 180;
                                      %pi
(%o1)                                 ---
                                      180
(%i2) sin(60 d);

incorrect syntax: d is not an infix operator
sin(60 d)
       ^
(%i3) 2 * sin(30 * d) * cos(30 * d);
                                    sqrt(3)
(%o3)                               -------
                                       2
(%i4) sin(60 * d);
                                    sqrt(3)
(%o4)                               -------
                                       2

更に

(%i5) trigexpand(sin(a+b));
(%o5)                    cos(a) sin(b) + sin(a) cos(b)
(%i6) trigexpand(cos(2 * a));
                                  2         2
(%o6)                          cos (a) - sin (a)
(%i7) trigreduce(2 * sin(a) * cos(a));
(%o7)                              sin(2 a)
(%i8) sqrt(3);
(%o8)                              sqrt(3)
(%i9) sqrt(3.0);
(%o9)                         1.732050807568877
(%i10) float(sqrt(3));
(%o10)                         1.732050807568877
(%i11) bfloat(sqrt(3)), fpprec: 50;
(%o11)        1.7320508075688772935274463415058723669428052538104b0

お主、なかなかやるな。そこらのぼんくらよりは、数学が出来るな。sqrt(3)は頑固にsqrt(3)だけど(無理数だから無理からぬ事)、一捻りすると柔軟になってくれる。

Maximaを活用した数学学習

上で見たように各アプリを使う場合、それぞれの作法の習得が必要。帯に短しタスキに長し。 それもそのはず、パーサーなんてものが裏で動いているせい。パーサーを人間に任せてしまえば そんな悩みも吹き飛ぶ。

maximaは裏でlispが動いていたけど、無理な事をしない限り表に出てこない。簡単に人間パーサーを使うにはschemeが良い。

gosh> (use math.const)
gosh> (define (d n)(* n pi/180))
d
gosh> (define (^2 n)(* n n))
^2

我らがgoshには、pi/180 なんて言う定数が既に用意されてる。他の言語しか知らない人は目を剥くだろうけど。それと、もう一つ、2乗っぽい名前の関数を宣言した。 後は、人間パーサーが活躍する事となる。初めから人間パーサーしか無いから、精神衛生上、非常に宜しいと思うぞ。

gosh> (* 2 (sin (d 30)) (cos (d 30)))
0.8660254037844386
gosh> (sin (d 60))
0.8660254037844386
gosh> (- (^2 (cos (d 30))) (^2 (sin (d 30))))
0.5000000000000002
gosh> (cos (d 60))
0.5000000000000001

括弧のバランスを恐れるなかれ。emacs上でpareditとかを使っていれば、全く心配無しです。

openssh.com

OpenSSH 8.1 released October 8, 2019

前回の最後にちらっと書いたけど、新しいopensshが出た。HPで高らかに宣伝されてる。 それはいいんだけど、

HPの下の方に大事なお願いが書かれている。

OpenSSH is developed by a few developers of the OpenBSD Project and made
available under a BSD-style license.

OpenSSH is incorporated into many commercial products, but very few of
those companies assist OpenSSH with funding.

Contributions towards OpenSSH can be sent to the OpenBSD Foundation.

大事な事なので、意訳してみる。(ググルさんの力を借りて)

OpenSSHは、OpenBSDプロジェクトの少数の開発者によって開発され、BSDスタイルの
ライセンスの下で利用可能になっています。

OpenSSHは多くの商用製品に組み込まれていますが、OpenSSHを資金援助している企業は
ほとんどありません。

OpenSSHへの貢献は、OpenBSD Foundationに送信できます 。

OpenSSHはOpenBSDの成果の一部。それを一般開放してるって事。しかもゆるゆるなライセンスの元に。実に寛大。これもそれも、Linux教の親分からは、あいつらセキュリティ教(狂)と揶揄されながらも、信念を曲げない親分が居るからです。

こんな寛大な御心に付け込んで、みんなフリーライド(無賃乗車、ただ使い)してるんで、寄付宜しくのお願いだ。 財政がひっ迫してくると、ウィキペディアの寄付お願い、お願いになるだろうね。

ウィキペディアの方は個人が訪れる事が多いだろうけど、OpenSSHみたいなツールを追いかける 個人なんて、余りいないだろう。企業の方宜しく。まあ、自由に使える物に金払うなんて、そんな無駄な事するなって、資本主義の原理がまかり通るんだろうね。

せめてGAFAな連中もとえ(皆様方)の寛大なる寄付をお願い致します。 わざわざOpenssh.comなんて言う会社組織にしてるのは、(多分)寄付を受け付け易くするためでしょう。大口開けて待ってるぜぃ。

そんな事なんで、OpenSSHは、OpenBSDの配布サイトからも取ってこれる。 例えば 理研のさーばーに行って、OpenSSHの下に潜ればよい。一般のOS用には、portableの中に収録されてるのを取ってくる。。

OpenBSDの親分はOpenSSHの他に、セキュリティの脅威になりそうな物を(OpenNTPDとか)も、独自開発してる。(多分資金不足で)ポータブル化はされていないけど。

これらを使いたかったら、OpenBSDに乗り換える事です。CDを注文するとかマシンを寄付するとかして貢献しましょう。

for FreeBSD

早速、万人の福を与えると言うポータブル版をFreeBSDで試してみる。

$ cd openssh-8.1p1/
$ ./configure
   :
OpenSSH has been configured with the following options:
                     User binaries: /usr/local/bin
                   System binaries: /usr/local/sbin
               Configuration files: /usr/local/etc
               Askpass program: /usr/local/libexec/ssh-askpass
                      Manual pages: /usr/local/share/man/manX
                          PID file: /var/run
  Privilege separation chroot path: /var/empty
   At runtime, sshd will use the path defined in /etc/login.conf
   Make sure the path to scp is present, otherwise scp will not work
                    Manpage format: doc
                       PAM support: no
                   OSF SIA support: no
                 KerberosV support: no
                   SELinux support: no
              MD5 password support: no
                   libedit support: no
                   libldns support: no
  Solaris process contract support: no
           Solaris project support: no
         Solaris privilege support: no
       IP address in $DISPLAY hack: no
           Translate v4 in v6 hack: no
                  BSD Auth support: no
              Random number source: OpenSSL internal ONLY
             Privsep sandbox style: capsicum

              Host: x86_64-unknown-freebsd12.0
          Compiler: cc
    Compiler flags: -g -O2 -pipe -Wunknown-warning-option -Qunused-arguments -Wall -Wpointer-arith -Wuninitialized -Wsign-compare -Wformat-security -Wsizeof-pointer-memaccess -Wno-pointer-sign -Wno-unused-result -fno-strict-aliasing -mretpoline -D_FORTIFY_SOURCE=2 -ftrapv -fno-builtin-memset -fstack-protector-strong
Preprocessor flags:
      Linker flags:  -Wl,-z,retpolineplt -Wl,-z,relro -Wl,-z,now -Wl,-z,noexecstack -fstack-protector-strong
         Libraries: -lcrypto -lutil -lz  -lcrypt
$ make
   :

configの出来具合を見ると、リナちゃん用とかソラリスまでサポートするオプションが有るのね。サービス精神旺盛。gmakeなんて言うリナ専用なやつじゃなくても、ちゃんとmake出来るってのもいいね。リナはリナ以外にOSは無いと思ってる連中が多いからね。

$ ssh -V
OpenSSH_7.8p1, OpenSSL 1.1.1a-freebsd  20 Nov 2018
$ ./ssh -V
OpenSSH_8.1p1, OpenSSL 1.1.1a-freebsd  20 Nov 2018

文句を言われる事も無くコンパイルが終了したので、既に入ってるやつと比べてみた。3代前のやつが入ってるという事は、当時の流行版を入れてたのね。

書き忘れたけど、一回のmakeでsshファミリーに属するコマンドを全部作りあげていた。

実際に機能するか、確認。

$ ./ssh localhost
The authenticity of host 'localhost (127.0.0.1)' can't be established.
ECDSA key fingerprint is SHA256:BmYGkeLlpZJ16R6rL4VwWlxn1vrRIII81iurIKigA30.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
Password for sakae@fb12:
Last login: Sun Oct 13 14:19:07 2019 from tmux(979).%0
FreeBSD 12.0-RELEASE-p10 GENERIC

Welcome to FreeBSD!

うん、ちゃんと動いたね。そんじゃ、既存のやつと違いが有るか、成分表をざっと眺めてみるか。

$ ldd /usr/bin/ssh
/usr/bin/ssh:
        libprivatessh.so.5 => /usr/lib/libprivatessh.so.5 (0x800276000)
        libgssapi.so.10 => /usr/lib/libgssapi.so.10 (0x80031e000)
        libcrypto.so.111 => /lib/libcrypto.so.111 (0x80032b000)
        libc.so.7 => /lib/libc.so.7 (0x800618000)
        libprivateldns.so.5 => /usr/lib/libprivateldns.so.5 (0x800a0b000)
        libcrypt.so.5 => /lib/libcrypt.so.5 (0x800a6c000)
        libz.so.6 => /lib/libz.so.6 (0x800a8e000)
        libthr.so.3 => /lib/libthr.so.3 (0x800aa8000)
        libssl.so.111 => /usr/lib/libssl.so.111 (0x800ad3000)
$ ldd ./ssh
./ssh:
        libcrypto.so.111 => /lib/libcrypto.so.111 (0x8002fa000)
        libutil.so.9 => /lib/libutil.so.9 (0x8005e7000)
        libz.so.6 => /lib/libz.so.6 (0x8005fe000)
        libcrypt.so.5 => /lib/libcrypt.so.5 (0x800618000)
        libc.so.7 => /lib/libc.so.7 (0x80063a000)
        libthr.so.3 => /lib/libthr.so.3 (0x800a2d000)

何やらオプションを有効にしたやつが使われているのね。

どんなオプションでコンパイルされてるか既存のソースを調べてみるか。/usr/src/crypto/opensshにソースが有るけどMakefileが無い。

するってぇと、buildworldする時に、ここに移動してきてconfigureするんだろう。きっとMakefileに書いてあるだろう。

$ cd /usr/src
$ find . -name Makefile.inc | xargs grep openssh
./secure/Makefile.inc:SSHDIR=           ${SRCTOP}/crypto/openssh

最初、Makefileを対象に調べて、空振りしたのは秘密だ。

$ cd secure/
$ ls
Makefile        lib/            tests/          usr.sbin/
Makefile.inc    libexec/        usr.bin/
$ ls usr.bin
Makefile        scp/            ssh-add/        ssh-keyscan/
Makefile.inc    sftp/           ssh-agent/      tests/
openssl/        ssh/            ssh-keygen/
$ ls usr.bin/ssh
Makefile                Makefile.depend

Makefileを辿って、例えば、secure/usr.bin/ssh/Makefileの中

# gss-genr.c really belongs in libssh; see src/secure/lib/libssh/Makefile
SRCS+=  gss-genr.c

CFLAGS+=-I${SSHDIR} -include ssh_namespace.h
SRCS+=  ssh_namespace.h

LIBADD= ssh

.if ${MK_LDNS} != "no"
CFLAGS+=        -DHAVE_LDNS=1
.endif

.if ${MK_GSSAPI} != "no" && ${MK_KERBEROS_SUPPORT} != "no"
CFLAGS+= -include krb5_config.h
SRCS+=  krb5_config.h
LIBADD+=        gssapi
.endif

configureを手動展開してみて、その成果をMakefileに反映させてるとな。FreeBSDとしてのコンパイルオプションで運用って事だな。って事は、OpenSSHと同盟関係に有っても、完全に信用してる訳では無いと言う事か。 いや、そうじゃないな。後で個々のコマンドのメンテナンスをやり易いように、それぞれ用のMakefileを用意したるんだよ。

source-treeの中に有ったREADME.platformでの注意書き

Linux
-----

Some Linux distributions (including Red Hat/Fedora/CentOS) include
headers and library links in the -devel RPMs rather than the main
binary RPMs. If you get an error about headers, or complaining about a
missing prerequisite then you may need to install the equivalent
development packages.  On Redhat based distros these may be openssl-devel,
zlib-devel and pam-devel, on Debian based distros these may be
libssl-dev, libz-dev and libpam-dev.

みんなリナの所業には苦労してんのよ。

for CentOS

次はCentOSかな。

(base) [sakae@c8 ~]$ ssh -V
OpenSSH_7.8p1, OpenSSL 1.1.1 FIPS  11 Sep 2018

最近出たはずなのに、版が古いね。作り方はFreeBSDと一緒で無事に動いた。気になる機能差

(base) [sakae@c8 openssh-8.1p1]$ ldd /usr/bin/ssh
        linux-vdso.so.1 (0x00007fff5191f000)
        libfipscheck.so.1 => /lib64/libfipscheck.so.1 (0x00007f64ebdda000)
        libcrypto.so.1.1 => /lib64/libcrypto.so.1.1 (0x00007f64eb902000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f64eb6fe000)
        libutil.so.1 => /lib64/libutil.so.1 (0x00007f64eb4fa000)
        libz.so.1 => /lib64/libz.so.1 (0x00007f64eb2e3000)
        libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f64eb0ba000)
        libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f64eaea3000)
        libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f64eac79000)
        libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f64eaa29000)
        libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f64ea739000)
        libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f64ea51d000)
        libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f64ea319000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f64e9f55000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f64e9d35000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f64ec297000)
        libpcre2-8.so.0 => /lib64/libpcre2-8.so.0 (0x00007f64e9ab1000)
        libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f64e98a1000)
        libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f64e969d000)
(base) [sakae@c8 openssh-8.1p1]$ ldd ./ssh
        linux-vdso.so.1 (0x00007fffdf976000)
        libcrypto.so.1.1 => /lib64/libcrypto.so.1.1 (0x00007f55e7926000)
        libdl.so.2 => /lib64/libdl.so.2 (0x00007f55e7722000)
        libutil.so.1 => /lib64/libutil.so.1 (0x00007f55e751e000)
        libz.so.1 => /lib64/libz.so.1 (0x00007f55e7307000)
        libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f55e70de000)
        libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f55e6ec7000)
        libc.so.6 => /lib64/libc.so.6 (0x00007f55e6b03000)
        libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f55e68e3000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f55e80b5000)

色々な物を取り込んでいるな。

for Debian

やってみようと思ったけどページの無駄なんで、 apt source openssh して、openssh_7.9p1-10+deb10u1.debian.tar.xzを展開すると出来るdebianの中を覗いてみてる。

changelogにバグチケットを終了したとか、残してある。

openssh (1:7.9p1-10+deb10u1) buster-security; urgency=high

  * Apply upstream patch to deny (non-fatally) shmget/shmat/shmdt in preauth
    privsep child, coping with changes in OpenSSL 1.1.1d that broke OpenSSH
    on Linux kernels before 3.19 (closes: #941663).

 -- Colin Watson <cjwatson@debian.org>  Sun, 06 Oct 2019 19:18:07 +0100

controlとか言うファイル内

Source: openssh
Section: net
Priority: standard
Maintainer: Debian OpenSSH Maintainers <debian-ssh@lists.debian.org>
Build-Depends: autotools-dev,
               debhelper (>= 9.20160709~),
               dh-autoreconf,
               dh-exec,
               dpkg-dev (>= 1.16.1~),
               libaudit-dev [linux-any],
               libedit-dev,
               libgtk-3-dev <!pkg.openssh.nognome>,
               libkrb5-dev | heimdal-dev,
               libpam0g-dev | libpam-dev,
               libselinux1-dev [linux-any],
               libssl-dev (>= 1.1.0g),
               libsystemd-dev [linux-any],
               libwrap0-dev | libwrap-dev,
               pkg-config,
               zlib1g-dev (>= 1:1.2.3),

こんな定義が、しっかり書いてあったぞ。ここには、インストール情報とかも置いてあるのね。

debパッケージ作成方法をステップバイステップでまとめました

for OpenBSD

最初、所定の場所(/usr/src/usr.bin/)にソースを展開すべきかプチ悩んだけど、男は度胸って事で /tmpに展開してみる事にした。ここRAMDISKですから、SSDを傷める心配もなく、好き放題出来ます。

ob$ ls -l | egrep '^d'
drwxr-xr-x  2 sakae  wheel     512 Oct  9 09:39 moduli-gen
drwxr-xr-x  2 sakae  wheel     512 Oct  9 09:39 scp
drwxr-xr-x  2 sakae  wheel     512 Oct  9 09:39 sftp
drwxr-xr-x  2 sakae  wheel     512 Oct  9 09:39 sftp-server
drwxr-xr-x  2 sakae  wheel     512 Oct  9 09:39 ssh
drwxr-xr-x  2 sakae  wheel     512 Oct  9 09:39 ssh-add
drwxr-xr-x  2 sakae  wheel     512 Oct  9 09:39 ssh-agent
drwxr-xr-x  2 sakae  wheel     512 Oct  9 09:39 ssh-keygen
drwxr-xr-x  2 sakae  wheel     512 Oct  9 09:39 ssh-keyscan
drwxr-xr-x  2 sakae  wheel     512 Oct  9 09:39 ssh-keysign
drwxr-xr-x  2 sakae  wheel     512 Oct  9 09:39 ssh-pkcs11-helper
drwxr-xr-x  2 sakae  wheel     512 Oct  9 09:39 sshd

ソース群と、それぞれのコマンドを生成する為のMakefileが格納されたdir群があります。色々なファミリーが有るんですなあ。そんじゃ、試しにコンパイル。

ob$ cd ssh
ob$ make
  :
cc -O2 -pipe  -I/tmp/ssh/ssh/.. -fstack-protector-all -DWITH_OPENSSL -DENABLE_PKCS11 -DHAVE_DLOPEN -Wall -Wextra -Wformat-security -Wmissing-declarations -Wmissing-prototypes -Wpointer-arith -Wshadow -Wstrict-prototypes -Wunused -Wno-unused-parameter  -Wstrict-aliasing=2 -Wold-style-definition  -MD -MP  -c /tmp/ssh/ssh/../ssh-pkcs11.c
cc   -o ssh ssh.o readconf.o clientloop.o sshtty.o sshconnect.o sshconnect2.o mux.o atomicio.o authfd.o compat.o dns.o fatal.o hostfile.o msg.o readpass.o utf8.o sshbuf.o sshbuf-getput-basic.o sshbuf-misc.o ssherr.o log.o xmalloc.o misc.o dh.o kexdh.o kexecdh.o kexgex.o kexc25519.o smult_curve25519_ref.o kexgen.o kexsntrup4591761x25519.o sntrup4591761.o kexgexc.o sshkey.o cipher.o cipher-chachapoly.o chacha.o poly1305.o ssh-dss.o ssh-ecdsa.o ssh-rsa.o sshbuf-getput-crypto.o digest-openssl.o ssh-ed25519.o sc25519.o ge25519.o fe25519.o ed25519.o verify.o hash.o authfile.o bitmap.o krl.o channels.o monitor_fdpass.o nchan.o ttymodes.o canohost.o dispatch.o hmac.o kex.o mac.o packet.o umac.o umac128.o addrmatch.o match.o ssh-pkcs11.o -lcrypto -lutil -lz

あっけなく作成完了。早速動作試験。

ob$ ./ssh -V
OpenSSH_8.1, LibreSSL 2.9.1
ob$ ./ssh localhost
The authenticity of host 'localhost (127.0.0.1)' can't be established.
  :
Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts.
sakae@localhost's password:
Last login: Mon Oct 14 16:11:37 2019 from xxx.xxx.xxx.xxx
OpenBSD 6.5 (GENERIC.MP) #5: Thu Aug 29 20:38:30 CEST 2019

無事に動いてますなあ。この調子で族をコンパイルしまくり、所定の位置にコマンドを置けば、バックポートが完了します。まあ、やってもいいけど、後少しすれば新しいOpenBSDが出てきますからねぇ。

OpenBSDのサイトに6.6の箱が出来て、パッケージの搬入が始まったな。もうすぐですよ。emacs 26.3がやって来るのは。