Как изменить sudoers file

Contents

Contents

  1. Introduction
  2. Editing the sudoers file
  3. Aliases

    1. User Aliases
    2. Runas Aliases
    3. Host Aliases
    4. Command Aliases
  4. User Specifications
  5. The Default Ubuntu Sudoers File
  6. Common Tasks

    1. Shutting Down From The Console Without A Password
    2. Multiple tags on a line
    3. Enabling Visual Feedback when Typing Passwords
  7. Troubleshooting

Introduction

The /etc/sudoers file controls who can run what commands as what users on what machines and can also control special things such as whether you need a password for particular commands. The file is composed of aliases (basically variables) and user specifications (which control who can run what).

Editing the sudoers file

For Ubuntu 8.04: The default editor for visudo has changed to vi, which may cause confusion to those who are not familiar to its command bindings. To change this behavior, open your ~/.bashrc file, and append the line to the bottom of the file:

export EDITOR="nano"

If you wish to use another text editor, replace «nano» with any text editor of your choice. Run source ~/.bashrc to ensure the changes you made have taken effect.

Now launch visudo with sudo -E visudo in the terminal, and put in Defaults editor=/usr/bin/nano in the file.

So the top of the file should now look like this:

Defaults    editor=/usr/bin/nano
Defaults    env_reset

Again, if you wish to use another text editor, replace «nano» with the full path to the text editor of your choice. Save, and from now on launching visudo with gksu visudo for Ubuntu; kdesu visudo for Kubuntu or sudo visudo in the terminal will now open with your chosen editor.


For Ubuntu 8.10: The default editor for visudo has changed to sensible-editor. sensible-editor defaults to nano now, and select-editor (which will run by default the first time) allows you to select another one.

To setup the default editor for visudo.

sudo select-editor

You will get a prompt to choose which editor you want.

Select an editor.  To change later, run 'select-editor'.
  1. /usr/bin/vim.tiny                  
  2. /bin/ed                  
  3. /bin/nano        <---- easiest
  4. /usr/bin/vim.basic    

Choose 1-4 [3]: 

If you don’t consider yourself competent in any of the enlisted terminal-based editors, it is recommended that you choose option 3, nano.


Because sudo is such a powerful program you must take care not to put anything formatted incorrectly in the file. To prevent any incorrect formatting getting into the file you should edit it using the command visudo run as root or by using sudo.

sudo visudo

The sudoers file is read in one pass so when multiple entries match for a user, they are applied in order. Where there are conflicting values, the last match is used (which is not necessarily the most specific match). Also you must set an alias before you can use it. Normally you will set the aliases at the beginning of the file and then set the user specifications after all the aliases are laid out.

You can insert comments by prefixing them with a # but this is also used to specify a uid in certain parts of the file when it is followed by a number.

Aliases

There are four kinds of aliases: User_Alias, Runas_Alias, Host_Alias and Cmnd_Alias. Each alias definition is of the form:

  • Alias_Type NAME = item1, item2, …

Where Alias_Type is one of User_Alias, Runas_Alias, Host_Alias or Cmnd_Alias. A name is a string of uppercase letters, numbers and underscores starting with an uppercase letter. You can put several aliases of the same type on one line by separating them with colons (:) as so:

  • Alias_Type NAME1 = item1, item2 : NAME2 = item3

You can include other aliases in an alias specification provided they would normally fit there. For example you can use a user alias wherever you would normally expect to see a list of users (for example in a user or runas alias).

There are also built in aliases called ALL which match everything where they are used. If you used ALL in place of a user list it matches all users for example. If you try and set an alias of ALL it will be overridden by this built in alias so don’t even try.

User Aliases

User aliases are used to specify groups of users. You can specify usernames, system groups (prefixed by a %) and netgroups (prefixed by a +) as follows:

 # Everybody in the system group "admin" is covered by the alias ADMINS
 User_Alias ADMINS = %admin
 # The users "tom", "dick", and "harry" are covered by the USERS alias
 User_Alias USERS = tom, dick, harry
 # The users "tom" and "mary" are in the WEBMASTERS alias
 User_Alias WEBMASTERS = tom, mary
 # You can also use ! to exclude users from an alias
 # This matches anybody in the USERS alias who isn't in WEBMASTERS or ADMINS aliases
 User_Alias LIMITED_USERS = USERS, !WEBMASTERS, !ADMINS

Runas Aliases

Runas Aliases are almost the same as user aliases but you are allowed to specify users by uid’s. This is helpful as usernames and groups are matched as strings so two users with the same uid but different usernames will not be matched by entering a single username but can be matched with a uid. For example:

 # UID 0 is normally used for root
 # Note the hash (#) on the following line indicates a uid, not a comment.
 Runas_Alias ROOT = #0
 # This is for all the admin users similar to the User_Alias of ADMINS set earlier 
 # with the addition of "root"
 Runas_Alias ADMINS = %admin, root

Host Aliases

A host alias is a list of hostname, ip addresses, networks and netgroups (prefixed with a +). If you do not specify a netmask with a network the netmask of the hosts ethernet interface(s) will be used when matching.

 # This is all the servers
 Host_Alias SERVERS = 192.168.0.1, 192.168.0.2, server1
 # This is the whole network
 Host_Alias NETWORK = 192.168.0.0/255.255.255.0
 # And this is every machine in the network that is not a server
 Host_Alias WORKSTATIONS = NETWORK, !SERVER
 # This could have been done in one step with 
 # Host_Alias WORKSTATIONS = 192.168.0.0/255.255.255.0, !SERVERS
 # but I think this method is clearer.

Command Aliases

Command aliases are lists of commands and directories. You can use this to specify a group of commands. If you specify a directory it will include any file within that directory but not in any subdirectories.

The special command ‘»sudoedit»‘ allows users to run sudo with the -e flag or as the command sudoedit. If you include command line arguments in a command in an alias these must exactly match what the user enters on the command line. If you include any of the following they will need to be escaped with a backslash (): «,», «», «:», «=».

Examples:

 # All the shutdown commands
 Cmnd_Alias SHUTDOWN_CMDS = /sbin/poweroff, /sbin/reboot, /sbin/halt
 # Printing commands
 Cmnd_Alias PRINTING_CMDS = /usr/sbin/lpc, /usr/sbin/lprm
 # Admin commands
 Cmnd_Alias ADMIN_CMDS = /usr/sbin/passwd, /usr/sbin/useradd, /usr/sbin/userdel, /usr/sbin/usermod, /usr/sbin/visudo
 # Web commands
 Cmnd_Alias WEB_CMDS = /etc/init.d/apache2

User Specifications

User Specifications are where the sudoers file sets who can run what as who. It is the key part of the file and all the aliases have just been set up for this very point. If this was a film this part is where all the key threads of the story come together in the glorious unveiling before the final climatic ending. Basically it is important and without this you ain’t going anywhere.

A user specification is in the format

<user list> <host list> = <operator list> <tag list> <command list>

The user list is a list of users or a user alias that has already been set, the host list is a list of hosts or a host alias, the operator list is a list of users they must be running as or a runas alias and the command list is a list of commands or a cmnd alias.

