Переключение между двумя открытыми сессиями X без повторной аутентификации

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

В системе есть пара учетных записей пользователей, которые как-то эквивалентны.

Конкретнее, для данной пары:

  • Обе учетные записи являются обычными учетными записями 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 вызывает.

Больше поиска

Поиск подсказок в ошибке № 1205384 "Блокировку можно обойти, переключившись на консоль": Ошибки: 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)?

Спасибо за Ваше внимание.

1 ответ

Резюме: готово, применимо, текущее решение приемлемо только в совместной многопользовательской среде, может быть улучшено.

Я написал полезное доказательство концепции патча для 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 и переключаться на него в любое время, когда он открывается. И наоборот (поменять местами А и В).

Изменения не могут быть применены без прав администратора (sudo предполагается, особенно для установки пакета).

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

Постоянное предупреждение

Изменения почти постоянны. Они остаются после перезагрузки. Чтобы вернуть их, установите (используя aptitude, synaptic или что угодно) регулярный lightdm* пакеты, которые заменят измененные.

Обратите внимание, что в любое время обновления Ubuntu lightdm пакеты и обновления установлены, они будут отменять изменения. Администратор может применить их снова.

Возможное уточнение (восстановление безопасности)

Это доказательство концепции может быть уточнено путем умного использования, например, групп Unix. lightdm разрешит переключение, только если текущие и целевые пользователи перечислены в любой группе с обычным именем файла, например lightdm-quickswitch-anystringfoo, Такое изменение (возможно, наряду с другими) может быть в конечном итоге объединено в какое-то официальное решение.

команды

Я предлагаю войти в текстовую консоль (нажмите Ctrl-Alt-F1 и войдите в систему), чтобы выполнить следующие шаги. Это позволяет перезапустить lightdm без потери текущей оболочки.

Скопируйте и вставьте приведенные ниже команды в оболочку bash, и она настроит lightdm выполнить изменения.

(
set -euxv

echo Making sure system has necessary packages.

echo Installing packages will be done only once but might be long as it may fetch around 40Mbytes of data from the Internet.
sudo apt-get --assume-yes install devscripts

echo Enabling source packages in 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 Getting package source

apt-get source lightdm
cd */

pwd

if [ -d .pc ]
then
quilt push -a || echo "Quilt returned an error code, we ignore it because we saw it was sometimes irrelevant."
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://Ask-ubuntu.ru/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://Ask-ubuntu.ru/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://Ask-ubuntu.ru/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 Building modified packages.

dch -lquickswitch "Allow dm-tool switch-to-user username to switch without authentication if user session is already opened.  WARNING: this negates local security. For details, see https://Ask-ubuntu.ru/questions/811953/switching-between-two-opened-x-sessions-without-reauthenticating"
head debian/changelog
time dpkg-buildpackage -rfakeroot -uc -b

echo Installing modified packages.

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

или перезагрузкой.

Обратная связь

Работает ли это для вас? Можете ли вы придумать вариант? Обратная связь приветствуется.

Другие вопросы по тегам