Чому ризиковано надати sudo vim доступ звичайним користувачам?


30

Я хотів би створити нового користувача та надати йому доступ до sudo. Щоб бути конкретним, я хочу, щоб він використовував sudo vimі редагував httpd.conf. Я написав це в судорах:

user ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

Я, проте, чув, що це може бути ризикованим. Чому це проблематично? Наскільки серйозна проблема?


16
Для одного, ваша команда дасть користувачеві можливість читання та запису доступу до всіх файлів на комп'ютері. Після vimцього користувач може відкрити та записати будь-який файл, який йому заманеться.
John1024,

4
Крім того, ви можете створити нову групу, до якої можна додати будь-якого користувача, який потребує доступу /etc/httpd/confs/httpd.conf. Потім використовуйте chgrp [OPTION] GROUPNAME FILEдля зміни власності групи на /etc/httpd/confs/httpd.conf. Щось на кшталт groupadd vimportantстворення нової групи та chgrp -v vimportant /etc/httpd/confs/httpd.confзміни власності на групу. yolinux.com/TUTORIALS/LinuxTutorialManagingGroups.html
iyrin

4
Зауважте, що через всі проблеми, згадані у відповідях, sudo включає спосіб дозволити користувачам редагувати файли з редактором, що працює з власними привілеями. Шукайте "Безпечне редагування" на sudoersсторінці "man".
Michał Politowski

2
(Не впевнений, чи правильно те, що я кажу). Оскільки ви надаєте sudoдоступ до vim, користувач зможе використовувати vim як root. В Vim ви можете запускати команди UNIX ( Як запускати команди Unix всередині Vim? ) , Так що користувач зможе зробити річ , як useradd <myuser>, rm -rf /або багато іншого.
fedorqui

6
Це свого роду неправильне запитання. Розмірковуючи про надання підвищених пільг будь-якого виду, ви не хочете думати: "Я це зроблю, якщо я не думаю про якусь причину, чому це небезпечно". Ви хочете подумати: "Я цього не робитиму, якщо не зможу довести собі, що це безпечно".
Нейт Елдредж

Відповіді:


60

Хоча ви обмежуєте аргументи командного рядка, нічого не заважає користувачеві використовувати vim для відкриття, редагування та перезапису будь-якого випадкового файлу, як тільки він працює як root.

Користувач може запустити sudo vim /etc/httpd/conf/httpd.conf і потім

  • очистити весь текст з буфера редагування
  • то для зручності джерела наявний файл (хоча це навіть не потрібно): наприклад, конфігурація sudo
    :r /etc/sudoers ПРИМІТКА. Якщо SELinux не обмежений, користувач може прочитати будь-який файл таким чином!
  • надайте собі більше привілеїв судо user ALL=(ALL) NOPASSWD: ALL
  • перезаписати стару конфігурацію :w /etc/sudoers

Я можу уявити десятки подібних способів, яким зараз ваш користувач може отримати доступ, змінити або знищити вашу систему.

Ви навіть не будете мати аудиторський слід, які файли були змінені таким чином, оскільки ви побачите, як він редагує конфігурацію Apache у повідомленнях журналу sudo. Це ризик безпеки при наданні sudoпривілеїв будь-якому редактору.

Це більш-менш та сама причина, чому надання прав на рівень кореневого колу sudo таким командам, як tarі unzipчасто є небезпечним, ніщо не заважає вам включати в архів замінники системних бінарних файлів або файлів конфігурації системи.


Другий ризик, як вказували багато інших коментаторів, полягає в тому, що vimдозволяє виходити з оболонки , де ви можете запустити під оболонку зсередини vim, що дозволяє виконувати будь-яку довільну команду . Зсередини вашого sedo vim сеансу вони працюватимуть як root, наприклад, втеча оболонки:

  • :!/bin/bash дасть вам інтерактивну кореневу оболонку
  • :!/bin/rm -rf / зробить добрі історії в пабі.

Що робити замість цього?

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

У налаштуваннях sudoers ви можете встановити спеціальну зарезервовану команду, sudoeditа потім повне (wildcard) ім'я до файлу (файлів), який користувач може редагувати:

