Як захистити своє довкілля від удалення половини судо?
Здається, я можу захистити змінні, але функції, на які змінні (наприклад, підказка, наприклад) покладаються, не визначені.
Це означає, що наступного разу, коли відображатиметься запит, замість того, щоб виконувати функцію лише для читання в середовищі, він буде шукати виконуваний на диску диск і виконувати перше, що знайде.
Це може бути або не бути шкідливим залежно від обставини, але здається, що збереження "половини" навколишнього середовища та видалення речей, на які покладається, навіть, наприклад, для відображення наступного підказки, є рецептом катастрофи.
Також на установках, де очищено env IS, змінні типу "TERM" зберігаються, але не "DISPLAY". Чи не GUI трохи частіше, ніж TTY? Можливо, гірше те, що sudo заохочує використання функції "auth-time-only" pam_env. У документації pam_env рекомендується використовувати лише під час першого авторизації в системі, оскільки якщо користувач надходить з віддаленої системи, це єдиний час, коли пам’ять може отримати доступ, коли користувач увійшов у систему, і встановив такі речі, як REMOTEHOST і ДИСПЛЕЙ. Якщо судо витирає шлях входу та повідомляє дистрибутиву використовувати pam_env, це все, окрім гарантії, що вихідний хост і дисплей користувача будуть очищені. Окрім оскарження походження користувача, він також вбиває будь-який сеанс віддаленого входу.
Зважаючи на те, що багато систем не дозволяють входити безпосередньо в систему через віддалений сеанс, але вимагають, щоб ви увійшли через свого користувача, а потім sudo to root, це, мабуть, буде чітким способом анулювати цю модель безпеки.
Чи є ще одна версія судо, яка не така небезпечна?
Оновлення
Для підказки: 1) Я не хочу викликати функції, що базуються на диску, кожен раз, коли я підказую (як це робить ваш колір перемикання). Також вимога: коли я перелічую свої глобальні зміни, АБО коли я відшукую, я не хочу, щоб коди перемикачів кольорів відображалися в сирому вигляді та змінювали кольори там, де це не бажано.
Крім того, я не хотів робити це щодо мого конкретного налаштування, оскільки він працює протягом РОКІВ у декількох unix і Windows, тільки для того, щоб потребувати "виправлення" тепер, коли sudo не може копіювати моє середовище цілісністю.
Що стосується налаштування кольорів, це відносно тривіально. Використовуйте "читати" і читайте в кодах з tput у vars, так що перелічені або в сліді, коди знаходяться в нерозширеному баш-введенні. Приклад:
read _CRST <<<"$(tput sgr0)" #Reset
read _CRed <<<"$(tput setaf 1)" #Red
read _CBLD <<<"$(tput bold)" #Bold
стає: _CBLD = $ '\ E [1m' _CRST = $ '\ E [0; 10m' _CRed = $ '\ E [31m'
Примітка: мої вимоги були розроблені та вдосконалені протягом декількох років, це не є стимулом створення моменту.
Але для підказки, це спосіб складніший - пам’ятайте, що немає хоста для місцевого хоста, але також хочете його у заголовку вікна.
Все, окрім "spwd", є тут: # build a prompt ########### # # специфічний для xterm & linux консолі compat emulations read _CRST <<< "$ (tput sgr0)" #Reset read _CRed < << "$ (tput setaf 1)" #Red read _CBLD <<< "$ (tput bold)" #Bold оголосити _prompt_open = "" _prompt_close = "" _prompt = ">" оголосити _disp_port = $ {DISPLAY / [^: ] *: /} printf -v qUSER "% q" $ USER набір -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 експорт 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}" )
}
typeset -xrf spwd
Інформація про значення чи функції лише для читання:
Якщо ви спробуєте відновити змінні чи функції лише для читання, ви отримаєте помилку. Оскільки змінні все ще читаються лише ... sudo може знищити лише половину середовища, лише тоді, коли функції лише для читання можуть бути безпечно прочитані. У всіх інших випадках їх повторне читання спричинить за собою декілька помилок під час виконання (не вдається перевизначити var або функцію лише для читання).
Мої підпрограми повинні були якось знати, що половина значень лише для читання в пам'яті (тих, які виглядають як функції) були видалені і лише їх читати. Я не впевнений, як би я кодував у хаках тестування на перезаписані парами чи функціями, доступними лише для читання, - і не повинен.
Щодо зміни моїх функцій:
1) Постійний користувач не мав би доступу до sudo в першу чергу. 2) Оскільки я системний адміністратор, ці функції для мене ... якщо я зламаю власну систему, "C'est la vie".
re: PAM: Так, sudo використовує pam як більшість конфігурацій дистрибутива.
Все, що я хочу, - це судо робити те, що говорить: і не торкатися свого оточення, коли я говорю це не робити. Це не має можливості для такого, тому я запитав про більш безпечну заміну. Програми, які "допомагають" користувачеві, відбираючи його вибір конфігурації, не є хорошими програмами безпеки, оскільки вони не дотримуються політики безпеки місцевого сайту, а замість цього переосмислюють його, бо думають, що вони краще знають. Я ще не бачив, щоб така програма була правильною.
Сподіваємось, це відповідає на ваші запитання про те, чому я запитую, як подолати цю проблему і чому вона є проблемою, хоча це, безумовно, значно виходить за рамки задавання питання, яке хтось уже відзначив, навіть будучи запитаним ... (як я смію! ) ...