[linux] 로그인 후 SSH 사용자를 사전 정의 된 명령 세트로 제한하는 방법은 무엇입니까?
이것은 보안을위한 아이디어입니다. 우리 직원은 리눅스 서버의 일부 명령에 액세스 할 수 있지만 전부는 아닙니다. 예를 들어 로그 파일 ( less logfile
) 에 액세스 하거나 다른 명령 ( shutdown.sh
/ run.sh
)을 시작할 수 있어야합니다 .
배경 정보:
모든 직원은 동일한 사용자 이름으로 서버에 액세스합니다. 당사 제품은 “일반”사용자 권한으로 실행되며 “설치”가 필요하지 않습니다. 사용자 디렉토리에 압축을 풀고 실행하십시오. 우리는 응용 프로그램이 “설치된”여러 서버를 관리합니다. 모든 컴퓨터에는 사용자가 있습니다.johndoe
있습니다. 직원들은 때때로 로그 파일에 액세스하여 확인하거나 수동으로 애플리케이션을 다시 시작하기 위해 명령 줄에서 애플리케이션에 액세스해야합니다. 일부 사용자 만 전체 명령 줄 액세스 권한을 갖습니다.
우리는 서버에서 ppk 인증을 사용하고 있습니다.
employee1이 로그 파일에만 액세스 할 수 있고 employee2도 X 등을 수행 할 수 있다면 좋을 것입니다.
해결책 :
해결책으로 나는 수락 된 답변에 command
명시된 옵션을 사용합니다 . 일부 직원을 위해 실행할 수있는 유일한 파일이 될 저만의 작은 쉘 스크립트를 만들 것 입니다. 스크립트는 실행할 수있는 여러 명령을 제공하지만 다른 명령은 제공하지 않습니다. 여기에 설명 된대로 from에서 다음 매개 변수를 사용합니다 .authorized_keys
command="/bin/myscript.sh",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty
ssh-dss AAAAB3....o9M9qz4xqGCqGXoJw= user@host
이것은 우리에게 충분한 보안입니다. 감사합니다, 커뮤니티!
답변
또한 키를 허용 가능한 명령으로 제한 할 수 있습니다 (authorized_keys 파일에서).
즉, 사용자는 ssh를 통해 로그인하지 않고 제한된 명령 세트를 가지지 만 오히려 ssh (예 : “ssh somehost bin / showlogfile”)를 통해서만 해당 명령을 실행할 수 있습니다.
답변
ssh
rsh
암호 파일에서 사용자의 셸 프로그램을 사용하여 명령을 실행함으로써 전통을 따릅니다 .
이것은 ssh
어떤 식 으로든 구성을 포함하지 않고도이 문제를 해결할 수 있음을 의미합니다 .
사용자가 쉘 액세스 권한을 갖지 못하도록하려면 해당 사용자의 쉘을 스크립트로 바꾸십시오. 들여다 보면 /etc/passwd
각 사용자에게 쉘 명령 인터프리터를 할당하는 필드가 있음을 알 수 있습니다. 스크립트는 대화식 로그인 ssh user@host
과 명령 모두에 대해 쉘로 사용됩니다 ssh user@host command arg ...
.
여기에 예가 있습니다. foo
쉘이 스크립트 인 사용자 를 만들었습니다 . 스크립트는 메시지 my arguments are:
와 인수 (각각 별도의 줄과 꺾쇠 괄호로 묶음)를 인쇄하고 종료합니다. 로그에는 인수가 없습니다. 다음은 발생합니다.
webserver:~# ssh foo@localhost
foo@localhost's password:
Linux webserver [ snip ]
[ snip ]
my arguments are:
Connection to localhost closed.
사용자가 명령을 실행하려고하면 다음과 같습니다.
webserver:~# ssh foo@localhost cat /etc/passwd
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 )
;; # continue execution
( * )
printf "command not allowed\n"
exit 1
;;
esac
# Canonicalize the path name: we don't want escape out of
# git via ../ path components.
gitpath=$(readlink -f "$2") # GNU Coreutils specific
case "$gitpath" in
( /git/* )
;; # continue execution
( * )
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]
.
답변
찾고있는 것은 Restricted Shell 이라고 합니다. Bash는 사용자가 자신의 홈 디렉토리에있는 명령 만 실행할 수 있고 다른 디렉토리로 이동할 수없는 모드를 제공하므로 충분할 수 있습니다.
이 스레드 는 약간 날짜가있는 경우 매우 예시적인 것으로 나타났습니다 .
답변
제한된 쉘인`rssh ‘를 얻어야합니다.
위에서 언급 한 제한 가이드를 따를 수 있으며, 모두 이해하기 쉽고 따르기 쉽습니다. `chroot jail ‘이라는 용어를 이해하고 sshd / terminal 구성을 효과적으로 구현하는 방법 등을 이해합니다.
대부분의 사용자가 sshd를 통해 터미널에 액세스하므로 SSH를 통해 특정 제한을 적용하려면 SSH 데몬 구성 파일 인 sshd_conifg도 살펴 봐야합니다. 그러나 조심하십시오. 잘못된 구성의 결과는 아마도 다소 끔찍할 수 있으므로 구현하려는 것을 올바르게 이해하십시오.
답변
자신 만의 로그인 쉘을 작성하지 않는 이유는 무엇입니까? 이를 위해 Bash를 사용하는 것은 매우 간단하지만 모든 언어를 사용할 수 있습니다.
Bash의 예
자주 사용하는 편집기를 사용하여 파일을 만듭니다 /root/rbash.sh
(이름 또는 경로가 될 수 있지만 chown root:root
및 이어야 함 chmod 700
).
#!/bin/bash
commands=("man" "pwd" "ls" "whoami")
timestamp(){ date +'%Y-%m-%s %H:%M:%S'; }
log(){ echo -e "$(timestamp)\t$1\t$(whoami)\t$2" > /var/log/rbash.log; }
trycmd()
{
# Provide an option to exit the shell
if [[ "$ln" == "exit" ]] || [[ "$ln" == "q" ]]
then
exit
# You can do exact string matching for some alias:
elif [[ "$ln" == "help" ]]
then
echo "Type exit or q to quit."
echo "Commands you can use:"
echo " help"
echo " echo"
echo "${commands[@]}" | tr ' ' '\n' | awk '{print " " $0}'
# You can use custom regular expression matching:
elif [[ "$ln" =~ ^echo\ .*$ ]]
then
ln="${ln:5}"
echo "$ln" # Beware, these double quotes are important to prevent malicious injection
# For example, optionally you can log this command
log COMMAND "echo $ln"
# Or you could even check an array of commands:
else
ok=false
for cmd in "${commands[@]}"
do
if [[ "$cmd" == "$ln" ]]
then
ok=true
fi
done
if $ok
then
$ln
else
log DENIED "$cmd"
fi
fi
}
# Optionally show a friendly welcome-message with instructions since it is a custom shell
echo "$(timestamp) Welcome, $(whoami). Type 'help' for information."
# Optionally log the login
log LOGIN "$@"
# Optionally log the logout
trap "trap=\"\";log LOGOUT;exit" EXIT
# Optionally check for '-c custom_command' arguments passed directly to shell
# Then you can also use ssh user@host custom_command, which will execute /root/rbash.sh
if [[ "$1" == "-c" ]]
then
shift
trycmd "$@"
else
while echo -n "> " && read ln
do
trycmd "$ln"
done
fi
이 실행 파일을 로그인 쉘로 설정하기 만하면됩니다. 예를 들어, 편집하여 /etc/passwd
파일을 해당 사용자의 현재 로그인 쉘 교체 /bin/bash
와를 /root/rbash.sh
.
이것은 단순한 예일 뿐이지 만 원하는만큼 발전시킬 수 있습니다. 아이디어가 있습니다. 자신과 유일한 사용자의 로그인 셸을 변경하여 자신을 잠그지 않도록주의하십시오. 그리고 항상 이상한 기호와 명령을 테스트하여 실제로 안전한지 확인하십시오.
다음을 사용하여 테스트 할 수 있습니다 su -s /root/rbash.sh
..
주의 하고 전체 명령과 일치하는지 확인하고 와일드 카드에주의하십시오! 더 나은 같은 배쉬 – 문자 제외 ;
, &
, &&
, ||
,$
, 및 역 따옴표 확신 할 수 있습니다.
사용자에게주는 자유에 따라 이보다 훨씬 더 안전하지 않습니다. 몇 가지 관련 명령에만 액세스 할 수있는 사용자를 만들기 만하면되는 경우가 많았는데,이 경우 정말 더 나은 솔루션입니다. 그러나 더 많은 자유를 원하십니까, 감옥과 권한이 더 적절할 수 있습니다. 실수는 쉽게 만들어지며 이미 너무 늦었을 때만 알아 차립니다.