Как безопасно передать пароль по SSH для использования удаленной командой

Первый подход, с помощью -f опция для rm команда:

rm -rf /your/path

Второй подход,

yes | rm -r /your/path

Первый подход использовал больше для Вашей цели, и второй подход использовал больше для копии или движущихся файлов.

3
15.06.2015, 09:21
1 ответ

Источник не является безопасным, так как он выполнит произвольный код. Это может не быть беспокойством для вас, но если файловые разрешения неверны, может быть возможно для атакующего доступом файловой системы для выполнения кода в качестве привилегированного пользователя путем введения кода в файл конфигурации, загруженного в противном случае, например, скрипт init.

До сих пор лучшее решение, которое я смог идентифицировать, - это неуклюжее восстановительное колесо:

MyScript.conf

password=bar
echo rm -rf /
PROMPT_COMMAND='echo "Sending your last command $(history 1) to my email"'
hostname=localhost; echo rm -rf /

Использование Источник , это будет работать Echo RM -RF / Дважды, а также изменить работу пользователя $ Prompt_command . Вместо этого сделайте это:

myscript.sh (Bash 4)

#!/bin/bash
typeset -A config # init array
config=( # set default values in config array
    [username]="root"
    [password]=""
    [hostname]="localhost"
)

while read line
do
    if echo $line | grep -F = &>/dev/null
    then
        varname=$(echo "$line" | cut -d '=' -f 1)
        config[$varname]=$(echo "$line" | cut -d '=' -f 2-)
    fi
done < myscript.conf

echo ${config[username]} # should be loaded from defaults
echo ${config[password]} # should be loaded from config file
echo ${config[hostname]} # includes the "injected" code, but it's fine here
echo ${config[PROMPT_COMMAND]} # also respects variables that you may not have
               # been looking for, but they're sandboxed inside the $config array

MyScript.Sh (Mac / Bash 3-совместимый)

#!/bin/bash
config() {
    val=$(grep -E "^$1=" myscript.conf 2>/dev/null || echo "$1=__DEFAULT__" | head -n 1 | cut -d '=' -f 2-)

    if [[ $val == __DEFAULT__ ]]
    then
        case $1 in
            username)
                echo -n "root"
                ;;
            password)
                echo -n ""
                ;;
            hostname)
                echo -n "localhost"
                ;;
        esac
    else
        echo -n $val
    fi
}

echo $(config username) # should be loaded from defaults
echo $(config password) # should be loaded from config file
echo $(config hostname) # includes the "injected" code, but it's fine here
echo $(config PROMPT_COMMAND) # also respects variables that you may not have
               # been looking for, but they're sandboxed inside the $config array

Пожалуйста, ответьте, если вы найдете безопасность в моем коде.

-121--17348-

Это читается по RELORTY_USER и root . Никто другой, если только Remote_Command записывает его в глобально читаемый файл или что-то в этом роде.

Вы можете проверить среду процесса в файловой системе / PROC в / ProC / $ PID / Enviry . Вам либо нужно быть одним и тем же пользователем, что и EUID из $ PID или необходимо быть root , так как разрешения этого файла кажутся по умолчанию -R---- ---- .

Помимо использования окружающей среды, вы также можете пройти пароль через stdin по трубе в SSH . Если вы используете в SSH, только root и целевую программу (и это дети) смогут добраться до него, насколько я знаю (предполагая $ (Cat / proc / sys / kernel / yama / ptrace_scope) == 1 ).

3
27.01.2020, 21:22

Теги

Похожие вопросы