LINUX.ORG.RU
решено ФорумAdmin

powercli: как работает магия доменной аутентификации?

 powercli, ,


0

1

Доброго времени суток

Некоторое время назад ms допилили powershell, и в linux теперь работает полноценная, а не кастрированная версия. vmware powercli сейчас тоже полноценно работает из-под linux

Есть желание сделать кроссплатформенными свои скрипты для работы с vsphere. Одна проблема: в винде работает доменная аутентификацию (не нужно вводить credentials), в linux нет. Можно сделать workaround с загрузкой credentials из файла. Но не хотелось бы терять доменную аутентификацию при работе в винде

Есть идеи?

★★★★★

Хм, ну очевидная идея: сделать в скрипте определение ОС, под которой он запускается — и если стартует на Linux, то запускать загрузку credentials из файла, а если на Windows, то использовать доменную аутентификацию. Или я не понял ситуацию?

Vsevolod-linuxoid ★★★★★
()
Ответ на: комментарий от Vsevolod-linuxoid

Там всё через пайпы

Попробую обернуть логин в отдельную функцию с if’ами

router ★★★★★
() автор топика

Одна проблема: в винде работает доменная аутентификацию (не нужно вводить credentials), в linux нет.

Линуксовая машина в домен введена? Kerberos-тикеты на ней есть?

Pinkbyte ★★★★★
()

Сделай kinit, а потом klist. Появился ли TGT в выводе klist?

Для того, чтобы получить тикет, вводить машину в домен не нужно, достаточно настроить конфиг Kerberos (/etc/krb5.conf).

Если TGT ты не получаешь, то дальше продолжать нет смысла - надо разбираться с конфигом Kerberos.

Если с TGT все OK, то сделай Connect-VIServer в PowerShell и снова запусти klist - появился ли тикет для твоего vCenter в выводе?

Если появился, то SSO должен работать.

Если не появился, то, значит, Connect-VIServer даже не попытался получить тикет (либо пытался, но не смог). Пытался ли он или нет - можно понять, запустив tcpdump на 88 порт во время Connect-VIServer.

Если он даже не пытается, то, хм... надо в исходники смотреть, что ему мешает (и умеет ли он вообще работать с Kerberos).

bigbit ★★★★★
()
25 февраля 2021 г.

Пока сделал следующий wrapper:

# domain auth does not work with "powershell core + linux"
# so let's try to get credentials other way:
# 1. if global variable $my_credential exists, use it
# 2. else, if $my_credstore is not $null, load credentials from specified file
# 3. else, fallback to default method: domain auth, then get-credential

# path to credential file or $null
#
# how to create credentials file:
#   Get-Credential | Export-Clixml "/home/ok/Documents/vccred.xml"
#
#$my_credstore = "/home/ok/Documents/vccred.xml"
$my_credstore = $null

function connect-wrapper {
  param(
    [Parameter(Mandatory=$True)][string]$server
  )
  # domain auth works only with windows
  # so let's create wrapper for linux
  $my_connect_opts = @{}
  if (Test-Path variable:global:my_credential){
    $my_connect_opts["Credential"] = (Get-Variable my_credential -Scope Global).Value
  } elseif ($my_credstore) {
    $my_connect_opts["Credential"] = (Import-clixml $my_credstore)
  }
    return Connect-VIServer -server $server @my_connect_opts
}

Подключаю файл с wrapper’ом во все скрипты через

try {
  # do version specific actions in separated script
  . ".\_vsphere_prepare.ps1"
} catch {
  $my_err_message = "can't import scripts: " + [string]($_.Exception.Message)
  Write-Error $my_err_message
  exit 1
}

Не это хотелось бы видеть, но powershell’у до питона далеко, да и я не программист

router ★★★★★
() автор топика
Ответ на: комментарий от Pinkbyte

Нет, цербера он не подхватывает. Либо прозрачная аутентицикация сделана по-другому, либо её в принципе не делали в powershell для linux, либо нужна какая-то предварительная настройка

router ★★★★★
() автор топика
Ответ на: комментарий от bigbit

Как работает kerberos, я примерно представляю

Это была теория, или у тебя прозрачная аутентификация реально работает в связке «powershell + linux» ?

router ★★★★★
() автор топика
Ответ на: комментарий от router

Нет, у меня не работает.

Это была не только теория, но и пошаговые инструкции, как определить, почему оно не работает.

bigbit ★★★★★
()
Ответ на: комментарий от router

В общем оно не работает потому, что PowerCLI использует SSPI, который есть только в винде. Там идет проверка ОС - если Windows, то вызывается ServerLoginHelper.DoLoginUseSspi.

Вот такой код:

if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) {
  if (string.IsNullOrEmpty(user)) {
    try
    {
      ExceptionHelper.WriteVerbose("ViCore_ServerLoginHelper_DoLogin_Sspi_Started", Strings.ViCore_ServerLoginHelper_Sspi_Started);
      client = ServerLoginHelper.DoLoginUseSspi(protocol, client, serverAddress, portNum, incrementConnectionRefCount, certificateValidator, out wasReused);
      ExceptionHelper.WriteVerbose("ViCore_ServerLoginHelper_DoLogin_Sspi_Succeeded", Strings.ViCore_ServerLoginHelper_Sspi_Succeeded_Message);
    }

Запустив Connect-VIServer с опцией "-Verbose" под виндой можно увидеть эти самые сообщения SSPI.

Получается, это проблема не линуксового PowerShell, a PowerCLI.

bigbit ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.