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

追記 (2019/03/22)

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

はじめに

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

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

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

なお、本稿においては特段の断りのない限り、 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 によるリモートログインを抑止するように、 OpenSSH の SSH サーバの設定ファイルである /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  
  ...(略)...  

謝辞

Debian noroot 環境から SSH クライアントを起動する際に X11 forwarding に関する問題について、問題報告と障害再現及び問題回避に際しては、 @cakecakecake 氏の多大な助言及び協力を得ました。 @cakecakecake 氏に心より感謝致します。

この記事へのコメント

まだコメントはありません