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

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

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

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

  • Обе учетных записи являются обычными учетными записями Unix, они просто, оказалось, использовались тем же физическим пользователем (человек).
  • Тот же человек имеет почти всегда два графических X открытых сессий, один для каждой учетной записи пользователя, но только должен видеть по одному на экране.
  • Это абсолютно отдельные учетные записи с различными почтовыми конфигурациями, историями браузера, файлами, с разными уровнями безопасности.
  • Ничто не совместно используется учетными записями, не было бы никакого смысла в смешивании тех учетных записей на тех же X сессиях (даже вставка копии между теми будет бесполезна).
  • Все же пользователь должен много раз переключать между ними день.
  • Легко поместить кнопку, которая звонит dm-tool switch-to-user но практически пользователь затем должен повторно пройти проверку подлинности на каждом переключателе, и это - потеря производительности.

Потребность состоит в том, чтобы позволить быстрый переключатель между двумя, графическими X сессий (например, при щелчке по кнопке на панели), не имея необходимость повторно проходить проверку подлинности.

Информация о системе и импликация безопасности (ослабляющий локальную защиту должен быть хорошо),

  • Система является Гостеприимным Xubuntu 16.04.
  • X мест, вход в систему, блокировка, переключение сделано lightdm out-of-the-box.

Я знаю, что расслабляющая безопасность между парой пользователей при сохранении других операций безопасными более сложна, чем обычный подход блокировки-и-переключателя. К счастью, в нашем случае это хорошо, если некоторая локальная защита потеряна, так как машина находится в управляемом помещении. Например, если бы решение потребности вызывает некоторый сценарий, который обычно автоматически блокировал бы сессию (как suspend+resume), чтобы больше не заблокировать для этой пары пользователей или даже каждого пользователя в системе, это может быть приемлемо.

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

Кроме того, удаленная безопасность должна быть сохранена (например, доступ SSH к тем учетным записям не должен быть затронут решением этой проблемы).

Поиск перед регистрацией

Подход 1: используйте lightdm инструменты, но корректируйтесь так или иначе

В основном использовать dm-tool switch-to-user *username* и примите меры, чтобы сессия пользователя не была заблокирована.

Работавший в 12,04

В Ubuntu 12.04 мы отключили легкий блокировщик для предотвращения блокировки сессии плюс набор значок на рабочем столе каждого пользователя, который выполнил эту команду:

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: Ubuntu, ничто конкретно работа.

Я посмотрел на dm-tool исходный код по http://archive.ubuntu.com/ubuntu/pool/main/l/lightdm/lightdm_1.18.1-0ubuntu1.tar.gz (из ссылки на Ubuntu – Детали пакета lightdm в гостеприимном).

Принцип похож на это:

  • 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 так мог бы работать в другом месте.

  • Недостаток: hackish способ выяснить соединение между пользователем и числом VT?

Заключение, перескажите вопрос

  • Любой комментарий о первом подходе (через dm-tool, PAM корректируется)?
  • Любой комментарий о втором подходе (через chvt)?

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

6
задан 13 August 2016 в 13:51

1 ответ

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

Я записал патч usable-proof-of-concept к lightdm это делает задание.

Это делает то, в чем мы нуждаемся здесь!

Посмотрите ниже для инструкций по установке.

Предпосылки

  • Система по крайней мере с двумя учетными записями пользователей и пользователями, готовыми позволить быстрый переключатель между графическими сессиями, не перепечатывая пароли.
  • Каждый пользователь может использовать любую настольную среду, которая полностью использует lightdm, включая использование light-locker для блокировки сессии. Единица и XFCE должны работать.

Протестированный с XFCE.

Как использовать, как видеть изменения

Попробуйте это прежде, чем выполнить изменения:

  • имейте пользователя открытое графическая сессия
  • сделайте, чтобы пользователь 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 пакеты с измененными версиями, которые позволяют переключаться между любыми двумя пользователями, в настоящее время зарегистрированными графическая сессия. Это ослабляет безопасность системы, например, пользователь, журналы в графически, сессия блокировок, уходят, пользователь B входит в систему. Пользователь B может разблокировать пользователя сессия и переключить на нее любое время, она открыта. И наоборот (подкачивают A и B).

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

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

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

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

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

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

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

Команды

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

Вставка копии команды ниже в оболочке удара и это будет корректироваться 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://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 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://askubuntu.com/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

или путем перезагрузки.

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

Это работает на Вас? Можно ли думать о варианте? Приветствие обратной связи.

1
ответ дан 23 November 2019 в 08:12

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

Похожие вопросы: