이는 다음을 기반으로 합니다.내 다른 질문스크립트를 사용하여 특정 명령이 실행되지 않도록 하려고 합니다. 대화형 셸에서 완벽하게 실행되는 스크립트를 얻었지만 비대화형 셸의 경우 실행을 방해하지 않습니다. 나이거 봤어?나도 같은 일을 하고 있어요.
/home/user/stop.sh (.bashrc에서)
#!/usr/bin/env bash
shopt -s extdebug; stop_cmd () {
[ -n "$COMP_LINE" ] && return # not needed for completion
[ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] && return # not needed for prompt
local this_command=$BASH_COMMAND;
echo $this_command" Not Allowed";
return 1
};
trap 'stop_cmd' DEBUG
/홈/사용자/temp.sh
#!/usr/bin/env bash
ls
제안된 BASH_ENV 변수를 사용했습니다.@이니안비대화형 셸을 사용하여 내 스크립트를 스크립트 파일에 넣습니다.
새 껍질에
#:export BASH_ENV=/home/user/stop.sh
#:ls
ls Not Allowed --> This is because of the source in .bashrc
#: --> Prompt appears. ls did not run
#:./temp.sh
./temp.sh: /usr/share/bashdb/bashdb-main.inc: No such file or directory
./temp.sh: warning: cannot start debugger; debugging mode disabled
ls Not Allowed --> Because of the $BASH_ENV
Directory contents displayed --> ls ended up running
#: --> Prompt appears after executing temp.sh
그러나 temp.sh에서 stop.sh를 직접 얻으면 이 동작이 나타나지 않고 매력처럼 작동합니다.
답변1
유감스럽게도 비대화형 셸에서 DEBUG 트랩을 사용하여 명령 실행을 제한하는 것은 불가능합니다.
또는 다른 접근 방식을 시도해 볼 수도 있습니다.
rbash, BASH_ENV 및 command_not_found_handle의 제한 사항
- 테스트 사용자 설정
- test-users homedir에서 허용되는 명령에 대한 Symlink
예:
allow=(bash cat sed)
user="ruser"
homedir="/home/$user"
mkdir "$homedir/bin"
for c in ${allow[@]}; do
ln -s /bin/$c $homedir/bin
done
PATH
변수를 설정/home/$user/.bashenvrc
하고 허용하려는 바인드 디렉터리만 나열되는지 확인하세요./home/$user/bin;...;...
BASH_ENV=/home/$user/.bashenvrc
다음에서 설정/home/$user/.bashrc
bash -r
사용자가 슬래시가 포함된 명령 이름을 실행할 수 없도록 제한된 쉘을 사용하십시오 (예: )/bin/sh
.
하지만 계속rbash 보안 약점마음.
보다 세분화된 제한 가능성을 원하십니까? 이 함수를 사용하여 이 방법을 확장하면 command_not_found_handle ()
에서 찾을 수 없는 각 명령을 자세히 처리할 수 있습니다.PATH
function command_not_found_handle () {
while read -r pattern; do
[[ "$1" =~ $pattern ]] \
&& command="/bin/restrict/$1" \
&& [ -h $command -a -x $command ] \
&& shift \
&& { $command "$@"; return $?; }
done </bin/restrict/whitelist
echo "Command '$1' not found."
}
rbash, 블랙리스트 및 래퍼의 제한 사항
- 블랙리스트를 루트로 설정
예:
cat <<EOF >/home/cmd_blacklist
~/bin/ls -al
~/bin/rm -rf
EOF
chmod g-wx+r,o-wx+r /home/cmd_blacklist
BASH_ENV=~/.bashenvrc
추가하다~/.bashrc
- 편집하다
~/.bashenvrc
예:
PATH="$HOME/bin"
errmsg='arguments not allowed: $cmd $pattern'
while read -r cmd pattern; do
[ ! -e "$cmd" ] && continue # skip nonexistent
[ "$cmd" == "$(basename $cmd)" ] && continue # prevent recursion
eval "function $(basename $cmd) () { [[ \"$(printf $'%s ' \$@)\" =~ $pattern ]] && echo \"$errmsg\" || $cmd \"\$@\"; }"
done </home/cmd_blacklist
이제 [cmd][pattern] 형식의 블랙리스트 각 줄을 읽어야 하며 여기에서 래퍼 함수가 생성되어야 합니다. 당신은 또한 수래퍼 함수를 서브셸로 내보내기
추가 자료 및 sudo를 사용하는 쉬운 방법
많은 상황에 대해sudoers 구성을 편집하여 명령 실행을 제한하세요.최선의 선택입니다.