Разделение прав доступа – одна из наиболее важных парадигм безопасности, реализуемых в Linux и Unix-подобных операционных системах. Обычные пользователи работают с ограниченными правами; так сокращаются масштабы их влияния на их собственную среду и на операционную систему в целом.
Пользователь root имеет привилегии суперпользователя. Эта учетная запись администратора не имеет ограничений, которые присутствуют на учётных записях обычных пользователей. Другие пользователи могут выполнять команды с правами root в ряде отдельных случаев.
В данном руководстве показано, как правильно и безопасно для системы передавать права root.
Примечание: Данное руководство было выполнено на сервере Ubuntu 12.04, однако большинство современных дистрибутивов Linux будут вести себя аналогичным образом.
Для выполнения руководства нужно предварительно выполнить начальную настройку сервера:
Войдите на сервер как не-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, иначе можно случайно нанести системе непоправимый ущерб.