Как сохранить учетные данные 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, который поддерживает современную аутентификацию и автоматический скрипт.
Вместо хранения пароля вы можете использовать сертификат или существующий принципал службы и секрет клиента.