Debian noroot 環境において dropbear に基づく SSH サーバを導入する

# はじめに

[Debian noroot][DBNR] とは、 [Android OS][ANDR] 上において root 権限を取ることなく [Debian 環境][DEBI]を構築するためのアプリケーションです。
CPU の性能とメモリ容量が潤沢にある Android 端末であれば、 [Debian noroot][DBNR] の導入によって Android 端末上で非常に軽快な [Debian 環境][DEBI]を実現することができます。

[Debian noroot 環境][DBNR]上において SSH サーバを起動すると、 SSH クライアントをインストールした遠隔の PC 端末から [Debian noroot 環境][DBNR]を容易に操作することが可能となるので、非常に有用です。

しかし、 [Debian noroot 環境][DBNR]に、各種 Linux ディストリビューションで多く用いられている [OpenSSH][OSSH] を導入して ```sshd``` デーモンを起動しようとすると、以下のようなエラーメッセージを出力して ```sshd``` が正常に起動しません。

```shell-session
 $ sudo bash
 # apt-get install openssh-server
 
 ... # (ここで sshd を起動する為の適切な各種設定)
 
 # /etc/init.d/ssh start
 Starting OpenBSD Secure Shell server: sshd/var/run/sshd must be owned by root and not group or world-writable.
 failed!
 #
```

この問題は、ディレクトリ ```/var/run/sshd``` の所有者が root では無く、グループ及び全てのユーザに対して書き込み可能な状態であり、ディレクトリ ```/var/run/sshd``` の所有者および権限をユーザ権限からでは変更出来ないのが原因であると考えられます。

そこで、 [Debian noroot 環境][DBNR]上における SSH サーバとして OpenSSH に代えて軽量な SSH サーバである [dropbear][DROP] の導入を行いました。

次に、 [Debian noroot 環境][DBNR]上におけるユーザのパスワードを変更する設定を行った後、 [Debian noroot 環境][DBNR]で ```dropbear``` デーモンを一時的に起動して、 SSH クライアントをインストールした遠隔の PC 端末よりパスワード認証を用いた SSH による接続確認を行いました。

そして、 SSH クライアントをインストールした遠隔の PC 端末から、 SSH クライアントにおいて使用する公開鍵と秘密鍵を生成し、公開鍵を [Debian noroot 環境][DBNR]に転送して、遠隔の PC 端末より公開鍵認証を用いた SSH による接続確認を行いました。

最後に、 [Debian noroot 環境][DBNR]の起動時に ```dropbear``` デーモンを自動的に起動させる為の設定を行いました。

以上の設定により、 [Debian noroot 環境][DBNR]の起動後は [Android OS][ANDR] 端末に触れること無く、 SSH クライアントをインストールした遠隔の PC 端末から [Debian noroot 環境][DBNR]を操作することが出来るようになりました。

本稿では、 [Debian noroot 環境][DBNR]に [dropbear][DROP] を導入して、 SSH クライアントを導入した各種端末から [Debian noroot 環境][DBNR]にリモートログインを行うことが出来る環境を構築する一連の過程について述べます。

まず最初に、 "[接続先への dropbear の導入][CHAP01]" の章において、 [Debian noroot 環境][DBNR]に [dropbear][DROP] 及び [dropbear][DROP] に関連するパッケージをインストールする手法について述べます。

次に、 "[パスワード認証に基づく SSH による接続の設定][CHAP02]" の章において、[前章][CHAP01]で [Debian noroot 環境][DBNR]に導入した [dropbear][DROP] に向けて、パスワード認証に基づいた SSH のリモートログインを行うための設定の手法について述べます。

そして、 "[公開鍵認証に基づく SSH による接続の設定][CHAP03]" の章において、接続元となる PC 端末において生成した公開鍵を、接続先となる [Debian noroot 環境][DBNR]に転送し、接続先の [Debian noroot 環境][DBNR]に導入した [dropbear][DROP] に向けて、公開鍵認証に基づいた SSH のリモートログインを行うための設定の手法について述べます。

続いて、 "[接続先の ```dropbear``` デーモンの起動の自動化][CHAP04]" の章において、[前々章][CHAP02]及び[前章][CHAP03]にて設定及び動作確認を行った ```dropbear``` を [Debian noroot 環境][DBNR]の起動時に自動的に起動させる為の設定の手法について述べます。

最後に、 "[結論][CHAP05]" の章において、本稿の結論について述べます。

なお本稿においては、特段の断りのない限り、 SSH によるリモートログインの接続先となる [Debian noroot 環境][DBNR]及び接続元となる SSH クライアントに関する各種環境設定等に関しては、下記の通りであるとします。

