Kinit с systemd в пользовательском режиме

596
Kartik

Я создал keytabфайл в домашнем каталоге пользователя $HOME/client.keytab. Файл кэша аутентификации находится в расположении по умолчанию /tmp/krb5cc_%U(где% U - UID). Теперь у меня есть этот простой systemd unitфайл для запуска сервиса и получения ключей аутентификации:

[Unit] Description=Initializes, caches and renews Kerberos tickets for user After=default.target  [Service] Type=oneshot RemainAfterExit=yes ExecStartPre=/usr/bin/kdestroy -q -c /tmp/krb5cc_%U ExecStart=/usr/bin/kinit -V -l 30d -r 365d -k -t %h/client.keytab -c /tmp/krb5cc_%U %i@EXAMPLE.COM ExecStartPost=/usr/bin/krenew -b -K 60 -k /tmp/krb5cc_%U StandardOutput=syslog StandardError=syslog SyslogIdentifier=KerberosTicketing  [Install] WantedBy=default.target 

Это работает отлично, и создает и сохраняет билеты проверки подлинности Kerberos, если Afterуказывает на default.target. Однако почему default.target? Это довольно поздно в процессе загрузки. Я бы предпочел, чтобы он работал multi-user.target, чтобы я мог использовать сгенерированные тикеты для монтирования удаленных файловых систем с серверов, которые не принимают публичную / частную аутентификацию.

РЕДАКТИРОВАТЬ : Если что- Afterто, но default.targetили позже, kinitне с ошибкой kinit: Cannot find KDC for realm "EXAMPLE.COM" while getting initial credentials.

Я в основном пытаюсь сделать это: SSHFS автомонтирование через FSTAB с использованием Kerberos (GSSAPI) .

0

1 ответ на вопрос

1
grawity

Для юнитов systemd --user именно здесь начинается время. Весь менеджер --user запускается поздно в процессе загрузки - это системный сервис (user @ .service), который запускается systemd-logind, который всегда запускается во время поздней загрузки.

Чтобы заказать услугу для более ранних модулей (например, remote-fs.target), вам необходимо преобразовать ее в системный сервис. Тогда ваши единицы .mount (или ваши записи в fstab) смогут также указать зависимости от вашего сервиса.


Обратите внимание, что WantedBy = не определяет, когда ваш юнит будет поставлен в очередь (в некотором смысле он делает противоположное). Вместо этого это определяется (неявным и явным) параметрами Before = / After =. Совершенно возможно и обычно иметь модуль с «WantedBy = multi-user.target», но также с «DefaultDependencies = no» и «Before = remote-fs.target».


Как примечание, не запускайте демонов, таких как krenew -Kчерез ExecStartPost =. Единственное место, которое «официально» разрешает длительные процессы (и предоставляет такие функции, как Restart =), - это главный ExecStart =, поэтому, если вы хотите периодическое обновление, поместите его krenew -Kтуда.

Вы можете запустить kinit в качестве второго ExecStartPre = или использовать его, k5start -Kчтобы избежать необходимости вручную kinit.

