ssh
rsh
암호 파일에서 사용자의 셸 프로그램을 사용하여 명령을 실행함으로써 전통을 따릅니다 .
이것은 ssh
어떤 식 으로든 구성을 포함하지 않고도이 문제를 해결할 수 있음을 의미합니다 .
사용자가 쉘 액세스 권한을 갖지 못하도록하려면 해당 사용자의 쉘을 스크립트로 바꾸십시오. 들여다 보면 /etc/passwd
각 사용자에게 쉘 명령 인터프리터를 할당하는 필드가 있음을 알 수 있습니다. 스크립트는 대화식 로그인 ssh user@host
과 명령 모두에 대해 쉘로 사용됩니다 ssh user@host command arg ...
.
여기에 예가 있습니다. foo
쉘이 스크립트 인 사용자 를 만들었습니다 . 스크립트는 메시지 my arguments are:
와 인수 (각각 별도의 줄과 꺾쇠 괄호로 묶음)를 인쇄하고 종료합니다. 로그에는 인수가 없습니다. 다음은 발생합니다.
webserver:~
foo@localhost's password:
Linux webserver [ snip ]
[ snip ]
my arguments are:
Connection to localhost closed.
사용자가 명령을 실행하려고하면 다음과 같습니다.
webserver:~
foo@localhost's password:
my arguments are:
<-c>
<cat /etc/passwd>
우리의 "셸" -c
은 전체 명령을 하나의 인수로 사용하여 스타일 호출을 받습니다./bin/sh
을받습니다.
보시다시피 이제 우리가 할 수있는 일은 스크립트를 추가로 개발하여 -c
인수 로 호출 된 경우를 인식 한 다음 문자열을 구문 분석하는 것입니다 (예 : 패턴 일치). 허용되는 문자열은 재귀 적으로 호출하여 실제 쉘로 전달할 수 있습니다 /bin/bash -c <string>
. 거부 사례는 오류 메시지를 인쇄하고 종료 할 수 있습니다 ( -c
누락 된 사례 포함 ).
이 글을 쓰는 방법에주의해야합니다. 나는 매우 구체적인 것만 허용하고 다른 모든 것은 허용하지 않는 긍정적 인 일치 만 작성하는 것이 좋습니다.
참고 : 인 경우 다음 과 같이 명령 root
에서 셸을 재정 의하여이 계정에 로그인 할 수 있습니다.su
su -s /bin/bash foo
. (선택의 대체 쉘.) 비 루트는 이것을 수행 할 수 없습니다.
다음은 예제 스크립트입니다. 사용자를 에서 저장소에 ssh
대한 git
액세스 용 으로 만 사용 하도록 제한합니다 /git
.
#!/bin/sh
if [ $# -ne 2 ] || [ "$1" != "-c" ] ; then
printf "interactive login not permitted\n"
exit 1
fi
set -- $2
if [ $# != 2 ] ; then
printf "wrong number of arguments\n"
exit 1
fi
case "$1" in
( git-upload-pack | git-receive-pack )
;;
( * )
printf "command not allowed\n"
exit 1
;;
esac
gitpath=$(readlink -f "$2")
case "$gitpath" in
( /git/* )
;;
( * )
printf "access denied outside of /git\n"
exit 1
;;
esac
if ! [ -e "$gitpath" ] ; then
printf "that git repo doesn't exist\n"
exit 1
fi
"$1" "$gitpath"
물론 우리는 이러한 Git 프로그램 git-upload-pack
과git-receive-pack
구멍이 나 사용자에게 시스템에 대한 액세스를 제공합니다 해치를 탈출하지 않습니다.
그것은 이러한 종류의 제한 계획에 내재되어 있습니다. 사용자는 특정 보안 도메인에서 코드를 실행하도록 인증되었으며 해당 도메인을 하위 도메인으로 제한하는 제한을 두었습니다. 예를 들어 사용자가 vim
특정 파일에 대해 명령 을 실행하여 편집 하도록 허용하면 사용자 는 :!sh[Enter]
.