- [Debian noroot 環境][DBNR]が動作している端末の IP アドレス: 192.168.0.1
- [Debian noroot 環境][DBNR]上で動作する ```dropbear``` デーモンが待ち受ける SSH のポート番号: 12022
- [Debian noroot 環境][DBNR]におけるユーザ名 (環境変数 USER の値): u0_a200
- 接続元にインストールされた SSH クライアント: 各種 Linux ディストリビューションにインストールされた OpenSSH_6.7p1
- 接続元にインストールされた SSH クライアントにおけるユーザ名 (環境変数 USER の値): z80oolong

# 接続先への dropbear の導入

本章では、 SSH によるリモートログインの接続先となる [Debian noroot 環境][DBNR]へ [dropbear][DROP] を導入する手法について述べます。

本稿において前述したように、 [Debian noroot 環境][DBNR]上において起動する SSH サーバとして [dropbear][DROP] を使用します。本稿では、 Linux の各ディストリビューション上におけるソースコードの取得及びビルドに基づいたパッケージ管理システムである [Linuxbrew][BREW] を用いて [Debian noroot 環境][DBNR]に対応した [dropbear][DROP] を導入します。

まずは、 "[Debian noroot 環境に Linuxbrew を導入する][ZOLQ]" の投稿及び [Linuxbrew の公式ページ][BREW]に基づいて [Linuxbrew][BREW] に依存するパッケージと [Linuxbrew][BREW] 本体のリポジトリを導入します。

```shell-session
 $ sudo apt-get install build-essential curl file git python-setuptools ruby
 $ sudo apt-get install m4 texinfo libbz2-dev libcurl4-openssl-dev libexpat-dev libncurses-dev zlib1g-dev gettext    # 必要に応じて任意に導入する。
 $ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install)"
```

なお、 [32 bit ARM アーキテクチャ][ARMP]及び [64 bit x86 アーキテクチャ][X86P]以外を搭載した携帯端末にインストールされた [Debian noroot 環境][DBNR]に [Linuxbrew][BREW] を導入する場合、前述の [Linuxbrew][BREW] の本体のリポジトリを導入するコマンドを実行すると、途中で [Linuxbrew][BREW] が使用する [ruby 処理系][RUBY]の bottle ファイルの取得に失敗して、導入作業が正常に行われません。

従って、これらの携帯端末における環境の場合は、 "[Linuxbrew の自動的なインストールスクリプトが異常終了する場合における代替の導入手法][ZOQ2]" の投稿に基づき、 [Linuxbrew の開発コミュニティ][BREW]による [Linuxbrew][BREW] のインストールスクリプトに代えて、下記のようにして [Linuxbrew][BREW] を導入する必要が有ります。

```shell-session
 $ sudo apt-get install build-essential curl file git python-setuptools ruby
 $ sudo apt-get install m4 texinfo libbz2-dev libcurl4-openssl-dev libexpat-dev libncurses-dev zlib1g-dev gettext    # 必要に応じて任意に導入する。
 $ sudo apt-get install libssl-dev libreadline6-dev libyaml-dev libgdbm-dev libdb-dev
 $ sh -c "$(curl -fsSL https://raw.githubusercontent.com/z80oolong/linuxbrew-altinstall/master/install.sh)"
```

そして、 ```bash``` の初期化ファイルである ```${HOME}/.bashrc``` について、以下の通りに環境変数の設定を行い、  ```bashrc``` を再起動します。

```sh:${HOME}/.bashrc
...
# for Linuxbrew

export HOMEBREW_PREFIX="/home/linuxbrew/.linuxbrew"
export PATH="${HOMEBREW_PREFIX}/sbin:${HOMEBREW_PREFIX}/bin:$PATH"
export MANPATH="${HOMEBREW_PREFIX}/share/man:${MANPATH}"
export INFOPATH="${HOMEBREW_PREFIX}/share/info:${INFOPATH}"
export HOMEBREW_NO_AUTO_UPDATE=1
...
```

次に、以下の通りに ```brew tap``` コマンド及び ```brew install``` コマンドを実行して、 [Debian noroot 環境][DBNR]に対応した [dropbear][DROP] を導入します。

```shell-session
 $ brew tap z80oolong/debian-noroot
 $ brew install -dv z80oolong/debian-noroot/dropbear
```

**この時、ソースコードのコンパイルに時間が掛かると思われますが、我慢強くインストールの完了を待つ必要が有ります。この場合、 Android 端末に CPU の性能とメモリ容量が潤沢にあれば、別に他の必要な [Android OS][ANDR] アプリを起動して [Linuxbrew][BREW] でのインストールの完了を待っても構いません。**

なお、 [dropbear][DROP] において SFTP に基づくファイル転送を行う場合は、 [OpenSSH][OSSH] サーバに同梱された SFTP サーバである ```openssh-sftp-server``` パッケージを ```apt-get``` コマンドを用いて導入する必要があります。

```shell-sesssion
 $ sudo apt-get install openssh-sftp-server
```

# パスワード認証に基づく SSH による接続の設定

