From cb9a9874abf208a8a7d3387c3f1c39e13b15375a Mon Sep 17 00:00:00 2001 From: Dmitry Date: Mon, 15 Jun 2026 14:51:57 +0300 Subject: [PATCH] arch-x1: 2026-06-15 14:51:57 | 4 Affected files: .obsidian/appearance.json .obsidian/plugins/editing-toolbar/data.json 00 Inbox/Sudoers.md 99 System/INDEX.md --- .obsidian/appearance.json | 2 +- .obsidian/plugins/editing-toolbar/data.json | 78 +--- 00 Inbox/Sudoers.md | 402 ++++++++++++++++++++ 99 System/INDEX.md | 23 +- 4 files changed, 432 insertions(+), 73 deletions(-) create mode 100644 00 Inbox/Sudoers.md diff --git a/.obsidian/appearance.json b/.obsidian/appearance.json index b44a9b6..a0752ce 100644 --- a/.obsidian/appearance.json +++ b/.obsidian/appearance.json @@ -8,7 +8,7 @@ "interfaceFontFamily": "Fira Sans,FiraCode Nerd Font", "textFontFamily": "Fira Sans,FiraCode Nerd Font", "baseFontSizeAction": true, - "baseFontSize": 16, + "baseFontSize": 15, "monospaceFontFamily": "FiraCode Nerd Font", "nativeMenus": false, "showRibbon": true, diff --git a/.obsidian/plugins/editing-toolbar/data.json b/.obsidian/plugins/editing-toolbar/data.json index 1cf6a1d..77908f1 100644 --- a/.obsidian/plugins/editing-toolbar/data.json +++ b/.obsidian/plugins/editing-toolbar/data.json @@ -1,7 +1,7 @@ { "lastVersion": "4.0.8", - "aestheticStyle": "default", - "positionStyle": "top", + "aestheticStyle": "custom", + "positionStyle": "fixed", "menuCommands": [ { "id": "editing-toolbar:editor-undo", @@ -411,43 +411,6 @@ "name": "Clear text formatting", "icon": "eraser" }, - { - "id": "editing-toolbar:header2-text", - "name": "Header 2", - "icon": "header-2" - }, - { - "id": "editing-toolbar:header3-text", - "name": "Header 3", - "icon": "header-3" - }, - { - "id": "SubmenuCommands-header", - "name": "submenu", - "icon": "header-n", - "SubmenuCommands": [ - { - "id": "editing-toolbar:header1-text", - "name": "Header 1", - "icon": "header-1" - }, - { - "id": "editing-toolbar:header4-text", - "name": "Header 4", - "icon": "header-4" - }, - { - "id": "editing-toolbar:header5-text", - "name": "Header 5", - "icon": "header-5" - }, - { - "id": "editing-toolbar:header6-text", - "name": "Header 6", - "icon": "header-6" - } - ] - }, { "id": "editing-toolbar:toggle-bold", "name": "Bold", @@ -1075,7 +1038,7 @@ "shouldShowMenuOnSelect": false, "cMenuVisibility": true, "cMenuBottomValue": 4.25, - "cMenuNumRows": 12, + "cMenuNumRows": 1, "cMenuWidth": 610, "cMenuFontColor": "#2DC26B", "cMenuBackgroundColor": "#d3f8b6", @@ -1102,19 +1065,19 @@ "toolbarBackgroundColor": "#2D3033", "toolbarIconColor": "#E2E8F0", "toolbarIconSize": 18, - "aestheticStyle": "default" + "aestheticStyle": "glass" }, "following": { "toolbarBackgroundColor": "rgba(var(--background-secondary-rgb), 0.7)", "toolbarIconColor": "var(--text-normal)", "toolbarIconSize": 18, - "aestheticStyle": "default" + "aestheticStyle": "glass" }, "fixed": { - "toolbarBackgroundColor": "rgba(var(--background-secondary-rgb), 0.7)", - "toolbarIconColor": "var(--text-normal)", - "toolbarIconSize": 18, - "aestheticStyle": "default" + "toolbarBackgroundColor": "#F5F8FA", + "toolbarIconColor": "#4A5568", + "toolbarIconSize": 12, + "aestheticStyle": "custom" }, "mobile": { "toolbarBackgroundColor": "rgba(var(--background-secondary-rgb), 0.7)", @@ -1123,9 +1086,9 @@ "aestheticStyle": "default" } }, - "toolbarBackgroundColor": "#2D3033", - "toolbarIconColor": "#E2E8F0", - "toolbarIconSize": 18, + "toolbarBackgroundColor": "#F5F8FA", + "toolbarIconColor": "#4A5568", + "toolbarIconSize": 12, "useCurrentLineForRegex": false, "ai": { "enabled": false, @@ -1149,21 +1112,8 @@ "artifact": "03-agent" }, "pkmer": { - "tokenExpiresAt": 1781122456017, - "userInfo": { - "sub": "fa484d57-e07b-48f3-9410-ff0ce39782d8", - "name": "gcdmitry", - "email": "gcdmitry@gmail.com", - "ai_quota": { - "quota": 50000000, - "usedQuota": 0, - "remainingQuota": 50000000, - "remainingTokens": 100, - "requestCount": 0 - }, - "thino": false, - "supporter": false - } + "tokenExpiresAt": 0, + "userInfo": null }, "enableCustomModel": false, "customModel": { diff --git a/00 Inbox/Sudoers.md b/00 Inbox/Sudoers.md new file mode 100644 index 0000000..83b2053 --- /dev/null +++ b/00 Inbox/Sudoers.md @@ -0,0 +1,402 @@ +--- +title: Sudoers +status: seed +type: guide +tags: + - linux + - sudo + - security +created: 2026-06-15 +updated: 2026-06-15 +aliases: + - sudoers + - Настройка sudo +--- + +# Sudoers + +`sudo` запускает команду с полномочиями другого пользователя, обычно `root`. Политика доступа задаётся в `/etc/sudoers` и дополнительных файлах из `/etc/sudoers.d/`. + +`sudo` не является заменой файловых прав. Он выдаёт полномочия на конкретное действие после проверки пользователя, хоста, целевого пользователя, команды и параметров политики. + +## Где хранится конфигурация + +- `/etc/sudoers` — основной файл. +- `/etc/sudoers.d/` — каталог для отдельных правил. +- `/var/log/` или журнал systemd — записи о вызовах `sudo`, в зависимости от конфигурации системы. + +Основной файл обычно содержит: + +```sudoers +@includedir /etc/sudoers.d +``` + +Для локальных правил удобнее создавать отдельный файл: + +```bash +sudo visudo -f /etc/sudoers.d/backup +``` + +Имена файлов в `sudoers.d` лучше делать без точки и символа `~`: некоторые реализации игнорируют такие файлы. Права должны исключать запись обычными пользователями: + +```bash +sudo chown root:root /etc/sudoers.d/backup +sudo chmod 0440 /etc/sudoers.d/backup +``` + +## Редактирование через visudo + +Не следует редактировать `/etc/sudoers` обычным редактором. `visudo` блокирует файл от одновременного изменения и проверяет синтаксис перед сохранением. + +```bash +sudo visudo +sudo visudo -f /etc/sudoers.d/backup +sudo visudo -c +``` + +Если ошибка уже внесена, исправление потребует действующей root-сессии, загрузки в recovery mode или другого способа получить root-доступ. + +Редактор можно выбрать переменными окружения: + +```bash +sudo EDITOR=nvim visudo +``` + +Возможность выбора редактора зависит от настроек `sudo`; небезопасные переменные окружения могут быть отброшены. + +## Формат правила + +Базовая форма: + +```sudoers +пользователь хост=(целевой_пользователь:целевая_группа) теги: команды +``` + +Пример: + +```sudoers +ada ALL=(root) /usr/bin/systemctl restart nginx +``` + +Значение полей: + +| Поле | Смысл | +|---|---| +| `ada` | кому разрешено использовать правило | +| `ALL` | на каких хостах действует правило | +| `(root)` | от имени какого пользователя разрешён запуск | +| `/usr/bin/systemctl restart nginx` | разрешённая команда и аргументы | + +Группа указывается с `%`: + +```sudoers +%wheel ALL=(ALL:ALL) ALL +``` + +Это разрешает членам группы `wheel` запускать любые команды от имени любого пользователя и группы. Такое правило выдаёт полный административный доступ. + +## Команды и аргументы + +В правилах следует использовать абсолютный путь: + +```sudoers +ada ALL=(root) /usr/bin/systemctl status nginx +``` + +Путь можно узнать командой: + +```bash +command -v systemctl +``` + +Аргументы являются частью разрешения. Эти правила различаются: + +```sudoers +ada ALL=(root) /usr/bin/systemctl restart nginx +ada ALL=(root) /usr/bin/systemctl restart * +``` + +Первое разрешает перезапустить только `nginx`. Второе намного шире и может разрешить перезапуск произвольного юнита. + +Правило без аргументов в современных версиях `sudo` может разрешать команду с любыми аргументами. Для явного запрета аргументов используется пустая строка: + +```sudoers +ada ALL=(root) /usr/bin/id "" +``` + +Поведение сопоставления аргументов и специальных символов зависит от версии `sudo`. После изменения правило нужно проверять на целевой системе. + +## Псевдонимы + +Псевдонимы уменьшают повторение в больших конфигурациях. + +### User_Alias + +```sudoers +User_Alias OPERATORS = ada, alice, %ops +``` + +### Runas_Alias + +```sudoers +Runas_Alias SERVICE_USERS = nginx, postgres +``` + +### Host_Alias + +```sudoers +Host_Alias WEB_SERVERS = web01, web02 +``` + +### Cmnd_Alias + +```sudoers +Cmnd_Alias NGINX_CONTROL = \ + /usr/bin/systemctl status nginx, \ + /usr/bin/systemctl reload nginx, \ + /usr/bin/systemctl restart nginx + +%ops WEB_SERVERS=(root) NGINX_CONTROL +``` + +Имена псевдонимов принято писать в верхнем регистре. + +## Теги + +### PASSWD и NOPASSWD + +По умолчанию `sudo` запрашивает пароль вызывающего пользователя: + +```sudoers +ada ALL=(root) /usr/bin/systemctl restart nginx +``` + +Без пароля: + +```sudoers +ada ALL=(root) NOPASSWD: /usr/bin/systemctl restart nginx +``` + +`NOPASSWD` удобно для автоматизации, но увеличивает последствия компрометации учётной записи. Его следует ограничивать минимальным набором команд. + +Теги действуют на следующие команды в списке, пока не будут переопределены: + +```sudoers +ada ALL=(root) NOPASSWD: /usr/bin/systemctl status nginx, \ + PASSWD: /usr/bin/systemctl restart nginx +``` + +### NOEXEC + +```sudoers +ada ALL=(root) NOEXEC: /usr/bin/less /var/log/nginx/error.log +``` + +`NOEXEC` пытается запретить программе запускать другие процессы. Это дополнительная мера, а не надёжная граница безопасности: поддержка зависит от платформы и типа бинарника. + +### SETENV + +```sudoers +ada ALL=(root) SETENV: /usr/local/sbin/deploy +``` + +`SETENV` позволяет передавать переменные окружения с меньшим числом ограничений. Это опасно для команд, поведение которых зависит от `PATH`, загрузчиков библиотек, интерпретаторов и конфигурационных переменных. + +## Defaults + +Директивы `Defaults` управляют поведением `sudo`. + +```sudoers +Defaults env_reset +Defaults use_pty +Defaults timestamp_timeout=5 +Defaults passwd_tries=3 +``` + +Часто используемые параметры: + +| Параметр | Назначение | +|---|---| +| `env_reset` | оставляет ограниченный набор переменных окружения | +| `secure_path` | задаёт доверенный `PATH` для команд через `sudo` | +| `use_pty` | запускает команду в псевдотерминале | +| `timestamp_timeout` | срок действия успешной аутентификации в минутах | +| `passwd_tries` | число попыток ввода пароля | +| `log_input`, `log_output` | запись ввода и вывода поддерживаемых сессий | + +Пример `secure_path`: + +```sudoers +Defaults secure_path="/usr/local/sbin:/usr/local/bin:/usr/bin" +``` + +Настройки можно ограничить пользователем, группой, хостом или командой: + +```sudoers +Defaults:ada timestamp_timeout=0 +Defaults:%ops use_pty +Defaults!/usr/bin/systemctl !log_output +``` + +`timestamp_timeout=0` требует пароль для каждого отдельного запуска. Отрицательное значение создаёт сессию без ограничения по времени и обычно нежелательно. + +## Запуск от имени другого пользователя + +```sudoers +ada ALL=(postgres) /usr/bin/psql +``` + +Использование: + +```bash +sudo -u postgres /usr/bin/psql +``` + +С указанием группы: + +```sudoers +ada ALL=(deploy:deploy) /usr/local/bin/release +``` + +## Запреты + +Команду можно исключить через `!`: + +```sudoers +ada ALL=(root) ALL, !/usr/bin/su, !/usr/bin/bash +``` + +Такой список не создаёт безопасное ограничение полного административного доступа. Пользователь с разрешением `ALL` часто может получить оболочку другим способом: через редактор, интерпретатор, отладчик, файловый менеджер, загрузку модуля, изменение исполняемого файла или сервисной конфигурации. + +Отрицания полезны для уточнения узкого списка, но не должны использоваться как sandbox. + +## Опасные категории команд + +Нельзя считать ограниченными команды, которые позволяют: + +- запустить оболочку или произвольный процесс; +- выполнять код или загружать модули; +- редактировать произвольные файлы; +- менять владельца, права или ACL; +- записывать в исполняемые файлы и каталоги из `PATH`; +- менять unit-файлы, cron-задачи, PAM, загрузчик или конфигурацию сервисов; +- читать секреты и закрытые ключи; +- управлять контейнерами или виртуальными машинами с доступом к хосту. + +Примеры команд, которые часто позволяют выйти к root: + +```text +sh, bash, zsh, python, ruby, perl, vim, nvim, less, find, +tar, rsync, awk, sed, env, systemctl, docker, podman +``` + +Риск зависит от разрешённых аргументов, файловой системы и окружения. Само имя команды недостаточно для оценки безопасности. + +## Безопасная автоматизация + +Предпочтительный подход — разрешить один root-owned wrapper с фиксированным поведением: + +```sudoers +deploy ALL=(root) NOPASSWD: /usr/local/sbin/restart-myapp +``` + +Требования к wrapper: + +- файл и родительские каталоги не доступны на запись вызывающему пользователю; +- используются абсолютные пути; +- входные параметры проверяются по allowlist; +- не выполняются строки через shell без необходимости; +- окружение очищается или задаётся явно; +- временные файлы создаются безопасно; +- логируются значимые действия. + +Если пользователь может изменить разрешённый скрипт, библиотеку, конфигурацию или исполняемый файл, правило фактически разрешает выполнение произвольного кода с повышенными правами. + +## Проверка правил + +Показать доступные текущему пользователю команды: + +```bash +sudo -l +``` + +Проверить другого пользователя от root: + +```bash +sudo -l -U ada +``` + +Сбросить сохранённую аутентификацию: + +```bash +sudo -k +``` + +Удалить timestamp полностью: + +```bash +sudo -K +``` + +Проверить конфигурацию: + +```bash +sudo visudo -c +``` + +Проверять нужно не только синтаксис, но и фактический результат `sudo -l`: правила могут объединяться, а более широкое разрешение в другом файле отменяет ожидаемое ограничение. + +## Приоритет и объединение правил + +`sudoers` не работает как обычный firewall с простым правилом «первое совпадение победило». Для пользователя могут совпасть несколько записей; разрешения и теги вычисляются по правилам sudoers и могут объединяться. + +Практические следствия: + +- узкое правило не отменяет широкое разрешение из другого файла; +- порядок важен для некоторых тегов и параметров; +- членство пользователя в нескольких административных группах нужно учитывать; +- проверять итог следует через `visudo -c` и `sudo -l`. + +## Минимальный пример + +Задача: разрешить группе `webops` проверять и перезапускать только `nginx`. + +```sudoers +Cmnd_Alias NGINX_READ = \ + /usr/bin/systemctl status nginx + +Cmnd_Alias NGINX_WRITE = \ + /usr/bin/systemctl reload nginx, \ + /usr/bin/systemctl restart nginx + +%webops ALL=(root) NGINX_READ +%webops ALL=(root) PASSWD: NGINX_WRITE +``` + +Проверка: + +```bash +sudo visudo -c +sudo -l +sudo /usr/bin/systemctl status nginx +``` + +## Чек-лист + +- Правило хранится в отдельном файле `/etc/sudoers.d/`. +- Файл проверен через `visudo`. +- Использованы абсолютные пути. +- Разрешены конкретные команды и аргументы. +- Нет лишнего `ALL`. +- `NOPASSWD` используется только при необходимости. +- Пользователь не может изменить разрешённую команду или её зависимости. +- Не разрешены оболочки, редакторы и интерпретаторы без осознанной причины. +- Учтены переменные окружения и `secure_path`. +- Итоговые права проверены через `sudo -l`. +- Есть журналирование и способ аварийного получения root-доступа. + +## Связанные заметки + +- [[Super-user]] +- [[File Permissions]] +- [[Linux - MOC]] diff --git a/99 System/INDEX.md b/99 System/INDEX.md index 4b07127..470cd3f 100644 --- a/99 System/INDEX.md +++ b/99 System/INDEX.md @@ -1,6 +1,6 @@ --- -generated: 2026-06-12 -total: 510 +generated: 2026-06-15 +total: 512 --- # Vault Index @@ -9,7 +9,7 @@ total: 510 | Параметр | Значение | |----------|----------| -| Всего заметок | 510 | +| Всего заметок | 512 | ## . @@ -20,6 +20,13 @@ total: 510 | [[CODEX]] | CODEX | — | — | [] | | [[GEMINI]] | GEMINI | — | — | [] | +## 00 Inbox + +| Заметка | Aliases | Status | Type | Tags | +|---------|---------|--------|------|------| +| [[Proxmox VE — local, local-lvm, LVM]] | — | seed | concept | [] | +| [[Sudoers]] | sudoers, Настройка sudo | seed | guide | [linux, sudo, security] | + ## 01 Ideas | Заметка | Aliases | Status | Type | Tags | @@ -245,8 +252,8 @@ total: 510 | [[Индексное инвестирование]] | Индексное инвестирование | seed | guide | [finance, investments, index, funds] | | [[Инсайдерская торговля и манипулирование рынком]] | Инсайдерская торговля и манипулирование рынком | seed | concept | [finance, investments, market-abuse] | | [[Криптовалюты как инвестиционный актив]] | Криптовалюты как инвестиционный актив | seed | concept | [finance, investments, crypto] | -| [[Облигации с залоговым обеспечением]] | Облигации с залоговым обеспечением денежных требований | seed | concept | [finance, investments, bonds, abs] | | [[Облигации]] | Облигации | seed | guide | [finance, investments, bonds] | +| [[Облигации с залоговым обеспечением]] | Облигации с залоговым обеспечением денежных требований | seed | concept | [finance, investments, bonds, abs] | | [[Оценка акций]] | Оценка акций | seed | guide | [finance, investments, stocks, valuation] | | [[Риск-профиль инвестора]] | Риск-профиль инвестора | seed | concept | [finance, investments, risk] | | [[Трейдинг]] | Трейдинг | seed | guide | [finance, trading, risk] | @@ -447,8 +454,8 @@ total: 510 | [[ФА - вращение]] | ФА - Вращение | seed | concept | [math, statistics, factor-analysis] | | [[ФА - модель, цель, сущность]] | ФА - Модель, Цель, Сущность | stable | concept | [math, ml, mephi, statistics, factor-analysis] | | [[Факторное отображение. Факторная структура]] | Факторное Отображение. Факторная Структура | stable | concept | [math, mephi, statistics, factor-analysis] | -| [[Факторный анализ. Цели и сущность. Постановка задачи. Отличие от анализа главных компонент]] | Факторный Анализ. Цели И Сущность. Постановка Задачи. Отличие От Анализа Главных Компонент | seed | concept | [math, mephi, statistics, factor-analysis] | | [[Факторный анализ]] | Факторный Анализ | stable | concept | [math, ml, mephi, statistics, factor-analysis] | +| [[Факторный анализ. Цели и сущность. Постановка задачи. Отличие от анализа главных компонент]] | Факторный Анализ. Цели И Сущность. Постановка Задачи. Отличие От Анализа Главных Компонент | seed | concept | [math, mephi, statistics, factor-analysis] | | [[Фундаментальная теорема факторного анализа]] | Фундаментальная Теорема Факторного Анализа | stable | concept | [math, mephi, statistics, factor-analysis] | | [[Этапы ФА. Выделение факторов]] | Этапы ФА. Выделение Факторов | seed | concept | [math, mephi, statistics, factor-analysis] | @@ -531,8 +538,8 @@ total: 510 | Заметка | Aliases | Status | Type | Tags | |---------|---------|--------|------|------| -| [[DHCP-snooping]] | DHCP-snooping | seed | concept | [network, networking, protocols, dhcp] | | [[DHCP]] | DHCP | stable | concept | [network, networking, protocols, dhcp] | +| [[DHCP-snooping]] | DHCP-snooping | seed | concept | [network, networking, protocols, dhcp] | | [[Dynamic ARP Inspection]] | Dynamic ARP Inspection | seed | concept | [network, networking, protocols, dhcp, arp] | | [[Механизм работы - DHCP]] | Механизм Работы - DHCP | stable | concept | [network, networking, protocols, dhcp] | | [[Настройка DHCP - Cisco]] | Настройка DHCP - Cisco | stable | concept | [network, networking, protocols, dhcp] | @@ -608,8 +615,8 @@ total: 510 | Заметка | Aliases | Status | Type | Tags | |---------|---------|--------|------|------| -| [[31, 32 - Налоги 1]] | 31, 32 - Налоги | seed | knowledge | [study, taxes] | | [[31, 32 - Налоги]] | 31, 32 - Налоги | seed | knowledge | [study, taxes] | +| [[31, 32 - Налоги 1]] | 31, 32 - Налоги | seed | knowledge | [study, taxes] | | [[CIСD Конвейер для сборки и доставки продукта. Знакомство с GitlabCI и Jenkins]] | — | seed | concept | [] | | [[gemini-code-1780921978295]] | — | — | — | [] | | [[Git]] | Git | seed | concept | [] | @@ -634,9 +641,9 @@ total: 510 | [[Вопросы по Вебу]] | — | processing | concept | [] | | [[Знания Ruby]] | Знания Ruby | seed | concept | [] | | [[Идеи для статьи]] | Идеи Для Статьи | — | — | [] | +| [[Идея]] | — | seed | concept | [] | | [[Идея сети кохонена]] | Идея сети кохонена | seed | concept | [] | | [[Идея — упаковка для еды]] | — | seed | concept | [] | -| [[Идея]] | — | seed | concept | [] | | [[Инструкция по деплою finreport-analyzer]] | — | seed | concept | [] | | [[Итераторы для обработки массивов Ruby]] | Итераторы для обработки массивов Ruby | seed | concept | [] | | [[Команды для деплоя с помощью Capistrano]] | — | seed | concept | [] |