Почему бы вам не написать свою собственную оболочку для входа? Было бы довольно просто использовать 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
.
Остерегайтесь, убедитесь, что они соответствуют всей команде, и будьте осторожны с подстановочными знаками! Лучше исключить Bash-символы, такие как ;
, &
, &&
, ||
, $
и обратные выходы.
В зависимости от свободы, которую вы предоставляете пользователю, не станет намного безопаснее этого. Я обнаружил, что часто мне нужно только сделать пользователя, который имеет доступ только к нескольким соответствующим командам, и в этом случае это действительно лучшее решение. Однако вы хотите предоставить больше свободы, тюрьма и разрешения могут быть более уместными. Ошибки легко создаются и замечаются только тогда, когда уже слишком поздно.