Ubuntu에서 pam_exec.so를 사용하여 스크립트를 호출하고, 사용자에게 입력을 요청하고, 스크립트가 종료 코드 0으로 종료되면 사용자가 SSH를 통해 로그인할 수 있도록 허용하려고 합니다. 나는 그것을 작동시킬 수 없습니다. 그래서 pam_exec.so를 테스트하여 원래 스크립트에 문제가 있는지 확인하기 위해 다음과 같은 간단한 스크립트를 작성했습니다. 그러나 이 간단한 스크립트를 사용해도 동일한 문제가 발생합니다.
/usr/local/bin/test.sh
#!/bin/bash
echo -n "Please enter your name:"
read name
echo "Hello $name"
@include common-auth
/etc/pam.d/sshd에 다음 줄을 추가하여 호출했습니다.
auth required pam_exec.so stdout /usr/local/bin/test.sh
그러나 시스템에 SSH를 통해 연결하면(아래 표시) 입력하라는 메시지가 표시되지 않습니다. 비밀번호를 입력하면 로그인이 됩니다. 그러나 스크립트의 출력은 표시됩니다.
그런 다음 입력이 없으면 종료 코드 1로 종료하도록 위 스크립트를 다음과 같이 변경했습니다.
#!/bin/bash
echo -n "Please enter your name:"
read name
if [ -z "$name" ]
then
exit 1
else
echo "Hello $name"
exit 0
fi
그런 다음 올바른 비밀번호를 입력하더라도 시스템에 SSH로 연결할 수 없으며(아래 스크린샷) 스크립트의 출력이 표시되지 않습니다.
그래서 제가 알고 싶은 것은 이 문제를 수정하고 pam_exec.so를 사용하여 스크립트를 실행하고, 사용자 입력을 받고, 스크립트가 종료 코드 0으로 종료되는 경우에만 ssh 인증을 허용하는 방법입니다.
답변1
나는 pam_exec.so
구현에 익숙하지 않지만 작은 PAM을 수행했으며 PAM 대화가 작동하는 방식( pam_conv_*
함수)과 타사 스크립트를 읽을지 여부를 알아야 합니다 stdin
(스크립트는 exec
포그라운드의 모듈에서만 읽을 수 없기 때문입니다).
기꺼이 투입하려는 노력의 양에 따라 PAM을 구축하는 것은 복잡하지 않으며 다음 예를 쉽게 읽을 수 있습니다.파이썬또는골란
또 다른 (아마도 더 빠른) 옵션은 사용 stdin
중인 옵션 입니다 pam_exec.so
.
보안은 제쳐두고, 사용 사례에 따라 비밀번호를 스크립트의 표준 입력으로 보내기 때문에 이것만으로도 충분할 수 있습니다.
스크립트 입력을 비밀번호와 연결하는 옵션이 있는 경우(예: 비밀번호 필드에 비밀번호 + OTP를 입력하는 일부 2FA 구현):
- 라인
stdin
에 옵션 추가pam_exec.so
- 스크립트에서 비밀번호를 두 번째 입력과 분리하세요.
- 비밀번호 인증 자체를 처리합니다(
pam_unix
추가 입력으로는 불가능하므로). - 추가 입력을 활용하세요