sshログインにデフォルト以外のログインシェルを使用する方法


9

現在、認証にLDAPを使用するネットワークで作業しています。zshログインシェルとして設定したsshところ、明らかにzshインストールされていないネットワーク上のマシンの1つを介してリモートアクセスを取得する問題に遭遇しました。ログインは失敗します

Dec 8 19:16:11 abert sshd[20649]: User sorokine not allowed because shell /bin/zsh does not exist

したがって、質問は基本的に:LDAPで構成されたものとは異なるログインシェルを使用するようにリモートマシンに指示するにはどうすればよいですか?

OpenSSH_6.0p1 Debian-4 + deb7u2、OpenSSL 1.0.1e


LDAPシェルをなどのより普遍的なものに変更し、/bin/shリモート~/.profileexecに適切なシェルがある場合はそれを適切なシェルに変更することを検討しましたか?
RobertL

それはオプションですが、あまりクリーンではないので、可能であればそれを避けたいと思います。
Sascha

回答:


10

ログインシェルが一部のマシンで実行できない場合、SSHを介して、または他のほとんどの方法でログインシェルにログインできません。SSHサーバーは常にログインシェルを実行します。sshコマンドラインでコマンドを渡す-cと、引数としてコマンド文字列¹を使用してログインシェルが実行されます。それ以外の場合、ログインシェルは引数なしのログインシェルとして実行されます。

ログインシェルをバイパスする方法があった場合、それはセキュリティホールになります。ログインシェルを1つの特定のタスクのみを実行するプログラムにすることで、アカウントを制限付きアカウントとして構成できます。たとえば、ログインシェルはgit-shellgitリポジトリrsshなどへのアクセスのみを許可することができます。

そのマシンにログインするには、/bin/zsh存在するように準備するか、ログインシェルを存在するものに変更する必要があります。

このような異種環境では/bin/sh、ログインシェルはどこにでも存在するので、ログインシェルとして使用することをお勧めします。SHELL環境変数を設定します(/bin/zsh存在する場合)。これにより、zshを対話型シェルとして取得できます。

if [ -x /bin/zsh ]; then
  export SHELL=/bin/zsh
fi

これにより、へのパスをハードコーディングする必要がなくなりますzsh

if SHELL=$(command -v zsh); then
  export SHELL
else
  unset SHELL
fi

テキストモードログインでzshを自動的に実行するには、から呼び出します.profile。を使用.zprofileして設定したい場合は、ログインシェルにしてください(ただし、zshが存在しないマシンでは同じ環境を取得できないため、お勧めしません)。これがインタラクティブなログインである場合にのみ、これを.profile実行してください。スクリプトによって実行されたときや、GUIモードのログイン中などではありません。

if case $- in *i*) true;; *) false;; esac &&  # interactive shell
   [ -z "$ZSH_VERSION" ] &&                   # not running zsh yet
   type zsh >/dev/null 2>/dev/null; then      # zsh is present
  exec zsh
fi

¹ SSHクライアントは、間にスペースをその非オプションの引数を連結し、接続を介して、結果の文字列を送信します。SSHプロトコルは、コマンドを文字列のリストではなく、文字列として定義します。


詳しい説明ありがとうございます。それはリモートマシンにzshをインストールすることを含まない唯一の方法であるように見え、完全に機能するので、私はそれに固執します。
Sascha

また[ "0$SHLVL" -lt 2 ]、デフォルトのログインシェルがサポートし$SHLVLているbash -l場合や、必要に応じて別のシェルを実行できる場合(たとえば、何らかの理由でzshが失敗した場合)にテストを追加することをお勧めします。したがってssh -t host bash -lbash後ろでzshを実行せずにログインシェルを実行します。また、私が代わるexec zshことにより、exec zsh -lそのよう.zloginファイルが供給されます。
vinc17

2

別の方法でアクセスする場合は、指定したマシンにシェルをインストールするか、管理者に要求してこれを実行するか、LDAPのシェルをリモートマシンに存在するシェルに変更する必要があります。

(open)sshdは常にユーザーシェルをチェックし、実行に渡されたものは常にそのシェルを実行します。別のシェルが渡されて実行されると、ユーザーシェルの引数として渡されて実行されます。たとえば、ユーザーシェルは '/ bin / sh'で、引数としてcshシェルを渡すと、 "/ bin / sh -c / bin / csh '。


redfastのコメントを読んでください。opensshを使用すると、デフォルトのシェルをバイパスできます。
Rui F Ribeiro

@Rui F Ribeiroもしそうなら、シェルを '/ bin / false'や '/ sbin / nologin'のようなものに設定する背後にあるロジックを取り除きます。ログイン後にシェルを変更することについて言及しているが、「/ bin / sh」がない場合は、上で書いたように(sh -c othersh)、それはうまくいきません。(Redhatでテスト済み)。
nkms

確かに、passwdに/ etc / shellsにリストされていないシェルがある場合は、とにかくログインしません。しかし、ログインが可能で、sshd_configが特定のシェルを強制しない限り、ユーザーが実行できるコマンドは公平なゲームです。たとえば、さらに2、3のテストを行うとssh -l user server "ps ax" | grep bash、デフォルトのシェルが常に呼び出されるとは限らないことに気づくでしょう。他のソリューションが実際に機能しないのは、zshが/ etc / shellsにないことのセキュリティチェックです
Rui F Ribeiro

@Rui F Ribeiroサーバー側でstrace -f sshdを実行します。あなたは"はexecve(" / binに/ bashの"[ "bashの"、 "-c"、 "PS"] ..."また、/ sbinに/ nologinには、中には/ etc /シェル有効なシェルであるようなものが表示されます。
nkms 2015

@RuiFRibeiro redfast00の答えは明らかに間違っています。nkmsのとおりです。
Gilles「SO-邪悪なことをやめなさい」
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.