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、ブラックリスト、ラッパーの制限事項

  • ブラックリストをrootに設定

例:

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設定を編集してコマンドの実行を制限します。最高の選択です。

関連情報