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