-1

Как я могу защитить свое окружение от стирания половины его?

Кажется, я могу защитить переменные, но функции, на которые полагаются переменные (например, приглашение), не определены.

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

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

Кроме того, в установках, где env IS очищен, переменные типа «TERM» сохраняются, но не «DISPLAY». Разве GUI не является более распространенным в наши дни, чем TTY? Возможно, еще хуже то, что sudo поощряет использование функции pam_env "только для авторизации". В документации pam_env рекомендуется использовать только во время первой авторизации в системе, поскольку, если пользователь входит из удаленной системы, это единственный раз, когда PAM может получить доступ, откуда пользователь вошел в систему, и установить такие вещи, как REMOTEHOST и DISPLAY. С sudo стирает логин и говорит дистрибутивам использовать pam_env, это почти гарантирует, что хост и дисплей оригинального пользователя будут очищены. Помимо того, что запутывает происхождение пользователя, он также убивает любой сеанс удаленного входа.

Учитывая, что многие системы не позволяют вам входить в систему root напрямую через удаленный сеанс - но требуют, чтобы вы входили через своего пользователя, а затем sudo в root, это может показаться очевидным способом аннулировать эту модель безопасности.

Есть ли другая версия sudo, которая не так небезопасна?

Обновить

Для подсказки: 1) Я не хочу вызывать дисковые функции каждый раз, когда я запрашиваю (как это происходит при переключении цветов). Также требование: когда я перечисляю свои глобальные переменные, ИЛИ, когда я отслеживаю, я не хочу, чтобы коды переключения цвета отображались в необработанном виде и меняли цвета там, где они не нужны.

Кроме того, я не хотел говорить об этой конкретной настройке, поскольку она работала на YEARS для нескольких Unix-систем и Windows, только для того, чтобы нуждаться в "исправлении" сейчас, когда sudo не может скопировать мою среду с целостностью.

Для настройки цвета это относительно тривиально. Используйте "read" и читайте в кодах из tput в vars, поэтому в списке или в трассировке коды находятся в нерасширенном вводе bash. Пример:

read _CRST <<<"$(tput sgr0)"   #Reset
read _CRed <<<"$(tput setaf 1)"  #Red
read _CBLD <<<"$(tput bold)"   #Bold

становится:_CBLD = $ '\E [1 м' _CRST = $ '\E [0; 10 м' _CRed = $ '\E [31 м'

Примечание: мои требования были разработаны и уточнены в течение нескольких лет, это не является стимулом для создания момента.

Но для подсказки, это намного сложнее - помните, нет хоста для локального хоста, но также хотите, чтобы он был в заголовке окна.

Здесь есть все, кроме spwd:# построить приглашение ########### # специфично для эмуляций консоли xterm & linux read read _CRST <<< "$(tput sgr0)" #Reset read _CRed < << "$(tput setaf 1)" #Red read _CBLD <<< "$(tput bold)" #Bold Declare _prompt_open = "" _prompt_close = "" _prompt = ">" Declare _disp_port = $ {DISPLAY/[^:] *:/} printf -v qUSER "% q" $ USER typeset -x qUSER

[[ $UID -eq 0 ]] && { 
    _prompt_open="$_CBLD$_CRed"
    _prompt="#"
    _prompt_close="$_CRST"
}
PS1='\['"$_prompt_open"'\]$(spwd "$PWD" )'"$_prompt"'\['"$_prompt_close"'\] ';

if [[ -n ${REMOTEHOST:-""} ]]; then
    function titlebar { \
        printf "\033]1;${qUSER}@${HOSTNAME}:%q\007" "$(spwd "$PWD")" ;\
    }
    export -f titlebar

    PS1='\[$(titlebar)'"$_prompt_open"'\]${HOSTNAME}:$(spwd "$PWD")'"$_prompt"'\['"$_prompt_close"'\] '
fi

FWIW, PS4 получает это:

PS4='>>${BASH_SOURCE:+${BASH_SOURCE[0]/$HOME/~}}#${LINENO}> '

Обратите внимание, что функции spwd нет в приведенном выше примере - она находится в отдельном файле, который создается только при инициализации новой среды.