ExecStart=/usr/bin/k5start -L -b -K 30 -f %h/client.keytab -k /tmp/krb5cc_%U -u %i@EXAMPLE.COM 
Здорово! На самом деле мой файл `systemd`` unit` работает с вашим `ExecStart` и` After = multi-user.target`. Так что проблема решена! Я пропустил флаг `-b` на` k5start` и поэтому провел все это время в погоне за гусем. Бесконечно благодарен! Kartik 6 лет назад 0
** после = ** multi-user.target? Это не имеет смысла в соответствии с вашим первоначальным вопросом. Это заставляет сервис запускаться _later_, чем обычные блоки (даже 'поздние' неявно упорядочены перед этой целью). grawity 6 лет назад 0
Вам необходимо просмотреть типы услуг, которые вы используете. Обычный `k5start` - это длительный процесс переднего плана, который работал бы с` Type = simple`. Если вы используете `k5start -b`, это попытается 'демонизировать', что требует` Type = forking`. Ни один из них не совместим с `Type = oneshot` (который предназначен для кратковременных сервисов, которые, например, просто делают быстрый Kinit и ничего более). grawity 6 лет назад 0
Таким образом, даже после преобразования в системный сервис он не запускается до `multi-user.target`. Я получаю Не могу найти KDC для ошибок областей. Поэтому единственный способ, которым он работает, это `After = multi-user.target`. Я не знаю, что мне здесь не хватает. Kartik 6 лет назад 0
Что ж, если ему нужна сеть, вам нужно заказать ее ** после службы, которая запускает сеть. ** (Хотя заказ после multi-user.target делает это в широком цикле, это создает другую проблему - все .mounts запущены задолго до этой цели, поэтому теперь ваша служба будет работать слишком поздно, чтобы sshfs могла ее использовать.) Вам может потребоваться `DefaultDependencies = no`,` Before = remote-fs-pre.target`, `After = network-online.target` , `Wants = network-online.target`. (Все они. Хотя обратите внимание, что сетевое подключение к Интернету варьируется между дистрибутивами.) grawity 6 лет назад 0
Да, я сделал это В Ubuntu `network.target` покрывает всю восходящую сеть. Тем не менее, нет кости. Я не пробовал `DefaultDependencies` и` Before = remote-fs-pre.target`. В настоящее время у меня есть псевдоним `sshfs` как` bash`, и я запускаю его вручную. Kartik 6 лет назад 0
Моя конечная цель - получить билеты Kerberos при загрузке системы и смонтировать удаленный каталог. Билеты Kerberos также используются для SSH в кластер с удаленным хранилищем. Рабочий стол, которым я пользуюсь, доступен другим пользователям из моей команды. Поэтому лучше придерживаться своего пользовательского пространства и ничего не делать глобально. Более того, моему коллеге также необходимо настроить свою собственную проверку подлинности Kerberos для кластера и также смонтировать свой удаленный рабочий каталог. Kartik 6 лет назад 0
Но вы говорили о монтировании файловых систем перед multi-user.target. Это ** уже глобально **, поскольку это происходит только через общесистемные модули fstab или .mount. С другой стороны, если вы вместо этого планируете монтировать через ~ / .config / systemd / user / sshfs @ .service (неглобальный), то multi-user.target не имеет никакого отношения вообще, а ваш первоначальный вопрос не имеет смысл. grawity 6 лет назад 0
Я думаю, что хочу сделать что-то подобное. Я сейчас запутался. Вы рекомендуете ресурс, где я могу читать и обучать себя? Может быть, тогда я могу задать лучший вопрос. Проблема, с которой я столкнулся, когда писал этот вопрос, заключалась в том, что `After = default.target` был очень поздним в процессе загрузки. Это никуда не уводило, чтобы поместить `sshfs @ .service` между` k5start @ .service` и `default.target`. Теперь с вашей помощью я могу использовать `After = multi-user.target`, который дает место для слота` sshfs @ service`. Спасибо за совет о `Type = forking`. Kartik 6 лет назад 0
Что вы подразумеваете под "пространство в слот"? ** Слотов нет. ** Если у вас есть две службы, заказанные после одной цели, это не означает, что между этими двумя службами не может быть внутреннего порядка. Вы могли бы просто использовать что-то вроде `After = k5start @ .... service` в вашем сервисе sshfs, не заботясь о целях вообще. Я думаю, что вы представляете After = как строгое «это произойдет * сразу же * без исключений», но это не то, что есть. Он не создает связанный список; он строит дерево зависимостей и немного более гибок, чем вы думаете. grawity 6 лет назад 0
Нет, я попробовал это. Я получил ошибку, которую не помню сейчас. Но он удалил `sshfs @ .service`. Я не имею в виду слоты буквально. Я понимаю разницу между связанным списком и деревом зависимостей. Я не знаю, насколько гибким является дерево. Проблема заключалась в том, что `k5start @ .service` был после` default.target`, а у `sshfs @ .service` было` After = k5start.service`, но он был разыскивался `default.target` в Install. Я знаю, что услуги могут зависеть от других услуг, а не только от целей. Kartik 6 лет назад 0