本章では、接続先となる [Debian noroot 環境][DBNR] に導入した [dropbear][DROP] について、パスワード認証に基づいた SSH のリモートログインを行うための設定について述べます。

まず最初に、 "[Debian noroot 環境のユーザのパスワードを変更する][SEC0201]" の節において、 [Debian noroot 環境][DBNR]に導入した [dropbear][DROP] へのリモートログインの設定に先立って、 [Debian noroot 環境][DBNR]のユーザのパスワードを変更する設定について述べます。

次に、 "[接続先の ```$HOME/.bashrc``` を設定する][SEC0202]" の節において、接続先となる [Debian noroot 環境][DBNR]上の [dropbear][DROP] への SSH のリモートログインの接続において、日本語環境等の主要な環境変数を反映させるための、接続先の ```$HOME/.bashrc``` の設定について述べます。

そして、 "[接続先の ```$HOMEBREW_PREFIX/etc/dropbear/dropbear.d``` を設定する][SEC0203]" の節において、接続先となる [Debian noroot 環境][DBNR]上の ```dropbear``` デーモンが待ち受けるポート番号等を指定するための、 ```dropbear``` デーモンの起動スクリプトである ```$HOMEBREW_PREFIX/etc/dropbear/dropbear.d``` の設定について述べます。

最後に、 "[パスワード認証に基づく SSH による接続の確認][SEC0204]" の節において、接続先となる [Debian noroot 環境][DBNR]において、パスワード認証に基づく SSH を用いたリモートログインによる接続を確認する手法について述べます。

## Debian noroot 環境のユーザのパスワードを変更する

本節では、 SSH クライアントをインストールした遠隔の PC 端末から [Debian noroot 環境][DBNR] の [dropbear][DROP] へパスワード認証に基づいた SSH のリモートログインを行うために、 [Debian noroot 環境][DBNR] のユーザのパスワードをユーザ自身以外に知り得ないものに変更する設定について述べます。

[Debian noroot 環境][DBNR] においては、通常の [Debian 環境][DEBI]と同様に sudo 経由で ```passwd``` コマンドを用いて任意のユーザのパスワードを変更することが出来ます。

即ち、以下のように ```passwd``` コマンドを実行して、ユーザ u0_a200 のパスワードをユーザ自身以外に知り得ないものに変更します。

```shell-session
  $ env LANG=C LC_ALL=C sudo passwd u0_a200
  Changing password for u0_a200
  New UNIX password:			# (ユーザ自身以外に知り得ないパスワードを入力)
  Retype new UNIX password:		# (前に入力したパスワードを再入力)
  passwd: all authentication tokens updated successfully
  $
```

上記のコマンド ```passwd``` の実行により、[Debian noroot 環境][DBNR] のユーザのパスワードを変更することが出来ます。

## 接続先の ```$HOME/.bashrc``` を設定する

本節では、 [Debian noroot 環境][DBNR]上の [dropbear][DROP] への SSH のリモートログインにおいて、日本語環境及び [Debian noroot 環境][DBNR]の動作の上で必要となる主要な環境変数を反映させるために、接続先の ```$HOME/.bashrc``` を設定する手法について述べます。

後述で行う、接続先となる [Debian noroot 環境][DBNR]上の [dropbear][DROP] へのパスワード認証に基づいた SSH のリモートログインによる接続確認において判る通り、 [dropbear][DROP] を用いた SSH によるリモートログインの環境においては、日本語 locale 及び日本語入力メソッド関連等の環境変数が反映されません。

ここで、接続先の SSH によるリモートログイン環境においては、接続先および接続元の IP アドレス及びポート番号に関する情報は、環境変数 ```SSH_CONNECTION``` に保持されています。

即ち、接続先の SSH によるリモートログインシェルの初期化ファイルである ```${HOME}/.bashrc``` に下記の記述を追記します。


```sh:${HOME}/.bashrc
...
# SSH によるリモートログイン環境の場合は、主要な環境変数を $HOME/.bashrc で再定義する。

case `echo ${SSH_CONNECTION} | cut -d ' ' -f 1` in
  192.168.0.*)
    export TZ="Asia/Tokyo"
    export LANG="ja_JP.UTF-8"
    export LC_ALL="ja_JP.UTF-8"
    export LANGUAGE="ja"
    export XMODIFIERS="@im=fcitx"
    export GTK_IM_MODULE=fcitx
    export QT_IM_MODULE=fcitx
    export QT4_IM_MODULE=fcitx
    export CLUTTER_IM_MODULE=fcitx
    export VTE_CJK_WIDTH=1
  ;;
...

esac
...
```

上記の記述により、接続先の SSH によるリモートログイン環境において、日本語環境関連の設定に関する重要な環境変数が反映されます。

## 接続先の ```$HOMEBREW_PREFIX/etc/dropbear/dropbear.d``` を設定する

