Шановні друзі!
26 та 31 грудня магазин працюватиме до 16 години. 1 та 2 січня магазин працювати не буде.
Вітаємо всіх з Різдвом та Новим Роком!
Мобільна версія Форум Arduino Документація Гарантійні умови 0 0
UA RU
Графік роботи магазину:
Пн-Пт: 8.00 - 19.00
Сб: 10.00 - 17.00
Нд: вихідний
Каталог
Напиши статтю і отримай знижку!

Sudo - настройка прав доступа

2021-11-29

Всі статті →

Sudo - настройка прав доступа.


Вступление

    В любой операционной системе всегда уделяется особое внимание ”правам доступа“, ведь от их реализации непосредственно зависит безопасность всей системы в целом. Хотя это касается не только ОС, но и любых программных и аппаратных продуктов. OC GNU/Linux в независимости от дистрибутива не исключение.

    Тема прав доступа очень обширна и требует довольно-таки глубоких знаний, поэтому в этой статье не будут затрагиваться такие вопросы, как: реализация прав доступа в OC GNU/Linux, хранение паролей пользователей, их верификация, обход различных коллизий и т.д. Не следует рассматривать данную статью, как полноценное руководство. Основная ее цель - объяснить зачем нужна такая программа, как sudo в OC GNU/Linux и показать на примере базовый принцип ее конфигурации.

Теоретическая часть

    Наверное никому не секрет, что в любом дистрибутиве Linux существует как минимум два пользователя: суперпользователь (root) с неограниченными правами доступа и обычный пользователь ровно с теми правами, которые ему были выданы (разрешены) суперпользователем. Следует понять и запомнить одно негласное правило: любой сеанс в системе должен проходить только из-под сессии обычного пользователя и ни в коем случае не от root. Суть данного правила заключается в том, что если кто-то получит доступ к консоли открытой под суперпользователем он сможет умышленно или нет (особого значения не имеет) выполнить любую команду, нанеся тем самым вред системе. Вариант, когда вы сами по неопытности или случайно выполните нежелательную команду тоже имеет место. Из всего вышеизложенного становится понятно, что вся основная работа происходит в сеансе от обычного пользователя, а в случае необходимости в сеансе от суперпользователя. Вариант с постоянной сменой пользователя естественно допускается, но он как минимум не удобен, а как максимум тоже не безопасен. Вот тут на помощь и приходит утилита sudo.

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

Практическая часть

Конфигурационный файл - sudoers расположенный в директории /etc.

Примечание: в качестве тестовой платформы использовался одноплатный компьютер Raspberry Pi 4/4GB под управлением Raspberry PI OS, но все что описано в данной статье применимо и к любому иному дистрибутиву Linux независимо от аппаратной платформы и ее архитектуры.

Открываем конфигурационный файл sudoers

  • pi@host7: sudo nano /etc/sudoers

В открывшемся файле будет находиться приблизительно следующая информация:

  • #
  • # This file MUST be edited with the 'visudo' command as root.
  • #
  • # Please consider adding local content in /etc/sudoers.d/ instead of
  • # directly modifying this file.
  • #
  • # See the man page for details on how to write a sudoers file.
  • #

  • Defaults env_reset
  • Defaults mail_badpass
  • Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

  • # Host alias specification

  • # User alias specification

  • # Cmnd alias specification

  • # User privilege specification

  • root ALL=(ALL:ALL) ALL

  • # Allow members of group sudo to execute any command

  • %sudo ALL=(ALL:ALL) ALL

  • # See sudoers(5) for more information on "#include" directives:

  • #includedir /etc/sudoers.d

Разберем подробно структуру файла и значение параметров.

Первые три строки:

  • Defaults env_reset
  • Defaults mail_badpass
  • Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

В этой части файла после Defaults перечислены основные параметры конфигурации:

  • Defaults env_reset - обнуляет среду терминала удаляя все пользовательские переменные среды.
  • Defaults mail_badpass - разрешает отправку уведомления о неудачных попытках ввода пароля sudo для настроенного пользователя mailto. По умолчанию это учетная запись root.
  • Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" - определяет переменную PATH (директории где операционная система будет искать приложения), которая используется для операций sudo. Это предотвращает использование пользовательских путей, которые могут быть вредоносными.