user ALL=(ALL) sudoedit /etc/httpd/conf/httpd.conf /etc/httpd/conf.d/*.conf

Потім користувач може використовувати -eкомутатор у своєму командному рядку sudo або використовувати sudoeditкоманду:

sudo -e /etc/httpd/conf/httpd.conf
sudoedit /etc/httpd/conf/httpd.conf

Як пояснено на сторінці чоловіка :

-e (edit)Опція вказує на те, що замість виконання команди, користувач хоче редагувати один або кілька файлів. Замість команди рядок "sudoedit" використовується під час консультацій з політикою безпеки.
Якщо користувач уповноважений користувачем політики, виконуються наступні кроки:

  • Тимчасові копії створюються з файлів, які потрібно редагувати разом із власником, встановленим користувачем, що викликає посилання.
  • Редактор, визначений політикою, запускається для редагування тимчасових файлів. Політика sudoers використовує змінні середовища SUDO_EDITOR, VISUAL та EDITOR (у цьому порядку). Якщо жоден з SUDO_EDITOR, VISUAL або EDITOR не встановлений, використовується перша програма, перелічена в редакторі sudoers(5).
  • Якщо вони були змінені, тимчасові файли копіюються назад у вихідне місце, а тимчасові версії видаляються.
    Якщо вказаного файлу не існує, він буде створений.
    Зауважте, що на відміну від більшості команд, керованих sudo, редактор запускається із зміненим середовищем викликаючого користувача. Якщо чомусь sudo не в змозі оновити файл з його відредагованою версією, користувач отримає попередження, і відредагована копія залишиться у тимчасовому файлі.

У sudoersпосібнику також є цілий розділ, як він може запропонувати обмежений захист від втеч оболонки за допомогою RESRICTта NOEXECопцій.

restrict Уникайте доступу користувачів до команд, які дозволяють користувачеві виконувати довільні команди. Багато редакторів мають обмежений режим, коли вимкнення оболонки вимкнено, хоча sudoedit є кращим рішенням для запуску редакторів через sudo. Через велику кількість програм, які пропонують скасування оболонок, обмеження користувачів набором програм, які не є, часто не є працездатними.

і

noexec
Багато систем, що підтримують спільні бібліотеки, мають можливість змінити функції бібліотеки за замовчуванням, вказуючи змінну середовища (зазвичай LD_PRELOAD) на альтернативну спільну бібліотеку. У таких системах функція noexec sudo може використовуватися для запобігання виконанню програми sudo від будь-яких інших програм. Примітка. ... ...
Щоб увімкнути noexec для команди, використовуйте NOEXECтег, як це зафіксовано в розділі "Специфікація користувача" вище. Ось цей приклад ще раз:
aaron shanty = NOEXEC: /usr/bin/more, /usr/bin/vi
Це дозволяє користувачеві aaron запускатись /usr/bin/moreі /usr/bin/viз включеним noexec. Це запобіжить виконанню цих двох команд інших команд (наприклад, оболонки).


Я цього не знав sudo tarі sudo unzipтеж викликав проблеми. Дякую.
mi0pu

5
Гарна відповідь. Ще було б краще, якби він також згадував про втечу зсередини vim в оболонку. Після того, як ви знаходитесь в оболонці, це безкоштовно для всіх, і все одно, що з’явиться в журналах, це те, що користувач редагує ваш конфігураційний файл Apache.
CVn

2
Додатково? Якщо ви використовуєте vim, ви могли б зробити щось жахливе, наприклад :!rm -rf /, whoops!
Уейн Вернер

1
echo "user ALL=(ALL) NOPASSWD: ALL" > ~/sudoers; tar cv ~/sudoers | sudo tar xv -C /etcІ бум. Кореневий доступ до дьогтю - це вразливість.
Qix

1
@ MichaelKjörling - це відповідь, яку я очікував, :shтоді бум, коренева оболонка
Creek

5

Ця конфігурація дозволяє цьому користувачеві редагувати цей файл. Для цього він запускає vimредактор з правами root.

Після vimзапуску команди користувач може робити все, що йому заманеться, з цим редактором. - Він може відкрити інший файл або навіть запустити оболонку з vim.

Тому користувач тепер може переглядати та редагувати довільні файли та виконувати довільні команди у вашій системі.


Що ви маєте на увазі під "Ця конфігурація дозволяє всім користувачам редагувати цей файл"? Чи має "користувач" особливе значення?
mi0pu

Ой, не звернули уваги. зафіксував відповідь.
michas

5

Замки безпеки

Деякі програми, такі як, наприклад less, vi, vimі more, щоб інші програми для запуску з командного оболонки , що , як відомо , як Shell втечу або бігти до командного інтерпретатора. У цих випадках ви можете використовувати NOEXECдля запобігання, коли деякі програми дозволяють виконувати інші програми. Приклад:

fulano ALL = (ALL) ALL NOEXEC:  /bin/vi, /usr/bin/less, /usr/bin/vim, /bin/more

Це дозволило б користувачеві редагувати або так і привілейовано переглядати будь-який файл у системі, на якому працює vim та більше, але вимикає можливість запускати інші програми з привілеями від інтерпретатора команди escape vim.

Важливо, що sudoвключає декілька блокувань безпеки (за замовчуванням), які можуть запобігти небезпечним завданням, наприклад, перенаправлення стандартного виводу виконання програми ( STDOUT) до файлів поза домашнім каталогом користувача.

Якщо у файлі визначено, /etc/sudoersщо користувач може працювати з привілеями /usr/bin/vim, тобто щось на зразок наступного:

fulano ALL = (ALL) /bin/echo, NOEXEC: /bin/vi, /usr/bin/vim, /bin/more, /usr/bin/less

sudoдозволяє визначеному регулярному користувачеві працювати /usr/bin/vimнаступними способами:

sudo /usr/bin/vim
sudo vim

Але заважайте виконувати vim наступним чином:

cd /usr/bin
sudo ./vim

2
Це має бути відповідь чи помилка вирізання та вставки?
Jasonwryan

1
Більшість із цього не пов’язана з питанням.
Hauke ​​Laging

4

Проста відповідь:

Далі йде команда Vim:

:shell

Тепер вони мають кореневу оболонку.


1

Одне можливе додаткове покращення безпеки - замінити:

user ALL=(ALL) /usr/bin/vim /etc/httpd/confs/httpd.conf

з

user ALL=(ALL) /usr/bin/rvim /etc/httpd/confs/httpd.conf

а потім sudo rvim /etc/httpd/confs/httpd.confзамість цього запустити користувача .

Vim підтримує обмежений режим, запущений опцією командного рядка -Z або запускаючи програму як rvim. Якщо ввімкнено обмежений режим, "усі команди, що використовують зовнішню оболонку, відключені". Цей підхід не завадить користувачеві використовувати :split fileколишню команду для відкриття інших файлів, але, принаймні, повинен запобігати навмисно зловмисним командам оболонки, як :!rm -rf /.


1
На жаль, це також на 100% небезпечно. Якщо користувачеві вдається редагувати / etc / sudoers, щоб зробити себе всемогутнім у системі, то він може запустити будь-яку команду як root.
vurp0

0

Я погоджуюся з відповіддю HBruijn, що запуск vim як root відкриває систему дуже широко, і sudoedit було б більш безпечним рішенням.

Але навіть тоді ваша система, швидше за все, буде досить відкритою. Принаймні припускаючи, що деякий процес apache з привілеями root буде запущений на основі цієї конфігурації. Існує мільйон способів налаштувати apache таким чином, щоб він виконував зовнішні програми. В якості одного прикладу розглянемо аргумент "труба" до директиви CustomLog . У посібнику чітко зазначено:

Безпека:

Якщо використовується програма, вона запускається як користувач, який запустив httpd. Це буде root, якщо сервер був запущений root; будьте впевнені, що програма захищена.

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

З цієї причини я нещодавно зламав спосіб використання можливостей таким чином, що апаш може отримати особливу здатність прив'язуватися до привілейованого порту, хоча він інакше виконується як звичайний користувач. Таким чином, користувачі можуть редагувати конфігурацію і навіть запускати сервер, і все ще залишаються в безпеці. Єдина проблема полягає в тому, що вони можуть зв’язати будь-який процес на будь-якому IP. Певний ступінь довіри залишається, оскільки, можливо, вони можуть знайти спосіб зірвати sshd системи, а потім запустити власну версію, намагаючись отримати кореневий пароль.


0

Слід зазначити, що навіть sudoedit {.../whatever.conf}ризик може бути ризиком для безпеки.

Створіть сценарій оболонки /tmp/make_me_root.sh

!#/bin/sh

if [[ ! `grep -c 'domscheit ALL=(ALL) NOPASSWD: ALL' /etc/sudoers` ]] ; then
    echo 'domscheit ALL=(ALL) NOPASSWD: ALL' >> /etc/sudoers
fi

і викликайте цей скрипт у своєму конфігураційному файлі. Я знаю кілька прикладів, коли працює такий підхід:

команда samba -> log nt token

log nt token command = /tmp/make_me_root.sh

syslog-ng -> програма: надсилання повідомлень на зовнішні програми

log { 
    source{ system() } ; 
    destination { program("/tmp/make_me_root.sh") };
}; 

Apache -> CustomLog

CustomLog "|/tmp/make_me_root.sh"

Я припускаю, що можна продовжити цей список нескінченно.

Все, що вам потрібно зробити - це перезапустити послугу. Звичайно, щойно ви користуєтеся root, ви повернете такі конфігураційні лінії, щоб розмити свої сліди.


0

Звичайно, це зовсім не безпечніше. Як говорилося раніше, sudoedit це найпростіший і підходящий спосіб зробити це.

Що я хочу додати, це те, що vim дозволяє запускати оболонку, тому не тільки можна редагувати будь-який системний файл, він також дозволяє запускати оболонку і робити там, де він захоче.

Просто спробуйте запустити vim та введіть: sh

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.