本節では、接続先となる [Debian noroot 環境][DBNR]上の [dropbear][DROP] において、 ```dropbear``` デーモンが待ち受けるポート番号及び root によるログイン等の抑止を行うために、 ```dropbear``` デーモンの起動スクリプトである ```${HOMEBREW_PREFIX}/etc/dropbear/dropbear.d``` を設定する手法について述べます。

最初に、 ```dropbear``` デーモンの起動スクリプトである ```${HOMEBREW_PREFIX}/etc/dropbear/dropbear.d``` を必要に応じて下記のように編集します。編集する箇所は下記の２箇所です。

```sh:${HOMEBREW_PREFIX}/etc/dropbear/dropbear.d
...
PORT=12022
#SERVER_OPTION="-W 65536 -s -w -g"
SERVER_OPTION="-W 65536 -w -g"
...
```

まず、環境変数 ```PORT``` において、 ```dropbear``` デーモンが待ち受けるポート番号を指定します。このポート番号は必ず 1024 番以上を指定する必要があります。

そして、環境変数 ```SERVER_OPTION``` において、  ```dropbear``` デーモンに追加する引数を指定します。本稿においては、下記のように引数を追加します。

- ```-W <receive_window_buffer>``` … receive_window_buffer のサイズを指定する。この数値が大きいほど接続速度が若干早くなる。
- ```-w``` … root によるログインを抑止する。
- ```-g``` … root によるパスワードを用いたログインを抑止する。

また、以下の引数を一旦無効にします。

- ```-s``` … パスワードを用いたログインを抑止する。

上記の記述により、 [Debian noroot 環境][DBNR]への SSH によるリモートログインをポート番号 12022 で待ち受け、ユーザによるパスワードを用いた認証を有効にし、 root によるログインを完全に抑止します。

## パスワード認証に基づく SSH による接続の確認

本節では、接続先となる [Debian noroot 環境][DBNR]において ```dropbear``` デーモンを一時的に起動し、パスワード認証に基づく SSH を用いたリモートログインによる接続を確認する手法について述べます。

まず最初に、 [dropbear][DROP] の起動スクリプトである ```${HOMEBREW_PREFIX}/etc/dropbear/dropbear.d``` を下記のように実行して、接続先となる [Debian noroot 環境][DBNR] の ```dropbear``` デーモンを起動します。

```shell-session
  $ $HOMEBREW_PREFIX/etc/dropbear/dropbear.d start
  Start Dropbear Daemon...
  Creating PID file "/var/run/dropbear.pid".
  Appending to /var/log/dropbear.log
  $
```

そして、接続元となる遠隔の PC 端末上にインストールされた SSH クライアントである ```ssh``` コマンドを下記のように起動します。

```shell-session
  $ ssh -l u0_a200 -p 12022 192.168.0.1
  The authenticity of host '192.168.0.1 (192.168.0.1)' can't be established.
  RSA key fingerprint is 11:22:33:44:55:66:77:88:99:aa:bb:cc:de:ad:be:ef.
  Are you sure you want to continue connecting (yes/no)?	# (ここでは、そのままリターンキーを入力)
  ...
  u0_a200@192.168.0.1's password:	# (ここで、 Debian noroot のユーザのパスワードを入力)
  
  The programs included with the Debian GNU/Linux system are free software;
  the exact distribution terms for each program are described in the
  individual files in /usr/share/doc/*/copyright.

  Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
  permitted by applicable law.
  $ 
```

上記のように [dropbear][DROP] の banner が表示され、リモートログインシェルが起動すれば、設定が正常に行われていることが判ります。

# 公開鍵認証に基づく SSH による接続の設定

本章では、接続先となる [Debian noroot 環境][DBNR] に導入した [dropbear][DROP] について、公開鍵認証に基づいた SSH のリモートログインを行うための設定について述べます。

最初に、 "[接続元における公開鍵及び秘密鍵を生成する][SEC0301]" の節において、公開鍵認証に基づいた SSH のリモートログインを行うために必要となる公開鍵方式における秘密鍵と公開鍵の対を生成する手法について述べます。

次に、 "[接続元から接続先へ公開鍵を転送する][SEC0302]" の節において、[前節][SEC0301]において生成した公開鍵を、 SSH によるリモートログインの接続先となる [Debian noroot 環境][DBNR]に転送する手法について述べます。

そして、 "[接続元の ```$HOME/.ssh/config``` を設定する][SEC0303]" の節において、 SSH によるリモートログインの接続元となる SSH クライアントの設定ファイルである ```${HOME}/.ssh/config``` において必要となる設定について述べます。

最後に、 "[公開鍵認証に基づく SSH による接続の確認][SEC0204]" の節において、接続先となる [Debian noroot 環境][DBNR]において、認証に基づく SSH を用いたリモートログインによる接続を確認する手法について述べます。

## 接続元における公開鍵及び秘密鍵を生成する

本節では、 SSH によるリモートログインの接続元の遠隔の PC 端末において、 SSH クライアントで使用するために必要となる秘密鍵と公開鍵の対を ```ssh-keygen``` コマンドを用いて生成する手法について述べます。

まず、 ```ssh-keygen``` コマンドを起動して、公開鍵暗号方式における公開鍵と秘密鍵の対を生成します。本稿では、 RSA に基づいた鍵の対を生成するものとします。

```shell-session
 $ ssh-keygen -t rsa -f /home/z80oolong/.ssh/id_rsa.foo                                                                                             
 Generating public/private rsa key pair.                                                                                                                             
 Enter passphrase (empty for no passphrase):	# ここで、パスワードの入力は空文字列を含め任意 (空文字列とすることを勧めます)。                                                                                                         
 Enter same passphrase again:					# 再度、空文字列を含め同一のパスワードを入力
 Your identification has been saved in /home/z80oolong/.ssh/id_rsa.foo.
 Your public key has been saved in /home/z80oolong/.ssh/id_rsa.foo.pub.
 ...
 $
```

上記の ```ssh-keygen``` コマンドの実行により、接続元の PC 端末のディレクトリ ```/home/z80oolong/.ssh``` 以下に秘密鍵ファイル ```id_rsa.foo``` と公開鍵ファイル ```id_rsa.foo.pub``` が生成されているのが判ります。

## 接続元から接続先へ公開鍵を転送する

本節では、[前節][SEC0301]において ```ssh-keygen``` コマンドによって生成した公開鍵ファイル ```/home/z80oolong/.ssh/id_rsa.foo.pub``` を接続先となる [Debian noroot 環境][DBNR]に転送する手法について述べます。

本稿では、接続元から接続先に公開鍵ファイルを転送し、接続元の環境に適切な設定を行う為の簡便なコマンドである ```ssh-copy-id``` コマンドを用います。

まず、以下のようにして ```ssh-copy-id``` コマンドを実行し、公開鍵ファイル ```/home/z80oolong/.ssh/id_rsa.foo.pub``` を転送します。

```shell-session
  $ ssh-copy-id -i /home/z80oolong/.ssh/id_rsa.foo.pub -p 12022 u0_a200@192.168.0.1
  Password:	# (ここで、 Debian noroot のユーザのパスワードを入力)
  ...
  Now try logging into the machine, with "ssh 'u0_a200@192.168.0.1'", and check in:
  ...
```

上記の ```ssh-copy-id``` コマンドの実行により、接続元の PC 端末によって生成された公開鍵ファイル ```/home/z80oolong/.ssh/id_rsa.foo.pub``` が接続先の [Debian noroot 環境][DBNR]に転送され、その公開鍵ファイルの内容が、接続先のディレクトリ ```/home/u0_a200/.ssh``` 以下にある公開鍵リストファイル ```authorized_keys``` の最終行に自動的に追記されます。

## 接続元の ```$HOME/.ssh/config``` を設定する

本節では、 SSH によるリモートログインの接続元となる遠隔の PC 端末にインストールされた SSH クライアントの設定ファイルである ```${HOME}/.ssh/config``` において、接続先の IP アドレスとポート番号及び認証方式の指定等の SSH によるリモートログインを行う上で必要となる設定を記述する手法について述べます。

まず最初に、接続元の遠隔の PC 端末にインストールされた SSH クライアントの設定ファイルである ```${HOME}/.ssh/config``` に下記の記述を追加します。

```sh:${HOME}/.ssh/config
...
Host noroot
  HostName               192.168.0.1		# Debian noroot 環境が動作している端末の IP アドレス
  Port                   12022				# Debian noroot 環境上で動作している dropbear のポート番号
  PasswordAuthentication no					# パスワード認証による接続を行わない
  PubkeyAuthentication   yes				# 公開鍵認証による接続を行う
  User                   u0_a200			# Debian noroot 環境上でのユーザ名	
  IdentityFile           ~/.ssh/id_rsa.foo	# 公開鍵認証方式での認証に用いる公開鍵と対になる秘密鍵が存在するパス
  RequestTTY             yes                # 標準入力が TTY の場合はTTYを要求する
...
```

また、上記の設定に加えて、下記の記述を追記すると、[次節][SEC0304]で後述する X11 フォワーディングの機能が使用できるようになります。