Оставляем все три параметра и добавляем к ним новые:

  • Defaults requiretty - sudo запускается только тогда, когда пользователь вошел в систему на реальном терминале. Когда этот флаг установлен, sudo можно запускать только из сеанса входа в систему, а не с помощью других средств таких, как cron или сценарии cgi-bin.
  • Defaults lecture=always - шаблон короткого стартового приветствия с запросом пароля. Значение по умолчанию - once. Если значение не указано, параметр примет значение - once. Отрицание параметра приводит к значению - never.
    • Возможны следующие значения:
    • always - всегда
    • never - никогда
    • once - один раз, только при первом выполнении команды
  • Defaults passwd_tries=2 - количество попыток предоставленных пользователю для ввода пароля перед тем, как sudo зарегистрирует ошибку и завершит работу. По умолчанию параметр имеет значение - 3.
  • Defaults passwd_timeout=1 - количество отведенного времени в минутах для ввода пароля. Может содержать дробную часть (например: 2.5). По умолчанию параметр имеет значение - 5.
  • Defaults timestamp_timeout=3 - количество отведенного времени в минутах до того, как sudo повторно запросит пароль. Может содержать дробную часть (например: 2.5). При значении 0, пароль будет запрашиваться всегда. По умолчанию параметр имеет значение - 5.
  • Defaults passprompt="Enter sudo-pass : " - шаблон короткого стартового приветствия с запросом пароля. Возможно переопределить с помощью параметра -p или SUDO_PROMPT переменной среды. Значение по умолчанию - Password:
    • Поддерживаются следующие процентные [ escape-последовательности:
    • %H - расширяется до имени локального хоста, включая имя домена (только если имя хоста полностью определено или установлена опция fqdn).
    • %h - расширяется до имени локального хоста без имени домена.
    • %p - расширяется до имени пользователя, чей пароль запрашивается (учитывает флаги rootpw, targetpw и runaspw в sudoers).
    • %U - расширяется до имени пользователя от имени которого будет запущена команда (по умолчанию root).
    • %u - расширяется до логина вызывающего пользователя.
    • %% - два последовательных символа сокращаются до одного символа [ % ].
  • Defaults badpass_message="Password incorrect!" - шаблон короткого сообщения, которое отображается если пользователь вводит неверный пароль. По умолчанию используется - Sorry, try again.
  • Defaults logfile=/var/log/sudo - путь к файлу журнала (не к файлу системного журнала). Установка пути включает запись в файл, отрицание этого параметра отключает его. По умолчанию все сообщения заносятся в системный журнал.
  • Defaults log_year - если параметр установлен, то в файл журнала к каждой записи будет добавлен год в четырехзначном формате (данный параметр не относиться к системному журналу). По умолчанию этот параметр выключен.
  • Defaults log_host - если параметр установлен, то в файл журнала к каждой записи будет добавлено имя хоста (данный параметр не относиться к системному журналу). По умолчанию этот параметр выключен.

Для базовой конфигурации этих правил вполне хватит. Естественно это далеко не все параметры которые существуют, их в десятки раз больше и в идеале под каждую задачу конкретного пользователя они будут разные. Тут я показал, как они добавляются и что могут. Все существующие параметры Вы можете найти в официальной документации перейдя по ссылке: https://www.sudo.ws/man/1.8.13/sudoers.man.html или открыв страницу документации в системе - man sudoers. Настоятельно советую ознакомиться с документацией и внести именно те параметры, которые вы считаете более оптимальными для вашей задачи.

После параметров указаны псевдонимы - alias.

  • User_Alias    - список имен пользователей, которые будут использовать sudo.
  • Runas_Alias - список имен учетных записей, от имени которых будут выполняться команды.
  • Host_Alias    - список имен хостов.
  • Cmnd_Alias  - список команд.

Синтаксис:

  • User_Alias    наименование группы = элемент 1, элемент 2, элемент 3
  • Runas_Alias наименование группыэлемент 1, элемент 2, элемент 3
  • Host_Alias    наименование группы = элемент 1, элемент 2, элемент 3...
  • Cmnd_Alias  наименование группы = элемент 1, элемент 2, элемент 3

Примечание: наименование группы должно начинаться с символа набранного в верхнем регистре. Это позволяет указывать несколько определений псевдонимов одного типа в одной строке, разделенных знаком [ : ]

  • ****_Alias наименование группы = элемент 1, … : наименование группы = элемент 1, …

Существуют еще и списки:

  • User_List
  • Runas_List
  • Host_List
  • Cmnd_List

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

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

Примеры:

  • User_Alias       LOCAL = aleksey, user1, ivan
  • Runas_Alias    APCL = apache, www
  • Host_Alias       LOCAL = g44, hp2980
  • Cmnd_Alias     APT = /bin/apt-get update, /bin/apt-get upgrade, /bin/apt-get install
  • Cmnd_Alias     APTRM = /bin/apt-get --purge --auto-remove remove

Надеюсь базовый синтаксис и примеры использования ясны.

В моем случае имя обычного пользователя - pi, а имя хоста - host7. В качестве примера разрешим пользователю pi выполнять на локальном хосте команду apt-get с определенными параметрами.

Создаем нужные псевдонимы и прописываем их в конфигурационный файл после параметров.

  • Host_Alias LOCALHOST = host7
  • User_Alias ULH = pi • User_Alias ADM = root
  • Cmnd_Alias APTSHORT = /bin/apt-get update, /bin/apt-get upgrade, /bin/apt-get install *
  • Cmnd_Alias APTLONG = /bin/apt-get –download-only *, /bin/apt-get --download-only install *, /bin/apt-get --purge --auto-remove remove *

Теперь осталось разобраться непосредственно только с правилами.

В конфигурационном файле уже имеются две строки:

  • root ALL=(ALL:ALL) ALL
  • %sudo ALL=(ALL:ALL) ALL

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

Синтаксис:

  • ALL ALL=(ALL:ALL) ALL

  • ALL - пользователь (группа пользователей) которому выдаются права
  • ALL - хост (группа хостов) к которому применяется правило
  • ALL - от лица какого пользователя будут выполняться команды
  • ALL - от лица какой группы будут выполняться команды
  • ALL - список разрешенных команд

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

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

ULH LOCALHOST=(root:root) APTSHORT, APTLONG

По итогу конфигурационный файл будет выглядеть следующим образом:

  • #
  • # This file MUST be edited with the 'visudo' command as root.
  • #
  • # Please consider adding local content in /etc/sudoers.d/ instead of
  • # directly modifying this file.
  • #
  • # See the man page for details on how to write a sudoers file.
  • #

  • Defaults env_reset
  • Defaults mail_badpass
  • Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
  • Defaults requiretty
  • Defaults lecture=always
  • Defaults passwd_tries=2
  • Defaults passwd_timeout=1
  • Defaults timestamp_timeout=3
  • Defaults passprompt="Enter sudo-pass : "
  • Defaults badpass_message="Password incorrect!"
  • Defaults logfile=/var/log/sudo
  • Defaults log_year
  • Defaults log_host

  • # Host alias specification

  • Host_Alias LOCALHOST = host7

  • # User alias specification
  • #
  • # ULH - USER LOCAL HOST

  • User_Alias ULH = pi

  • # Cmnd alias specification

  • Cmnd_Alias APTSHORT = /bin/apt-get update, /bin/apt-get upgrade, /bin/apt-get install *
  • Cmnd_Alias APTLONG = /bin/apt-get —download-only *, /bin/apt-get --download-only install *, /bin/apt-get --purge --auto-remove remove *

  • # User privilege specification

  • root ALL=(ALL:ALL) ALL
  • ULH LOCALHOST=(root:root) APTSHORT, APTLONG

  • # Allow members of group sudo to execute any command

  • #%sudo ALL=(ALL:ALL) ALL

  • # See sudoers(5) for more information on "#include" directives:

  • #includedir /etc/sudoers.d

Сохраняем файл и выходим из него.

Остался один нюанс. В самом конце конфигурационного файла имеется строка #includedir /etc/sudoers.d и она не является комментарием, это указатель на директорию /etc/sudoers.d/ в которой должны располагаться пользовательские конфигурационные файлы (которые не заканчиваются на [ ~ ] или не содержат символ [ . ]) для утилиты sudo. Смысл в таком решении заключается в том, что при обновлении системы конфигурационный файл sudoers может быть автоматически изменен. Поэтому если параметры настройки прописаны в sudoers следует всегда иметь его актуальную резервную копию. Оба варианта допустимы, но на сегодняшний день метод описанный в данной статье считается архаичным и предпочтительней второй метод. Следует еще учитывать, что в некоторых дистрибутивах изначально в директории /etc/sudoers.d/ уже имеются пользовательские файлы конфигурации, а вы планируете работать только с sudoers в таком случае следует или удалить ненужные пользовательские файлы или закомментировать находящиеся в них параметры. Поэтому при классическом варианте настройки обязательно следует проверять директорию /etc/sudoers.d/.

Например в Raspberry PI OS в директории /etc/sudoers.d/ изначально находятся четыре файла: 010_at-export, 010_pi-nopasswd, 010_proxy, README. В файле 010_pi-nopasswd находится строка pi ALL=(ALL) NOPASSWD: ALL которая означает что пользователь pi может выполнять любые команды на любом хосте от любого пользователя без ввода пароля. Естественно такое недопустимо и данную строку следует закомментировать или удалить файл.

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

Ваша оцінка статті:

Відмінно
Добре
Задовільно
Погано
Дуже погано

Загальна оцінка:

Оцінка "Sudo - настройка прав доступа"
5 з 5
зроблена на основі 1 оцінки 1 клієнтських відгуку.

Дякуємо Вам за звернення! Ваш відгук з'явиться після модерації адміністратором.
No Name
24.02.2022 18:17:35
Thanks
оплата картами Visa і MasterCard