SSHを介してLinuxサーバーに接続しているユーザーがActive Directory(Centrify)を使用して認証されていることを確認しようとしています。
彼がローカルアカウント(場所/etc/passwd
)を使用している場合は、Active Directoryアカウントを使用するように警告し、再度ログインするように求められます。
私の最初の試みは、PAMモジュールpam_scriptを使用して、ユーザーがログインした/etc/pam.d/login
ときに現在のユーザー名が/ etc / passwdにあることを確認し、見つかった場合は警告を表示し、login
コマンドを再度呼び出すスクリプトを実行することでした。
次の行を追加しました。/etc/pam.d/login
session required pam_script.so runas=root
この行は、以下を含むスクリプトファイルを実行します/etc/security/onsessionopen
。
#!/bin/sh
username=$1
if [ $(grep -c '^'$username':' /etc/passwd) = 1 ]
then
echo "Warning, please user your AD credentials"
login
fi
ただし、SSHを使用しても同じシナリオが発生します/etc/pam.d/sshd
。スクリプトは実行されますが、テキストまたはログインプロンプトは表示されません。
どんなアイデアがありますか?ありがとう
答え1
広告を介して接続されているかローカルに接続されているかを確認するのは比較的使いid
やすいです/etc/passwd
。次のステップは、/etc/profile
警告メッセージをエクスポートする機能を備えています。
答え2
問題のアカウントシェルを変更することをお勧めし/etc/passwd
ます。
たとえば、これを入れて/usr/local/etc/mustuseadlogin
実行可能にします。
#!/bin/sh
echo
echo "Please log in with AD authentication" >&2
echo
sleep 10
exit 0
これで修正/etc/passwd
(使用を推奨vipw
)し、影響を受けるすべてのアカウントの最後のフィールドをに変更します/usr/local/etc/mustuseadlogin
。例えば、
roaima:x:1001:1001:I am roaima:/home/roaima:/usr/local/etc/mustuseadlogin
答え3
標準の「ログイン」に最適なソリューションです。残念ながら、「sshd」を使用して同じ動作を実行する幸運はあまりないと思います。これは、接続の確立時に sshd が使用する基本的な接続プロセスによるものです。 PAMスタック(または他の提案と同様に構成ファイルのビット)に達すると、ユーザー名はすでにSSHクライアントによって送信されました。
これについて詳しく説明するリソースは次のとおりです。https://serverfault.com/questions/330310/force-ssh-to-prompt-for-user
この情報を考慮すると、理想的な解決策はスクリプト(または/ etc / profileを追加)に固執することですが、「sshd」スタックの場合は「ログイン」を押すのではなく10秒間スリープ状態にすることです。何か(警告が表示されることを確認するために)セッションを閉じます。
答え4
モジュールpam_script
は終了ステータスを使用して、呼び出しスタックに何をすべきかを知らせます。コードを次のように変更すると機能します。
#!/bin/bash
username="$1"
if [[ root != "$username" ]] && grep -q '^'"$username"':' /etc/passwd
then
echo "Warning, please user your AD credentials"
exit 1
fi
exit 0
root
ブロックから除外しました。[[ ... ]]
UID < 500などのテストを調整して、自分のシナリオに適用できます。