Настройка использования Samba для Kerberos-аутентификации с помощью ADCM

Обзор

Samba выступает контроллером домена Active Directory, поэтому настройка Kerberos-аутентификации с Samba очень похожа на настройку аутентификации с Active Directory.

Особенности CentOS 7

 
На CentOS 7 бандл не генерирует keytab-файлы автоматически, так как стандартный пакет Samba для CentOS 7 не поддерживает создание принципалов на удаленном контроллере. Из-за такой специфики вам необходимо подготовить keytab-файлы вручную. Для этого вы можете изменить переменные в скрипте ниже и использовать его. На других ОС генерация происходит автоматически.

Для керберизации кластера с помощью Samba выполните описанные ниже шаги:

  1. В веб-интерфейсе ADCM перейдите на страницу Clusters. Выберите установленный и подготовленный кластер ADPS, и запустите действие Manage Kerberos.

    Запуск действия Manage Kerberos
    Manage Kerberos
  2. В появившемся окне выберите опцию Existing Samba.

    Опции активации Kerberos
    Выбор соответствующей опции
  3. Заполните Kerberos-параметры Samba и приступайте к настройке Kerberos в кластере.

    Параметры Samba
    Kerberos-параметры Samba
  4. Нажмите Run и дождитесь окончания действия. Затем приступайте к настройке Kerberos в кластере.

    Активация Kerberos через Samba
    Запуск действия

Для проверки запустите команду kinit. Если она работает некорректно со сгенерированными keytab-файлами в вашей системе, добавьте следующие опции шифрования паролей в секцию libdefaults кастомного параметра krb5.conf в конфигурации кластера в ADCM:

[libdefaults]
  permitted_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 arcfour-hmac rc4-hmac arcfour-hmac-md5
  default_tkt_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 rc4-hmac
  default_tgs_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 rc4-hmac
Особенности реализации

 
В представленном скрипте принципалы создаются особым способом (как и в бандле) по ряду причин:

  • Чтобы работала аутентификация по keytab-файлам, в качестве UPN (User Principal Name) требуется передать SPN (Service Principal Name). Это необходимо из-за того, что Samba не позволяет искать принципалов по UPN при выполнении kinit.

  • Так как существует ограничение UPN в одну запись, приходится создавать SPN для каждого сервиса по количеству хостов.

  • По умолчанию Samba при работе с принципалами и keytab-файлами обращается к локальной базе, а не к удаленному контроллеру домена. Чтобы Samba обращалась к контроллеру, при запуске действий нужно использовать аргумент -H ldap://$SAMBA_SERVER.

У такого подхода есть свои плюсы: нет необходимости добавлять компьютер в домен и настраивать локальные реплики баз данных Samba для создания сервисных пользователей и принципалов. Также аутентификация принципалов происходит по отдельным keytab-файлам для каждого, а не по одному keytab-файлу на компьютер.

Скрипт для генерации keytab-файлов
#!/bin/bash
# Script for adding services and keytabs to Cluster hosts
# Edit  HOSTS as it will be suitable for your case.
# EDIT your Samba parameters
# Select services according to the bundle

# Samba credentials
SAMBA_USER='Administrator'
SAMBA_PASSWORD='adminPassword'
SAMBA_SERVER='<samba_server>'
REALM='<samba_realm>'
SAMBA_HOST='<samba_host>'
USER_PASSWORD='userPassword'
OU_NAME='CN=Users,DC=samba,DC=test'

declare -a HOSTS

SSH_OPTS='-o GlobalKnownHostsFile=/dev/null -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no'

HOSTS=(
    "List your hosts here"
)
encoded_password=$(echo -n "\"$USER_PASSWORD\"" | iconv -f UTF-8 -t UTF-16LE | base64)

#ADPS services
SERVICES=(HTTP knox rangeradmin rangerkms rangerlookup rangertagsync rangerusersync solr zookeeper)

mkdir /tmp/keytabs

for HOST in ${HOSTS[@]}; do
    echo "Set hostname"
        ssh $SSH_OPTS $HOST "sudo hostnamectl --static set-hostname $HOST"
    echo "Create keytab dir"
	    ssh $SSH_OPTS $HOST "sudo mkdir -p /etc/security/keytabs"
    for SERVICE in ${SERVICES[@]}; do
        echo "Create service user"
        ssh $SSH_OPTS $SAMBA_HOST "sudo useradd $SERVICE"
        echo "Create service principal"
        echo "Create add.ldif"
        ssh $SSH_OPTS $SAMBA_HOST "cat <<EOF > /tmp/add.ldif
DN: CN=${SERVICE}/${HOST},${OU_NAME}
changetype: add
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: user
accountExpires: 0
sAMAccountName: ${SERVICE}-${HOST}
userPrincipalName: ${SERVICE}/${HOST}@${REALM}
servicePrincipalName: ${SERVICE}/${HOST}
distinguishedName: CN=${SERVICE}/${HOST},${OU_NAME}
userAccountControl: 514

DN: CN=${SERVICE}/${HOST},${OU_NAME}
changetype: modify
replace: unicodePwd
unicodePwd:: $encoded_password

DN: CN=${SERVICE}/${HOST},${OU_NAME}
changetype: modify
replace: userAccountControl
userAccountControl: 66048

