Sudo i что значит. Все, что нужно для понимания sudo vs su в Ubuntu Linux. Настройка 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 есть несколько преимуществ, ради которых стоит потрудиться набрать несколько лишних символов:

  • по умолчанию sudo записывает всю пользовательскую активность в syslog-канал authpriv (как правило, результат кладется в файл /var/log/auth.log), а в su подобную фичу надо включать с помошью задания специального параметра в файле настроек, различающемся от дистрибутива к дистрибутиву (SULOG_FILE в /etc/login.defs в Ubuntu Linux, /etc/login.conf и /etc/pam.d/su в FreeBSD и т.д.)
  • в случае с su администратор системы не может ограничить команды, выполняемые пользователями, а в sudo - может
  • если пользователь должен быть лишен права администрирования, в случае с su после удаления его из группы wheel он должен забыть пароль root"а; если используется sudo, достаточно вынести его из соответствующей группы (например, wheel или admin) и/или файла sudoers, если он был дополнительно настроен.
Q: я единственный пользователь своей системы и привык к su, зачем мне sudo?
A: отвечу вопросом на вопрос: если есть правильный sudo, зачем использовать устаревший su?

Немного о самом 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. Я думаю, что синтаксис понятен:
ползователь хост = команда

где команда прописывается с полным путем. Для группы все аналогично, только добавляется знак “%”.

III.Продвинутые настройки sudo.

Очень удобно при настройке 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 с применением собственных разработок. Ресурс молодой, но уже достаточно интересный и полезный.

Иногда для решения какой-либо задачи необходимо открыть терминал и выполнить команды от суперпользователя (sudo или su), называемый также ROOT. Хотя некоторые из них можно осуществить с помощью графического интерфейса.

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

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

Итак, существует два основных способа получить права суперпользователя (Root) это - sudo или su

Команда sudo используется в Debian - подобных системах или более популярных Ubuntu, «su» используется почти во всех остальных дистрибутивах Linux.

Ввод sudo в операционной системе Ubuntu требует ввода пароля Root и далее после успешного ввода, дает права суперпользователя на время выполнения одной лишь команды. Перед всеми последующими командами, которые требуют прав Root в Debian - подобных системах, необходимо снова вводить «sudo». А в остальных дистрибутивах Linux, где используется команда «su», предоставляет полный доступ Root, после ввода пароля, пока вы не введете «logout» или не закроете терминал.

В Debian - подобных (Ubuntu) системах есть одна хитрость, которая может предоставить полный доступ к Root, пока вы не закроете терминал. Это нужно в том случае если вы будете выполнять много команд от имени Root, и вам не придется перед каждой командой вводить «sudo». Для этого скомандуйте:

Например, нам необходимо найти всех имеющихся пользователей в системе, увидеть их каталоги и присвоить права нужного каталога одного пользователя другому. Для этого если бы я использовал Ubuntu, то команда в терминале была бы следующей:

