組込み向けSSH、SCP、SFTPを試してみる

[wolfSSH](https://www.wolfssl.jp/products/wolfssh/)は[wolfSSL](https://www.wolfssl.jp/products/)と連携してSSHサーバやクライアント、またscpやsftpのプロトコル機能を実現するためのC言語ライブラリーです。IoTデバイスや組み込み機器などに例えば遠隔コンソール機能のようなものを追加したい場合に利用します。プロトコル部分だけを提供するものなので、Telnetベースの既存機能をSSHベースに置き換えたりするようなケースにも利用できます。

今回は、Linux, MacOS, WidnowsのWSL, CygwinやminGWなどのパソコンのコマンド環境上でwolfSSHをインストールして、簡単な動作確認を行う手順を紹介します。

SSHプロトコルはSSL/TLSとは異なるので、厳密にはwolfSSHはwolfSSLの上で動作するのではなくwolfSSLに含まれる暗号化ライブラリーwolfCryptを利用してSSHプロトコルを実現しています。しかし、ソフトウェア製品コンポーネントとしてはwolfSSLとwolfSSHを組み合わせることになります。

###1. wolfSSLのビルド、インストール

まず、wolfSSHが参照するwolfSSLを準備します。wolfSSLのダウンロードについては"[wolfSSLのクイックスタート(コマンド編)](https://qiita.com/kojo1/items/3140b107fd7f0ccdf061)" を参照してください。

wolfSSLをダウンロードしたら、SSH連携オプションを有効化してビルド、インストールします。

```
$ cd wolfssl
$ ./configure --enable-ssh
...
   * wolfSSH                     yes
...
$ make check
...

$ sudo make install
$ cd ..
```

###２. wolfSSHのダウンロード、ビルド、インストール

次に、wolfSSHをダウンロード、ビルド、インストールします。

１） ソースコード一式のダウンロード
正式版はwolfSSLサイトから、最新版はGithubからダウンロードします。

正式版：
https://www.wolfssl.jp/download/ からwolfssh-x.x.x.zip  を選択してダウンロード、解凍します。

最新版：
https://github.com/wolfssl/wolfssh をcloneします。cloneの後、wolfsshデイレクトリでautogen.shを実行しconfigureなど必要ファイルを生成します。

```
$ git clone https://github.com/wolfssl/wolfssh
Cloning into 'wolfssh'...
remote: Enumerating objects: 5, done.
...
Resolving deltas: 100% (3240/3240), done.

$ cd wolfssh
$ sh autogen.sh
autoreconf: Entering directory `.'
...
parallel-tests: installing 'build-aux/test-driver'
autoreconf: Leaving directory `.'
```

２） ビルド
次に、ライブラリとサンプルプログラム一式をビルドします。configureコマンドでMakefileを生成し、makeコマンドにてビルドします。configureコマンドはとりあえずアーギュメントなしのデフォルトでビルドします。make checkのように指定するとコンパイル完了後、ローカルテストを実行するのですべてのテストが正常終了することを確認します。

```
$ ./configure
...
   * scp:                       no
   * sftp:                      no
   * TCP/IP Forwarding:         no
   * Examples:                  yes

$ make check
/Applications/Xcode.app/Contents/Developer/usr/bin/make -j17  check-am
  CC       examples/client/client.o
  CC       src/libwolfssh_la-ssh.lo
  CC       src/libwolfssh_la-internal.lo
...

============================================================================
Testsuite summary for wolfssh 1.4.4
============================================================================
# TOTAL: 4
# PASS:  4
# SKIP:  0
# XFAIL: 0
# FAIL:  0
# XPASS: 0
# ERROR: 0
============================================================================

```

3) インストール
最後にライブラリを所定の場所にインストールします。

```
$ sudo make install
Password:

```

###3. サンプルプログラムの実行
ここまでの手順で、ライブラリーと同時に各種サンプルプログラムがビルドされるので、代表的なものの使い方を説明します。

###1) echoserver
###- パスワード認証
まずはパスワード認証を試してみます。以下のようにechoserverを起動してみます。

```
$ ./examples/echoserver/echoserver
From another terminal run:
```

別のウィンドウから適当なsshコマンドでログインしてみます。この時、***echoserverのデフォルトポート "22222"*** を指定します。echoserverにはデフォルトで以下の二つのアカウントが登録されているので、どちらかでログインしてみます。

|ユーザ名|パスワード|
|---|---|
|jill|upthehill|
|jack|fetchapail|


```
$ ssh -p 22222 jill@localhost
wolfSSH Example Echo Server
jill@localhost's password: 
hello wolfSSH
```

ログイン後、自分が入力した文字がそのままエコーバックされるはずです。

Wiresharkなどでパケットキャプチャーしてみると、SSHプロトコル、一文字ずつエコーバックする様子がキャプチャーできるはずです。Wiresharkでポート "22222" がSSHとして解釈されるように、メニューバーのAnalyze -> Decode As でこのポートをSSHとして登録します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/263939/b6cc872b-6931-b392-4a5e-f78c7b36c2a5.png)

###- 公開鍵認証
次に、公開鍵認証によるログインを試してみます。

SSHの実際の利用ケースでは、公開鍵認証のためにはあらかじめ公開鍵と秘密鍵のペアを生成して、公開鍵のほうをサーバに登録しておくという手順が必要ですが、ここでは簡単のためにサンプルechoserverにデフォルトで組み込まれているサンプルユーザと鍵ペアを利用します。サンプルユーザとしては、"gretel" と "hansel" の二つが用意されています。また、それぞれのユーザ用として "./kyes" の下に秘密鍵が用意されています。秘密鍵はRSAとECCの両方が用意されています。ただし、ダウンロード直後のまま使用するとファイルアクセス権エラーとなってしまうので、使用前に変更しておきます。

```
$ chmod 0600 ./keys/gretel-key-rsa.pem ./keys/hansel-key-rsa.pem \
             ./keys/gretel-key-ecc.pem ./keys/hansel-key-ecc.pem
```

適当な公開鍵を選択してSSHで接続すると、公開鍵認証でログインできることがわかります。

```
$ ssh -p 22222 -i ./keys/gretel-key-rsa.pem gretel@localhost
wolfSSH Example Echo Server
hello wolfSSH
```

###2) SCPクライアント
LinuxないしmadOSではSCPやSFTPのサンプルもサポートされているので、これを動かしてみます。wolfSSHのルートディレクトリに移動して、configure, make で再ビルドします。

```
$ cd wolfssh
$ ./configure --enable-scp --enable-sftp
...
   * scp:                       yes
   * sftp:                      yes
$ make
  CC       examples/client/client.o
  CC       examples/server/server.o
```

ビルドが終わったら、サンプルプログラムを起動します。この時、SCPの試しコピー用のコピー先ディレクトリーを作っておきます。

```
$ ./examples/server/server
```

別のウィンドウを開いて、例えばwolfSSHルートでscpコマンドでファイルをリモートコピーしてみます。"-P"(大文字P)オプションでサンプルプログラムで使用しているポート番号を指定します。

```
$ ls src/*.c
src/internal.c	src/io.c	src/keygen.c	src/log.c	src/misc.c   ...
$ scp -P 22222 src/internal.c jill@127.0.0.1:./
```

サンプルプログラムを起動したディレクトリにファイルがコピーされていることがわかります。

```
$ ls *.c
internal.c
```

リカーシブオプション "-r" を指定してみます。 

```
$ scp -P 22222 -r keys jill@127.0.0.1:./temp
wolfSSH Example Server
jill@127.0.0.1's password:
hansel-key-rsa.pem                                                                                                                                   100% 1675     1.8MB/s   00:00    
gretel-key-rsa.pem                                                                                                                                   100% 1675     3.3MB/s   00:00    
...
  
pubkeys-rsa.txt                                                                                                                                      100%  776     4.5MB/s   00:00    
server-key-ecc-521.pem                                                                                                                               100%  474     2.6MB/s   00:00
```
###３) SFTPサーバ
次にSFTPのサンプルプログラムを試してみます。あくまでサンプルプログラムなので、詳細の機能まで実現されているわけではありませんが、SFTPサーバの基本的機能を試すことができます。SFTPサーバはSSHのechoserverの一部として実現されます。


SSHのechoserverを立ち上げてから、下記のようにホスト名、ポート指定なしでsftpクライントサンプルを起動すると、デフォルトで、ローカルホスト、ポート22222のechoserverに接続されます。

```
$ ./examples/echoserver/echoserver
$ ./examples/sftpclient/wolfsftp -u jill
Password: 
```

ログインしたらlsでファイル名を確かめて、getでコピーしてみます。

```
wolfSSH sftp> ls
...
aclocal.m4
autogen.sh
wolfSSH sftp> mkdir temp2    
wolfSSH sftp> get autogen.sh temp2/autogen.sh
fetching ... ./autogen.sh to temp2/autogen.sh
Processed     1106	 bytes 
...
```

##4. まとめ

今回は、wolfSSHの機能について、簡単に試してみました。[詳細なドキュメント](https://www.wolfssl.jp/wordpress/wp-content/uploads/2019/04/wolfSSHUserManual-jp.pdf)、[製品情報](https://www.wolfssl.jp/products/wolfssh/)についてはこちらを参照してください。

wolfSSLはソフトウェアの内容は同じですが、無償のオープンソース版と有償商用版のデュアルライセンスとなっています。社内技術評価などにはオープンソース、製品への組み込みの際は商用ライセンス契約をお願いしています。商用ラインセンス、サポートについてはinfo@wolfssl.jpにお問い合わせください。

ドキュメント：https://www.wolfssl.jp/docs/
wolfSSH製品ページ：https://www.wolfssl.jp/products/wolfssh/
wolfSSL社英語サイト：https://www.wolfssl.com
wolfSSL社日本語サイト：https://www.wolfssl.jp
Twitter: https://twitter.com/wolfSSL_Japan