TL;DR Pour se connecter à Azure via la ligne de commande Windows, nous pouvons si nécessaire définir le proxy http à utiliser via les variables d’environnement HTTP_PROXY et HTTPS_PROXY.

Que ce soit avec CMD ou avec Powershell, configurer un proxy http pour la ligne de commande sous Windows n’est pas aussi simple que cela devrait. En effet, le proxy défini au niveau du système d’exploitation n’est pas récupéré automatiquement, comme c’est le cas pour d’autres programmes. De plus, une fois dans la console, il n’y a pas de méthode uniformisée, chaque outil utilise son propre paramétrage.

En l’occurence, la CLI Azure se base sur les variables d’environnement HTTP_PROXY et HTTPS_PROXY. Pour utiliser un proxy http sous Windows vous devrez donc alimenter ces deux valeurs avec l’URI du proxy à utiliser.

HTTP_PROXY = "http:// ...user... : ... mot de passe ... @ ... nom du proxy : port"

Et oui, il faut mettre ses identifiants en clair dans la variable. Par exemple:

HTTP_PROXY = "http://user:password@proxy.acme.local:8080"

Avec CMD

Nous pouvons utiliser la commande SET pour définir les variables d’environnement :

set HTTP_PROXY=http://user:password@proxy.acme.local:8080
set HTTPS_PROXY=http://user:password@proxy.acme.local:8080

az login
...

Avec Powershell

Nous pourrions utiliser l’équivalent de SET, mais nous pouvons également essayer d’être plus malins.

En effet, l’instruction SET avec son mot de passe en clair, va rester dans l’historique Powershell, ce qui n’est pas idéal. Nous pouvons à la place appeler la Cmdlet Get-Credential, qui va afficher une invite permettant de saisir ses identifiants et de les stocker dans une variable temporaire à la session.

$my_credentials = Get-Credential

Le contenu de la variable pourra être utilisé pour construire les variables d’environnement et les identifiants ne seront pas conservés dans l’historique.

Deuxième protection, certes toute relative, la portée de la variable d’environnement peut être limitée au process Powershell en cours (c’est à dire à la console ouverte) ce qui évitera de conserver indéfiniment l’information ou de la partager avec d’autres consoles.

[Environment] ::SetEnvironmentVariable("HTTP_PROXY", "http://user:password@proxy.acme.local:8080", [EnvironmentVariableTarget]::Process)

Enfin, une fois la configuration effectuée, avec Remove-Variable nous pouvons nettoyer toutes les variables temporaires générées par Get-Credential.

Ce qui donne le script suivant:

$my_proxy_host = "some-host-name-or-ip"
$my_proxy_port = "8080"
$my_credentials = Get-Credential
$my_proxy_string = "http://$($my_credentials.UserName):$($my_credentials.GetNetworkCredential().password)@${my_proxy_host}:${my_proxy_port}"

[Environment] ::SetEnvironmentVariable("HTTP_PROXY", $my_proxy_string, [EnvironmentVariableTarget]::Process)
[Environment] ::SetEnvironmentVariable("HTTPS_PROXY", $my_proxy_string, [EnvironmentVariableTarget]::Process)

Remove-Variable my_proxy_host
Remove-Variable my_proxy_port
Remove-Variable my_credentials
Remove-Variable my_proxy_string

Attention cependant : malgré les précautions prises, le mot de passe reste défini en clair dans les variables d’environnement de la console en cours.

Conclusion

Le script peut être ajouté à $PROFILE (notepad $PROFILE) et/ou défini dans une fonction Powershell personnalisée:

function Configure-Proxy 
{
  param($my_proxy_host = "some-host-name-or-ip", $my_proxy_port = "8080")

  $my_credentials = Get-Credential
  $my_proxy_string = "http://$($my_credentials.UserName):$($my_credentials.GetNetworkCredential().password)@${my_proxy_host}:${my_proxy_port}"

  [Environment] ::SetEnvironmentVariable("HTTP_PROXY", $my_proxy_string, [EnvironmentVariableTarget]::Process)
  [Environment] ::SetEnvironmentVariable("HTTPS_PROXY", $my_proxy_string, [EnvironmentVariableTarget]::Process)

  Remove-Variable my_credentials
  Remove-Variable my_proxy_string
}

Nous pouvons désormais nous connecter à Azure via la CLI en passant par un proxy http et en renseignant le mot de passe.

Configure-Proxy

az login
az account list -o table
...