Хоча ви обмежуєте аргументи командного рядка, нічого не заважає користувачеві використовувати 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. Це запобіжить виконанню цих двох команд інших команд (наприклад, оболонки).
vimцього користувач може відкрити та записати будь-який файл, який йому заманеться.