한 가지 작업만 수행할 수 있는 사용자를 만들고 싶습니다. ssh를 통해 특정 폴더에 있는 스크립트(및 해당 스크립트에 대한 명령줄 인수)를 지정하고(이 질문에서는 이라고 부르겠습니다 /local/remote_only_scripts/foo
) 스크립트를 실행합니다. 그리고 그 출력을 반환합니다.
명확성을 위해 사용자가 수행할 수 없도록 하고 싶은 작업의 예는 다음과 같습니다.
- 로컬 로그인 계정. 로그인 응용 프로그램은 폴더에 있는 스크립트
/bin/login
가 아니므/local/remote_only_scripts/foo
로 사용자가 호출하면 안 됩니다. - 원격 로그인 계정. 다시 로그인(ssh로 호출?)은 해당 폴더의 스크립트가 아닙니다.
- 디렉토리의 내용을 나열합니다. ls는 에 있습니다
/bin/ls
. 해당 디렉토리의 스크립트가 아닙니다. - 이 디렉터리의 파일을 편집합니다. emacs, vi, gedit 및 대부분의 기타 편집기는 이 디렉토리의 스크립트가 아닙니다.
- 이 디렉터리에 있는 파일의 내용을 봅니다.
- 실행 권한이 없는 디렉터리의 파일을 실행합니다.
참고하시기 바랍니다예사용자가 수행할 수 없도록 하고 싶은 다른 작업이 많이 있습니다. 작업을 고려할 때 "이 작업이 의 스크립트에 의해 수행됩니까 /local/remote_only_scripts/foo
?"라고 질문합니다. 대답이 '아니요'인 경우 사용자는 해당 작업을 수행할 수 없습니다. 대답이 '예'라면 사용자는 이 작업을 수행할 수 있어야 합니다.
추신: "사용자 추가"가 무엇을 의미하는지 명확히 하겠습니다. 일부 SSH 하위 시스템에 사용자를 추가한다는 의미는 아닙니다. 대신, 컴퓨터 시스템에 사용자를 추가하는 것을 의미합니다. 예를 들어, 나는 www.hg.bar.com이라는 주소로 호출하는 debian stable을 실행하는 시스템을 가지고 있습니다. 사용자를 추가하고(kuser, users-admin, useradd 또는 유사한 방법을 통해) 그 사람을 hg_guest라고 부르고 싶습니다. hg_guest는 로컬로 로그인하거나 위 목록의 작업을 수행할 수 없습니다. hg_guest가 할 수 있는 일은 스크립트를 "원격으로" 실행하는 것뿐입니다. 나는 그가 ssh를 통해 이 작업을 수행할 수 있어야 한다고 말했지만 이제 생각해보면 그에게 ssh를 사용하도록 허용하면 로컬로 로그인할 수 있으므로 다른 메커니즘이 필요할 수도 있습니다.
답변1
하나 있다주문하다authorized_keys 파일의 옵션입니다. 이 옵션은 당신이 찾고 있는 것과 정확히 일치하는 것 같습니다.
이것은 chroot 또는 제한된 쉘이 아닙니다. 이 명령은 SSH를 통해서만 실행될 수 있습니다. 귀하의 예에서는 다음과 같습니다.
ssh somehost /local/remote_only_scripts/foo
이 Authorized_keys 파일의 경우:
command="/local/remote_only_scripts/foo",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ...public key...
사용자가 로컬로 로그인할 수 없도록 하려면 여러 가지 방법이 있습니다. 당신은 할 수 있습니다:
- 쉘을 다음으로 설정하십시오./빈/거짓(어쩌면 당신이 필요할 수도 있습니다/bin/trueSSH에는 유효한 로그인이 필요하기 때문에)
- 비밀번호를 잠그세요. 참조
passwd -l
편집하다: 더 많은 제한 옵션을 추가하고 로컬 액세스를 제거하는 방법을 명확히 했습니다.
답변2
사용자의 로그인 셸로 다음을 시도해 보세요.
#!/bin/sh
basedir=/local/remote_only_scripts
while read -p '$ ' prog args; do
if [ ! -x "$basedir/$prog" ]; then
echo "Invalid program: $prog"
else
case "$prog $args" in
*\**|*\?*|*\^*|*\&*|*\<*|*\>*|*\|*|*\;*|*\`*|*\[*|*\]*)
echo "Invalid character in command";;
*)
eval "$prog $args"
echo;; # force a trailing newline after the program
esac
fi
done
authorized_keys
Coren의 답변처럼 파일에 명시적 으로 포함하고 싶을 수도 있지만 여기서는 '.../foo;'를 프로그램으로 바꾸세요. 이렇게 하면 sftp
, scp
및 와 같은 SSH의 명령이 차단됩니다 ssh hostname command
.
답변3
이는 스크립트에만 액세스해야 하는 경우에 유용합니다. 사용자를 추가하고 기본 셸을 스크립트 경로로 변경합니다. SSH를 통해 연결하면 스크립트가 실행되고 세션이 닫힙니다.
server1:/ # useradd -s "/local/remote_only_scripts/foo/script.sh" hg_guest
server1:/ # grep hg_guest /etc/passwd
hg_guest:x:2002:100::/home/hg_guest:/local/remote_only_scripts/foo/script.sh