[解決済み] 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
関連
-
[解決済み] Putty: Server refused our key Errorを取得する。
-
[解決済み] SSH - シェルがなくてもログイン時に強制的にコマンドを実行する
-
[解決済み] Git上でシェルコマンドを実行する際に使用するSSH-keyの秘密鍵を指定する方法は?
-
[解決済み] 新しい鍵を作成せずに、SSH鍵のパスフレーズを削除するにはどうすればよいですか?
-
[解決済み] VirtualBoxのゲストにホスト経由で外部からSSHする方法は?[クローズド]です。
-
[解決済み] rsyncを使用する際に、別のsshポートを指定することは可能ですか?
-
[解決済み] sshログイン時の.bashrc
-
[解決済み] Vagrantのスタックした接続のタイムアウトを再試行する
-
[解決済み] SSHパスフレーズを確認/チェック/テスト/検証するにはどうすればよいですか?
-
[解決済み] 切り離されたモッシュセッションに再接続するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
プロンプトエラーです。コンストラクタFileInputStream(File)は未定義です。
-
クラスパス上でSpring WebApplicationInitializerの型が検出されない場合の解決策
-
[解決済み] SSHセッションでローカル鍵ペアを転送する方法は?
-
[解決済み] SSH - シェルがなくてもログイン時に強制的にコマンドを実行する
-
[解決済み] 1つのクライアントで複数のSSH秘密鍵を使用する最適な方法 [終了しました]。
-
[解決済み] SSHキーです。"パーミッション 0644 for 'id_rsa.pub' is too open." on mac
-
[解決済み] Vagrantのスタックした接続のタイムアウトを再試行する
-
[解決済み] SSHパスフレーズを確認/チェック/テスト/検証するにはどうすればよいですか?
-
[解決済み] sshでsudoする正しい方法
-
[解決済み] .pem ファイルを使用して ssh で接続する