1. ホーム
  2. ssh

[解決済み] SSH - シェルがなくてもログイン時に強制的にコマンドを実行する

2022-03-14 05:44:32

質問

ポートフォワーディングのためにシェルを持たない制限付きユーザーを作成しており、pubkey 経由のログイン時にスクリプトを実行する必要があるのですが、ユーザーが ssh -N user@host SSHサーバーにシェルを要求しない。

スクリプトは pubkey で認証された接続時に admin に警告する必要があるため、接続するユーザがスクリプトの実行をスキップできないようにする必要があります (例えば、接続時に ssh -N ).

試してみましたが、無駄でした。

  • にコマンドを設定する。 /etc/ssh/sshrc .
  • で command="COMMAND" を使用する。 .ssh/authorized_keys (man authorized_keys)
  • コマンドをユーザーのシェルとするスクリプトを設定する。( chsh -s /sbin/myscript.sh USERNAME )
  • でのマッチングユーザー /etc/ssh/sshd_config のようなものです。 Match User MYUSERNAME ForceCommand "/sbin/myscript.sh"

ユーザがシェルを要求した場合はすべて動作しますが、ポート転送のためだけにログを取り、シェル ( ssh -N は動作しません。

解決方法は?

スクリプトを実行するだけなら pam_exec .

基本的に、実行するスクリプトを参照するのは /etc/pam.d/sshd の構成になります。

session optional pam_exec.so seteuid /path/to/script.sh

いくつかのテストの後、次のように変更することができます。 optional から required .

こちらの回答もご覧ください " bash - sshログインが成功したときに電子メールアラートを設定するにはどうすればよいですか?- Ubuntuに質問する "で同様の依頼があります。

確かにこのスクリプトでは、環境変数の限られたサブセットしか利用できません。

LANGUAGE=en_US.UTF-8
PAM_USER=bitnami
PAM_RHOST=192.168.1.17
PAM_TYPE=open_session
PAM_SERVICE=sshd
PAM_TTY=ssh
LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
PWD=/

のユーザー情報を取得したい場合 authorized_keys このスクリプトが役に立つかもしれません。

#!/bin/bash
# Get user from authorized_keys
# pam_exec_login.sh
# * [ssh - What is the SHA256 that comes on the sshd entry in auth.log? - Server Fault](https://serverfault.com/questions/888281/what-is-the-sha256-that-comes-on-the-sshd-entry-in-auth-log)
# * [bash - How to get all fingerprints for .ssh/authorized_keys(2) file - Server Fault](https://serverfault.com/questions/413231/how-to-get-all-fingerprints-for-ssh-authorized-keys2-file)

# Setup log
b=$(basename $0| cut -d. -f1)
log="/tmp/${b}.log"

function timeStamp () {
  echo "$(date '+%b %d %H:%M:%S') ${HOSTNAME} $b[$$]:"
}

# Check if opening a remote session with sshd
if [ "${PAM_TYPE}" != "open_session" ] || [ $PAM_SERVICE != "sshd" ] || [ $PAM_RHOST == "::1" ]; then
  exit $PAM_SUCCESS
fi

# Get info from auth.log
authLogLine=$(journalctl -u ssh.service |tail -100 |grep "sshd\[${PPID}\]" |grep "${PAM_RHOST}")
echo ${authLogLine} >> ${log}

PAM_USER_PORT=$(echo ${authLogLine}| sed -r 's/.*port (.*) ssh2.*/\1/')
PAM_USER_SHA256=$(echo ${authLogLine}| sed -r 's/.*SHA256:(.*)/\1/')

# Get details from .ssh/authorized_keys
authFile="/home/${PAM_USER}/.ssh/authorized_keys"
PAM_USER_authorized_keys=""

while read l; do
  if [[ -n "$l" && "${l###}" = "$l" ]]; then
    authFileSHA256=$(ssh-keygen -l -f <(echo "$l"))
    if [[ "${authFileSHA256}" == *"${PAM_USER_SHA256}"* ]]; then
      PAM_USER_authorized_keys=$(echo ${authFileSHA256}| cut -d" " -f3)
      break
    fi
  fi
done < ${authFile}

if [[ -n ${PAM_USER_authorized_keys} ]]
then
  echo "$(timeStamp) Local user: ${PAM_USER}, authorized_keys user: ${PAM_USER_authorized_keys}" >> ${log}
else
  echo "$(timeStamp) WARNING: no matching user in authorized_keys" >> ${log}
fi