```sh:${HOME}/.ssh/config
Host noroot
  HostName               192.168.0.1		# Debian noroot 環境が動作している端末の IP アドレス
  Port                   12022				# Debian noroot 環境上で動作している dropbear のポート番号
  PasswordAuthentication no					# パスワード認証による接続を行わない
  PubkeyAuthentication   yes				# 公開鍵認証による接続を行う
  User                   u0_a200			# Debian noroot 環境上でのユーザ名	
  IdentityFile           ~/.ssh/id_rsa.foo	# 公開鍵認証方式での認証に用いる公開鍵と対になる秘密鍵が存在するパス
  RequestTTY             yes                # 標準入力が TTY の場合は TTYを要求する
  ForwardX11             yes				# ← ForwardX11	yes の行を追記する
  ForwardX11Trusted      yes				# ← ForwardX11Trusted	yes の行を追記する
```

## 公開鍵認証に基づく SSH による接続の確認

本節では、接続先となる [Debian noroot 環境][DBNR]において ```dropbear``` デーモンを一時的に起動し、パスワード認証に基づく SSH を用いたリモートログインによる接続を確認する手法について述べます。

まず最初に、接続先となる [Debian noroot 環境][DBNR]において ```dropbear``` デーモンが起動しているかどうかを ```ps awxu | grep dropbear``` コマンドを用いて確認します。

```shell-session
  $ ps awxu | grep dropbear
  ...(略)...
  u0_a200  27085  0.0  0.0   2564     0 ?        Ss    2月13   0:00 /home/linuxbrew/.linuxbrew/opt/dropbear/sbin/dropbear -p 12022 -d /home/linuxbrew/.linuxbrew/etc/dropbear/dropbear_dss_host_key -r /home/linuxbrew/.linuxbrew/etc/dropbear/dropbear_rsa_host_key -r /home/linuxbrew/.linuxbrew/etc/dropbear/dropbear_ecdsa_host_key -W 65536 -s -w -g -F -E
  ...(略)...
```

もし ```dropbear``` デーモンが起動していなければ、 [dropbear][DROP] の起動スクリプトである ```${HOMEBREW_PREFIX}/etc/dropbear/dropbear.d``` を下記のように実行して、接続先となる [Debian noroot 環境][DBNR] の ```dropbear``` デーモンを改めて起動し直します。

```shell-session
  $ $HOMEBREW_PREFIX/etc/dropbear/dropbear.d start
```

そして、接続元となる遠隔の PC 端末上にインストールされた SSH クライアントである ```ssh``` コマンドを下記のように起動します。

```shell-session
  $ ssh noroot
  ...(ここで、秘密鍵と公開鍵の対にパスワードを設定していれば入力を促され、設定していなければそのままログインプロンプトが表示される。)...
  The programs included with the Debian GNU/Linux system are free software;
  the exact distribution terms for each program are described in the
  individual files in /usr/share/doc/*/copyright.

  Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
  permitted by applicable law.
  $ 
```

上記のように [dropbear][DROP] の banner が表示され、リモートログインシェルが起動すれば、設定が正常に行われていることが判ります。

また、[前節][SEC0303]において述べた設定において、 X11フォワーディングの機能を有効にしている場合は、リモートログインシェルから下記のように ```xeyes``` コマンドを起動すると、以下の画像のように、接続元となる遠隔の PC 端末の画面に ```xeyes``` の実行結果である目玉が表示されます。

```shell-session
 $ xeyes
```

![(xeyes)][IMG1]


最後に、安全のために ```dropbear``` デーモンがパスワードを用いた SSH によるリモートログインを抑止するように、 ```dropbear``` デーモンの起動スクリプトである ```${HOMEBREW_PREFIX}/etc/dropbear/dropbear.d``` を下記のように修正します。

```sh:${HOMEBREW_PREFIX}/etc/dropbear/dropbear.d
...
PORT=12022
SERVER_OPTION="-W 65536 -s -w -g"  # (一旦無効にした -s オプションを再度追記する。)
...
```

以上の設定により、 ```dropbear``` デーモンは、接続元からのパスワードを用いた SSH によるリモートログインを抑止します。

# 接続先の ```dropbear``` デーモンの起動の自動化

本章では、 [前々章][CHAP02]及び[前章][CHAP03]において設定した SSH によるリモートログインの接続環境を [Debian noroot 環境][DBNR]を起動した直後に自動的に起動することが出来るように設定する手法について述べます。

ここで、 SSH によるリモートログインの接続環境を [Debian noroot 環境][DBNR]を起動した直後に自動的に起動するには、 [Debian noroot 環境][DBNR]においてウィンドウマネージャを起動し、デスクトップ環境を整えるためのシェルスクリプトである ```/startx.sh``` に下記のような設定を追記します。

```sh:/startx.sh
...
fakeroot-tcp /usr/bin/env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin dbus-daemon --system
# ↓ ${HOMEBREW_PREFIX}/etc/dropbear/dropbear.d を起動するコマンドを追加。念の為に末尾の & を忘れないこと。
/home/linuxbrew/.linuxbrew/etc/dropbear/dropbear.d start &
...
# ↓ xfce-session の直後に /home/linuxbrew/.linuxbrew/etc/dropbear/dropbear.d を停止するコマンドを追加。
dbus-launch --exit-with-session sh -c 'xfce4-session ; /home/linuxbrew/.linuxbrew/etc/dropbear/dropbear.d stop; setsid sh -c "cd /proc/ ; for f in [0-9]* ; do [ \$f = \$\$ ] || kill -9 \$f ; done"' &
...
```