The tag list has not been covered yet and allows you set special things for each command. You can use PASSWD and NOPASSWD to specify whether the user has to enter a password or not and you can also use NOEXEC to prevent any programs launching shells themselves (as once a program is running with sudo it has full root privileges so could launch a root shell to circumvent any restrictions in the sudoers file.

For example (using the aliases and users from earlier)

 # This lets the webmasters run all the web commands on the machine 
 # "webserver" provided they give a password
 WEBMASTERS webserver= WEB_CMDS
 # This lets the admins run all the admin commands on the servers
 ADMINS SERVERS= ADMIN_CMDS
 # This lets all the USERS run admin commands on the workstations provided 
 # they give the root password or and admin password (using "sudo -u <username>")
 USERS WORKSTATIONS=(ADMINS) ADMIN_CMDS
 # This lets "harry" shutdown his own machine without a password
 harry harrys-machine= NOPASSWD: SHUTDOWN_CMDS
 # And this lets everybody print without requiring a password
 ALL ALL=(ALL) NOPASSWD: PRINTING_CMDS

The Default Ubuntu Sudoers File

The sudoers file that ships with Ubuntu 8.04 by default is included here so if you break everything you can restore it if needed and also to highlight some key things.

# /etc/sudoers
#
# This file MUST be edited with the 'visudo' command as root.
#
# See the man page for details on how to write a sudoers file.
#

Defaults    env_reset

# Uncomment to allow members of group sudo to not need a password
# %sudo ALL=NOPASSWD: ALL

# Host alias specification

# User alias specification

# Cmnd alias specification

# User privilege specification
root    ALL=(ALL) ALL

# Members of the admin group may gain root privileges
%admin ALL=(ALL) ALL

This is pretty much empty and only has three rules in it. The first (Defaults env_reset) resets the terminal environment after switching to root. So, ie: all user set variables are removed. The second (root ALL=(ALL) ALL) just lets root do everything on any machine as any user. And the third (%admin ALL=(ALL) ALL) lets anybody in the admin group run anything as any user. Note that they will still require a password (thus giving you the normal behaviour you are so used to).

If you want to add your own specifications and you are a member of the admin group then you will need to add them after this line. Otherwise all your changes will be overridden by this line saying you (as part of the admin group) can do anything on any machine as any user provided you give a password.

Common Tasks

This section includes some common tasks and how to accomplish them using the sudoers file.

Shutting Down From The Console Without A Password

Often people want to be able to shut their computers down without requiring a password to do so. This is particularly useful in media PCs where you want to be able to use the shutdown command in the media centre to shutdown the whole computer.

To do this you need to add some cmnd aliases as follows:

Cmnd_Alias SHUTDOWN_CMDS = /sbin/poweroff, /sbin/halt, /sbin/reboot

You also need to add a user specification (at the end of the file after the «%admin ALL = (ALL) ALL» line so it takes effect — see above for details):

<your username> ALL=(ALL) NOPASSWD: SHUTDOWN_CMDS

Obviously you need to replace «<your username>» with the username of the user who needs to be able to shutdown the pc without a password. You can use a user alias here as normal.

There are times where you need to have both NOPASSWD and NOEXEC or other tags on the same configuration line. The man page for sudoers is less than clear, so here is an example of how this is done:

myuser ALL = (root) NOPASSWD:NOEXEC: /usr/bin/vim

This example lets the user «myuser» run as root the «vim» binary without a password, and without letting vim shell out (the :shell command).

Enabling Visual Feedback when Typing Passwords

As of Ubuntu 10.04 (Lucid), you can enable visual feedback when you are typing a password at a sudo prompt.

Simply edit /etc/sudoers and change the Defaults line to read:

Defaults        env_reset,pwfeedback

Troubleshooting

If your changes don’t seem to have had any effect, check that they are not trying to use aliases that are not defined yet and that no other user specifications later in the file are overriding what you are trying to accomplish.


CategorySecurity

Данная статья – это продолжение темы, посвящённой утилите sudo, начатой материалами, знакомящими с данной командой и некоторыми её опциями. Ниже попробуем рассказать о настройках утилиты sudo, которые могут применяться в её отношении.

Настройки sudo по большей части находятся в файле /etc/sudoers. Для внесения изменений в этот файл крайне нежелательно использовать обычный редактор текста. Дело в том, что некорректный синтаксис файла sudoers запросто может навредить операционной системе в части повышения уровня полномочий учётных записей и их действий. Для редактирования файла sudoers существует специальная команда – visudo. Данная команда использует штатный текстовый редактор, но при сохранении внесённых в файл изменений производит проверку синтаксиса.

Здесь есть один интересный момент. Команда visudo обычно использует текстовый редактор vi. Но, например, в Ubuntu visudo открывает файл при помощи nano. И, несмотря на это, операционная система сохраняет возможность заменить использующийся редактор. В Ubuntu команда для изменения редактора выглядит следующим образом:

$ sudo update-alternatives --config editor

Здесь нужно просто ввести соответствующую цифру, либо нажать <Enter>, чтобы не вносить изменений:

sudo update-alternatives --config editor - Sudo: настройка файла /etc/sudoers

Содержимое файла /etc/sudoers

Теперь давайте рассмотрим некоторые настройки, содержащиеся в файле /etc/sudoers.

Во-первых, строка Defaults env_reset отвечает за сброс терминальной среды с целью удалить переменные пользователя. Такая мера безопасности применяется для ликвидации потенциально опасного воздействия переменных среды в сессии sudo.

Во-вторых, строка Defaults secure_path задаёт значение для переменной PATH. Такой путь для приложений используется утилитой sudo для выполнения операций. Это позволяет защитить систему от использования пользовательских путей, которые могут быть потенциально опасными.

Далее, в файле /etc/sudoers есть строка, определяющая полномочия sudo для учётной записи root.

root ALL=(ALL:ALL) ALL

В этой записи первое значение ALL указывает на то, что описанное правило будет применено ко всем хостам. Второе значение ALL указывает на то, что учётная запись root может выполнять команды от имени любого пользователя. Третье значение ALL говорит о том, что учётная запись root может выполнять команды от имени любой группы. И, наконец, последнее значение ALL указывает на то, что данное правило применяется ко всем выполняемым командам.

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

%sudo ALL=(ALL:ALL) ALL

Имена, которые начинаются со знака %, указывают на то, что речь идёт именно о названиях групп, а не об именах учётных записей. В остальном данная настройка идентична тому, как это описано в отношении пользователей.

Есть в файле /etc/sudoers настройка, которая выглядит как комментарий.

#includedir /etc/sudoers.d - Sudo: настройка файла /etc/sudoers

Несмотря на то, что строка с параметром includedir начинается со знака #, комментарием данная строка не является. Этот параметр указывает на то, что файлы, находящиеся в директории /etc/sudoers.d, также применяются для настройки полномочий sudo. Файлы в этом каталоге создаются в основном для того, чтобы определённые пользователи могли запускать определённые команды с использованием привилегий sudo. Данные файлы, также как и файл /etc/sudoers, необходимо редактировать командой visudo. Например, для того, чтобы отредактировать файл /etc/sudoers.d/mysettingsfile, следует применить следующую конструкцию:

$ sudo visudo -f /etc/sudoers.d/mysettingsfile

Использование псевдонимов

При организации данных по разным пользователям и группам в файле /etc/sudoers полезно использование различных псевдонимов. Вот так выглядят записи в /etc/sudoers, соответствующие трём разным группам пользователей:

User_Alias     GROUPA = user1, user2, user3
User_Alias     GROUPB = user4, user5, user3
User_Alias     GROUPC = user1, user4, user5

Важно помнить, что названия групп должны начинаться с заглавной буквы. Следующей строкой для членов группы GROUPA мы дадим разрешение на запуск обновления базы данных apt:

GROUPA      ALL = /usr/bin/apt update

Подобным же образом мы можем дать участникам группы GROUPC разрешение на перезагрузку операционной системы. Для этого необходимо создать псевдоним, содержащий команды на перезагрузку системы. Такой псевдоним мы назовём, например, RSTRT. После чего участникам группы GROUPC нужно будет выдать разрешение на запуск этих команд.

Cmnd_Alias      RSTRT = /sbin/restart, /sbin/reboot
GROUPC          ALL= RSTRT

В файле /etc/sudoers существует возможность контролировать реакцию утилиты sudo при её вызове. Например, вы можете разрешить пользователям выполнять какую-либо команду с использованием полномочий root, но без необходимости пользователю вводить свой пароль. Для таких случаев применяется опция NOPASSWD. Так будет выглядеть запись в /etc/sudoers, разрешающая запуск команды apt update участникам группы GROUPB:

GROUPB      ALL = NOPASSWD: /usr/bin/apt update

И кстати, в /etc/sudoers есть настройка, позволяющая изменить количество неправильных попыток ввода пароля при выполнении команды sudo. По умолчанию таких попыток разрешено 3. Но если есть желание увеличить из количество, допустим, до четырёх, то такая настройка будет выглядеть как:

Defaults   passwd_tries=4

Там же вы можете изменить фразу, с помощью которой система сообщает вам о неверно набранном пароле при запуске sudo:

Defaults    badpass_message="Your password is not correct!"

И эту фразу пользователь будет видеть вместо стандартной Sorry, try again.

Сообщение о неправильно набранном пароле

Вместо заключения

Файл /etc/sudoers является очень мощным инструментом настройки функционирования системы. В этой ознакомительной статье мы лишь вкратце коснулись данной темы. Ну, а поскольку вы теперь знаете, что такие настройки возможны, глубину их изучения определять именно вам. Ведь применять или не применять их в работе с Linux-системами, решаете вы.

17 марта, 2016 12:01 пп
56 134 views
| Комментариев нет

Centos, Linux, Ubuntu

Разделение прав доступа – одна из наиболее важных парадигм безопасности, реализуемых в Linux и Unix-подобных операционных системах. Обычные пользователи работают с ограниченными правами; так сокращаются масштабы их влияния на их собственную среду и на операционную систему в целом.

Пользователь root имеет привилегии суперпользователя. Эта учетная запись администратора не имеет ограничений, которые присутствуют на учётных записях обычных пользователей. Другие пользователи могут выполнять команды с правами root в ряде отдельных случаев.

В данном руководстве показано, как правильно и безопасно для системы передавать права root.

Примечание: Данное руководство было выполнено на сервере Ubuntu 12.04, однако большинство современных дистрибутивов Linux будут вести себя аналогичным образом.

Для выполнения руководства нужно предварительно выполнить начальную настройку сервера:

  • Начальная настройка сервера Ubuntu 12.04
  • Начальная настройка сервера CentOS 7

Войдите на сервер как не-root пользователь.

Как получить права root

Есть три основных способа получить привилегии суперпользователя, которые варьируются по уровню сложности.

Вход как root

Проще всего, конечно, войти в систему как пользователь root.

При подключении через SSH укажите IP-адрес или имя хоста:

ssh root@IP_адрес_или_домен

По запросу введите root-пароль.

Команда su

Постоянно использовать учётную запись root не рекомендуется, поскольку, имея абсолютные права доступа, можно совершенно случайно нанести системе непоправимый вред.

Потому в системе существует команда su, позволяющая обычному пользователю получать root-права в любой момент.

Примечание: Команда su – это сокращение от substitute user.

Итак, чтобы получить root-права, просто введите:

su

Система запросит пароль root-пользователя, после чего откроет доступ к сессии оболочки root-пользователя.

Выполнив все задачи, требующие прав root, можно вернуться в предыдущую сессию:

exit

Команда sudo

Последний способ получения привилегий root – команда sudo.

Команда sudo позволяет выполнять отдельные команды с правами root без необходимости открывать новую сессию.

sudo command_to_execute

Примечание: В отличие от su, команда sudo запрашивает не пароль root, а пароль пользователя, который вызывает команду.

Из соображений безопасности команда sudo недоступна по умолчанию, доступ к ней нужно настраивать. Если вы следовали руководству по начальной настройке сервера, вы уже знаете, как это делается.

Что такое Visudo?

Команда sudo настраивается при помощи файла /etc/sudoers.

Важно! Никогда не редактируйте этот файл при помощи обычного текстового редактора! Для этого следует использовать visudo.

Неправильный синтаксис, добавленный в этот файл, может полностью нарушить распределение прав между пользователями. Потому для работы с этим файлом используется команда visudo.

Команда visudo открывает файл в обычном текстовом редакторе, но во время сохранения файла проверяет его синтаксис. Это позволяет избежать ошибок в конфигурации.

Как правило, visudo открывает файл /etc/sudoers в редакторе vi. В системе Ubuntu visudo использует nano.

Чтобы настроить команду visudo для использования vi в системе Ubuntu, выполните команду:

sudo update-alternatives --config editor

There are 3 choices for the alternative editor (providing /usr/bin/editor).
Selection    Path                Priority   Status
————————————————————
* 0            /bin/nano          40        auto mode
1            /bin/nano           40        manual mode
2            /usr/bin/vim.basic   30        manual mode
3            /usr/bin/vim.tiny    10        manual mode

Выберите число, соответствующее текстовому редактору, который вы хотите использовать.

В системе CentOS это значение можно изменить, добавив в ~/.bashrc строку:

export EDITOR=/path/to/editor

Чтобы обновить настройки, введите:

. ~/.bashrc

Чтобы открыть /etc/sudoers, введите:

sudo visudo

Редактирование файла sudoers

Итак, в выбранном вами текстовом редакторе на экране откроется файл sudoers.

Ниже приведены параметры файла системы Ubuntu 12.04 (закомментированные строки опущены, а изменения, внесённые при начальной настройке сервера, сохранены).

Примечание: Файл sudoers системы CentOS гораздо более объёмен; некоторые его параметры в этом руководстве не описаны.

Defaults        env_reset
Defaults        secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
root        ALL=(ALL:ALL) ALL
demo        ALL=(ALL:ALL) ALL
%admin      ALL=(ALL) ALL
%sudo       ALL=(ALL:ALL) ALL

Стандартные параметры

Первая строка, Defaults env_reset, сбрасывает терминальную среду, чтобы удалить все пользовательские переменные. Эта мера безопасности используется для устранения потенциально вредного воздействия переменных среды из сессии sudo.

Второй параметр, Defaults secure_path=…, задаёт путь (PATH, точки файловой системы, в которых ОС будет искать приложения) для операций sudo. Это предотвращает использование потенциально опасных пользовательских путей.

Параметры настройки прав пользователей

Третий и четвёртый параметр должны быть вам знакомы. Четвёртую строку вы добавили самостоятельно, но, возможно, не разбирали её подробно.

  • demo  ALL=(ALL:ALL) ALL
  • Первое поле задаёт имя пользователя, к которому нужно применить данное правило (в данном случае это demo).
  • Первое ALL значит, что правило будет применяться ко всем хостам.
  • Второе ALL значит, что указанный пользователь может запускать команды в сессии любого пользователя.
  • Третье ALL значит, что указанный пользователь может запускать команды в любой группе.
  • Последнее ALL указывает, что эти правила нужно применять ко всем командам.

Это значит, что пользователи root и demo могут запускать все команды при помощи sudo, указав свой пароль.

Параметры привилегий групп

Последние две строки похожи на параметры привилегий пользователей, однако они отвечают за права групп.

Имена групп начинаются с символа %.

Как видите, группа admin может выполнять любую команду как любой пользователь или хост. Аналогичные права имеет группа sudo, однако она также может запускать команду как любая группа.

Пользовательские правила

Ознакомившись с базовым синтаксисом файла, попробуйте создать пару правил самостоятельно.

Создание алиасов

Файл sudoers можно более удобно структурировать при помощи различных алиасов (англ. – alias).

К примеру, можно создать три разные группы пользователей с совмещёнными правами:

User_Alias      GROUPONE = abby, brent, carl
User_Alias      GROUPTWO = brent, doris, eric,
User_Alias      GROUPTHREE = doris, felicia, grant

Имена групп должны начинаться с большой буквы. После этого можно дать пользователям GROUPTWO право на изменение БД apt-get:

GROUPTWO    ALL = /usr/bin/apt-get update

Если в правиле не указан пользователь и группа, по умолчанию sudo использует root.

Затем можно разрешить пользователям группы GROUPTHREE выключать и перезапускать машину; для этого нужно создать алиас команды:

Cmnd_Alias      POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart
GROUPTHREE  ALL = POWER

Алиас команды POWER содержит команды для отключения и перезапуска машины.

Также можно создать алиас Run as, который заменяет часть правила, указывающую пользователя, в сессии которого нужно выполнить команду.

Runas_Alias     WEB = www-data, apache
GROUPONE    ALL = (WEB) ALL

Теперь любой пользователь группы GROUPONE может выполнять команды в сессиях пользователей www-data или apache.

Примечание: Помните, что созданные ранее правила имеют более высокий приоритет в случае конфликта правил.

Блокировка правил

Существует ряд способов контроля поведения и реакции sudo на вызов.

К примеру, команда updatedb в сочетании с пакетом mlocate относительно безвредна. Чтобы обычный пользователь мог выполнять её с привилегиями суперпользователя, не вводя пароль, можно создать такое правило:

GROUPONE    ALL = NOPASSWD: /usr/bin/updatedb

Команда NOPASSWD значит, что система не будет запрашивать пароль. Также существует команда PASSWD, которая отвечает за противоположное поведение и используется по умолчанию.

NOPASSWD распространяется на всё правило, если команда PASSWD не отменяет его. Например, строка может выглядеть так:

GROUPTWO    ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill

Ещё одна удобная команда – NOEXEC, которая используется для предотвращения опасного поведения определенных программ. К примеру, некоторые команды, такие как less, могут вызывать другие команды:

!command_to_run

Эта команда выполняет любую команду с привилегиями пользователя, запускающего less, а это может быть очень опасно.

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

username    ALL = NOEXEC: /usr/bin/less

Дополнительные сведения

В данном разделе собраны различные полезные советы по работе с sudo.

Если вы указали пользователя или группу в параметре Run as, вы можете выполнять команды в сессии этого пользователя при помощи флагов -u и –g соответственно:

sudo -u run_as_user command
sudo -g run_as_group command

По умолчанию sudo сохраняет учётные данные в одном терминале на некоторое время. Это означает, что в течение этого периода вам не придется вводить пароль снова.

Если в целях безопасности вы хотите сбросить этот таймер, используйте команду:

sudo -k

Чтобы узнать права пользователя, введите:

sudo -l

Эта команда выведет все права, указанные в файле /etc/sudoers для данного пользователя.

Если обычный пользователь попытается запустить команду администратора без префикса sudo, команда не сработает. Чтобы  избежать необходимости повторного ввода команды, используйте функцию bash, которая повторяет команду:

sudo !!

Двойной восклицательный знак повторит последнюю команду.

Заключение

Теперь у вас есть базовые навыки работы с файлом sudoers и правами root.

Работая с правами суперпользователя, помните о том, что обычные пользователи не обладают такими правами по умолчанию из соображений безопасности. Не злоупотребляйте правами root, иначе можно случайно нанести системе непоправимый ущерб.

Tags: sudoers, Ubuntu 12.04

On a modern Ubuntu system (and many other GNU/Linux distributions), fixing a corrupted sudoers file is actually quite easy, and doesn’t require rebooting, using a live CD, or physical access to the machine.

To do this via SSH, log in to the machine and run the command pkexec visudo. If you have physical access to the machine, SSH is unnecessary; just open a Terminal window and run that pkexec command.

Assuming you (or some other user) are authorized to run programs as root with PolicyKit, you can enter your password, and then it will run visudo as root, and you can fix your /etc/sudoers.

If you need to edit one of the configuration files in /etc/sudoers.d (which is uncommon in this situation, but possible), use pkexec visudo -f /etc/sudoers.d/filename.

If you have a related situation where you have to perform additional system administration commands as root to fix the problem (also uncommon in this circumstance, but common in others), you can start an interactive root shell with pkexec bash. Generally speaking, any non-graphical command you’d run with sudo can be run with pkexec instead.

(If there is more than one user account on the system authorized to run programs as root with PolicyKit, then for any of those actions, you’ll be asked to select which one you want to use, before being asked for your password.)


If that doesn’t work—for example, if there are no users authorized to run programs as root via PolicyKit—then boot from an Ubuntu live CD (like the CD you probably used to install Ubuntu) and mount the filesystem for the installed system. You can do this by running sudo parted -l to view your partitions—there is probably just one ext4 partition, and that’s the root filesystem.

Suppose the installed Ubuntu system’s root filesystem is on /dev/sda1. Then you could mount it with sudo mount /dev/sda1 /mnt. Then you can edit the installed system’s sudoers file with sudo nano -w /mnt/etc/sudoers. Or, even better, you can edit it with

sudo visudo -f /mnt/etc/sudoers

(which will prevent you from saving a sudoers file with incorrect syntax).

Состояние перевода: На этой странице представлен перевод статьи Sudo. Дата последней синхронизации: 26 июня 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Sudo (англ. substitute user do, дословно «подменить пользователя и выполнить») позволяет системному администратору делегировать полномочия, чтобы дать некоторым пользователям (или группе пользователей) возможность запускать некоторые (или все) команды c правами суперпользователя или любого другого пользователя, обеспечивая контроль над командами и их аргументами.

Sudo — это альтернатива su для выполнения команд с правами суперпользователя (root). В отличие от su, который запускает оболочку с правами root и даёт всем дальнейшим командам root-права, sudo предоставляет временное повышение привилегий для одной команды. Предоставляя привилегии root только при необходимости, sudo снижает вероятность того, что опечатка или ошибка в выполняемой команде произведут в системе разрушительные действия.

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

Установка

Установите пакет sudo.

Использование

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

Для использования sudo просто добавьте sudo и пробел перед нужной командой:

$ sudo команда

Например, для использования pacman:

$ sudo pacman -Syu

Смотрите sudo(8) для более подробной информации.

Настройка

Defaults

sudoers(5) § SUDOERS OPTIONS содержит список опций, которые можно использовать с командой Defaults в файле /etc/sudoers.

Здесь доступен список опций (извлечён из исходного кода версии 1.8.7) в формате, удобном для копирования и вставки в файл sudoers.

Смотрите sudoers(5) для более подробной информации, например о настройке таймаутов.

Просмотр текущих настроек

Выполните sudo -ll для вывода текущей конфигурации sudo.
Чтобы посмотреть настройки, действующие для конкретного пользователя, выполните sudo -lU пользователь.

Использование visudo

Файл настроек /etc/sudoers всегда следует редактировать с помощью команды visudo(8). visudo блокирует файл sudoers, сохраняет изменения во временный файл и проверяет, что файл синтаксически корректен, перед тем как скопировать его в /etc/sudoers.

Важно:

  • Крайне важно, чтобы файл sudoers был без синтаксических ошибок! Любая ошибка делает sudo неработоспособным. Всегда редактируйте его только с помощью visudo для предотвращения ошибок.
  • Из visudo(8): Обратите внимание, что это дыра в безопасности, поскольку позволяет пользователю запускать любую программу, какую он захочет, просто прописав её в VISUAL или EDITOR.

visudo использует vi в качестве текстового редактора по умолчанию. Пакет sudo скомпилирован с опцией --with-env-editor по умолчанию и использует переменные VISUAL и EDITOR. EDITOR не используется, если задана переменная VISUAL.

Чтобы выбрать nano в качестве редактора для visudo в текущем сеансе, задайте и экспортируйте переменную EDITOR перед запуском visudo. Чтобы выбрать другой редактор однократно, можно просто прописать эту переменную перед командой visudo:

# EDITOR=nano visudo

В качестве альтернативы можно отредактировать копию файла /etc/sudoers и вручную запустить проверку синтаксиса с помощью команды visudo -c /копия/файла/sudoers. Это может пригодиться, если вас не устраивает, что visudo блокирует файл.

Для изменения редактора на постоянной основе для текущего пользователя, смотрите раздел Переменные окружения#На уровне пользователя. Для того, чтобы установить выбранный редактор на постоянной основе для всей системы, но только для visudo, добавьте следующее в /etc/sudoers (предположим, что вы предпочитаете nano в качестве редактора):

# Сброс окружения
Defaults      env_reset
# Установка ограниченного варианта nano в качестве редактора по умолчанию и запрет visudo использовать EDITOR/VISUAL.
Defaults      editor=/usr/bin/rnano, !env_editor

Примеры настроек

Настройка sudo осуществляется добавлением записей в файл /etc/sudoers. Чтобы дать пользователю привилегии суперпользователя, когда он вводит sudo перед командой, добавьте следующую строку:

имя_пользователя   ALL=(ALL:ALL) ALL

Разрешить пользователю выполнять все команды от любого пользователя, но только на машине с определенным названием хоста:

имя_пользователя   название_хоста=(ALL:ALL) ALL

Предоставить членам группы wheel доступ к sudo:

%wheel      ALL=(ALL:ALL) ALL

Совет: Для добавления новых администраторов рекомендуется включить доступ к sudo для группы wheel и добавлять новых пользователей в неё, поскольку по умолчанию Polkit рассматривает членов группы wheel как администраторов. Если пользователь не является членом группы wheel, программы, использующие Polkit, могут запросить аутентификацию с использованием пароля root вместо пароля пользователя.

Чтобы не спрашивать пароль у пользователя:

Важно: Это позволит любому процессу, запущенному под вашим именем пользователя, использовать sudo, не спрашивая разрешения.

Defaults:имя_пользователя      !authenticate

Разрешить выполнять только конкретные команды и только пользователю на определенном хосте:

имя_пользователя название_хоста=/usr/bin/halt,/usr/bin/poweroff,/usr/bin/reboot,/usr/bin/pacman -Syu

Примечание: Наиболее общие опции должны идти в начале файла, а наиболее частные — наоборот, в конце файла, так как более нижние строки переопределяют более верхние. В частности, добавляемая строка должна быть после строки %wheel, если ваш пользователь находится в этой группе.

Разрешить выполнять конкретно определённые команды только для пользователя на определенном хосте и без пароля:

имя_пользователя название_хоста= NOPASSWD: /usr/bin/halt,/usr/bin/poweroff,/usr/bin/reboot,/usr/bin/pacman -Syu

Подробный пример для sudoers доступен в /usr/share/doc/sudo/examples/sudoers. Также смотрите sudoers(5) для получения более подробной информации.

Права доступа к файлам sudoers по умолчанию

Файл sudoers должен иметь владельца root и группу root (0). Права доступа всегда должны быть установлены как r--r----- (0440). Эти права установлены по умолчанию, однако если вы случайно измените их, они должны быть немедленно изменены обратно, иначе sudo не будет работать.

# chown -c root:root /etc/sudoers
# chmod -c 0440 /etc/sudoers

Советы и рекомендации

Отключение таймаута запроса пароля

Часто раздражает такая вещь: вы запускаете какой-то долгий процесс, который работает с обычными правами и повышает их только при необходимости, и когда sudo запросит пароль, вы можете случайно не заметить это и не ввести его вовремя, из-за чего случается таймаут, процесс умирает и проделанная работа теряется или, если повезёт, кэшируется. Обычно советуют отключить запрос пароля для sudo или увеличить время действия ранее введённого пароля, однако оба этих способа имеют негативные последствия для безопасности. Таймаут запроса пароля тоже можно отключить, и поскольку это никак не влияет на безопасность, это и должно быть предпочтительным решением:

Defaults passwd_timeout=0

Сигнал при запросе пароля

Чтобы работающий в фоне терминал привлёк ваше внимание в момент запроса пароля, можно добавить символ BELL в строку запроса пароля:

Defaults passprompt="^G[sudo] password for %p: "

Вместо ^G должен быть вписан настоящий символ BELL. Например, чтобы ввести его в vim, используйте сочетание Ctrl+v Ctrl+g, а в nano используйте Alt+v Ctrl+g.

Перенос псевдонимов

Если у вас установлено много псевдонимов, вы могли заметить, что они не переносятся в сеанс sudo. Однако, это легко исправить. Просто добавьте в ваш ~/.bashrc или /etc/bash.bashrc строку:

alias sudo='sudo '

Один тайм-аут на все сеансы терминала

Важно: Это позволит любому процессу воспользоваться вашим открытым сеансом sudo.

По умолчанию сеанс sudo действует только в пределах текущего терминала; при запуске sudo в новом терминале он запросит пароль заново. Если вас это раздражает, укажите для опции timestamp_type значение global:

Defaults timestamp_type=global

Время действия введённого пароля

Возможно, вы захотите изменить промежуток времени, в течение которого sudo действует без ввода пароля. Этого легко добиться добавив опцию timestamp_timeout в /etc/sudoers (по умолчанию 5 минут):

Defaults timestamp_timeout=10

Если вы запускаете много sudo-команд подряд, возможно, вместо увеличения timestamp_timeout лучше просто периодически обновлять временную метку. Команда sudo -v запустит отсчёт таймаута заново. С помощью команды sudo -K можно удалить временную метку, что приведёт к запросу пароля при следующем запуске sudo.

Обновление временной метки можно автоматизировать с помощью такого псевдонима (добавьте его в .bashrc):

alias sudo='sudo -v; sudo '

Также можно сделать bash-функцию: подробнее на stackexchange.

Переменные окружения

Если у вас много переменных окружения или вы экспортировали ваши настройки прокси через export http_proxy="...", когда вы используете sudo, эти переменные не будут переданы в открытый сеанс, если вы не запустите sudo в опцией -E.

$ sudo -E pacman -Syu

Рекомендованный способ сохранения переменных окружения — это прописать их в env_keep:

/etc/sudoers
Defaults env_keep += "ftp_proxy http_proxy https_proxy no_proxy"

Пароль суперпользователя

Вы можете сконфигурировать sudo так, чтобы он спрашивал пароль суперпользователя вместо пароля текущего пользователя, добавив targetpw (целевой пользователь, по умолчанию root) или rootpw в список опций Defaults в /etc/sudoers:

Defaults targetpw

Чтобы не понадобилось разглашать пароль root обычным пользователям, можно указать эту опцию только для определённой группы:

Defaults:%wheel targetpw
%wheel ALL=(ALL) ALL

Отключение учетной записи root

Вы можете захотеть отключить возможность входа систему пользователя root. Без этого атакующие сначала должны будут угадать имя пользователя, сконфигурированного как sudoer, а также пароль этого пользователя. Смотрите для примера Secure Shell (Русский)#Отключение.

Важно:

  • Будьте осторожны. Вы можете попасть в свою ловушку, если отключите вход систему пользователя root. Sudo по умолчанию не установлен, и его стандартная конфигурация не позволяет ни получить доступ к правам root без пароля, ни дать такой доступ вам по вашему собственному паролю. Убедитесь, что пользователь правильно сконфигурирован как sudoer перед отключением аккаунта суперпользователя!
  • Если файл sudoers настроен на использование rootpw по умолчанию, то не отключайте root-вход ни одной из следующих команд!
  • Если вы уже попали в ловушку, смотрите статью Сброс пароля root для получения помощи.

Можно заблокировать аккаунт с помощью passwd:

# passwd -l root

Похожая команда снимает блокировку:

$ sudo passwd -u root

Также вы можете отредактировать /etc/shadow и заменить зашифрованный пароль root на «!»:

root:!:12345::::::

Тогда, чтобы задать новый пароль и тем самым разблокировать пользователя root:

$ sudo passwd root

Совет: Чтобы попасть в командную оболочку root даже после отключения аккаунта, используйте команду sudo -i.

kdesu

kdesu можно использовать в KDE для запуска графических программ с привилегиями суперпользователя. Вероятно, что kdesu по умолчанию будет пытаться использовать su, даже если аккаунт root отключен. К счастью, можно сказать kdesu использовать sudo вместо su. Создайте/отредактируйте файл ~/.config/kdesurc:

[super-user-command]
super-user-command=sudo

или используйте следующую команду:

$ kwriteconfig5 --file kdesurc --group super-user-command --key super-user-command sudo

Еще один пример настройки

Допустим, вы создали 3 пользователей: admin, devel и joe. Пользователь «admin» используется для journalctl, systemctl, mount, kill и iptables; «devel» используется для установки пакетов и редактирования настроек; «joe» — пользователь, под которым вы вошли в систему. Чтобы разрешить «joe» перезагружаться, выключать систему и использовать netctl, мы должны сделать следующее:

Отредактировать /etc/pam.d/su и /etc/pam.d/su-1.
Потребовать, чтобы пользователь был в группе wheel, но никого в неё не добавлять.

#%PAM-1.0
auth            sufficient      pam_rootok.so
# Uncomment the following line to implicitly trust users in the "wheel" group.
#auth           sufficient      pam_wheel.so trust use_uid
# Uncomment the following line to require a user to be in the "wheel" group.
auth            required        pam_wheel.so use_uid
auth            required        pam_unix.so
account         required        pam_unix.so
session         required        pam_unix.so

Разрешить вход по SSH только для группы ‘ssh’. В эту группу будет входить только «joe».

# groupadd -r ssh
# gpasswd -a joe ssh
# echo 'AllowGroups ssh' >> /etc/ssh/sshd_config

Перезапустите службу sshd.service.

Добавить пользователей в другие группы.

# for g in power network ;do ;gpasswd -a joe $g ;done
# for g in network power storage ;do ;gpasswd -a admin $g ;done

Установить права на настройки так, чтобы devel мог редактировать их.

# chown -R devel:root /etc/{http,openvpn,cups,zsh,vim,screenrc}
Cmnd_Alias  POWER       =   /usr/bin/shutdown -h now, /usr/bin/halt, /usr/bin/poweroff, /usr/bin/reboot
Cmnd_Alias  STORAGE     =   /usr/bin/mount -o nosuid,nodev,noexec, /usr/bin/umount
Cmnd_Alias  SYSTEMD     =   /usr/bin/journalctl, /usr/bin/systemctl
Cmnd_Alias  KILL        =   /usr/bin/kill, /usr/bin/killall
Cmnd_Alias  PKGMAN      =   /usr/bin/pacman
Cmnd_Alias  NETWORK     =   /usr/bin/netctl
Cmnd_Alias  FIREWALL    =   /usr/bin/iptables, /usr/bin/ip6tables
Cmnd_Alias  SHELL       =   /usr/bin/zsh, /usr/bin/bash
%power      ALL         =   (root)  NOPASSWD: POWER
%network    ALL         =   (root)  NETWORK
%storage    ALL         =   (root)  STORAGE
root        ALL         =   (ALL)   ALL
admin       ALL         =   (root)  SYSTEMD, KILL, FIREWALL
devel	    ALL         =   (root)  PKGMAN
joe	    ALL         =   (devel) SHELL, (admin) SHELL

С такими настройками вам практически никогда не понадобится входить как суперпользователь.

«joe» может подсоединиться к своему домашнему WiFi.

$ sudo netctl start home
$ sudo poweroff

«joe» не может использовать netctl от имени другого пользователя.

$ sudo -u admin -- netctl start home

Когда «joe» хочет воспользоваться journalctl или убить зависший процесс, он может переключиться на нужного пользователя:

$ sudo -i -u devel
$ sudo -i -u admin

Но «joe» не может переключиться на суперпользователя.

$ sudo -i -u root

Если «joe» хочет начать gnu-screen сессию как admin, он может сделать это следующим образом:

$ sudo -i -u admin
[admin]$ chown admin:tty `echo $TTY`
[admin]$ screen

Настройка sudo с помощью вкладываемых в /etc/sudoers.d файлов

sudo обрабатывает файлы, содержащиеся в директории /etc/sudoers.d/. Это означает, что вместо того, чтобы редактировать /etc/sudoers, вы можете менять настройки в отдельных файлах и перемещать их в эту директорию. Это даёт два преимущества:

  • Вам не понадобится редактировать файл sudoers.pacnew;
  • Если с новой записью будет проблема, вы можете просто удалить соответствующий файл вместо необходимости редактировать /etc/sudoers (но смотрите предупреждение ниже).

Формат записей в этих вкладываемых файлах такой же, как и в самом файле /etc/sudoers. Чтобы редактировать их напрямую, используйте visudo -f /etc/sudoers.d/файл. Смотрите sudoers(5) § Including other files from within sudoers для дополнительной информации.

Файлы из каталога /etc/sudoers.d/ обрабатываются в лексикографическом порядке; файлы, содержащие . или ~ в имени, пропускаются. Чтобы избежать путаницы с сортировкой, рекомендуется начинать имена файлов с двух цифр, например 01_foo.

Примечание: Порядок настроек в файлах имеет значение: убедитесь, что правила не переопределяют сами себя.

Важно: Файлы в /etc/sudoers.d/ так же хрупки, как и сам /etc/sudoers: любой некорректный файл сделает sudo неработоспособным. Поэтому по той же причине настоятельно рекомендуется использовать visudo

Редактирование файлов

sudo -e или sudoedit позволяет редактировать файл от имени другого пользователя, но при этом запускать текстовый редактор от имени вашего пользователя.

Это полезно для редактирования файлов от имени root без предоставления повышенных привилегий вашему текстовому редактору. Подробнее об этом читайте в sudo(8) § e.

В качестве редактора можно использовать любую программу, поэтому, например, можно использовать meld для управления файлами pacnew:

$ SUDO_EDITOR=meld sudo -e /etc/файл{,.pacnew}

Шутливые оскорбления

Вы можете сконфигурировать sudo так, чтобы при вводе неверного пароля он выводил шутливые оскорбления вместо стандартного сообщения «Sorry, try again». Найдите строку Defaults в /etc/sudoers и добавьте insults в список опции, разделяя их запятыми. Конечный результат может выглядеть так:

/etc/sudoers
Defaults insults

Для проверки, введите sudo -K, чтобы завершить текущий сеанс и позволить sudo заново запросить пароль.

Решение проблем

Проблемы с TTY через SSH

По умолчанию SSH не выделяет tty при выполнении удалённой команды. Без tty sudo не может отключить отображение пароля при его вводе. Вы можете воспользоваться ssh опцией -t, чтобы заставить его выделять tty.

Defaults опция requiretty всего лишь позволяет запускать sudo пользователям, если они имеют tty.

# Disable "ssh hostname sudo <cmd>", because it will show the password in clear text. You have to run "ssh -t hostname sudo <cmd>".
#
#Defaults    requiretty

Наложение umask

Sudo накладывает на значение umask пользователя свою собственную (которая по умолчанию установлена в 0022). Это предотвращает sudo от создания файлов с более либеральными правами доступа, чем это позволяет umask пользователя. Несмотря на то, что это разумное значение по умолчанию, если не используется измененная umask, это может привести к ситуации, когда программа, запущенная через sudo может создавать файлы с правами доступа отличными от тех, которые создаются при запуске программы непосредственно суперпользователем. Для исправления таких ошибок sudo предоставляет возможность исправить umask, даже если желаемая umask более либеральна, чем установлено в umask пользователя. Добавив такие строки (используйте visudo) вы измените поведение sudo по умолчанию:

Defaults umask = 0022
Defaults umask_override

Это установит sudo umask в umask суперпользователя по умолчанию (0022) и переопределит поведение по умолчанию, всегда используя указанную umask и независимо от umask пользователя.

С помощью утилиты sudo совершенно не обязательно выдавать пользователю абсолютно все права, на выполнение всех команд в системе, от имени root. И для этого не обязательно добавлять юзера в группу sudo.

Возможно также разграничение прав на определенные команды для пользователя или групп пользователей.

Но прежде чем начать настраивать sudoers правила, важно запомнить:

  1. файл /etc/sudoers редактируется при помощи команды visudo
  2. остальные файлы правил создаются и редактируются командой visudo f /etc/sudoers.d/you_file_name
  3. выбор удобного редактора командой updatealternatives config editor

visudo похожа на crontab тем, что во время сохранения файла проверяет его синтаксис и не даст сохранить файл с неверным синтаксисом(что может привести к уязвимости системы).

Как частично разрешить выполнение systemctl команд определённым юзерам?

Предположим, есть пользователь username, которому необходимо разрешить управление(старт, рестарт и т.д) каким либо сервисом, без ввода пароля. Создадим файл /etc/sudoers.d/username и пропишем в нем ряд команд через запятую, или одну команду:

username ALL=NOPASSWD: /bin/systemctl start yourservice.service, /bin/systemctl stop yourservice.service, /bin/systemctl restart yourservice.service, /bin/systemctl reload yourservice.service, /bin/systemctl status yourservice.service

или так:

username ALL=(root) NOPASSWD: /bin/systemctl start yourservice.service, /bin/systemctl stop yourservice.service, /bin/systemctl restart yourservice.service, /bin/systemctl reload yourservice.service, /bin/systemctl status yourservice.service

Прописав команду sudo перед указанными командами, юзер сможет выполнить их без пароля. А разрешение для группы пользователей будет выглядеть так:

%usergroup ALL=(root) NOPASSWD: /bin/systemctl start yourservice.service, /bin/systemctl stop yourservice.service, /bin/systemctl restart yourservice.service, /bin/systemctl reload yourservice.service, /bin/systemctl status yourservice.service

После внесенных изменений необходим рестарт сервиса sudo, естественно от рута:

Следует обратить внимание — то что прописано в каталоге /etc/sudoers.d/ должно подтягиваться из основного конфига /etc/sudoers поэтому в этом файле должно быть прописано внизу:

#includedir /etc/sudoers.d

именно так, с решеткой в начале, хоть это и выглядит как комментарий, это не простой комментарий.

Конечно, мы можем прописывать разрешения и в основном конфиг файле, но делать этого не рекомендуется.

А чтобы разрешить пользователю выполнение абсолютно всех команд без ввода пароля:

username ALL=(ALL) NOPASSWD: ALL

Для лучшего понимания базового синтаксиса sudo заглянем в /etc/sudoers и посмотрим на эти строки:

[...]

# User privilege specification

root ALL=(ALL:ALL) ALL

# Allow members of group sudo to execute any command

%sudo ALL=(ALL:ALL) ALL

[...]

  • Первое поле задаёт имя пользователя или группу, к которым нужно применить данное правило (в данном случае это root и группа sudo).
  • Первое ALL значит, что правило будет применяться ко всем хостам.
  • Второе ALL значит, что указанный пользователь может запускать команды в сессии любого пользователя.
  • Третье ALL значит, что указанный пользователь может запускать команды в любой группе.
  • Последнее ALL указывает, что эти правила нужно применять ко всем командам.

Однако в данном случае ввод первой sudo команды в группе sudo будет сопровождаться просьбой ввода пароля текущего(не root) пользователя.

[sudo] пароль для username:

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

Например, команда NOPASSWD значит, что система не будет запрашивать пароль. Но также существует команда PASSWD, которая отвечает за противоположное поведение и используется по умолчанию. Эти записи идентичны:

%sudo ALL=(ALL:ALL) ALL

%sudo ALL=(ALL:ALL) PASSWD: ALL

Если в правиле не указан пользователь и группа, по умолчанию sudo использует root, именно поэтому данные записи тоже идентичны:

username ALL=NOPASSWD: command

username ALL=(root) NOPASSWD: command

Для структурирования sudo прав применяются алиасы. Например в алиас sudo можно объединить несколько пользователей и затем применять к ним те или иные правила. Создадим 3 алиаса, в которых 9 пользователей:

User_Alias      GROUPONE = abby, brent, carl

User_Alias      GROUPTWO = brent, doris, eric,

User_Alias      GROUPTHREE = doris, felicia, grant

Имена групп должны начинаться с большой буквы. После этого можно дать пользователям GROUPTWO право на изменение БД apt-get:

GROUPTWO ALL = /usr/bin/aptget update

В правиле не указан пользователь и группа, тут по умолчанию sudo использует root.

Затем можно разрешить пользователям группы GROUPTHREE выключать и перезапускать машину; для этого нужно создать алиас команды:

Cmnd_Alias POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart

GROUPTHREE ALL = POWER

Алиас команды POWER содержит команды для отключения и перезапуска машины.

Также можно создать алиас Run as, который заменяет часть правила, указывающую пользователя, в сессии которого нужно выполнить команду.

Runas_Alias WEB = wwwdata, apache

GROUPONE ALL = (WEB) ALL

Теперь любой пользователь группы GROUPONE может выполнять команды в сессиях пользователей www-data или apache.

Примечание: Помните, что созданные ранее правила имеют более высокий приоритет в случае конфликта правил.

Блокировка правил

Существует ряд способов контроля поведения и реакции sudo на вызов.

К примеру, команда updatedb в сочетании с пакетом mlocate относительно безвредна. Чтобы обычный пользователь мог выполнять её с привилегиями суперпользователя, не вводя пароль, можно создать такое правило:

GROUPONE ALL = NOPASSWD: /usr/bin/updatedb

Команда NOPASSWD значит, что система не будет запрашивать пароль. Также существует команда PASSWD, которая отвечает за противоположное поведение и используется по умолчанию.

NOPASSWD распространяется на всё правило, если команда PASSWD не отменяет его. Например, строка может выглядеть так:

GROUPTWO ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill

Ещё одна удобная команда – NOEXEC, которая используется для предотвращения опасного поведения определенных программ. К примеру, некоторые команды, такие как less, могут вызывать другие команды:

Эта команда выполняет любую команду с привилегиями пользователя, запускающего less, а это может быть очень опасно.

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

username ALL = NOEXEC: /usr/bin/less

Частично данный материал взят из источника: https://www.8host.com/blog/redaktirovanie-fajla-sudoers-v-ubuntu-i-centos/  — не впервые обнаруживаю в их блоге очень годные статьи по системному администрированию unix.

Добавление юзера sudo на сервер с авторизацией по SSH ключам

Сен 28, 2022

Olha L.

3хв. читання

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

Прокачайте ваш проект, воспользовавшись скидками на VPS-хостинг в Hostinger! Большой выбор планов, как для учебных, так и для крупных коммерческих проектов.

К предложению

Как Работает Команда Sudo

Чтобы увидеть, как работает команда sudo, сначала следует получить доступ к вашему VPS через SSH. Если возникнут проблемы, ознакомьтесь с нашим руководством по PuTTY.

По умолчанию пользователям root не нужно использовать префикс sudo. У них уже есть все возможные привилегии. Между тем, если пользователь без полномочий root хочет добавить другого пользователя, он должен добавить префикс sudo к команде useradd, например так:

sudo useradd olga

Если пользователь не использует префикс sudo, в выводе он увидит “В разрешении отказано”, или “Permission denied”.

Файл Sudoers

Команда sudo настраивается через файл, расположенный в /etc/. Он называется sudoers.

С помощью команды sudo вы предоставляете привилегии административного уровня обычным пользователям. Обычно первый пользователь, которого вы создаёте при установке Ubuntu, имеет права sudo. В среде VPS это пользователь root по умолчанию. Вы можете изменить настройки таким образом, чтобы другие пользователи также могли запускать команду sudo. Сделать это можно путём редактирования sudoers.

Важно: будьте осторожны! Редактирование файла sudoers с ошибками или неправильным синтаксисом может привести к блокировке всех пользователей в вашем дистрибутиве.

Синтаксис файла Sudoers

Вы можете открыть файл в любом текстовом редакторе, который вам нравится. Мы будем использовать vi:

vi /etc/sudoers

Наш файл VPS выглядит следующим образом:

Пример Файла Sudoers

Давайте рассмотрим некоторые форматы и правила, которых следует придерживаться, редактируя sudoers:

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

Ещё один интересный момент – #includedir /etc/sudoers.d, это означает, что мы можем добавить конфигурации в файл sudoers.d и связать его здесь.

Редактируем Файл Sudoers

Чтобы изменить файл /etc/sudoers, используйте следующую команду:

sudo visudo -f /etc/sudoers

Для редактирования файла sudoers рекомендуется использовать visudo. Visudo гарантирует, что sudoers редактируется только одним пользователем, а не несколькими одновременно, а также выполняет необходимые проверки синтаксиса.

Чтобы увидеть, какие пользователи входят в группу sudo, мы можем использовать команду grep (англ):

grep ‘sudo’ /etc/group

Это действие выведет список имён пользователей.

Чтобы добавить пользователя с именем Билл в группу sudo, мы используем команду adduser в командной строке, например:

adduser bill sudo

Если мы используем команду grep для проверки того, кто входит в группу, мы увидим пользователя с именем Билл.

Если вы хотите дать кому-либо привилегии root, просто добавьте их в sudo.

Чтобы удалить пользователя из sudo:

deluser bill sudo

Команда deluser удалит Билла из группы sudo.

Теперь пользователь Билл больше не сможет выполнять действия, требующие привилегий sudo.

Используем Файл Sudoers, Чтобы Настроить Определённые Привилегии

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

Для этого мы создаем файл конфигурации в /etc/sudoers.d/ и называем его networking. 

Используйте следующую команду для создания файла:

sudo visudo -f /etc/sudoers.d/networking

Добавьте следующий текст в файл:

Cmnd_Alias     CAPTURE = /usr/sbin/tcdump
Cmnd_Alias     SERVERS = /usr/sbin apache2ctl, /usr/bin/htpasswd
Cmnd_Alias     NETALL = CAPTURE, SERVERS
%netadmin ALL=NETALL

В приведенном выше файле мы создали группу netadmin. Пользователи в группе netadmin могут запускать команды, указанные в NETALL. NETALL, в свою очередь, включает все команды под псевдонимами CAPTURE и SERVERS. Команда tcpdump находится под псевдонимом CAPTURE, например, /usr/sbin/tcpdump.

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

sudo adduser bill netadmin

Теперь пользователь Билл сможет запускать команду tcpdump вместе с другими командами, связанными с сетью.

Итоги

Если вы работаете с несколькими пользователями, вам необходимо понимать, как работает команда sudo и файл sudoers. В этом руководстве вы ознакомились с основными моментами, необходимыми для того, чтобы полностью контролировать назначение привилегий в вашей системы!

Author

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

Wondering how to edit Sudoers File in Linux? We can help you.

As part of our Server Management Services, we assist our customers with several Linux queries.

Today let us focus on how to securely obtain root privileges.

How to Edit Sudoers File in Linux

A special user, called root, has super-user privileges. This is an administrative account without the restrictions that are present on normal users.

Users can execute commands with super-user or root privileges in a number of different ways.

In this article, we will discuss how to correctly and securely obtain root privileges, with a special focus on editing the /etc/sudoers file.

In order to see how to edit Sudoers File in Linux, as a first step, our Support Engineers suggest having an Ubuntu 20.04 server. However, most modern Linux distributions such as Debian and CentOS should operate in a similar manner.

How to Edit Sudoers File in Linux

How To Obtain Root Privileges

Our Support Engineers suggest three basic ways to obtain root privileges, which vary in their level of sophistication.

  • Log In As Root

The simplest and most straightforward method of obtaining root privileges is to directly log into the server as the root user.

If we login into a local machine, we enter root as the username at the login prompt and enter the root password.

If we login through SSH, we specify the root user prior to the IP address or domain name in the SSH connection string:

$ ssh root@server_domain_or_ip

Likewise, if we have not set up SSH keys for the root user, we enter the root password when prompted.

  • Usesu to Become Root

Our Support Team doesn’t usually recommend direct login as root. Because, it is easy to begin using the system for non-administrative tasks, which is dangerous.

The next way is to gain super-user privileges and to become the root user at any time. We can do this by invoking the su command, which stands for “substitute user”.

To gain root privileges, type:

$ su

Enter the root user’s password, and we will be dropped into a root shell session.

Once we finish the tasks which require root privileges, return to the normal shell by typing:

# exit
  • Use sudo to Execute Commands as Root

The final, way to obtain root privileges is with the sudo command.

The sudo command allows us to execute one-off commands with root privileges, without the need to spawn a new shell.

It is executed like this:

$ sudo command_to_execute

Unlike su, the sudo command will request the password of the current user, not the root password.

Because of its security implications, sudo access is not granted to users by default. It must be set up before it functions correctly.

The sudo command is configured through a file located at /etc/sudoers.

We should not edit this file with a normal text editor. Instead, use the visudo command.

The visudo command opens a text editor like normal, but it validates the syntax of the file upon saving. This prevents configuration errors from blocking sudo operations. It may be our way to obtain root privileges.

Traditionally, visudo opens the /etc/sudoers file with the vi text editor. Ubuntu, however, has configured visudo to use the nano text editor instead.

If we want to change it back to vi, we issue the following command:

$ sudo update-alternatives –config editor
Output
There are 4 choices for the alternative editor (providing /usr/bin/editor).

Selection        Path                Priority     Status
————————————————————
* 0              /bin/nano           40           auto mode
1                /bin/ed             -100         manual mode
2                /bin/nano           40           manual mode
3                /usr/bin/vim.basic  30           manual mode
4                /usr/bin/vim.tiny   10           manual mode

Press <enter> to keep the current choice[*], or type selection number:

Select the number that corresponds with the choice we would like to make.

On CentOS, we can change this value by adding the following line to ~/.bashrc:

$ export EDITOR=`which name_of_editor`

Then source the file to implement the changes:

$ . ~/.bashrc

After we configure visudo, execute the command to access the /etc/sudoers file:

$ sudo visudo

How to Edit Sudoers File in Linux

We will have the /etc/sudoers file in the text editor we choose.

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

Moving ahead, let’s take a look at what these lines do.

  • Default Lines

The first line, “Defaults env_reset”, resets the terminal environment to remove any user variables. This is a safety measure to clear potentially harmful environmental variables from the sudo session.

The second line, Defaults mail_badpass, tells the system to mail notices of bad sudo password attempts to the configured mailto user. By default, this is the root account.

The third line, which begins with “Defaults secure_path=…”, specifies the PATH for sudo operations. This prevents using user paths which may be harmful.

  • User Privilege Lines

The fourth line, which dictates the root user’s sudo privileges, is different from the preceding lines.

Let us take a look at what the different fields mean:

root ALL=(ALL:ALL) ALL
The first field indicates the username that the rule will apply to (root).

root ALL=(ALL:ALL) ALL
The first “ALL” indicates that this rule applies to all hosts.

root ALL=(ALL:ALL) ALL
This “ALL” indicates that the root user can run commands as all users.

root ALL=(ALL:ALL) ALL
This “ALL” indicates that the root user can run commands as all groups.

root ALL=(ALL:ALL) ALL
The last “ALL” indicates these rules apply to all commands.

This means that our root user can run any command using sudo, as long as they provide their password.

  • Group Privilege Lines

The next two lines are similar to the user privilege lines, but they specify sudo rules for groups.

Names beginning with % indicate group names.

Here, we see the admin group can execute any command as any user on any host. Similarly, the sudo group has the same privileges but can execute as any group as well.

  • Included /etc/sudoers.d Line

The last line might look like a comment at first glance:

. . .
#includedir /etc/sudoers.d

However, this line indicates that files within the /etc/sudoers.d directory will source and apply.

Files within that directory follow the same rules as the /etc/sudoers file itself. Any file that does not end in ~ and that does not have a . in it will be read and appended to the sudo configuration.

As with the /etc/sudoers file, we should always edit files within the /etc/sudoers.d directory with visudo. The syntax for editing these files will be:

$ sudo visudo -f /etc/sudoers.d/file_to_edit

How To Give a User Sudo Privileges

The most common operation that users want to accomplish is to grant a new user general sudo access. This is useful if we want to give an account full administrative access to the system.

The easiest way of doing this on a system set up with a general-purpose administration group, like the Ubuntu system, is actually to add the user in question to that group.

For example, on Ubuntu 20.04, the sudo group has full admin privileges. We can grant a user these same privileges by adding them to the group like this:

$ sudo usermod -aG sudo username

We can also use the gpasswd command:

$ sudo gpasswd -a username sudo

These will both accomplish the same thing.

On CentOS, this is usually the wheel group instead of the sudo group:

$ sudo usermod -aG wheel username

Or, use gpasswd:

$ sudo gpasswd -a username wheel

On CentOS, if adding the user to the group does not work immediately, we have to edit the /etc/sudoers file to uncomment the group name:

$ sudo visudo
. . .
%wheel ALL=(ALL) ALL
. . .

[Stuck with privileges? We’d be happy to assist]

How To Set Up Custom Rules

As we are familiar with the general syntax of the file, let us create some new rules.

  • How To Create Aliases

The sudoers file can organize more easily by grouping things with various kinds of “aliases”.

For instance, we can create three different groups of users, with overlapping membership:

. . .
User_Alias GROUPONE = abby, brent, carl
User_Alias GROUPTWO = brent, doris, eric,
User_Alias GROUPTHREE = doris, felicia, grant
. . .

Group names must start with a capital letter. We can then allow members of GROUPTWO to update the apt database by:

. . .
GROUPTWO ALL = /usr/bin/apt-get update
. . .

If we do not specify a user/group to run as, as above, sudo defaults to the root user.

We can allow members of GROUPTHREE to shut down and reboot the machine by creating a “command alias” and using that in a rule for GROUPTHREE:

. . .
Cmnd_Alias POWER = /sbin/shutdown, /sbin/halt, /sbin/reboot, /sbin/restart
GROUPTHREE ALL = POWER
. . .

We create a command alias called POWER that contains commands to power off and reboot the machine. Then allow the members of GROUPTHREE to execute these commands.

Similarly, we can also create “Run as” aliases, which can replace the portion of the rule that specifies the user to execute:

. . .
Runas_Alias WEB = www-data, apache
GROUPONE ALL = (WEB) ALL
. . .

This will allow anyone who is a member of GROUPONE to execute commands as the www-data user or the apache user.

The later rules will override the earlier rules when there is a conflict between the two.

  • How To Lock Down Rules

There are a number of ways that we can achieve more control over how sudo reacts to a call.

The updatedb command in association with the mlocate package is relatively harmless on a single-user system. If we want to allow users to execute it with root privileges without having to type a password, we can make a rule like this:

. . .
GROUPONE ALL = NOPASSWD: /usr/bin/updatedb
. . .

NOPASSWD is a “tag” that means no password will be requested. It has a companion command called PASSWD, which is the default behavior.

A tag is relevant for the rest of the rule unless overruled by its “twin” tag later down the line.

For instance, we can have a line like this:

. . .
GROUPTWO ALL = NOPASSWD: /usr/bin/updatedb, PASSWD: /bin/kill
. . .

Another helpful tag is NOEXEC, which can be used to prevent some dangerous behavior in certain programs.

For example, some programs, like less, can spawn other commands by typing this from within their interface:

!command_to_run

This basically executes any command the user gives it with the same permissions that less is running under, which can be quite dangerous.

To restrict this, we could use a line like this:

. . .
username ALL = NOEXEC: /usr/bin/less
. . .
  • Additional Information

There are a few more points that may be useful when dealing with sudo.

If we specify a user or group to “run as” in the configuration file, we can execute commands as those users by using the -u and -g flags, respectively:

$ sudo -u run_as_user command
$ sudo -g run_as_group command

For convenience, by default, sudo will save the authentication details for a certain amount of time in one terminal.

For security purposes, if we wish to clear this timer, we can run:

$ sudo -k

If, on the other hand, we want to “prime” the sudo command, not to prompt later, or to renew the sudo lease, we can always type:

$ sudo -v

We will be prompted for the password, which will be cached for later sudo uses until the sudo time frame expires.

If we need to know the privileges, we can type:

$ sudo -l

This will list all of the rules in the /etc/sudoers file that applies to the user.

There are many times when we will execute a command and it will fail because we forgot to preface it with sudo. To avoid having to re-type the command, we can take advantage of a bash functionality that means “repeat last command”:

$ sudo !!

The double exclamation point will repeat the last command. We preceded it with sudo to quickly change the unprivileged command to a privileged command.

We can add the following line to the /etc/sudoers file with visudo:

$ sudo visudo
. . .
Defaults insults
. . .

This will cause sudo to return a silly insult when a user types in an incorrect password for sudo.

Output:
[sudo] password for demo: # enter an incorrect password here to see the results
Your mind just hasn’t been the same since the electro-shock, has it?
[sudo] password for demo:
My mind is going. I can feel it.

[Need further assistance? We are available 24*7]

Conclusion

In short, now we have a basic understanding of root privileges, with a special focus on editing the /etc/sudoers file. Today, with the help of our Support Team we saw the details on how to edit Sudoers File in Linux.

Понравилась статья? Поделить с друзьями:
  • Как изменить textmeshpro через скрипт
  • Как изменить subsystem id видеокарты
  • Как изменить tele2 you на tele2
  • Как изменить style wordpress
  • Как изменить tdp процессора