ローカルフォールバックを使用するgettyの代わりにSSHログイン

ローカルフォールバックを使用するgettyの代わりにSSHログイン

私の問題の名前を正確に指定する方法がわかりません。

私のニーズに合ったTUIプログラムセットを含むサーバーがあるというシナリオです。

ネットワーク上の他のユーザーがraspiや恐竜コンピュータなどの小さなものを開くことを望み、起動すると、ユーザーは通常はローカルログインのgettyを見ることができませんが、代わりにサーバーにsshを表示します。サーバーが応答しない場合にのみ、ローカルログイン情報がユーザーに提供されます。

この種のシナリオは、新しくもラジカルではないようです...私の考えでは、基本的にSSHを介してtcp / ipに接続されたシンクライアントの概念です。

答え1

実際に可能です。私は1998年頃に大学で同様のことをしました。

デフォルトでは、標準プログラムではなくカスタムgettyバージョンのプログラムを呼び出すようにRasPiのプロセスを設定する必要があります。login/bin/login

login特にセキュリティを必要としない場合、またはプロトタイプのみを作成する場合、カスタム代替エントリはスクリプトです。しかし、深刻な実装のためには安全のためにコンパイルされたプログラムでなければならないと思います。スクリプトインタプリタを削除すると、実行するコードの量が最小限に抑えられ、競合状態やその他の攻撃を設定するのが難しくなります。

ただし、あなたのデザインにはユーザーエクスペリエンスの問題があるかもしれません。ユーザーがすでにログイン名を入力している場合は、パスワードのプロンプトが表示されるとすぐに、ほとんど何もしなくても、ほとんど反射動作でパスワードを直接入力できます。 SSH接続の試行が失敗し、同じログインが自動的にローカルログイン試行に再利用される場合、ユーザーは自分がサーバーに接続されていると考えてローカルログインを使用していることを発見した場合、混乱する可能性があります。

getty好ましくは、ローカルログイン用に変更されていない構成を使用して2番目の仮想コンソールに切り替えるなど、より慎重なアクションが必要です。ログインプロンプトの前に表示する/etc/issueために必要なキーストロークの手順を追加できます。getty副作用として、カスタムloginスクリプトまたはバイナリは基本的に次のように大幅に簡略化できます。

#!/bin/sh
REMOTEUSER="$1"
exec ssh -oEscapeChar=none "$REMOTEUSER"@your.server.example

この-oEscapeChar=noneオプションはOpenSSHを使用してキーストロークがエスケープされるのを防ぎ、ユーザーはSSHクライアントを使用してポートフォワーディングを設定したり他の空腹を実行したりすることはできません。

(またはその代替項目の1つでも)rootとして実行されるため、このコマンドを実行する前に、rootではなく一部のユーザーに切り替えることをお勧めしますlogin。ここでは、コンパイルされたプログラムがより柔軟になります。exec()ssh

いくつかのプログラミング経験がある場合は、/bin/login選択したLinuxディストリビューション用のソースコードパッケージをダウンロードしてハックできることを確認することをお勧めします。

getty基本的には2つの変更が必要です。指定されたユーザー名をパラメーターとして使用してログインするユーザー名を選択する代わりに、交換ユーザーが発信SSH接続用に予約されているハードコーディングされたユーザー名を使用できるようにすることもできます。loginexec()ログインプロセスの終わりにユーザーのシェルを使用する代わりに、SSHコマンドを使用してパラメータとしてexec()取得したユーザー名とサーバー名をgetty指定します。

答え2

私は次のようなものを使用することに傾いています/etc/profile(ユーザーのシェルがbash、ksh、または同様のものであると仮定します/etc/profile)。

if [[ $(ps h -o cmd $(ps h -o ppid $$)) =~ $(basename "$SHELL") ]] \
   || id | grep -q '(sshgroup)' \
   && fping -q remotehost; then
  set -e   # exit on any error, incl. user pressing ^C during
           # ssh-keygen or ssh-copy-id

  # generate a key if it doesn't already exist
  if [ ! -e ~/.ssh/id_rsa ] then
    ssh-keygen
  fi

  # install it on remote host if ~/.ssh/key-installed doesn't exist
  if [ ! -e ~/.ssh/key-installed ] ; then
    ssh-copy-id -i ~/.ssh/id_rsa.pub remotehost
    touch ~/.ssh/key-installed
  fi

  # rewrite the following if any users have a shell which doesn't
  # support arrays (ash, dash, posix sh, etc)
  ssh_args=(-oEscapeChar=none)
  exec ssh "${ssh_args[@]}" remotehost
fi

中国語:親プロセスがユーザーのシェルではない場合そしてこのユーザーは次の組織のメンバーです。sshgroup そしてリモートホストはpingに応答し、pingはリモートホストのsshに応答します(そして-edなので、sshsshexecセッションが終了するとすぐにユーザーはログアウトします)。それ以外の場合は、通常どおりログインが行われます。グループメンバーシップは以前にテストされたため、fping非会員は「fping」結果を待つ必要はありません。

ローカルホストとリモートホストのファイルにある適切なメッセージを/etc/motd使用して、ファイルが最終的にどのコンピュータに存在するかを強調することができます。

ユーザーがリモートホストにSSHキーを持っていない場合~/.ssh/authorized_keysでも、パスワードを要求します。スクリプトの断片ssh-keygenとコンテンツは、ssh-copy-idこれを防ぐ方法の最小限の例です。また、ログインするたびにではなく、1日に1回だけキーのパスワードを入力するだけでssh-agent実行する必要があるかもしれません。-t 86400

このようにグループメンバーシップを確認すると、特定のユーザー(たとえば、rootまたはroot以外の管理者アカウント)が自動的にリモートホストにSSHされることを簡単に除外できます。テストを元に戻し、自動的にすべてのユーザーにSSH経由で接続できます。いいえ特定のグループのメンバーです。

関連情報