EOF"

        echo "sudo ldbmodify -H ldap://$SAMBA_SERVER /tmp/add.ldif -U $SAMBA_USER --password=$SAMBA_PASSWORD"
        ssh $SSH_OPTS $SAMBA_HOST "sudo ldbmodify -H ldap://$SAMBA_SERVER /tmp/add.ldif -U $SAMBA_USER --password=$SAMBA_PASSWORD"

        echo "Delete keytab"
        ssh $SSH_OPTS $SAMBA_HOST "sudo rm -f /tmp/$SERVICE.service.keytab"

        echo "Extract keytab"
        TMP_SCRIPT="/tmp/extract_keytab_${SERVICE}_${HOST}.sh"
        KTUTIL_SCRIPT="/tmp/ktutil_commands_${SERVICE}_${HOST}.txt"
        cat <<EOT > $TMP_SCRIPT
#!/bin/bash
cd /tmp
sudo ktutil < $KTUTIL_SCRIPT
EOT

        cat <<EOT > $KTUTIL_SCRIPT
add_entry -password -p ${SERVICE}/${HOST}@${REALM} -k 1 -e aes256-cts-hmac-sha1-96
${USER_PASSWORD}
add_entry -password -p ${SERVICE}/${HOST}@${REALM} -k 1 -e aes128-cts-hmac-sha1-96
${USER_PASSWORD}
add_entry -password -p ${SERVICE}/${HOST}@${REALM} -k 1 -e arcfour-hmac
${USER_PASSWORD}
wkt ${SERVICE}.service.keytab
quit
EOT

        scp $SSH_OPTS $TMP_SCRIPT $SAMBA_HOST:$TMP_SCRIPT
        scp $SSH_OPTS $KTUTIL_SCRIPT $SAMBA_HOST:$KTUTIL_SCRIPT
        ssh $SSH_OPTS $SAMBA_HOST "chmod +x $TMP_SCRIPT && $TMP_SCRIPT && rm $TMP_SCRIPT && rm $KTUTIL_SCRIPT"
        rm $TMP_SCRIPT
        rm $KTUTIL_SCRIPT

        echo "Try kinit"
        ssh $SSH_OPTS $SAMBA_HOST "sudo klist -k /tmp/$SERVICE.service.keytab"
        echo "Change permission"
        ssh $SSH_OPTS $SAMBA_HOST "sudo chmod 777 /tmp/${SERVICE}.service.keytab"
        echo "Export keytab to local"
        scp $SAMBA_HOST:/tmp/${SERVICE}.service.keytab /tmp/keytabs/${SERVICE}.service.keytab
        echo "Export keytab to host"
        scp /tmp/keytabs/${SERVICE}.service.keytab $HOST:/tmp/${SERVICE}.service.keytab
        ssh $SSH_OPTS $HOST "sudo mv /tmp/${SERVICE}.service.keytab /etc/security/keytabs/${SERVICE}.service.keytab"
        echo "Clean up local temporary keytab"
        rm /tmp/keytabs/$SERVICE.service.keytab
    done

    echo "Change owner and group"

    ssh $SSH_OPTS $HOST sudo chown zookeeper:zookeeper /etc/security/keytabs/zookeeper*
    ssh $SSH_OPTS $HOST sudo chown root:hadoop /etc/security/keytabs/HTTP*
    ssh $SSH_OPTS $HOST sudo chown knox:knox /etc/security/keytabs/knox*
    ssh $SSH_OPTS $HOST sudo chown ranger:ranger /etc/security/keytabs/rangeradmin*
    ssh $SSH_OPTS $HOST sudo chown kms:kms /etc/security/keytabs/rangerkms*
    ssh $SSH_OPTS $HOST sudo chown ranger:ranger /etc/security/keytabs/rangerlookup*
    ssh $SSH_OPTS $HOST sudo chown ranger:ranger /etc/security/keytabs/rangertagsync*
    ssh $SSH_OPTS $HOST sudo chown ranger:ranger /etc/security/keytabs/rangerusersync*
    ssh $SSH_OPTS $HOST sudo chown solr:solr /etc/security/keytabs/solr*

    echo "Change permissions"

    ssh $SSH_OPTS $HOST "sudo chmod -R 777 /etc/security/keytabs/"

done

Kerberos-параметры Samba

Параметр Описание

Authentication on WEB UIs

Включает аутентификацию Kerberos для веб-интерфейсов

KDC hosts

Один или несколько хостов контроллера домена

Realm

Kerberos realm — сеть, содержащая KDC-хосты и множество клиентов

Domains

Домены, в которых находятся хосты

Kadmin server

Адрес хоста, на котором запущен kadmin

Kadmin principal

Имя принципала для подключения через kadmin, например admin@RU-CENTRAL1.INTERNAL

Kadmin password

Пароль принципала для подключения через kadmin

Keytabs directory

Директория keytab-файла, содержащего записи одного или нескольких принципалов и их ключи

Additional realms

Дополнительные сети Kerberos realm

LDAP URL

LDAP URL состоит из префикса ldap:// или ldaps://, имени хоста или IP-адреса и порта LDAP-сервера

Container DN

Отличительное имя контейнера

Trusted Active Directory server

Сервер с DC для односторонней доверенности

Trusted Active Directory realm

Область доверия между realm

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней