24
июнь
2021
14:01

Решение проблемы исчезновения прав на команду sudo

24 июнь 2021 14:01

После обновления ядра Linux, вдруг обнаружил, что пропала возможность запуска команды sudo.

Ошибка: "Sorry, user user is not allowed to execute '.....' as root"

где вместо .... полный путь пусть команды например /bin/cp

Таким образом, вместе с sudo перестали работать простейшие команды вроде sudo cp a b или sudo apt-get update.

1. Быстрое решение проблемы

В Debian и других классических ОС нужно добавить существующего пользователя vasya в группу wheel:

su
usermod -a -G wheel vasya

где vasya - имя пользователя.

В Ubuntu и Linux Mint - то же самое, но в группу sudo:

su
usermod -a -G sudo vasya

Где vasya - имя пользователя, которого добавляем в группу wheel или sudo.

После этого, выполняем logout и входим снова. Доступ к запуску su и sudo должен появиться.

Отличие команд su от su - в окружении: su - использует окружение root, в отличие от su, где окружение текущего пользователя.

Выход из su при помощи команды exit.

2. Объяснение причины проблемы

В моём случае, по всей видимости, пользователь user исчез из группы sudo.
Ошибка заключалась в выполненной мной ошибочной команде
sudo usermod -G dialout user

  • без операнда "-a", команда usermod затёрла группы пользователя user.

Второй вариант - ошибка возникла после обновления ядра системы.

3. Хранение пользователей и групп в Linux

  1. Группы пользователей и их члены хранятся в файле /etc/group.
  2. За передачу прав отвечает файл /etc/sudoers.

  1. В большинстве классических Linux операционных систем, например, в Debian или CentOS,
    пользователи которые могут запускать su или sudo, должны быть добавлены в группу wheel.
    (Исторически эта группа для сисадминов которые работали посменно).

Таким образом, с помощью команды usermod файл /etc/group будет изменен. (Прямое редактирование /etc/group запрещено).

В Ubuntu и Linux Mint вместо wheel используется группа sudo.

Чтобы узнать, членом каких групп является пользователь user, выполнить команду

groups user

будет написано вроде
user : user dialout sudo wheel

где перед двоеточием user - имя пользователя, после двоеточия:
user dialout sudo wheel - названия групп, в которых он состоит.

Чтобы вывести на экран членов группы wheel или sudo, выполнить команды

В Debian и CentOS:

cat /etc/group | grep wheel

или

grep "wheel" /etc/group

В Ubuntu и Linux Mint:

cat /etc/group | grep sudo

или

grep "sudo" /etc/group

Если в Ubuntu пользователь не входит в группу sudo, значит у него не будет прав на выполнение команды sudo.

Нужно добавить существующего пользователя в группу при помощи команды:

usermod -a -G группа пользователь

где группа - sudo, пользователя - ваше имя пользователя.

После добавления, просматриваем группы пользователя:

id пользователь

Вариант команды #2 - если нужно создать нового пользователь и сразу добавить в группу:

adduser новый_пользователь группа
  1. В Linix Mint файл sudoers (/etc/sudoers) у меня выглядит так:

Defaults env_reset
Defaults mail_badpass
Defaults secure_path="/usr/local/sbin: /usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin"
root ALL=(ALL:ALL) ALL
%admin ALL=(ALL) ALL
%sudo ALL=(ALL:ALL) ALL
#includedir /etc/sudoers.d

  • строка root ALL=(ALL:ALL) ALL наделяет неограниченными правами пользователю root
    (трогать её нельзя ни в коем случае, иначе исчезнут права у суперпользователя root).
  • строка %admin ALL=(ALL) ALL наделяет такими же неограниченными правами пользователей группы admin
  • строка %sudo ALL=(ALL:ALL) ALL предоставляет неограниченные права пользователям группы sudo

В чём отличие групп admin и sudo?

  • группа admin использовалась в Ubuntu ниже версии 11.10, т.е. оставлена для совместимости
  • в современных Ubuntu как административная, используется группа sudo

Как отредактировать файл /etc/sudoers :

При помощи команды

visudo

Для вставки текста нажмите 'Insert"

Для выхода с сохранением - нажать Esc, двоеточие и буквы w q
":wq"

Для выхода без сохранения - нажать Esc, двоеточие и q"
":q"

4. Дополнительно: понижение безопасности путем отключения запроса пароля пользователя

Чтобы пароль sudo не запрашивало каждый раз:

В файле /etc/sudoers:

vasya ALL=(ALL:ALL) NOPASSWD:ALL

где vasya - имя пользователя. Пользователь сможет выполнять команды от имени root без пароля (не рекомендуется!)

Вариант команды

vasya ALL=(ALL:ALL) NOPASSWD:ALL /usr/bin/soundmodem

Последний вариант касается только запуска soundmodem из каталога /usr/bin/ !

Строка с NOPASSWD должна стоять после строки %sudo !

Либо проблему NOPASSWD решаем без редактирования visudo при помощи каталога /etc/sudoers.d

Настройки в /etc/sudoers.d - присутствует понижение прав
например в файле mintupdate можно прочитать следующее
(добавил переносы строки для лучшей читаемости)

ALL ALL = NOPASSWD:/usr/bin/
mint-refresh-cache
ALL ALL = NOPASSWD:/usr/lib/linuxmint/
mintUpdate/synaptic-workaround.py
ALL ALL = NOPASSWD:/usr/lib/linuxmint/
mintUpdate/dpkg_lock_check.sh

То есть можно по примеру /etc/sudoers.d /mintupdate создать файл для себя, в котором прописать строку vasya ALL=(ALL:ALL) NOPASSWD:ALL .

visudo -f /etc/sudoers.d/custom
  1. Запуск пользовательских программ с sudo без пароля.

    whereis soundmodem

Вывод:
soundmodem: /usr/sbin/soundmodem

Как видно, путь /usr/sbin/ входит в настройки "Defaults secure_path".
Таким образом, запуск команды, скажем, из командного sh файла после настройки NOPASSWD будет работать:

Командный файл для запуска xastir.sh:

#!/bin/bash
sudo /usr/sbin/soundmodem &
/usr/bin/xastir

где & - для запуска программы в фоновом режиме.


Источники:



Похожие публикации