Z.OOL.ネット信託統治領 はてな諸島

こちらは "Z.OOL.ネット信託統治領 はてな諸島" です。

Debian noroot 環境から SSH クライアントを起動する

深夜覚醒と早朝覚醒がここ最近酷い。
睡眠障害の問題は未だ解決されず。


[BGM]: Pyrolator - Passage to Melilla

本稿について

本稿は、技術的事項についての速報的で簡易な短信についての Z.OOL.ネット信託統治領 Qrunch 諸島からのクロス投稿です。

本稿は、以下の Qrunch 諸島の投稿から御覧になれます。どうか御了承下さい。

z80oolong.qrunch.io

追記 (2019/03/22)

日本語入力に必要な環境変数の受け渡しに関する設定を追記しました。

はじめに

Debian noroot とは、 Android OS 上において root 権限を取ることなく Debian 環境を構築するためのアプリケーションです。

CPU の性能とメモリ容量が潤沢にある Android OS 端末であれば、 Debian noroot の導入によって Android OS 端末上で非常に軽快な Debian 環境を実現することが出来ます。

本稿では、 Debian noroot 環境を接続元として、 Debian noroot 環境に導入した OpenSSHSSH クライアントを用いて外部の端末に接続する手法の概略について述べます。

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

  • SSH サーバが動作している接続先の端末の IP アドレス: 192.168.0.2
  • 接続先の端末上で動作する SSH サーバが待ち受ける SSH のポート番号: 22 (デフォルト値)
  • 接続先にインストールされた SSH サーバ : 各種 Linux ディストリビューションにインストールされた OpenSSH_6.7p1
  • 接続先にインストールされた SSH サーバにおけるユーザ名 (環境変数 USER の値): z80oolong

また、接続先の端末へのリモートログインの設定については、 X11 forwarding の設定も同時に行うものとします。

OpenSSH クライアントの導入

まず最初に、 OpenSSH のクライアントである ssh コマンドを使用するために、 Debian noroot 環境 に以下の通りにパッケージ openssh-client を導入します。

  $ sudo apt-get install openssh-client

以上のコマンドの実行により、 Debian noroot 環境 において OpenSSH のクライアントが使用できるようになります。

パスワードによる接続

次に、 Debian noroot 環境 から、接続先の端末にパスワード認証に基づく SSH によるリモートログインの設定を行います。

まず、接続先の端末において、 OpenSSH の設定ファイルである /etc/ssh/sshd_config において、最低限設定の内容が以下の通りとなっているかを確認します。

そして、設定ファイル /etc/ssh/sshd_config を修正した場合は、 SSH サーバの再起動を行います。

# ...(略)...
# 日本語入力時に必要な環境変数の受け渡しに関する設定
AcceptEnv XMODIFIERS *_IM_MODULE
# ...(略)...
PermitRootLogin no
# ...(略)...
# 共通鍵暗号認証を一時的に無効化
# PubkeyAuthentication yes # 一時的にコメントアウト
# ...(略)...
# パスワード認証を一時的に有効化
PasswordAuthentication yes
# PasswordAuthentication no # 一時的にコメントアウト
PermitEmptyPasswords no
# ...(略)...
ChallengeResponseAuthentication yes
# ChallengeResponseAuthentication no # 一時的にコメントアウト
# ...(略)...
# X11 forwarding 関連の設定
X11UseLocalhost yes
AllowAgentForwarding yes
AllowTcpForwarding yes
X11Forwarding yes
X11DisplayOffset 10
X11UseLocalhost yes
# ...(略)...

以上の通り、接続先の端末において、 SSH サーバの設定を行った後は、以下の通りに ssh コマンドを実行して、正常に接続先の端末にリモートログインが可能であることを確認します。

  $ ssh -l z80oolong 192.168.0.2
  z80oolong@192.168.0.2's password:         # (ここで、接続先の端末におけるユーザ z80oolong のパスワードを入力する。)
  …(略)…
  z80oolong@192.168.0.2: $

公開鍵暗号による接続

そして、 Debian noroot 環境 から、接続先の端末に公開鍵認証に基づく SSH によるリモートログインの設定を行います。

まず、接続先の端末の SSH サーバがパスワードに基づいた SSH によるリモートログインを抑止するように、 OpenSSHSSH サーバの設定ファイルである /etc/ssh/sshd_config を下記のように修正します。

そして設定ファイル /etc/ssh/sshd_config を修正した後に、 SSH サーバの再起動を行います。

# ...(略)...
# 共通鍵暗号認証を有効化
PubkeyAuthentication yes
# ...(略)...
# パスワード認証を無効化
PasswordAuthentication no
PermitEmptyPasswords no
# ...(略)...
ChallengeResponseAuthentication no
# ...(略)...

次に、 Debian noroot 環境上において、公開鍵と秘密鍵の生成と、接続先への公開鍵の転送について、前述した拙稿 "Debian noroot 環境において dropbear に基づく SSH サーバを導入する" の以下の節の記述と同様の手法で設定を行います。

そして、Debian noroot 環境上の SSH クライアントの設定ファイルである ${HOME}/.ssh/config を以下の通りに編集します。

Host remotehost    # 接続先の端末を識別するための任意の名前
  HostName               192.168.0.2        # 接続先の端末の IP アドレス
  User                   z80oolong          # 接続先の端末上でのユーザ名   
  PasswordAuthentication no                 # パスワード認証による接続を行わない
  PubkeyAuthentication   yes                # 公開鍵認証による接続を行う
  IdentityFile           ~/.ssh/id_rsa.foo  # 公開鍵認証方式での認証に用いる公開鍵と対になる秘密鍵が存在するパス
  RequestTTY             yes                # 標準入力が TTY の場合は TTYを要求する
  X11Forwarding          yes                # ← X11Forwarding yes の行を追記する
  X11ForwardingTrust     yes                # ← X11ForwardingTrust    yes の行を追記する
  SendEnv                XMODIFIERS *_IM_MODULE   # ← 日本語入力時に必要な環境変数の受け渡しに関する設定

以上の通り、接続先の端末において、 SSH サーバの設定を行った後は、以下の通りに ssh コマンドを実行して、正常に接続先の端末にリモートログインが可能であることを確認します。

  $ ssh remotehost
  ...(ここで、秘密鍵と公開鍵の対にパスワードを設定していれば入力を促され、設定していなければそのままログインプロンプトが表示される。)...
  ...(略)...
  z80oolong@192.168.0.2: $ 

なおここで、 Debian noroot 環境から、 X11 forwarding を有効にした ssh を起動し、接続先のシェルから下記のように xeyes コマンドを起動すると、以下のエラーメッセージを出力して異常終了します。

  $ xeyes
  connect /tmp/.X11-unix/X0: No such file or directory
  Error: Can't open display: localhost:10.0 
  $

これは、 Debian noroot 環境において使用されている X サーバである Xserver XDSL が、名前付きソケットでは無く 6000 番をポート番号とする TCP に基づいて X クライアントと通信を行っているのが原因であると考えられます。

この場合は、設定ファイル ${HOME}/.bashrc 等に以下の設定を追記する事によって問題を回避する事が出来ます。

  ...(略)...
  case $DISPLAY in
    :0.0)
      if [ -z "`xhost | grep -i inet6 | grep localhost`" ] ; then
        xhost +localhost;
      fi
      export DISPLAY=localhost:0.0
    ;;
    localhost*)
    ;;
  esac
  ...(略)...