Что правильно использовать: su или sudo?
С давних времен многих смущает разнообразие вариантов обеспечения безопасности при выполнении операций с максимальными привилегиями. Например, в официальной документации Ubuntu в качестве команды редактирования рекомендуется использовать что-то вроде sudo nano , а в многочисленных любительских мануалах (в стиле «5 фокусов в командной строке, которые удивят вашу бабушку») для получения root"ового шелла предлагается писать sudo su - . Попробую объяснить, почему такое положение вещей кажется мне неправильным.
И сторически единственным универсальным способом выполнить команду от имени другого пользователя в Unix была программа su. Запущенная без параметров, она запрашивала пароль суперпользователя и в случае успеха просто подменяла текущее имя пользователя на root, оставляя почти все переменные окружения от старого пользователя (кроме PATH, USER и еще пары-тройки, см. man su от своего дистрибутива). Более корректно было запускать ее как su - - в таком случае оболочка получала также и правильный environment. С параметром -c можно было выполнить команду: su -c "vim /etc/fstab" .
При этом доверенным пользователям приходилось помнить пароль root"а и у всех пользователей, перечисленных в группе «wheel» (т.е. в группе, члены которой могли выполнить команду su и стать суперпользователем), был одинаковый неограниченный доступ ко всей системе, что являлось серьёзной проблемой безопасности.
Затем появилась команда sudo, и это был прорыв. Теперь администратор мог указывать список разрешенных команд для каждого пользователя (или группы пользователей), файлы, доступные для редактирования, специальные переменные окружения и многое другое (все это великолепие управляется из /etc/sudoers , см. man sudoers от своего дистрибутива). При запуске sudo спрашивает у пользователя его собственный пароль, а не пароль root. Полноценный шелл можно получить с помощью " sudo -i "
Стоит особо упомянуть о специальной команде sudoedit , безопасно запускающей редактор, указанный в переменной окружения $EDITOR . При более традиционной схеме редактирование файлов производилось примерно так:
sudo vi /etc/fstab
Запускаемый таким образом vi наследовал оболочку с неограниченными правами и через :! пользователь мог запускать любую команду (если, конечно, админ не позаботился об этом заранее) и открыть любой файл.
sudoedit проверяет, можно ли этому пользователю изменять данный файл, затем копирует указанный файл во временный каталог, открывает его в редакторе (который наследует права пользователя, а не root"а), а после редактирования, если файл был изменён, с особыми предосторожностями копирует его обратно.
В Debian-based дистрибутивах пользователь root не имеет пароля, вместо этого все административные действия должны производиться через sudo или его графический аналог gksudo . Являясь полной заменой su , sudo должна бы быть единственной командой переключения между пользователями, однако, как было сказано вначале, в настоящий момент это не так и все зачем-то изобретают дикие последовательности из sudo, su, vi и черточек.
Поэтому предлагаю всем раз и навсегда запомнить:
После первой публикации этой заметки мне было задано несколько вопросов. Из ответов получилось сделать мини-FAQ.
Q: как с помощью sudo сделать su -c "echo 1 > /etc/privileged_file" ? sudo echo 1 /etc/privileged_file ругается на «permission denied»
A: Это происходит потому, что только команда echo выполняется в повышенными правами, а результат перенаправляется в файл уже с правами обычного пользователя. Чтобы добавить что-нибудь в privileged_file, нужно выполнить такую команду:
$ echo 1| sudo tee -a privileged_file >/dev/null
Или же временно стать рутом:
$ sudo -i
# echo 1 > privileged_file
# exit
Q: sudo -i длиннее, чем su -, а разницы между ними вроде как и никакой, зачем печатать больше?
A: У sudo есть несколько преимуществ, ради которых стоит потрудиться набрать несколько лишних символов:
Q: я единственный пользователь своей системы и привык к su, зачем мне sudo?
A: отвечу вопросом на вопрос: если есть правильный sudo, зачем использовать устаревший su?
Sudo — это программа для Unix-подобных операционных систем, которая позволяет пользователям запускать программы с привилегиями безопасности другого пользователя, по умолчанию суперпользователя.
В отличие от связанной команды su , пользователи должны предоставить свой пароль для аутентификации. После аутентификации, если файл конфигурации, который обычно находится в /etc/sudoers , позволяет предоставить пользователю доступ, система выполняет требуемую команду. Файл конфигурации дает разрешение на доступ, в том числе позволяет выполнять команды вызывающиеся из терминала; позволяет запрашивать пароль для каждого пользователя или группы; позволяет требовать повторного ввода пароля каждый раз, или никогда не требовать ввода пароля вообще. Он также может быть настроен, чтобы разрешить передачу аргументов или нескольких команд.
Говоря простыми словами для того чтобы выполнить определенные действия в Linux
, нам потребуется либо ввод пароля, либо вход от имени суперпользователя (su)
.
Рассмотрим на простом примере, для того чтоб получить возможность удалять\копировать\заменять системные файлы в Ubuntu
, необходимо открыть файловый менеджер Nautilus
от имени суперпользователя.
Для этого вводим в терминале (ctrl+alt+T
). Будьте внимательны, терминал чувствителен к регистру.
Затем появится следующий текст:
password for user: /здесь вводите свой пароль, учтите что никакие символы отображаться не будут/Таким образом вы открыли файловый менеджер Nautilus от имени суперпользователя и теперь можете смело (или не очень) идти ковырять системные файлы ^^
Следующий пример. Например вам надо поковырять содержимое системного файла с помощью текстового редактора, но внести изменения вы в нем не можете. Открываете терминал и вводите:
sudo geditТаким образом вы открыли текстовый редактор с правами суперпользователя.
Еще один пример если, допустим, вы будете вы будете выполнять большое количество команд и каждый раз ввод пароля вас просто не устраивает. Вы можете открыть в терминале сеанс суперпользователя который избавит вас от этих неудобств.
Вводим в терминале:
Затем вводим свой пароль, сеанс суперпользователя открыт. Спасибо за внимание
С давних времен многих смущает разнообразие вариантов обеспечения безопасности при выполнении операций с максимальными привилегиями. Например, в официальной документации Ubuntu в качестве команды редактирования рекомендуется использовать что-то вроде sudo nano , а в многочисленных любительских мануалах (в стиле «5 фокусов в командной строке, которые удивят вашу бабушку») для получения root"ового шелла предлагается писать sudo su - . Попробую объяснить, почему такое положение вещей кажется мне неправильным.
Исторически единственным универсальным способом выполнить команду от имени другого пользователя в Unix была программа su. Запущенная без параметров, она запрашивала пароль суперпользователя и в случае успеха просто подменяла текущее имя пользователя на root, оставляя почти все переменные окружения от старого пользователя (кроме PATH, USER и еще пары-тройки, см. man su от своего дистрибутива). Более корректно было запускать ее как su - - в таком случае оболочка получала также и правильный environment. С параметром -c можно было выполнить команду: su -c "vim /etc/fstab" .
При этом доверенным пользователям приходилось помнить пароль root"а и у всех пользователей, перечисленных в группе «wheel» (т.е. в группе, члены которой могли выполнить команду su и стать суперпользователем), был одинаковый неограниченный доступ ко всей системе, что являлось серьёзной проблемой безопасности.
Затем появилась команда sudo, и это был прорыв. Теперь администратор мог указывать список разрешенных команд для каждого пользователя (или группы пользователей), файлы, доступные для редактирования, специальные переменные окружения и многое другое (все это великолепие управляется из /etc/sudoers , см. man sudoers от своего дистрибутива). При запуске sudo спрашивает у пользователя его собственный пароль, а не пароль root. Полноценный шелл можно получить с помощью " sudo -i "
Стоит особо упомянуть о специальной команде sudoedit , безопасно запускающей редактор, указанный в переменной окружения $EDITOR . При более традиционной схеме редактирование файлов производилось примерно так:
sudo vi /etc/fstab
Запускаемый таким образом vi наследовал оболочку с неограниченными правами и через:! пользователь мог запускать любую команду (если, конечно, админ не позаботился об этом заранее) и открыть любой файл.
Sudoedit проверяет, можно ли этому пользователю изменять данный файл, затем копирует указанный файл во временный каталог, открывает его в редакторе (который наследует права пользователя, а не root"а), а после редактирования, если файл был изменён, с особыми предосторожностями копирует его обратно.
В Debian-based дистрибутивах пользователь root не имеет пароля, вместо этого все административные действия должны производиться через sudo или его графический аналог gksudo . Являясь полной заменой su , sudo должна бы быть единственной командой переключения между пользователями, однако, как было сказано вначале, в настоящий момент это не так и все зачем-то изобретают дикие последовательности из sudo, su, vi и черточек.
Поэтому предлагаю всем раз и навсегда запомнить:
После первой публикации этой заметки мне было задано несколько вопросов. Из ответов получилось сделать мини-FAQ.
Q: как с помощью sudo сделать su -c "echo 1 > /etc/privileged_file" ? sudo echo 1 /etc/privileged_file ругается на «permission denied»
A: Это происходит потому, что только команда echo выполняется в повышенными правами, а результат перенаправляется в файл уже с правами обычного пользователя. Чтобы добавить что-нибудь в privileged_file, нужно выполнить такую команду:
$ echo 1| sudo tee -a privileged_file >/dev/null
Или же временно стать рутом:
$ sudo -i
# echo 1 > privileged_file
# exit
$
Q: sudo -i длиннее, чем su - , а разницы между ними вроде как и никакой, зачем печатать больше?
A: У sudo есть несколько преимуществ, ради которых стоит потрудиться набрать несколько лишних символов:
Команда sudo играет очень важное значение для управления
правами доступа в операционной системе Linux. Благодаря этой небольшой
команде вы можете давать полномочия на выполнение тех или иных действий
от имени администратора другим пользователям, при этом не давая им сам
пароль суперпользователя. Также вам не нужно сидеть всегда под учетной
записью суперпользователя чтобы иногда выполнять административные
действия.
Казалось бы, такая небольшая команда, с минимумом возможностей и
максимально простым использованием, но на самом деле она может намного
больше. В этой статье мы рассмотрим как выполняется настройка sudo в
linux для контроля доступа к функциям системы и возможностей
пользователя.
Вы также можете указать текстовый редактор, в котором вы хотите редактировать файл настройки:
# EDITOR=nano visudo
Дальше мы рассмотрим самые интересные настройки, которые вы можете
задать в этом файле. Но сначала давайте рассмотрим основной синтаксис
файла. Он состоит из двух типов строк, это псевдонимы, которые позволяют
создавать списки пользователей и флагов, а также сами правила, которые
задают как будет вести себя команда sudo. Синтаксис алиасов выглядит вот
так:
тип
имя_алиаса
=
элемент1, элемент2, элемент3
Тип указывает какого типа нужно создать алис, имя - имя, которое
будет использовано, а список элементов - те элементы, которые будут
подразумеваться при обращении к этому имени.
Описание разрешений для пользователей имеет немного другой синтаксис:
пользователь
хост
=
(другой_пользователь:группа)
команды
Пользователь указывает пользователя или группу, для которых мы
создаем правило, хост - компьютер, для которого будет действовать это
правило. Другой пользователь - под видом какого пользователя первый
может выполнять команды, и последнее - разрешенные команды. Вместо
любого из параметров может использоваться алиас. А теперь настройка sudo
в Debian и других дистрибутивах.
Defaults !lecture
Defaults !root_sudo
Defaults set_home
Defaults !preserve_groups
Defaults passwd_tries=5
Defaults timestamp_timeout=10
Defaults passwd_timeout=10
Defaults passprompt="Ваш пароль:"
Можно указать другого пользователя, не root, от которого будут выполняться все команды, для этого используйте:
Defaults runas_default="пользователь"
Вы можете записывать в лог все попытки подключения к sudo:
Defaults logfile=/var/log/sudo
$ sudo cat /var/log/sudo
ALL ALL = (ALL) ALL
%wheel ALL = (ALL) ALL
Означает то же самое, что и предыдущее, только здесь мы разрешаем
использовать sudo не всем пользователям, а только тем, которые состоят в
группе wheel.
%wheel ALL = (root) ALL
Тут мы уже ограничили возможный выбор пользователей только
пользователем root. Также можно указать группу пользователя, от имени
которого он может выполнять команды:
%wheel ALL = (root:admins) ALL
User_Alias Users = user1,user2,user3
Runas_Alias Admins = root,admin
Host_Alias Hosts = host1,host2
Cmd_Alias Cmds = /bin/mount,/bin/umount
Users Hosts = (Admins) Cmds
Это значит, что пользователи из списка Users смогут выполнять команды Cmds от имени пользователей Amdins на хостах Hosts.
Еще осталось сказать несколько слов о флагах. Флаг NOPASSWD говорит,
что не нужно запрашивать пароль при выполнении этого правила. Например,
разрешить всем пользователям выполнять команду mount с sudo без пароля:
ALL ALL = (root) NOPASSWD: /bin/mount
Также можно запретить выполнять именно эту команду вообще с помощью флага NOEXEC:
ALL ALL = (root) NOEXEC /bin/mount
Вы можете проверить правильно ли была проведена настройка файла
/etc/sudores и посмотреть все созданные правила с помощью команды:
Здесь отображены все установленные флаги и настройки, а также полномочия данного пользователя.
Немного о самом sudo, из wikipedia. sudo (англ. superuser do , дословно «выполнить от имени суперпользователя ») - это программа, разработанная в помощь системному администратору и позволяющая делегировать те или иные привилегированные ресурсы пользователям с ведением протокола работы. Основная идея - дать пользователям как можно меньше прав, но при этом ровно столько, сколько необходимо для решения поставленных задач.
Команда sudo предоставляет возможность пользователям выполнять команды от имени root, либо других пользователей. Правила, используемые sudo для принятия решения о предоставлении доступа, находятся в файле /etc/sudoers; язык их написания и примеры использования подробно изложены в sudoers(5).
Для редактирования файла /etc/sudoers следует использовать программу visudo, которая проверяет синтаксис и тем самым позволяет избежать ошибок в правилах.
В большинстве случаев грамотная настройка sudo делает работу от имени суперпользователя ненужной.
По умолчанию root аккаунт в Ubuntu отключен и пароля у root просто нет. Все административные задачи выполняются через sudo. По умолчанию право на выполнение sudo предоставлено первому пользователю, созданному при инсталляции. Все остальные по умолчанию – обычные пользователи.
Sudo - очень гибкий инструмент, позволяющий настроить права на выполнения административных действий для каждого пользователя отдельно. Например одному разрешить перезагружать какой-либо сервер, а другому дать возможность менять права доступа к файлам и папкам. Откройте файл /etc/sudoers. Это можно сделать либо отдав команду на открытие файла в вашем любимом текстовом редакторе, например так:
# nano /etc/sudoers
либо при помощи утилиты visudo:
# visudo
Последний способ откроет файл /etc/sudoers в редакторе пользователя по умолчанию, или если таковой не задан, то в редакторе vi. Преимущество данного способа в том, что при сохранении файл будет проверен на соответствие синтаксису.
Простейшая конфигурация выглядит так:
Defaults env_reset
# User privilege specification
root ALL=(ALL) ALL
user ALL=(ALL) ALL
Такая конфигурация дает пользователю user все права пользователя root при выполнении команды sudo. Defaults env_reset
полностью запрещает все пользовательские переменные при исполнении команд от имени root. Это хорошо с точки зрения безопасности, однако иногда вызывает проблемы. Можно разрешить использование личных переменных какой-либо группе или отдельному пользователю, добавив подобную этой строку:
Defaults:%admin !env_reset
которая будет сохранять переменные окружения для всех пользователей группы admin, или:
Defaults:user env_keep=TZ
которая сохранит переменную TZ для пользователя user.
Если сервер администрируется группой людей, то имеет смысл поступить таким образом:
%admin ALL=(ALL) ALL
Как можно догадаться, эта запись дает доступ к root-привилегиям всем членам группы admin.
Можно настроить для каждого конкретного пользователя доступ только к конкретным командам. Например:
user ALL = /bin/mount, /bin/kill
даст пользователю user права на выполнение команд mount и kill с любой машины, а:
user2 mydebiancomp = /sbin/modprobe
даст пользователю user2 права на выполнение modprobe с машины mydebiancomp. Я думаю, что синтаксис понятен:
ползователь хост = команда
где команда прописывается с полным путем. Для группы все аналогично, только добавляется знак “%”.
Очень удобно при настройке sudo создать группу алиасов. Чтобы не вбивать постоянно повторяющиеся команды, пользователей и хосты, мы можем собрать их в группы и устанавливать правила для каждой группы алиасов. Например так:
Cmnd_Alias command_alias = command1, command2, … // алиасы команд
Host_Alias host_alias = hostname1, hostname2, … // алиасы хостов
User_Alias user_alias = user1, user2, … // алиасы пользователей
Исполнение команды от имени другого пользователя тоже возможно. Например при такой записи:
user ALL = (user2, user3) /usr/bin/ark
пользователь user может выполнить команду ark от имени user2 или user3, при помощи ключа u, например так:
$ sudo -u user2 ark
По умолчанию sudo запоминает пароли на 5 минут. Если вы этого не хотите, то для каждого пользователя, группы или алиаса можете установить отдельное правило, например при:
Defaults:user timestamp_timeout=0
пароль полдьзователя user не будет запоминаться вообще, а при:
Defaults:user timestamp_timeout=-1
будет запоминаться на все время аптайма.
Sudo без паролей также возможно. Для этого существует подобная конструкция:
user myubuntucomp = NOPASSWD: /bin/kill
которая даст возможность пользователю user с хоста myubuntucomp использовать kill без запроса пароля. Вставьте свои значения, например ALL вместо имени хоста и команды, чтобы пользователь user мог вообще никогда не вводить пароль для выполнения команд от имени root с любого хоста, однако помните, что это делает систему очень уязвимой.
Постовой
Блоги, блоги, блоги. Максим Fuckin знает в этом толк.
Интерактивная карта города Оренбурга . Выполнена по технологии Google maps с применением собственных разработок. Ресурс молодой, но уже достаточно интересный и полезный.