Как сохранить учетные данные MFA в Powershell

При базовой аутентификации вы имели обыкновение хранить учетные данные в переменной

$cred = Get-Credential

Сейчас мы используем Modern Auth, а наша многофакторная аутентификация - Duo.

Как мне сохранить свои учетные данные для MFA в переменной, чтобы я мог подключить их в сценарий?

пример

$mfacred = *whateverthecodeis*
Connect-MsolService -Credential $mfacred
Connect-AzureAD -Credential $mfacred

Редактировать Я не хочу обойти MFA, я хочу запросить его и сохранить учетные данные и токен таким образом, чтобы остальная часть сценария могла использовать учетные данные и токен.

1 ответ

Насколько мой опыт работы с учетными записями с поддержкой MFA в скриптах. Единственный способ обойти MFA - использовать командлеты без параметра -Credential.

Основным вариантом использования MFA является защита от таких вещей, как сценарии, работающие на скомпрометированной учетной записи.

ОБНОВИТЬ:

Таким образом, есть способ взломать ваш путь к программному получению токена. Это делается с помощью двоичных файлов ADAL, которые поставляются с установкой модулей Azure и / или других модулей O365. Нет простого способа запросить и сохранить токен в переменной.

Вам нужно будет загрузить DLL в ваш скрипт, чтобы начать кэширование токена:

Add-Type -Path 'C:\Program Files\WindowsPowerShell\Modules\AzureAD\2.0.x.x\Microsoft.IdentityModel.Clients.ActiveDirectory.dll'

Вы можете получить токены доступа заранее, используя метод AcquireTokenAsync.

$accesstoken = [Microsoft.IdentityModel.Clients.ActiveDirectory.TokenCache]::DefaultShared
$accesstoken.ReadItems() | select DisplayableId, Authority, ClientId, Resource

Приведенный выше метод ReadItem() предоставит вам всю информацию, необходимую для сохранения токена в переменной.

$authContext = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContext" -ArgumentList #PLACE AUTHORITY URL HERE#
$client_id = "CLIENT_ID INFO"
$Credential = Get-Credential YOURUSERNAME@COMPANY.COM
$AzureADCred = New-Object "Microsoft.IdentityModel.Clients.ActiveDirectory.UserPasswordCredential" -ArgumentList $Credential.UserName,$Credential.Password
$authResult = [Microsoft.IdentityModel.Clients.ActiveDirectory.AuthenticationContextIntegratedAuthExtensions]::AcquireTokenAsync($authContext,"https://RESOURCE-URL.COM",$client_Id,$AzureADCred)

Получив токен, вы можете использовать его для подключения к сеансу, будь то обмен через Интернет, Azure или Office.

$Authorization = "Bearer {0}" -f $authResult.Result.AccessToken
$Password = ConvertTo-SecureString -AsPlainText $Authorization -Force
$Ctoken = New-Object System.Management.Automation.PSCredential -ArgumentList "YourCompanyUserAccount@COMPANY.COM", $Password

Предостережение: они применяются только к токенам доступа и не учитывают токен обновления. Вы можете даже не получить возвращенный токен обновления в зависимости от того, какие двоичные файлы ADAL вы используете.

Чтобы узнать больше о токенах доступа, вы можете узнать больше об этом здесь

Вы можете попробовать модуль предварительного просмотра EXO V2, который поддерживает современную аутентификацию и автоматический скрипт.

Вместо хранения пароля вы можете использовать сертификат или существующий принципал службы и секрет клиента.

https://o365reports.com/2020/07/04/modern-auth-and-unattended-scripts-in-exchange-online-powershell-v2/

Другие вопросы по тегам