即ち、 ```dbus-daemon``` デーモンを起動している行の直後に、 [dropbear][DROP] を起動する為のシェルスクリプト ```${HOMEBREW_PREFIX}/etc/dropbear/dropbear.d``` を start によって起動し、 [Debian noroot 環境][DBNR]をログアウトさせて ```xfce-session``` コマンドが終了した直後に、シェルスクリプト ```/etc/init.d/dropbear``` を stop によって停止させる設定を追記します。

以上の設定により、 SSH によるリモートログインの接続先となる [Debian noroot 環境][DBNR]を起動した後は、自動的に ```dropbear``` デーモンが起動し、 [Debian noroot 環境][DBNR]と遠隔で繋がる端末で、[前々章][CHAP02]において設定した SSH によるリモートログインの接続が確認された端末であれば、遠隔の SSH によるリモートログインの接続元の端末から SSH クライアントを用いてリモートログインを行い、 [Debian noroot 環境][DBNR]を遠隔から操作することが出来るようになります。

# 結論

[Debian noroot 環境][DBNR]において、各種 Linux ディストリビューションで多く用いられている [OpenSSH][OSSH] を導入することは、ディレクトリ ```/var/run/sshd``` の権限及び所有者の問題から適切で無かったため、 [OpenSSH][OSSH] に代えて、軽量な SSH サーバである [dropbear][DROP] を [Debian noroot 環境][DBNR]における SSH サーバとして用いて SSH によるリモートログイン環境の構築を行いました。

まず最初に、パスワードによる認証に基づいた SSH によるリモートログインによって、接続元となる SSH クライアント端末から [Debian noroot 環境][DBNR]に接続することが可能であることを確認しました。

その後、接続元となる SSH クライアント端末で生成した秘密鍵と公開鍵の対のうち、公開鍵を [Debian noroot 環境][DBNR]に転送して、接続元の SSH クライアント端末に適切な設定を行うことにより、公開鍵方式による認証に基づいた SSH によるリモートログインによって、接続元となる SSH クライアント端末から [Debian noroot 環境][DBNR]に接続することが可能であることを確認しました。

そして、  [Debian noroot 環境][DBNR]の起動時に SSH によるリモートログイン環境が自動的に起動するように、 [Debian noroot 環境][DBNR]のウィンドウマネージャを起動するためのシェルスクリプトである ```/startx.sh``` に ```dropbear``` デーモンを起動する設定を追記しました。

以上の設定により、 SSH によるリモートログイン環境を構築した [Debian noroot 環境][DBNR]を起動した後は、 [Debian noroot 環境][DBNR]が動作している [Android OS][ANDR] 端末に触れることなく、 SSH クライアントをインストールした遠隔の PC 端末から [Debian noroot 環境][DBNR]を操作することが出来るようになりました。

また、 [dropbear][DROP] は SSH によるリモートログインにおける X11 フォワーディングの機能を備えているため、 [Debian noroot 環境][DBNR]上で起動する X クライアントソフトを遠隔の PC 端末に表示させることが出来ることも判りました。

# 謝辞

本稿の記述に当たって、最初に [Android OS][ANDR] 端末上で非常に軽快な [Debian 環境][DEBI]を実現することを可能にした [Debian noroot 環境][DBNR]の開発者である [pelya 氏][PELY]に心より感謝致します。
 
次に、 [dropbear][DROP] の導入にあたってパッケージ管理システムとして使用した [Linuxbrew][BREW] の導入に関しては [thermes 氏][THER]による "[Linuxbrew のススメ][THBR]" 及び [Linuxbrew の公式ページ][BREW]等各種関連記事を参考にしました。 [thermes 氏][THER]及び [Linuxbrew の開発コミュニティ][BREW]の各氏に心より感謝致します。

また、 [dropbear][DROP] の設定に関しては、 [Dropbear 公式ページ][DROP]を参考にしました。 [dropbear][DROP] の作者である Matt Johnston 氏他 [dropbear][DROP] に関わる全ての方々に心より感謝致します。

そして、 SSH に関する各種設定に関しては、多数の SSH に関連する Web page を参照しました。 SSH による接続に関わる全ての方々に心より感謝致します。

最後に、 [Debian noroot 環境][DBNR]と [Android OS][ANDR] 及び [Debian 環境][DEBI]の全ての事に関わる全ての皆様に心より感謝致します。

# 追記とお断り

## 2017/10/05 現在の追記とお断り

[Debian noroot 環境][DBNR] における ```apt-get``` を用いて導入した [dropbear][DROP] では、 [Android OS 5.0][ANDR] 上において正常に動作しない事が判明しましたので、御詫びして訂正すると共に、 [Linuxbrew][BREW] を用いて [dropbear][DROP] を導入する手法に基づいて本稿を大幅に改稿致しました。どうか御了承下さい。

## 2018/01/22 現在の追記とお断り

[64 bit ARM アーキテクチャ等の環境で動作する Debian noroot 環境への Linuxbrew の導入に関する問題の解決手法][ZOQ2]について加筆を行い、本稿を改稿致しました。どうか御了承下さい。

## 2018/02/04 現在の追記とお断り

[Linuxbrew][BREW] を[自動的にインストールするための代替となるスクリプトの作成と公開][GIT1]に伴い、本稿を改稿致しました。どうか御了承下さい。

## 2018/02/14 現在の追記とお断り

[パスワード認証に基づく SSH による接続の設定][CHAP02]に関する記述の追記に伴い、本稿を大幅に改稿致しました。どうか御了承下さい。

## 2018/06/08 現在の追記とお断り

[Linuxbrew][BREW] を[自動的にインストールするための代替となるスクリプト][GIT1]の更新と、代替スクリプトの実行手法の変更に伴い、本稿を改稿致しました。どうか御了承下さい。

## 2018/10/11 現在の追記とお断り

[Linuxbrew][BREW] を[自動的にインストールするための代替となるスクリプト][GIT1]の実行の際に、 [Linuxbrew][BREW] が使用する [ruby 処理系][RUBY]をソースコードからコンパイルする際に必要となるパッケージについて訂正を行いました。どうか御了承下さい。

## 2018/12/29 現在の追記及び御詫びと訂正

"[接続元の ```$HOME/.ssh/config``` を設定する][SEC0303]" の X Forwarding の設定に関する記述において以下の誤りがありました。以下の設定が正当な設定です。

```sh:${HOME}/.ssh/config
Host noroot
  ...(略)...
											# ← (誤) X11Forwarding yes の行を追記する
  ForwardX11			 yes				# ← (正) ForwardX11	yes の行を追記する
											# ← (誤) X11ForwardingTrust yes の行を追記する
  ForwardX11Trusted   	 yes				# ← (正) ForwardX11Trusted	yes の行を追記する
```

以上、皆様に御迷惑を御掛け致しました事を御詫び致しますと共に、本文における接続元の ```$HOME/.ssh/config``` の設定を訂正致します。

<!-- 各章及び各節へのリンク一覧 -->

[CHAP01]:#接続先への-dropbear-の導入
[CHAP02]:#パスワード認証に基づく-ssh-による接続の設定
[CHAP03]:#公開鍵認証に基づく-ssh-による接続の設定
[CHAP04]:#接続先の-dropbear-デーモンの起動の自動化
[CHAP05]:#結論
[SEC0201]:#debian-noroot-環境のユーザのパスワードを変更する
[SEC0202]:#接続先の-homebashrc-を設定する
[SEC0203]:#接続先の-homebrew_prefixetcdropbeardropbeard-を設定する
[SEC0204]:#パスワード認証に基づく-ssh-による接続の確認
[SEC0301]:#接続元における公開鍵及び秘密鍵を生成する
[SEC0302]:#接続元から接続先へ公開鍵を転送する
[SEC0303]:#接続元の-homesshconfig-を設定する
[SEC0304]:#公開鍵認証に基づく-ssh-による接続の確認

<!-- 外部リンク一覧 -->

[DBNR]:https://play.google.com/store/apps/details?id=com.cuntubuntu&hl=ja
[ANDR]:https://www.android.com/intl/ja_jp/
[DEBI]:https://www.debian.org/index.ja.html
[OSSH]:https://www.openssh.com/
[DROP]:https://matt.ucc.asn.au/dropbear/dropbear.html
[BREW]:http://linuxbrew.sh/
[THER]:https://qiita.com/thermes
[THBR]:https://qiita.com/thermes/items/926b478ff6e3758ecfea
[ZOLQ]:https://qiita.com/z80oolong/items/bfa986438adf8aac51ab
[ZOQ2]:https://qiita.com/z80oolong/items/61feb20a9356532a15da
[GIT1]:https://github.com/z80oolong/linuxbrew-altinstall
[RUBY]:https://www.ruby-lang.org/ja/
[ARMP]:https://www.arm.com/
[X86P]:https://www.intel.co.jp/content/www/jp/ja/homepage.html
[GRIV]:https://www.google.com/intl/ja_ALL/drive/
[OWNC]:https://owncloud.org/
[IMG1]:https://qiita-image-store.s3.amazonaws.com/0/86258/bdfc0bde-fce2-91b7-8a06-fa2badfc6e48.png
[PELY]:https://github.com/pelya