Sudo du -sch /home/*

После этого последовал бы пароль от Root:

16K /home/lost+found 27G /home/pavel 34G /home/pavelubuntu 50G /home/pavelzen 110G итого

Я знаю, что я являюсь пользователем каталога /home/pavelzen , но мне необходимо еще стать и владельцем каталога /home/pavelubuntu. Для этого мне вновь необходимо перед командой ввести «sudo».

А для других систем: сначала я скомандовал бы

пароль, а потом

Du -sch /home/*

Chown -R pavelzen: /home/pavelubuntu

Вот так в системах Linux проявляются терминалы и суперпользователи.

Иногда, просто необходимо запустить команду от другого пользователя. И существует несколько способов, как это можно сделать. Я расскажу о них в своей статья «Запустить команду от другого пользователя в Unix/Linux».

Запустить команду от другого пользователя в Unix/Linux — способ 1

И так, можно использовать утилиту SUDO. Рассмотрим пример:

$ sudo -H -u Your_another_user -c "ping сайт"

Пояснения:

  • -H YOUR_HOME: Задает HOME (Переменное окружение для хома конкретного юзера) и по умолчанию — это root.
  • -u YOUR_USER: Задаем пользователя от которого будет выполнена команда.
  • -c YOUR_COMMAND: Служит опцией для ввода команды.

Как-то так.

Запустить команду от другого пользователя в Unix/Linux — способ 2

Можно использовать утилиту SU. И сейчас приведу несколько примеров.

Логин в root юзера

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

$ su - root

Запустить команду как root юзер

Вот пример команды:

# su - root -c "YOUR_COMMAND_HERE"

Su - -c "YOUR_COMMAND_HERE arg1"

Выполнить команду от другого пользователя с помощью su

И так, вот пример:

# su -c "/opt/solr/bin/solr create -c test_solr_core -n solrconfig.xml" -s /bin/sh solr Created new core "test_solr_core"

Рассмотрим другой пример:

$ su another_user -c "ping сайт"

$ su - YOUR_USER -c "YOUR_COMMAND_HERE"

  • — — Будет имитировать логин указанного пользователя.
  • -c — Служит для указания команды для выполнения (для указанного юзверя).

Как-то так.

Запустить команду от другого пользователя в Unix/Linux — способ 3

И так, можно использовать утилиту runuser. Команда runuser запускает оболочку с заменяющими идентификаторами пользователей и групп. Эта команда полезна только когда вы залогинены как пользователь root. Синтаксис выглядит следующим образом:

# runuser -l YOUR_USER -c "YOUR_COMMAND_HERE"

Как пример, я покажу следующую строку:

# runuser -l nginx -c "service nginx start"

PS: Для использования команды runuser пароль не требуется, и он должен запускаться только пользователем root.

Основные опции:

  • -l: Создаст оболочку для входа в систему, используя файл runuser-l PAM вместо стандартного.
  • -g: Указывает на основную группу.
  • -G: Указывает на дополнительную группу.
  • -c: Собственно, служит для указания команды.
  • –session-command=COMMAND: Передает одну команду в оболочку с опцией «-c» и не создает новый сеанс.
  • -m: Не сбрасывайте переменные среды (ENV).

Вот и все, тема «Запустить команду от другого пользователя в Unix/Linux» завершена.

Sudo - это программа позволяющая администраторам давать ограниченные root права пользователям и вести журнал root активности. Базовая философия заключается в том, чтобы дать так мало прав, как это возможно, но при этом позволить людям нормально выполнять свои задачи. Отличие от команды su в том, что пользователь вводит пароль от своей учетной записи, а не пароль пользователя root.

Sudo в Debian имеет пятнадцатиминутный (может быть ) таймаут после ввода пароля. Это значит, что когда вы первый раз ввели пароль рута, то у вас есть 15 минут в течение которых вы можете выполнить следующую команду без ввода пароля. Таймаут может быть немедленно сброшен с помощью команды sudo -k .

Установка sudo в Debian 7

aptitude install sudo

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

Параметры команды sudo

-k - позволяет сбросить таймаут до момента, когда необходимо будет снова вводить пароль. Если указать команду, которая может потребовать ввода пароля, то таймаут будет сброшен конкретно для этой команды.
-h - будет выведена небольшая подсказка на стандартный выход.
-V - отобразиться версия sudo и плагинов. Если запустить от root, то будут выведены все настройки.
-g group - позволяет задать от какой группы будет запущена команда.
-H - задает директорию, которая будет указана в переменной окружения HOME.
-i - симулирует начальный вход. Если команда не указана, то будет произведен вход в систему, таким образом можно сделаться рутом вместо использования sudo su.
-l[l] - если команда не указана, то будет выведен список доступных команд для вызвавшего пользователя (или пользователя указанного с параметром -U). Если указана команда и она доступна, то будет выведен полный путь до команды и доступные параметры. Если команда не доступна, то sudo закроется со статусом 1. Если использовать параметр -ll или указать -l два раза, то будет использован более подробный формат вывода.
-s - будет запущена оболочка указанная в переменной окружения SHELL. Если указана команда, то она будет передана на исполнения запущенной оболочке.
-U user - совместно с параметром -l позволяет отобразить привилегии определенного пользователя. Доступ спискам привилегий по умолчанию есть у root и пользователей со всеми привилегиями (ALL).
-u user - указанная команда будет запущена от имени указанного пользователя, а не от root.
-v - позволяет продлить таймаут на 15 минут или на тот, который указан в sudoers), но не выполнять каких-либо команд.

Здесь указана большая часть доступных параметров, но не все. Чтобы посмотреть полный список используйте команду man sudo .

Настройка sudo в Debian 7

Рекомендуется все пользовательские настройки задавать в файлах в директории /etc/sudoers.d , а не в основном файле /etc/sudoers . То есть можно создать файл с любым названием в директории /etc/sudoers.d и уже в нем перечислить необходимые настройки.

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