Но эта функция и ее данные: if [[! $ {qUSER: - ""}]]; затем printf -v qUSER "% q" $ USER export qUSER fi export _home_prefix = $ {HOME%/*}/

Следующая функциональная идея пришла от suse, но была полностью переписана.

Возвращает закороченный путь, когда отображаемый путь занимает> 50% ширины экрана:

alias int=declare\ -i _e=echo _pf=printf exp=export ret=return 
exp __dpf__='local -a PF=(
                "/$1/$2/$3/../\${$[$#-1]}/\${$#}" 
                "/$1/$2/../\${$[$#-1]}/\${$#}"
                "/$1/../\${$[$#-1]}/\${$#}"
                "/$1/../\${$#}"
                ".../\${$#}"
                "..." )'
function spwd () {  \
  (($#)) || { _e "spwd called with null arg"; return 1; }; \
  int w=COLUMNS/2                         ;\
  ( _pf -v _p "%s" "$1" ; export IFS=/    ;\
    set $_p; shift; unset IFS             ;\
    t="${_p#$_home_prefix}"               ;\
    int tl=${#t}                          ;\
    if (($#<=6 && tl<w));then ((tl<=2)) && \
      { _e -En "${_p}";return 0; }        ;\
    else                                   \
      eval "$__dpf__"                     ;\
      int i pfl=${#PF[*]}                 ;\
      for ((i=0; i<pfl; ++i)); do eval     \
        "_pf -v _pa %s \"${PF[i]}\""      ;\
        _p="$(eval "_pf %s \"$_pa\"")"    ;\
        ((${#_p}<w)) && break;  done      ;\
    fi                                    ;\
    _e -En "${_p#$_home_prefix}" )    
}

набрать -xrf spwd

При предоставлении ресурсов только для чтения значений или функций:

Если вы попытаетесь повторно использовать переменные или функции только для чтения, вы получите ошибку. Поскольку переменные по-прежнему доступны только для чтения ... только когда sudo разрушает более половины среды, функции, доступные только для чтения, могут быть безопасно прочитаны. Во всех остальных случаях их повторное чтение приведет к множественным ошибкам во время выполнения (невозможно переопределить переменную или функцию только для чтения).

Мои подпрограммы должны были как-то знать, что половина значений только для чтения в памяти (те, которые выглядят как функции) были удалены, и только читать их. Я не уверен, как я буду кодировать в хаки, чтобы проверить перезаписанные переменные или функции только для чтения - и я не должен это делать.

Что касается переопределения моих функций:

1) постоянный пользователь не будет иметь доступа к sudo. 2) Поскольку я системный администратор, эти функции для меня ... если я взломаю свою собственную систему, "C'est la vie".

Re: PAM: Да, sudo использует pam в качестве большинства дистрибутивов.

Все, что я хочу, это чтобы sudo делал то, что он говорит: и не трогал мою среду, когда я говорю это не делать. Вот почему у него нет выбора, поэтому я спросил о более безопасной замене. Программы, которые "помогают" пользователю, лишив его выбора конфигурации, не являются хорошими программами безопасности, поскольку они не уважают политику безопасности локального сайта, а вместо этого переопределяют ее, потому что считают, что знают лучше. Я еще не видел, чтобы такая программа была правильной.

Надеемся, что это ответит на ваши вопросы о том, почему я спрашиваю, как обойти эту проблему и почему это проблема, хотя это, безусловно, значительно выходит за рамки вопроса о том, что кто-то уже отметил, даже будучи ЗАПРОШЕНЫ ... (как я смею!)...

1 ответ1

1

Вы также отправили это в список рассылки sudo?

Переменные среды

Что ж, в sudoers вы можете указать, какие переменные среды следует хранить. Возьмите цикл по умолчанию env_reset и env_keep. Они также могут быть установлены для каждого пользователя или группы. Просто добавьте REMOTEHOST и DISPLAY и эй, presto.

Незамедлительный

Почему вы используете функции в вашем приглашении?

++ Кажется, вы хотите, чтобы ваш запрос был примерно таким:

PS1='${REMOTEHOST}${REMOTEHOST+->}\u@\h:\w\$ '

Это конечно не переключение цветов. Для этого:

PS1='\[$(tput bold)$(tput setaf 1)${REMOTEHOST}${REMOTEHOST+->}\u@\h:\w\$$(tput sgr0) \]'

Функции источника

И почему бы вам не получить исходный файл, содержащий эти функции?

++ Вы говорите, что делаете, но используете флаги для оптимизации функций и предотвращения их перечитывания. Если вы пропустите эту оптимизацию, она будет работать тогда?

Функции только для чтения

И в отношении root, почему вы должны хранить функции в среде, которая может быть изменена пользователем? Для пользователя root требуется четко определенная среда, настроенная без какого-либо влияния пользователя при переключении на root.

++ Постоянный пользователь всегда может сбросить все в оболочке. Суть в том, что вы не можете полагаться на функции, чтобы оставаться прежними. Таким образом, вы должны получать их каждый раз из надежного места.

РАМ

И sudo не использует pam_env() в своем источнике. Он вызывается, однако, через стек PAM. Итак, можете ли вы предоставить ссылку, подтверждающую вашу претензию?

++ Да, sudo может использовать PAM, если вы так настроите.

С наилучшими пожеланиями, Эдгар.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .