Bug 45710 - Невозможно использование firetools от имени обычного пользователя
Summary: Невозможно использование firetools от имени обычного пользователя
Status: NEW
Alias: None
Product: Sisyphus
Classification: Development
Component: firetools (show other bugs)
Version: unstable
Hardware: x86_64 Linux
: P5 normal
Assignee: Mikhail Efremov
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2023-03-30 13:57 MSK by Artem Varaksa
Modified: 2024-03-06 11:06 MSK (History)
3 users (show)

See Also:


Attachments
fix patch - waring вместо error, 500 вместо 1000 (540 bytes, patch)
2023-04-28 17:37 MSK, Alexander
no flags Details | Diff

Note You need to log in before you can comment on or make changes to this bug.
Description Artem Varaksa 2023-03-30 13:57:13 MSK
Описание проблемы
=================

firejail при запуске без root не может прочитать файл /etc/login.defs:

> Error: cannot read UID_MIN and/or GID_MIN from /etc/login.defs, using 1000 by default

Что ожидаемо:

> # l /etc/login.defs
> -rw-r----- 1 root shadow 2801 мар 21  2022 /etc/login.defs

Причём сам по себе firejail при этом работает нормально (без прав суперпользователя) и может запускать приложения.

Однако firetools при запуске без root видит в выводе от `firejail /bin/true 2>&1` слово "Error" и решает, что firejail не работает (https://github.com/netblue30/firetools/blob/6953e2d6cc6d59b7b3f0e9b344effd3bd7a67c1b/src/firetools/mainwindow.cpp#L47-L53), поэтому не запускается:

> Cannot run Firejail sandbox, you may not have the correct permissions to access this program.

Запуск firetools, таким образом, необходимо производить с правами суперпользователя, используя:

> # control sudowheel enabled
> $ sudo firetools

Однако дальнейшее использование firetools всё равно затруднено ввиду того, что многие приложения (firefox, vlc, chromium, pidgin, thunderbird, ...) отказываются запускаться с правами root. При их запуске из firetools в окне терминала название меняется, например, на "firetools firefox" и выводится сообщение вида "The new log directory is /proc/6596/root/var/log" (и, возможно, некоторые сообщения от самого приложения, например версия pidgin), но при этом больше ничего не происходит. Убедиться в том, что им не нравиться именно запуск с правами root, можно, выполнив:

> $ sudo firefox
> Running Firefox as root in a regular user's session is not supported.  ($XAUTHORITY is /home/test/.Xauthority which is owned by test.)

Ожидаемый результат: firetools должно быть можно запустить без прав суперпользователя (или хотя бы должна быть возможность разрешить это с помощью control).

Замечания
=========

Для запуска firetools может потребоваться создать папку /root/.config (в общем случае ~/.config), если она не существует (см. https://github.com/netblue30/firetools/issues/72).

Воспроизводимость
=================

Пакеты
------

firejail-0.9.72-alt1.x86_64
firetools-0.9.72-alt1.x86_64

Воспроизводимость в Sisyphus
----------------------------

Воспроизводится.

Стенды, обновлённые до Sisyphus:
education-10.1-x86-64
education-10.1-x86-64-kde

Воспроизводимость в p10
-----------------------

Проверялось в p10 (с задачей 317165), ошибка воспроизводится.

Стенды p10:
kworkstation-10.1-x86-64
education-10.1-x86-64
education-10.1-x86-64-kde
workstation-10.1-x86-64
server-10.1-x86-64

Проверка на регресс в p10
-------------------------

Также воспроизводится с версиями:

firejail-0.9.64.4-alt2
firetools-0.9.64-alt1

на стенде education-10.1-x86-64 (p10).
Comment 1 Artem Varaksa 2023-04-03 12:52:01 MSK
После дальнейшего тестирования выяснилось, что запускать firetools от root лучше через:

$ su -
# firetools

Тогда из интерфейса может запуститься больше приложений, например mousepad.

(Но это не решает основную проблему - невозможность использования от обычного пользователя и невозможность запуска многих приложений даже с root.)
Comment 2 Artem Varaksa 2023-04-03 13:37:46 MSK
При запуске через su, как описано выше, также становится возможным запуск приложений из интерфейса путём Configuration > выбрать приложение (например Network > Firefox) > Continue > Done.

При этом Mousepad, например, всё равно явно сообщает о том, что запущен от суперпользователя. Firefox явно об этом не сообщает: возможно, сам Firefox или Firetools/Firejail как-то запускает Firefox не от имени суперпользователя при таком способе запуска?

Но при этом запуск приложений нажатием иконок в Firetools всё равно не работает для многих приложений, как описано выше.
Comment 3 Alexander 2023-04-28 17:37:39 MSK
Created attachment 13053 [details]
fix patch  - waring вместо error, 500 вместо 1000

После локальной пересборки пакета с эти патчем, у меня firetools запустился из под обычного пользователя и работает.
Суть патча - поменял MIN_UID и MIN_GID по умолчанию с 1000 на 500.
Сообщение об ошибке изменил с Error на Warning
Comment 4 Anton Farygin 2023-05-19 14:29:48 MSK
На мой взгляд ошибка должна чиниться через права доступа к login.defs
Comment 5 Mikhail Efremov 2023-05-19 15:00:41 MSK
Ну, чем меньше не-root пользователи знают о конфигурации системы, тем лучше, конечно :).
Можно, в принципе, группу придумать для которой чтение login.defs разрешить. Но может в login.defs и нет ничего настолько уж секретного все-таки. Хотелось бы мнение ldv@ услышать.
Comment 6 Dmitry V. Levin 2023-05-19 15:01:48 MSK
На мой взгляд, если программа привилегированная, то у неё уже есть доступ на чтение к файлу /etc/login.defs, а если не привилегированная, то ей не должно быть дела до содержимого этого файла, в частности, до значений UID_MIN и GID_MIN.
Comment 7 Mikhail Efremov 2023-05-19 15:11:31 MSK
(In reply to Dmitry V. Levin from comment #6)
> На мой взгляд, если программа привилегированная, то у неё уже есть доступ на
> чтение к файлу /etc/login.defs, а если не привилегированная, то ей не должно
> быть дела до содержимого этого файла, в частности, до значений UID_MIN и
> GID_MIN.

Ну тут вот как раз хотят программу под не привилегированным пользователем запускать. Но мне тоже непонятно зачем ей знать UID_MIN/GID_MIN нать в этом случае.

(In reply to Mikhail Efremov from comment #5)
> Можно, в принципе, группу придумать для которой чтение login.defs разрешить.
Еще можно просто control для login.defs с public, wheelonly, restricted нарисовать, если это действительно нужно.
Comment 8 Anton Farygin 2023-05-19 15:23:20 MSK
авторы программы firejail используют uid_min и gid_min в этом месте:
https://git.altlinux.org/gears/f/firejail.git?p=firejail.git;a=blob;f=src/firejail/restrict_users.c;h=447d7b6635972363b3bd05f410002b25ed76384e;hb=c100d7f97da2f277c2ea0aa01608b00f5392d4df

В принципе я ничего критичного не увидел, на мой взгляд действия программы оправданы, а вот в связи с появлением двух вариантов этих параметров в репозитории - надо бы как-то научиться их получать.
Comment 9 Dmitry V. Levin 2023-05-19 15:54:10 MSK
Программа совершает логическую ошибку: она использует настройки создания новых пользователей для того, чтобы фильтровать уже созданных пользователей.

Очень хорошо, что права на /etc/login.defs позволили выявить эту ошибку.
Comment 10 Anton Farygin 2023-05-19 18:55:44 MSK
А как её лучше исправить, на твой взгляд ?

Какие ещё есть механизмы понять, что UID 501 ещё системный UID, а не пользователь системы ?
Comment 11 Anton Farygin 2024-01-25 10:57:08 MSK
Дима, можешь ответить на вопрос ?
Comment 12 Dmitry V. Levin 2024-01-25 11:43:18 MSK
(In reply to Anton Farygin from comment #11)
> Дима, можешь ответить на вопрос ?

Системность пользователя - это непонятная мне характеристика.
Пусть авторы программы определятся, по какому критерию они хотят фильтровать пользователей, и фильтруют по нему.  Например, по полю shell из списка /etc/shells.

UID_MIN из login.defs - странный критерий, на мой взгляд.
У нас полно установок, в которых через несколько лет после создания пользователей UID_MIN в login.defs увеличился с 500 до 1000.  Если следовать этому критерию, то все эти пользователи окажутся отфильтрованными.

Открыть login.defs всем на чтение - это значит просто замести все такие проблемы под ковёр.
Comment 13 Anton Farygin 2024-01-25 11:55:32 MSK
так авторы и определились - по UID_MIN. Вполне нормальный критерий, который используется при добавлении системных группы и пользователей.

Что касается обновлений - так есть же useradd -r, там проблема точно такая (с обновлениями) - было 500, стало 1000. Как раз за счёт login.defs, который не должен изменять UID_MIN при обновлении это и должно решаться.

Я могу сделать разные хаки для того, что бы получить значение UID_MIN в системе, но всё-таки хотелось бы сделать это не грязным способом.
Comment 14 Dmitry V. Levin 2024-03-06 00:03:01 MSK
(In reply to Anton Farygin from comment #13)
> так авторы и определились - по UID_MIN. Вполне нормальный критерий, который
> используется при добавлении системных группы и пользователей.
> 
> Что касается обновлений - так есть же useradd -r, там проблема точно такая
> (с обновлениями) - было 500, стало 1000. Как раз за счёт login.defs, который
> не должен изменять UID_MIN при обновлении это и должно решаться.
> 
> Я могу сделать разные хаки для того, что бы получить значение UID_MIN в
> системе, но всё-таки хотелось бы сделать это не грязным способом.

Повторяю ещё раз: UID_MIN - это настройка для useradd, а не для пользователей.  Эта настройка говорит, как создавать новых пользователей.  Она не говорит, как трактовать пользователей, созданных ранее.  UID_MIN в установленной системе менять не запрещено.  Просто не надо считать, что эта настройка описывает уже созданных пользователей, потому что она на это не рассчитана.

Конечно, гораздо проще плыть по течению, делать "как все" и воспроизводить чужие ошибки.
Но если мы не можем себе позволить сделать правильно, то зачем вообще было начинать?
Comment 15 Anton Farygin 2024-03-06 08:49:19 MSK
Дима, я не знаю другого способа. Подскажи, пожалуйста, как правильно или скажи где посмотреть (пример).

Задача очень простая - отделить реальных пользователей от "системных".

Ведь никто не запрещает создать "системного" пользователя со всеми признаками обычного - а именно разрешённый шелл или домашний каталог.

Сейчас при отсутствии возможности прочитать login.defs в приложение хардкодится 1000 и это работает не на всех наших системах.
Comment 16 Anton Farygin 2024-03-06 08:51:44 MSK
Эти же механизмы, очевидно, должны использоваться во всех графических менеджерах для отделения системных пользователей от обычных.

А сейчас там вот так:
https://packages.altlinux.org/en/sisyphus/srpms/lightdm/specfiles/#line-208
Comment 17 Dmitry V. Levin 2024-03-06 09:46:57 MSK
(In reply to Anton Farygin from comment #15)
> Дима, я не знаю другого способа. Подскажи, пожалуйста, как правильно или
> скажи где посмотреть (пример).
> 
> Задача очень простая - отделить реальных пользователей от "системных".
> 
> Ведь никто не запрещает создать "системного" пользователя со всеми
> признаками обычного - а именно разрешённый шелл или домашний каталог.

Если "системный" пользователь отличается только номером uid'а, то в чём состоит его системность, и чем он менее реальный, чем "реальные" пользователи?
Comment 18 Anton Farygin 2024-03-06 10:08:11 MSK
Мне всегда казалось, что системный пользователь - это некий специальный пользователь, предназначенный для выполнения системных операций (запуска сервисов, приложений, скриптов, утилит).

У системного пользователя может быть нестандартный домашний каталог, может отсутствовать (или присутствовать) шелл и быть UID ниже определённого в /etc/login.defs значении (который используется утилитой добавления пользователя для разделения - системный или обычный пользователь будет заведён).

К сожалению невозможно гарантировать, что заведённый с помощью useradd -r пользователь будет обладать какими-то дополнительными (кроме UID) отличиями от обычного, рядового пользователя.
Comment 19 Dmitry V. Levin 2024-03-06 10:59:06 MSK
(In reply to Anton Farygin from comment #18)
> К сожалению невозможно гарантировать, что заведённый с помощью useradd -r
> пользователь будет обладать какими-то дополнительными (кроме UID) отличиями
> от обычного, рядового пользователя.

Ну вот мне остаётся непонятно, с какой целью пытаться отличать пользователей, заведённых с помощью useradd -r, если они отличаются только uid.  Почему, скажем, greeter должен скрывать таких пользователей, если они могут залогиниться?
Comment 20 Dmitry V. Levin 2024-03-06 11:06:19 MSK
Что касается самих прав на login.defs, то доступ на чтение позволяет установить блокировку, и раньше были опасения, что возможность устанавливать такую блокировку непривилегированными пользователями можно использовать для организации отказов в обслуживании на всех, кто устанавливает такие блокировки на login.defs.  С тех пор код shadow-utils мог сильно измениться в этой части, возможно, прежние опасения уже не актуальны.

Однако, если login.defs станет доступным на чтение, это, несомненно, подорвёт мотивацию исправлять код, который смотрит на UID_MIN для угадывания системности пользователей.