Как настроить одновременную смену пароля в OpenLDAP и Kerberos?

Для одновременной смены пароля в OpenLDAP и Kerberos необходимо в конфигурационном файле /etc/tionix/vdi_server.yaml проверить наличие секции:

KERBEROS:
script_path: "path to script"

При наличии этой секции и валидного значения параметра script_path смена пароля выполняется посредством указанного сценария. Если путь до скрипта неверный или нет доступа к файлу, то возвращается ошибка в VDI клиенте, и в логах VDI сервера указывается причина. Если значение пустое или секции вообще нет, то производится смена пароля через обычный функционал Keystone.

Пример конфигурационного файла vdi_server.yaml:

DB:
  NAME: tionix_vdi_server
DEBUG: true
RABBIT_QUEUES:
  vhost: "tionix_vdi_server_vhost"
KERBEROS:
  script_path: /etc/tionix/chpwd.sh

Для успешного запуска скрипта, указанного в chpwd.sh, с целью выполнения скрипта на удаленной машине необходимо соблюсти ряд условий:

  1. Скрипт на хосте с VDI брокером не должен располагаться в каталоге /tmp.
  2. Необходимо учесть, что скрипт выполняется от пользователя, запустившего VDI сервер (в случае использования настроек по умолчанию это tionix).
  3. Необходимо предоставить возможность авторизации без использования пароля от пользователя tionix на удаленной машине.

Пример скрипта chpwd.sh на локальном хосте:

#!/bin/bash
SERVER='$SERVER_NAME' # Доменное имя либо IP-адрес
TM=$TIME_FOR_SSH # Ожидаемое время выполнения скрипта через SSH (в секундах)

timeout $TM ssh root@$SERVER /usr/local/sbin/princ_chpwd.sh $1 $2 $3

if [ "$?" != "0" ]; then
    exit 1
    else
    exit 0
fi

Пример скрипта (princ_chpwd.sh) смены паролей в OpenLDAP и Kerberos на удаленной машине (находится в зоне ответственности администраторов OpenLDAP и Kerberos):

#!/bin/bash

export PATH=$PATH:/usr/bin/:/usr/sbin/

ROOTDN="cn=ldaproot,dc=zags,dc=loc"
ROOTPW="thae0cohf1cieph7"
USERDN="ou=People,dc=zags,dc=loc"
DATE=$(date '+%F %T')
LOG="/var/log/avanpost.log"

#### Определение параметров ####
USER="$1"
PASS="$2"
OLDPASS="$3"
################################

#### Проверьте наличие учетной записи, если нет - укажите ее в лог и выйдите ####
PRINC=$(/usr/sbin/kadmin.local -q "getprinc $USER" | grep "Key: vno 1")
GETENT=$(/usr/bin/ldapsearch -LLL -b "$USERDN" -x -H "ldap://127.0.0.1" "(&(objectClass=posixAccount)(uid=$USER))" uid)
        if [ -z "$PRINC" ]; then
                echo "$DATE Account krb lock. User $USER not found." >> $LOG
                exit
        elif [ -z "$GETENT" ]; then
                echo "$DATE Account ldap lock. User $USER not found." >> $LOG
                exit
        fi

####
/usr/bin/ldappasswd -x -D "$ROOTDN" -x -w $ROOTPW -s $PASS -a $OLDPASS uid=$USER,$USERDN

#### Измените пароль основного пользователя ####
/usr/sbin/kadmin.local -q "change_password -pw $PASS $USER"
        echo "$DATE Princ change password. Password for principal "$USER" changed" >> $LOG