BASH에서 명령 실행을 방지하려고 합니다.. 항상 작동하지는 않습니다.

BASH에서 명령 실행을 방지하려고 합니다.. 항상 작동하지는 않습니다.

이는 다음을 기반으로 합니다.내 다른 질문스크립트를 사용하여 특정 명령이 실행되지 않도록 하려고 합니다. 대화형 셸에서 완벽하게 실행되는 스크립트를 얻었지만 비대화형 셸의 경우 실행을 방해하지 않습니다. 나이거 봤어?나도 같은 일을 하고 있어요.

/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 구성을 편집하여 명령 실행을 제한하세요.최선의 선택입니다.

관련 정보