- Вопрос или проблема
- Необходимость: быстрое переключение между парами пользователей.
- Информация о системе и последствия для безопасности (ослабление локальной безопасности должно быть приемлемым)
- Поиск перед публикацией
- Подход 1: использовать инструменты lightdm, но как-то настроить их
- Работало в 12.04
- Не работает в 16.04
- Дальнейший поиск
- Следующий шаг
- Подход 2: просто выяснить номер VT и использовать chvt
- Заключение, повтор вопроса
- Итог: выполнено, работоспособное, текущее решение приемлемо только в кооперативной среде нескольких пользователей, может быть улучшено.
- Предварительные требования
- Как использовать, как увидеть изменения
- Эффект изменений
- Практическое использование
- ПРЕДУПРЕЖДЕНИЕ ПО БЕЗОПАСНОСТИ
- Предупреждение о постоянстве
- Возможное уточнение (восстановление безопасности)
- Команды
- Отзывы
- Ответ или решение
- Быстрая смена X сессий между двумя пользователями без повторной аутентификации
- Потребность: мгновенное переключение между пользователями
- Системные параметры и компромиссы в безопасности
- Подходы
- Решение: Патч для lightdm
- Установка и настройка
- Обратная связь и возможные усовершенствования
- Заключение
Вопрос или проблема
Необходимость: быстрое переключение между парами пользователей.
В системе есть пара учетных записей пользователей, которые каким-то образом эквивалентны.
Более конкретно, для данной пары:
- Обе учетные записи являются обычными учетными записями Unix, они случайно используются тем же физическим пользователем (человеком).
- Этот же человек почти всегда имеет открытые две графические X-сессии, по одной для каждой учетной записи, но ему нужно видеть на экране только одну из них в данный момент.
- Это полностью отдельные учетные записи с разными настройками почты, историями браузера, файлами, с разным уровнем безопасности.
- Ничто не разделено между учетными записями, нет смысла смешивать эти учетные записи в одной X-сессии (даже копирование-вставка между ними будет бесполезным).
- Тем не менее, пользователь должен переключаться между ними много раз в день.
- Легко добавить кнопку, которая вызывает
dm-tool switch-to-user
, но практически пользователь должен заново аутентифицироваться при каждом переключении, и это снижает производительность.
Необходимо обеспечить быстрое переключение между двумя графическими X-сессиями (например, при нажатии на кнопку на панели) без необходимости повторной аутентификации.
Информация о системе и последствия для безопасности (ослабление локальной безопасности должно быть приемлемым)
- Система — Xubuntu 16.04 Xenial.
- X-сессии, вход, блокировка, переключение осуществляется с помощью lightdm “из коробки”.
Я осознаю, что ослабление безопасности между парами пользователей при сохранении других операций безопасными является более сложным, чем обычный подход блокировки и переключения. К счастью, в нашем случае допустимо потерять часть локальной безопасности, так как машина находится в контролируемых помещениях. Например, если решение задачи вызывает ситуацию, когда сессия, которая обычно блокируется автоматически (например, при приостановке+возобновлении), более не блокируется для этой пары пользователей или даже для всех пользователей системы, это может быть приемлемо.
Тем не менее, желательно, чтобы пользователь мог вручную заблокировать сессию.
Кроме того, удаленная безопасность должна быть сохранена (например, доступ по SSH к этим учетным записям не должен быть затронут решением этой проблемы).
Поиск перед публикацией
Подход 1: использовать инструменты lightdm, но как-то настроить их
В принципе, используйте dm-tool switch-to-user *username*
и организуйте, чтобы сессия пользователя не блокировалась.
Работало в 12.04
В Ubuntu 12.04 мы отключили light-locker, чтобы предотвратить блокировку сессии, и добавили значок на рабочий стол каждого пользователя, который выполнял эту команду:
dbus-send --system --type=method_call --print-reply --dest=org.freedesktop.DisplayManager $XDG_SEAT_PATH org.freedesktop.DisplayManager.Seat.SwitchToUser string:$CALLEDUSERNAME string:somesessionname
Это сработало: сессия переключилась к пользователю, упомянутому в $CALLEDUSERNAME
.
Не работает в 16.04
Это решение неудовлетворительно в 16.04: оно переключается на приветственный экран с заранее выбранным $CALLEDUSERNAME
, но все равно требуется аутентификация. Таким образом, результат тот же, что и у dm-tool switch-to-user *username*
. Я не проверял полностью, но вероятно оно идет точно по тем же путям кода, что и то, что вызывает dm-tool
.
Дальнейший поиск
Искал подсказки в Bug #1205384 “Lock can be circumvented by switching to console” : Bugs : lxsession package : Ubuntu, ничего конкретно работающего не нашел.
Я посмотрел исходный код dm-tool
по ссылке http://archive.ubuntu.com/ubuntu/pool/main/l/lightdm/lightdm_1.18.1-0ubuntu1.tar.gz (из ссылки на Ubuntu – Детали о пакете lightdm в xenial).
Принцип выглядит так:
- Исполняемый файл
dm-tool
вызывает dbus, чтобы отправить сообщение вlightdm
. lightdm
получает событие dbus вhandle_seat_call()
, вызываетseat_switch_to_user()
seat_switch_to_user()
вызываетg_signal_connect (session, SESSION_SIGNAL_AUTHENTICATION_COMPLETE, G_CALLBACK (switch_authentication_complete_cb), seat);
для регистрации обратного вызоваswitch_authentication_complete_cb()
.seat_switch_to_user()
затем вызываетsession_start()
, которое, по-видимому, создает целую новую X-сессию для аутентификации (не уверен в деталях, возможно, запускаетsession_child_run()
, который вызывает PAM)switch_authentication_complete_cb()
затем переключается на существующую сессию или создает новую
Следующий шаг
Можем ли мы как-то инструктировать PAM, чтобы он просто разрешал без запроса в этом случае, но без изменения поведения в других случаях? Идеально, чтобы поведение PAM изменялось только в случае переключения пользователя, а не в случае входа в систему или разблокировки. Возможно, дополнительная X-сессия будет все равно запущена, но не будет ожидаться, что пользователь введет пароль.
Подход 2: просто выяснить номер VT и использовать chvt
- Узнайте в любое время, какое VT соответствует целевому пользователю (возможно, потому что при входе в систему, скрипт будет считывать XDG_SEAT_PATH, чтобы получить номер сиденья, соединяется с командой
Xorg
, которая указывает соответствующий номер vt, и записывает результат в условное место). -
При необходимости переключиться на пользователя, узнайте номер vt и используйте
chvt
. Вероятно, потребуется какая-то настройка sudo. -
Преимущество: проще, без заморочек с
lightdm
, PAM или еще чем-то, даже без явной зависимости отlightdm
, так что, возможно, это сработает и в другом месте. - Недостаток: хаковые способы выяснения соответствия между пользователем и номером VT?
Заключение, повтор вопроса
- Есть ли комментарии относительно первого подхода (через
dm-tool
, настройка PAM)? - Есть ли комментарии относительно второго подхода (через
chvt
)?
Спасибо за внимание.
Итог: выполнено, работоспособное, текущее решение приемлемо только в кооперативной среде нескольких пользователей, может быть улучшено.
Я написал работоспособный концептуальный патч для lightdm
, который выполняет задачу.
Он выполняет то, что нам нужно здесь!
Смотрите ниже для инструкций по установке.
Предварительные требования
- Система с, по крайней мере, двумя учетными записями пользователей и пользователями, согласными быстро переключаться между графическими сессиями без повторного ввода паролей.
- Каждый пользователь может использовать любое окружение рабочего стола, которое полностью использует
lightdm
, включая использованиеlight-locker
для блокировки сессии. Unity и XFCE должны работать.
Тестировалось с XFCE.
Как использовать, как увидеть изменения
Попробуйте это до выполнения изменений:
- пусть пользователь A откроет графическую сессию
- пусть пользователь B откроет другую графическую сессию
Теперь из любой из двух сессий вы можете выполнить:
dm-tool switch-to-user userA
или
dm-tool switch-to-user userB
Эффект изменений
Без изменений вы увидите запрос на вход с требованием ввести пароль.
С изменением вы увидите немедленное переключение без запроса на вход.
Здесь переключение действительно быстрое. Гораздо быстрее, чем в Ubuntu 12.04, и даже без мерцаний в некоторых случаях.
Практическое использование
Для максимальной пользы рекомендую создать значок запуска где-либо на доке/панели/вортоне (как бы это ни называлось в вашем конкретном окружении рабочего стола), которое при нажатии выполняет:
dm-tool switch-to-user name-of-other-user
ПРЕДУПРЕЖДЕНИЕ ПО БЕЗОПАСНОСТИ
Выполнение команд ниже заменит системные пакеты lightdm
на измененные версии, которые позволяют переключаться между любыми двумя пользователями, которые в данный момент вошли в графическую сессию. Это ослабляет безопасность системы, например, пользователь A входит в систему графически, блокирует сессию, уходит, пользователь B входит. Пользователь B может разблокировать сессию пользователя A и переключаться на неё в любое время, когда она открыта. И наоборот (поменять местами A и B).
Изменения не могут быть применены без доступа администратора (предполагается sudo
, особенно для установки пакетов).
Для нас это работает отлично, но все же, имейте в виду, что lightdm
является важным пакетом, и это может его сломать или ввести другие тонкие ошибки. Поломка его сломает возможность использования графических сеансов входа для всех пользователей. Вы полностью несете ответственность за использование приведенных ниже команд. Вас предупредили.
Предупреждение о постоянстве
Изменения являются почти постоянными. Они остаются после перезагрузки. Чтобы отменить их, установите (используя aptitude
, synaptic
или что-либо другое) стандартные пакеты lightdm*
, которые заменят измененные.
Обратите внимание, что каждый раз, когда Ubuntu обновляет пакеты lightdm
, и обновления установлены, они отменяют изменения. Администратор может применить их снова.
Возможное уточнение (восстановление безопасности)
Этот концептуальный прототип можно доработать, умело используя, например, группы Unix. lightdm
будет разрешать переключение только если текущий и целевой пользователи перечислены в какой-то группе с условным именем, например, lightdm-quickswitch-anystringfoo
. Такие изменения (возможно, вместе с другими) могут быть в конечном итоге объединены в какое-то официальное решение.
Команды
Предлагаю войти в текстовую консоль (нажмите Ctrl-Alt-F1 и войдите), чтобы выполнить шаги ниже. Это позволит перезапустить lightdm, не потеряв текущую оболочку.
Скопируйте и вставьте команды ниже в оболочку bash, и это настроит lightdm
для выполнения изменений.
(
set -euxv
echo Убеждаемся, что система имеет необходимые пакеты.
echo Установка пакетов будет произведена только один раз, но это может быть долго, так как может потребоваться загрузить около 40 Мбайт данных из Интернета.
sudo apt-get --assume-yes install devscripts quilt
echo Включение исходных пакетов в apt.
sudo sed -i '/^#\sdeb-src /s/^# *//' "/etc/apt/sources.list"
sudo apt-get update
sudo apt-get --assume-yes --no-install-recommends build-dep lightdm
THETEMPDIR=$( mktemp -d )
cd $THETEMPDIR
echo Получение исходного кода пакета
apt-get source lightdm
cd */
pwd
if [ -d .pc ]
then
quilt push -a || echo "Quilt вернул код ошибки, мы игнорируем это, потому что видели, что иногда это неважно."
quilt new allow_switch_between_logged_users_without_authentication
quilt add src/seat.c
fi
patch -p0 <<EOF
--- src/seat.c 2016-07-29 05:19:45.000000000 +0200
+++ src/seat.c 2016-08-15 19:37:11.693364683 +0200
@@ -1578,6 +1578,20 @@
l_debug (seat, "Switching to user %s", username);
+ if (session)
+ {
+ l_debug (seat, "WIP quick switch: found inactive existing user session, switching to it: %s. For details, see https://askubuntu.com/questions/811953/switching-between-two-opened-x-sessions-without-reauthenticating", username);
+
+ session_unlock (session);
+ seat_set_active_session (seat, session);
+
+ l_debug (seat, "WIP quick switch to user complete: %s. For details, see https://askubuntu.com/questions/811953/switching-between-two-opened-x-sessions-without-reauthenticating", username);
+ return TRUE;
+ }
+
+ l_debug (seat, "WIP quick switch: no session for user, switching to greeter: %s. For details, see https://askubuntu.com/questions/811953/switching-between-two-opened-x-sessions-without-reauthenticating", username);
+
+
/* Attempt to authenticate them */
session = create_user_session (seat, username, FALSE);
g_signal_connect (session, SESSION_SIGNAL_AUTHENTICATION_COMPLETE, G_CALLBACK (switch_authentication_complete_cb), seat);
EOF
if [ -d .pc ]
then
quilt refresh
ls -al debian/patches/allow_switch_between_logged_users_without_authentication
cat debian/patches/allow_switch_between_logged_users_without_authentication
fi
echo Создание модифицированных пакетов.
dch -lquickswitch "Позволить dm-tool switch-to-user username переключаться без аутентификации, если пользовательская сессия уже открыта. ПРЕДУПРЕЖДЕНИЕ: это отменяет локальную безопасность. Подробности см. https://askubuntu.com/questions/811953/switching-between-two-opened-x-sessions-without-reauthenticating"
head debian/changelog
time dpkg-buildpackage -rfakeroot -uc -b
echo Установка модифицированных пакетов.
cd ..
PACKAGESTOINSTALL=$( for DEBNAME in *.deb ; do PACKAGENAME="$( echo "$DEBNAME" | cut -f 1 -d _ )" ; if dpkg -l $PACKAGENAME | grep -q ^ii ; then echo $DEBNAME ; fi ; done ) ; sudo dpkg --install ${PACKAGESTOINSTALL}
dpkg -l '*lightdm*'
)
Обратите внимание, что команда ниже немедленно закроет все графические сессии без возможности сохранить данные, поэтому для всех пользователей приложения следует закрыть надлежащим образом и сохранить нужные данные сначала.
Если пакеты установлены успешно, изменения могут быть активированы немедля с помощью :
sudo service lightdm restart
или при перезагрузке.
Отзывы
Работает ли это для вас? Можете ли вы предложить варианты?
Отзывы приветствуются.
Ответ или решение
Быстрая смена X сессий между двумя пользователями без повторной аутентификации
Потребность: мгновенное переключение между пользователями
На системе есть две учетные записи пользователей, которые используются одним физическим пользователем. Одна и та же персона обычно имеет открытые две графические X-сессии, по одной на каждую учетную запись, но ей нужно видеть на экране только одну из них в каждый момент. Эти пользователи ведут свою работу с разными конфигурациями почты, историями браузера, файлами и уровнями безопасности.
Системные параметры и компромиссы в безопасности
- Операционная система: Xubuntu 16.04 Xenial
- Управление сеансами: lightdm
Основной целью является переключение между двумя графическими X-сессиями по нажатию кнопки на панели без необходимости повторной аутентификации. В данном сценарии допустимо некоторое снижение локальной безопасности, так как система находится в контролируемом окружении. Однако важно, чтобы удаленная безопасность (например, доступ по SSH) оставалась неприкосновенной.
Подходы
-
Использование утилит lightdm
В этой стратегии используется команда
dm-tool switch-to-user
, но необходимо настроить систему так, чтобы не требовалось повторной аутентификации. В версии Ubuntu 12.04 удавалось отключить light-locker, но в 16.04 это вызывает окно авторизации. -
Определение номера виртуального терминала (VT) и использование chvt
Этот метод предполагает использование команды
chvt
для переключения между VT. Это проще и не требует изменения lightdm или PAM, но потребует конфигурацию sudo и способ определения соответствия между пользователем и VT.
Решение: Патч для lightdm
Я разработал рабочий патч для lightdm, который позволяет переключение сессий без аутентификации. Решение заключается в модификации кода светового диспетчера, чтобы в случае уже существующей неактивной пользовательской сессии система переключалась на нее без повторной аутентификации.
Внимание к безопасности: Это решение снижает уровень безопасности, позволяя любому пользователю, имеющему открытый сеанс, переключаться в сессию другого пользователя без введения пароля.
Установка и настройка
Процесс установки предусматривает замену стандартных кодов lightdm на модифицированные. Для этого потребуется административный доступ (использование sudo). Модульные изменения можно вносить из текстовой консоли, что позволяет избежать потери данных при перезапуске lightdm.
Команды для установки:
- Обеспечение наличия необходимых пакетов:
sudo apt-get install devscripts quilt
- Подготовка и применение патча:
apt-get source lightdm # Нажмите здесь для вставки основного кода установки патча sudo dpkg --install *.deb
Перезапуск lightdm:
Применение изменений может быть активировано немедленно командой:
sudo service lightdm restart
Обратная связь и возможные усовершенствования
Будем признательны за любые отзывы о работе решения и возможные варианты доработок. Для восстановления изначальной конфигурации следует установить стандартные пакеты lightdm или дождаться их обновления.
Заключение
Это решение является простым и эффективным для упрощения работы в контролируемой среде, однако следует тщательно оценить риски, связанные с изменением параметров безопасности. Этот подход может служить отправной точкой для дальнейших разработок и может быть дополнительно улучшен с учетом специфики вашей организации.