Kerberos с Samba

Обзор

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

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

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

Запуск Kerberos Samba для кластера ADS в интерфейсе ADCM

  1. Инициируйте включение Kerberos Samba для выбранного кластера. Для этого примените кластерное действие Manage Kerberos, нажав на иконку actions default dark actions default light в столбце Actions.

  2. Включите переключатель Existing Samba в открывшемся окне.

    Включение Existing Samba
    Включение Existing Samba
    ПРИМЕЧАНИЕ
    Включение Existing Samba можно совместить c опцией Custom kerberization settings.
  3. Переведите в активное состояние переключатель Show advanced.

  4. Установите Kerberos-параметры Samba кластера ADS и нажмите Run.

    Настройка конфигурации кластера ADS для Kerberos Samba
    Настройка конфигурации кластера ADS для Kerberos Samba
  5. Подтвердите действие в открывшемся окне.

    Подтверждение действия
    Подтверждение действия
  6. Дождитесь завершения включения Kerberos Samba. Проанализируйте и исправьте ошибки в случае их возникновения.

    Процесс запуска Kerberos
    Процесс запуска Kerberos
Особенности реализации

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

  • Чтобы работала аутентификация по 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)

#ADS services
SERVICES=(HTTP nifi zookeeper kafka ksql-server kafka-rest schema-registry)

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 nifi:nifi /etc/security/keytabs/HTTP*
    ssh $SSH_OPTS $HOST sudo chown nifi:nifi /etc/security/keytabs/nifi*
    ssh $SSH_OPTS $HOST sudo chown kafka:kafka /etc/security/keytabs/kafka*
    ssh $SSH_OPTS $HOST sudo chown ksql:kafka /etc/security/keytabs/ksql-server*
    ssh $SSH_OPTS $HOST sudo chown kafka-rest:kafka /etc/security/keytabs/kafka-rest*
    ssh $SSH_OPTS $HOST sudo chown schema-registry:kafka /etc/security/keytabs/schema-registry*

    echo "Change permissions"

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

done

Для включения Kerberos Samba на хостах с CentOS 7, где используются дефолтные слабые алгоритмы шифрования и предварительно не была настроена среда Kerberos, включение аутентификации необходимо выполнять в несколько этапов:

  1. Перед запуском скрипта убедитесь, что служба доменных имен (DNS) локального компьютера (хоста), с которого запущен скрипт, а также хостов кластера ADS настроена для подключения по SSH к серверу Samba.

  2. При первом включении Manage Kerberos активируйте опцию Custom kerberization settings, в которой установите значение true только для параметров Set up Kerberos utils и Configure Kerberos on hosts. При этом будут установлены все утилиты и созданы все конфигурационные файлы Kerberos.

  3. На странице кластера Primary configuration в группе параметров Kerberos присвойте параметру Custom krb5.conf значение true. Далее откройте шаблон пользовательского krb5.conf (расположен под Custom krb5.conf) и отредактируйте секцию [libdefaults] как в примере krb5.conf, приведенном ниже, и сохраните конфигурацию.

  4. При втором включении Manage Kerberos установите в опции Custom kerberization settings значение true для всех параметров, кроме параметра Set up principals and keytabs.

Пример пользовательского krb5.conf
[logging]
  default = FILE:/var/log/krb5libs.log
  kdc = FILE:/var/log/krb5kdc.log
  admin_server = FILE:/var/log/kadmind.log

[libdefaults]
  dns_lookup_realm = false
  ticket_lifetime = 24h
  # renew_lifetime = 7d
  forwardable = true
  rdns = false
  pkinit_anchors = /etc/pki/tls/certs/ca-bundle.crt
  default_realm = SAMBA.TEST
  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
  allow_weak_crypto = true

[realms]
  SAMBA.TEST = {
  admin_server = dc1.samba.test
  kdc = dc1.samba.test
  }

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

ПРИМЕЧАНИЕ
Аутентификация Kerberos на основе Samba после запуска Manage Kerberos в сервисе Kafka осуществляется в соответствии со статьей Использование Kerberos с MS Active Directory в Kafka.
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней