Модул 3 · 3.2
sudo и минимални права
Модул 3: Потребители, права и sudo · Време за четене: 11 минути
Цел на урока: След този урок ще можете да работите като обикновен потребител със sudo, да добавяте администратор по безопасен начин, да променяте настройките на sudo, без да заключите сами себе си отвън, и да обясните защо минималните права защитават Вашия сървър.
Основни понятия: sudo, група sudo, група wheel, /etc/sudoers, /etc/sudoers.d, visudo, NOPASSWD, sudo -l, заключване на root, лог на sudo, минимални права (least privilege), служебен потребител
Защо просто да не работите като root?
След инсталацията често влизате като root. Това е удобно: всичко е позволено. Но точно в това е проблемът:
- Една печатна грешка е достатъчна.
rm -rf / home/anna/oud(обърнете внимание на интервала след първата наклонена черта) изтрива като root целия Ви сървър. Като обикновен потребител ще получите съобщение за грешка. - Всичко работи като root. Скрипт, който копирате от интернет, програма, която тествате: всичко получава пълни права.
- Няма следа. Ако трима души работят като root, след това никой не знае кой какво е направил.
- root е името, което всеки нападател опитва. По-добре е напълно да изключите влизането като root (урок 2.2), но това е възможно едва когато имате друг път до администраторските права.
Този друг път е sudo: влизате като себе си и поставяте sudo само пред команда, която изисква администраторски права.
anna@web1:~$ apt update
E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied)
anna@web1:~$ sudo apt update
[sudo] password for anna:
Hit:1 http://deb.debian.org/debian trixie InRelease
...(От версия 25.10 Ubuntu използва по подразбиране sudo-rs, нова реализация на sudo. За всичко в този урок тя работи по същия начин.)
sudo иска Вашата парола, а не тази на root. След това по подразбиране я запомня за четвърт час, така че да не се налага да я въвеждате при всяка команда. Всяка команда, която изпълнявате със sudo, се записва в лога.
Създаване на администратор
В Debian и Ubuntu всеки от групата sudo може да прави всичко чрез sudo. Това е записано в /etc/sudoers:
%sudo ALL=(ALL:ALL) ALLЧетете го така: членовете на групата sudo (%) могат на всички машини (ALL) като всеки потребител и група ((ALL:ALL)) да изпълняват всяка команда (ALL).
Добавянето на администратор става на две стъпки, като root:
root@web1:~# adduser anna
root@web1:~# adduser anna sudoСлед това поставете публичния ключ на Anna в /home/anna/.ssh/authorized_keys с правилния собственик и права:
root@web1:~# mkdir -p /home/anna/.ssh
root@web1:~# cp /root/.ssh/authorized_keys /home/anna/.ssh/
root@web1:~# chown -R anna:anna /home/anna/.ssh
root@web1:~# chmod 700 /home/anna/.ssh
root@web1:~# chmod 600 /home/anna/.ssh/authorized_keysНе забравяйте chown: ако е копиран от root, файлът принадлежи на root и тогава Anna не може да влезе с ключа си.
Сега тествайте във втори прозорец, докато сесията Ви като root остава отворена:
anna@laptop:~$ ssh anna@192.0.2.10
anna@web1:~$ sudo -l
[sudo] password for anna:
User anna may run the following commands on web1:
(ALL : ALL) ALL
anna@web1:~$ sudo whoami
rootЕдва когато това работи, задайте в настройките на SSH PermitRootLogin no (урок 2.2). Оттук нататък винаги влизате като Anna.
Едно нещо, което трябва да запомните: сега Anna има нужда от парола за sudo. Запазете я във Вашия мениджър на пароли. Влизането става с ключа, sudo с паролата: две различни неща, които нарушителят трябва да притежава едновременно.
Промяна на настройките на sudo: винаги с visudo
Грешка в /etc/sudoers може да означава, че sudo изобщо спира да работи. Ако и root не може да влезе, оставате блокирани. Затова никога не редактирате настройките на sudo с обикновен редактор, а с visudo. Той отваря временно копие и проверява съдържанието, преди да го запази:
root@web1:~# visudo -f /etc/sudoers.d/backupКакто при SSH, по-добре използвайте отделен файл в /etc/sudoers.d/, а не основния файл. Обърнете внимание на две правила за тази папка:
- Файлове, чието име съдържа точка или завършва на
~, се пропускат. Затоваbackup.confне работи, аbackupработи. Целта е да се пренебрегват копията от редакторите, но това изненадва много хора. - Файлът трябва да принадлежи на root и да не може да бъде записван от други (обичайно е 440; visudo се грижи за това).
Ако искате да проверите съществуващ файл, без да го редактирате: visudo -c проверява всичко.
NOPASSWD: удобно, но знайте какво правите
С NOPASSWD sudo вече не иска парола:
anna ALL=(ALL:ALL) NOPASSWD: ALLНякои VPS образи задават това за потребителя по подразбиране, така че след влизане с ключ веднага сте администратор. Проверете с sudo -l какво важи при Вас. Последицата: който има ключа на Anna, веднага е root. Няма вече втора ключалка. За личен сървър можете да изберете това, но го направете съзнателно.
Много по-добре е NOPASSWD само за една конкретна команда, например за скрипт за резервни копия, който трябва да може да се изпълнява автоматично:
backup ALL=(root) NOPASSWD: /usr/local/bin/maak-backupТогава потребителят backup може да изпълнява като root точно този един скрипт, без парола, и нищо друго. Два капана:
- Винаги използвайте пълния път. Само с
maak-backupнякой може да постави собствена програма с това име в началото на своя път. - Самият скрипт не трябва да може да се записва от този потребител. Иначе той го променя и после изпълнява произволни команди като root. Същото важи за команди, които сами могат да отворят shell, като редактор (
vim,nano) илиless: който може да ги стартира чрез sudo, може от програмата да отвори root shell. Никога не давайте такива команди поотделно чрез sudo.
Какво се записва в лога
Всеки път, когато някой използва sudo, в journal се появява ред (а при системи с rsyslog и в /var/log/auth.log):
anna@web1:~$ sudo journalctl _COMM=sudo --since today
Nov 09 10:31:02 web1 sudo[2214]: anna : TTY=pts/0 ; PWD=/home/anna ; USER=root ; COMMAND=/usr/bin/apt updateВиждате кой, къде, като кой и каква команда. Това е една от причините да не работите с няколко души като root. Неуспешни опити за sudo ("incorrect password attempts", т.е. въведена грешна парола) от акаунт, който не е Вашият, са сигнал за тревога.
Минимални права в по-голям мащаб
sudo е едно приложение на общ принцип: минимални права (least privilege). Всеки потребител и всяка услуга получава точно правата, от които има нужда, и не повече. На сървър това означава, наред с другото:
- работите като обикновен потребител и използвате sudo само когато е необходимо;
- всяка услуга работи под собствен потребител без shell (урок 3.1), а не като root;
- уеб приложението получава потребител за базата данни, който може да използва само собствената си база данни, а не администратора на сървъра за бази данни;
- скриптът за резервни копия може да изпълнява само единствената команда, която му е нужна (NOPASSWD с пълен път);
- колега, който само обновява уебсайта, получава право на запис в
/var/www/example.comчрез група, а не sudo.
Идеята: ако нещо се обърка (пробив в плъгин, откраднат ключ), щетите остават ограничени до този един потребител или услуга. Това се появява отново и отново в принципите на CIS и в урока за hardening (10.1).
В AlmaLinux и Rocky Linux
Там администраторската група се казва wheel вместо sudo: usermod -aG wheel anna. Редът в /etc/sudoers е %wheel ALL=(ALL) ALL. visudo и /etc/sudoers.d работят по същия начин. Съобщенията на sudo се намират там и в /var/log/secure.
Обобщение
- Работете като обикновен потребител и използвайте sudo за администриране; sudo иска Вашата собствена парола и записва всяка команда в лога.
- Създаване на администратор:
adduser anna,adduser anna sudo(wheel при системи, подобни на RHEL), ключ с правилен собственик и права, тест във втори прозорец, едва след това изключване на влизането като root. - Редактирайте правилата на sudo само с
visudo, за предпочитане в отделен файл в/etc/sudoers.d/без точка в името. - NOPASSWD за всичко премахва една ключалка; по-добре го използвайте само за една команда с пълен път, която потребителят не може да променя.
- Минимални права: всеки потребител и услуга получава точно това, което му трябва, така че грешка или пробив да остане малък.
Тест (quiz)
Задача
Задача O3.2: Администратор със sudo. Създайте на Вашия сървър обикновен администратор (например anna), настройте правилно ключа си, тествайте влизането и sudo -l във втори прозорец и след това изключете влизането като root през SSH (PermitRootLogin no). Отметнете стъпките, поставете изхода на id (само име и групи) и отговорете на въпросите: кой ред дава права на Вашия администратор, има ли някъде NOPASSWD и как ще влезете, ако забравите паролата си?
Задача O3.2: Администратор със sudo
Тази задача изпълнявате сами; никой не я проверява. Отбележете какво сте направили и маркирайте задачата като изпълнена.
%sudo ALL=(ALL:ALL) ALL в /etc/sudoers (RHEL: %wheel). NOPASSWD само съзнателно и за предпочитане ограничено до една команда. При забравена парола: през конзолата на Вашия доставчик, нова root парола през панела или среда за възстановяване, след това passwd <gebruiker>.
Вашите отметки и бележки остават само в този браузър; не ги изпращаме никъде. Ако сте влезли, в Моите курсове запазваме само че сте изпълнили задачата.
Още за четене
Стъпките в тези статии се отнасят за VPS сървърите на WebOké; при други доставчици работи по подобен начин.
- Защита на VPS: първите пет минути
- Нямате достъп до VPS: какво да направите?
- Ръководство за DirectAdmin 12.2: Потребители на базата данни, права и пароли
- Ubuntu Server: User management: https://ubuntu.com/server/docs/how-to/security/user-management/
- Ръководство на Debian за sudoers: https://manpages.debian.org/trixie/sudo/sudoers.5.en.html
