원격으로만 스크립트를 실행할 수 있는 사용자 추가

원격으로만 스크립트를 실행할 수 있는 사용자 추가

한 가지 작업만 수행할 수 있는 사용자를 만들고 싶습니다. 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 하위 시스템에 사용자를 추가한다는 의미는 아닙니다. 오히려 컴퓨터 시스템에 사용자를 추가하는 것을 의미합니다. 예를 들어, 나는 debian stable을 실행하는 시스템을 가지고 있는데, 그 시스템의 주소는 www.hg.bar.com입니다. 사용자를 추가하고 싶습니다(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_keysCoren의 답변에서와 같이 명시적으로 파일 에 이를 포함하고 싶을 수도 있습니다 . 하지만 '.../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

관련 정보