<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Azure Cli on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/azure-cli/</link><description>Recent content in Azure Cli on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Tue, 07 Aug 2018 11:45:22 +0000</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/azure-cli/index.xml" rel="self" type="application/rss+xml"/><item><title>Votre première VM dans Azure… déployée avec Ansible bien sûr !</title><link>https://blog.zwindler.fr/2018/08/07/premiere-vm-dans-azure-avec-ansible-bien-sur/</link><pubDate>Tue, 07 Aug 2018 11:45:22 +0000</pubDate><guid>https://blog.zwindler.fr/2018/08/07/premiere-vm-dans-azure-avec-ansible-bien-sur/</guid><description>&lt;img src="https://blog.zwindler.fr/2018/06/azure.webp" alt="Featured image of post Votre première VM dans Azure… déployée avec Ansible bien sûr !" /&gt;&lt;h2 id="mais-tu-nas-pas-déjà-fais-un-article-sur-ansible-et-des-vms-"&gt;Mais tu n’as pas déjà fais un article sur Ansible et des VMs ?
&lt;/h2&gt;&lt;p&gt;Si vous me suivez depuis quelques temps, vous savez que j’apprécie particulièrement Ansible. J’ai déjà écris &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=ansible" &gt;plusieurs articles sur le sujet&lt;/a&gt;, ainsi que de nombreux playbooks que j’ai mis à votre disposition sur &lt;a class="link" href="https://github.com/zwindler?utf8=%E2%9C%93&amp;amp;tab=repositories&amp;amp;q=ansible&amp;amp;type=&amp;amp;language=" target="_blank" rel="noopener"
&gt;mon compte github.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Un des articles qui intéresse le plus les lecteurs du blogs est un article en deux parties (&lt;a class="link" href="https://blog.zwindler.fr/2017/06/20/deployer-machines-virtuelles-ansible-vmware/" &gt;part1&lt;/a&gt; &lt;a class="link" href="https://blog.zwindler.fr/2017/11/14/deployer-vm-vmware-ansible-part-2/" &gt;part2&lt;/a&gt;) qui détaille comment déployer des machines virtuelles sur une architecture VMware vSphere avec Ansible. J’en ai d’ailleurs fait une version en anglais également qui attire pas mal de monde aussi ;-).&lt;/p&gt;
&lt;p&gt;Du coup, maintenant que je me suis attaqué aux principaux clouds providers (AWS, GCP et Azure), il était grand temps de faire un article sur cette partie également !&lt;/p&gt;
&lt;p&gt;Comme d’autres outils d’automatisation, Ansible fait la part belle aux intégrations cloud. Je vous laisse jeter un oeil à la liste des modules Ansible disponibles pour le cloud :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.ansible.com/ansible/2.9/modules/list_of_cloud_modules.html" target="_blank" rel="noopener"
&gt;docs.ansible.com/ansible/2.9/modules/list_of_cloud_modules.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et c’est particulièrement vrai pour Azure, dont l’équipe dédiée chez Microsoft est assez réactive et ajoute des features de manière très régulière (on aura l’occasion d’y revenir dans un prochain article, #teasing).&lt;/p&gt;
&lt;h2 id="les-prérequis"&gt;Les prérequis
&lt;/h2&gt;&lt;p&gt;Finalement, déployer un VM dans Azure, c’est presque pareil que comme déployer une VM dans VMware. On a des prérequis, une liste de paramètres à renseigner et pouf, on va poper une VM.&lt;/p&gt;
&lt;p&gt;Bon, en vrai, ce n’est pas aussi trivial : si pour VMware, on se contentait d’une API python relativement simple à installer avec &lt;strong&gt;pip&lt;/strong&gt; et d’un mot de passe, sur Azure, il va falloir trimer un poil plus.&lt;/p&gt;
&lt;p&gt;Deux ressources nous donnent la marche à suivre pour configurer notre poste :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://learn.microsoft.com/fr-fr/azure/developer/ansible/overview" target="_blank" rel="noopener"
&gt;Le guide de Microsoft&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/fr-fr/azure/ansible/ansible-overview" target="_blank" rel="noopener"
&gt;Le guide d’Ansible&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="installer"&gt;Installer
&lt;/h3&gt;&lt;p&gt;Sur une machine mint/debian/ubuntu, récupérer les modules python nécessaires :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;apt install python-pip ansible
pip install setuptools wheel
pip install ansible[azure]
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="configurer"&gt;Configurer
&lt;/h3&gt;&lt;p&gt;Pour déployer des VMs sur Azure, il faut&amp;hellip; un compte sur Azure !&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Thanks, captain obvious.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Bon, si jamais vous voulez essayer, sachez que vous pouvez vous créer un compte gratuit avec 200$ de crédit offert, mais seulement valable 30 jours. C’est hyper radin de leur part, là où un GCP offre 300$ pendant 1 an, ce qui offre largement plus de temps pour tester.&lt;/p&gt;
&lt;p&gt;Pour ouvrir le compte, il faut simplement aller à &lt;a class="link" href="https://azure.microsoft.com/fr-fr/free/search/?&amp;amp;WT.srch=1&amp;amp;wt.mc_id=AID719808_SEM_Xu5DFmXy&amp;amp;gclid=Cj0KCQjwv-DaBRCcARIsAI9sba9FHepWuC6mzBDlrT2LqPIAQzFYrCdyjTC72M2QqEtYRd6GXXoyooQaAhYsEALw_wcB&amp;amp;dclid=COf_zsaAutwCFY1h0wodDDcOqg" target="_blank" rel="noopener"
&gt;cette URL&lt;/a&gt; et renseigner &lt;strong&gt;une carte bancaire&lt;/strong&gt;. Oui je sais, j’ai flippé moi aussi.&lt;/p&gt;
&lt;p&gt;Normalement, ils ne vous prélèveront pas sans vous prévenir, c’est simplement pour éviter les bots. Personnellement je n’ai pas eu de problèmes mais je ne peux rien garantir (même si je pense que ça se saurait s’il y avait eu des soucis de ce côté là).&lt;/p&gt;
&lt;p&gt;Une fois le compte créé, on va générer les fichiers de configuration pour Azure. Le plus simple pour le faire, c’est d’utiliser la commande « az login » (mais du coup il faut &lt;a class="link" href="https://docs.microsoft.com/fr-fr/cli/azure/install-azure-cli?view=azure-cli-latest" target="_blank" rel="noopener"
&gt;installer az cli&lt;/a&gt; en plus).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;az login
To sign in, use a web browser to open the page https://microsoft.com/devicelogin and enter the code CCHMTROLL to authenticate.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/08/azcli.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Vous devriez avoir un dossier .azure dans votre homedir&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;ll .azure
total 8
drwxrwxrwx 1 zwindler zwindler 512 Aug 4 17:00 ./
drwxr-xr-x 1 zwindler zwindler 512 Aug 4 16:56 ../
-rw------- 1 zwindler zwindler 7124 Aug 4 17:00 accessTokens.json
-rw-rw-rw- 1 zwindler zwindler 5 Aug 4 16:56 az.json
-rw-rw-rw- 1 zwindler zwindler 5 Aug 4 16:56 az.sess
-rw-rw-rw- 1 zwindler zwindler 333 Aug 4 17:00 azureProfile.json
-rw-rw-rw- 1 zwindler zwindler 66 Aug 4 17:00 clouds.config
-rw------- 1 zwindler zwindler 27 Aug 4 16:56 config
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="et-donc-on-la-déploie-sur-azure-cette-vm-"&gt;Et donc, on la déploie sur Azure, cette VM ?
&lt;/h2&gt;&lt;p&gt;Maintenant que notre poste est configuré, ça redeviens simple. Ouf !&lt;/p&gt;
&lt;p&gt;Le module à invoquer dans notre playbook est &lt;strong&gt;azure_rm_virtualmachine&lt;/strong&gt;, dont la documentation est disponible à l’adresse suivante :&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://docs.ansible.com/ansible/latest/modules/azure_rm_virtualmachine_module.html#azure-rm-virtualmachine-module" target="_blank" rel="noopener"
&gt;https://docs.ansible.com/ansible/latest/modules/azure_rm_virtualmachine_module.html#azure-rm-virtualmachine-module&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Voici un des exemples donnés dans la documentation du module :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;- name: Create a VM with managed disk
azure_rm_virtualmachine:
resource_group: Testing
name: testvm001
vm_size: Standard_D4
managed_disk_type: Standard_LRS
admin_username: adminUser
ssh_public_keys:
- path: /home/adminUser/.ssh/authorized_keys
key_data: &amp;lt; insert your ssh public key here... &amp;gt;
image:
offer: CoreOS
publisher: CoreOS
sku: Stable
version: latest
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;La plupart des options que je vous met plus haut sont obligatoires. Il y en a beaucoup d’autre, mais celles ci sont un minimum. Pour expliquer un peu de quoi il s’agit, voici une petite traduction :&lt;/p&gt;
&lt;p&gt;&lt;u&gt;resource_group&lt;/u&gt;&lt;br&gt;
Sur Azure, il existe plusieurs entités logiques permettant de segmenter les ressources entre elles. La souscription (plus haut niveau de segmentation, utile au niveau billing) et les &lt;strong&gt;resources groups&lt;/strong&gt;. On peut donc avoir plusieurs resource groups dans une souscription.&lt;/p&gt;
&lt;p&gt;&lt;u&gt;name&lt;/u&gt;&lt;br&gt;
Le nom de la ressource, telle qu’elle apparaîtra dans votre portail Azure. Pas plus important que ça.&lt;/p&gt;
&lt;p&gt;&lt;u&gt;vm_size&lt;/u&gt;&lt;br&gt;
Là on rentre dans le vif du sujet ; il s’agit de la taille de la VM (en terme de nombre de CPU et de Go de RAM) que va avoir votre VM. Un guide des tailles (sans le billing) est disponible &lt;a class="link" href="https://docs.microsoft.com/fr-fr/azure/virtual-machines/windows/sizes-general" target="_blank" rel="noopener"
&gt;à l’adresse suivante&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;u&gt;managed_disk_type&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;Pour faire simple, est ce que votre disque sera sur des baies SSD ou sur des baies mixant SSD et HDD classiques. On a assez peu d’information sur la façon dont sont stockées les données, au delà d’un nombre d’IOPS qui sera d’autant plus important que vous aurez réservé d’espace disque. Par exemple, un disque Premium de 128 Go, on aura droit à 500 IOPS et 100Mo/s max. Si vous passez au delà (de 129 à 256), vous aurez droit à 1100 IOPS et 125 Mo/s.&lt;/p&gt;
&lt;p&gt;Quelques infos quand même :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/fr-fr/azure/virtual-machines/windows/premium-storage" target="_blank" rel="noopener"
&gt;docs.microsoft.com/fr-fr/azure/virtual-machines/windows/premium-storage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/fr-fr/azure/virtual-machines/windows/standard-storage" target="_blank" rel="noopener"
&gt;docs.microsoft.com/fr-fr/azure/virtual-machines/windows/standard-storage&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Je vois vos petits yeux pétiller de malice.&lt;/p&gt;
&lt;p&gt;Vous vous dites « ahah, je vais les feinter, me payer un disque de 129 Go pour avoir les perfs d’un disque de 256 pour à peine plus qu’un disque de 128 Go ».&lt;/p&gt;
&lt;p&gt;Et bien non, ils ne sont pas fous, vous payerez pour un disque de 256 même si vous ne demandez que 129 (et même si vous n’utilisez 1 Go dedans).&lt;/p&gt;
&lt;p&gt;&lt;u&gt;admin_username &amp;amp; ssh_public_keys&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;Je ne vais pas vous faire l’affront de détailler ça. Il faut rentrer un utilisateur, un path pour la clé SSH et le contenu de votre clé publique.&lt;/p&gt;
&lt;p&gt;&lt;u&gt;image&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;Sur azure, vous avez accès à un magasin pré configuré d’images de VMs.&lt;/p&gt;
&lt;p&gt;Si on veut un Ubuntu 16.04, on mettra :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;image:
offer: UbuntuServer
publisher: Canonical
sku: &amp;#39;16.04.0-LTS&amp;#39;
version: latest
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pour un CentOS 7.4 :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;image:
offer: CentOS
publisher: OpenLogic
sku: &amp;#39;7.4&amp;#39;
version: latest
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="toujours-plus"&gt;Toujours plus
&lt;/h2&gt;&lt;p&gt;Alors OK, avoir un bout de doc qui explique comment déployer une VM sur Azure, c’est chouette. Mais est ce qu’on pourrait pas faire mieux ?&lt;/p&gt;
&lt;p&gt;Et oui, bien sûr ! Car en fait, dans Azure, on ne va pas simplement pouvoir déployer notre VM comme ça et espérer que ça marche.&lt;/p&gt;
&lt;p&gt;Je l’ai déjà dis, il existe des ressources groups, dans lequel toutes vos ressources doivent être. On va devoir le créer. Mais il va aussi nous falloir une carte réseau, qui aura une adresse IP qui elle même proviendra d’un réseau virtuel, qui auront leur propres règles de sécurité (genre de firewalling basique). Et bien sûr, tout ça, c’est des objets à créer (à la main :-( &amp;hellip; ou pas) !&lt;/p&gt;
&lt;p&gt;Mais comme je suis sympa, je vais vous donner un playbook clé en main qui fait tout ça pour vous ;)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;---
- name: &amp;#34;Create Azure resources&amp;#34;
connection: local
hosts: all
vars_prompt:
- name: &amp;#34;location&amp;#34;
prompt: &amp;#34;Choose region to deploy VMs&amp;#34;
private: no
default: &amp;#34;westeurope&amp;#34;
- name: &amp;#34;project_prefix&amp;#34;
prompt: &amp;#34;Choose a prefix for all the resources&amp;#34;
private: no
default: &amp;#34;test&amp;#34;
- name: &amp;#34;instances_number&amp;#34;
prompt: &amp;#34;Choose a number of virtual machines to create&amp;#34;
private: no
default: 1
- name: &amp;#34;vm_size&amp;#34;
prompt: &amp;#34;Choose a size for azure virtual machines&amp;#34;
private: no
default: &amp;#34;Standard_B2s&amp;#34;
- name: &amp;#34;managed_disk_type&amp;#34;
prompt: &amp;#34;Choose a type for azure virtual disks&amp;#34;
private: no
default: &amp;#34;Standard_LRS&amp;#34;
- name: &amp;#34;admin_username&amp;#34;
prompt: &amp;#34;Choose an admin username&amp;#34;
private: no
default: &amp;#34;zwindler&amp;#34;
- name: &amp;#34;admin_pub_path&amp;#34;
prompt: &amp;#34;Where can I find the admin public key ?&amp;#34;
private: no
default: &amp;#34;~/.ssh/id_rsa.pub&amp;#34;
- name: &amp;#34;local_ip&amp;#34;
prompt: &amp;#34;your local IP address (skip if you don&amp;#39;t want to add 22 port to NSG)&amp;#34;
private: no
default: &amp;#34;skip&amp;#34;
- name: &amp;#34;virtualnetwork_cidr&amp;#34;
prompt: &amp;#34;Give a network CIDR for virtual network (large)&amp;#34;
private: no
default: &amp;#34;172.16.0.0/18&amp;#34;
- name: &amp;#34;subnet_cidr&amp;#34;
prompt: &amp;#34;Give a subnet of that network&amp;#34;
private: no
default: &amp;#34;172.16.1.0/24&amp;#34;
vars:
- resourcegroup_name: &amp;#34;{{project_prefix}}-rg&amp;#34;
- availabilityset_name: &amp;#34;{{project_prefix}}-avset&amp;#34;
- virtualnetwork_name: &amp;#34;{{project_prefix}}-vnet&amp;#34;
- subnet_name: &amp;#34;{{project_prefix}}-subnet&amp;#34;
- securitygroup_name: &amp;#34;{{project_prefix}}-nsg&amp;#34;
- vm_root_name: &amp;#34;{{project_prefix}}-vm&amp;#34;
- public_ip_name: &amp;#34;{{project_prefix}}-ip&amp;#34;
- nic_root_name: &amp;#34;{{project_prefix}}-nic&amp;#34;
tasks:
- name: &amp;#34;Create {{project_prefix}}-rg Resource Group&amp;#34;
azure_rm_resourcegroup:
name: &amp;#34;{{resourcegroup_name}}&amp;#34;
location: &amp;#34;{{location}}&amp;#34;
- name: &amp;#34;Create {{availabilityset_name}} Availability Set&amp;#34;
azure_rm_availabilityset:
name: &amp;#34;{{availabilityset_name}}&amp;#34;
location: &amp;#34;{{location}}&amp;#34;
resource_group: &amp;#34;{{resourcegroup_name}}&amp;#34;
sku: Aligned
- name: &amp;#34;Create {{virtualnetwork_name}} Virtual Network&amp;#34;
azure_rm_virtualnetwork:
name: &amp;#34;{{virtualnetwork_name}}&amp;#34;
resource_group: &amp;#34;{{resourcegroup_name}}&amp;#34;
address_prefixes_cidr:
- &amp;#34;{{virtualnetwork_cidr}}&amp;#34;
- name: &amp;#34;create {{subnet_name}} Subnet in {{virtualnetwork_name}} for VMs&amp;#34;
azure_rm_subnet:
name: &amp;#34;{{subnet_name}}&amp;#34;
virtual_network_name: &amp;#34;{{virtualnetwork_name}}&amp;#34;
resource_group: &amp;#34;{{resourcegroup_name}}&amp;#34;
address_prefix_cidr: &amp;#34;{{subnet_cidr}}&amp;#34;
register: subnet
- name: &amp;#34;Create {{securitygroup_name}} security rules (if local IP address was given)&amp;#34;
azure_rm_securitygroup:
name: &amp;#34;{{securitygroup_name}}&amp;#34;
resource_group: &amp;#34;{{resourcegroup_name}}&amp;#34;
purge_rules: yes
rules:
- name: &amp;#39;AllowSSHFromYourOwnInternetIP&amp;#39;
protocol: &amp;#39;Tcp&amp;#39;
source_address_prefix: &amp;#34;{{local_ip}}&amp;#34;
destination_port_range: 22
access: Allow
priority: 1000
direction: Inbound
when: local_ip | ipaddr
- name: &amp;#34;Create a {{nic_root_name}}X network interface for each VM&amp;#34;
azure_rm_networkinterface:
name: &amp;#34;{{nic_root_name}}{{item}}&amp;#34;
resource_group: &amp;#34;{{resourcegroup_name}}&amp;#34;
virtual_network: &amp;#34;{{virtualnetwork_name}}&amp;#34;
subnet_name: &amp;#34;{{subnet_name}}&amp;#34;
security_group: &amp;#34;{{securitygroup_name}}&amp;#34;
ip_configurations:
- name: &amp;#34;ipconfig&amp;#34;
public_ip_address_name: &amp;#34;{{public_ip_name}}&amp;#34;
primary: True
with_sequence: count=&amp;#34;{{instances_number}}&amp;#34;
- name: &amp;#34;Create {{vm_root_name}}X VM with existing NIC&amp;#34;
azure_rm_virtualmachine:
resource_group: &amp;#34;{{resourcegroup_name}}&amp;#34;
name: &amp;#34;{{vm_root_name}}{{item}}&amp;#34;
vm_size: &amp;#34;{{vm_size}}&amp;#34;
managed_disk_type: &amp;#34;{{managed_disk_type}}&amp;#34;
admin_username: &amp;#34;{{admin_username}}&amp;#34;
availability_set: &amp;#34;{{availabilityset_name}}&amp;#34;
ssh_password_enabled: false
ssh_public_keys:
- path: &amp;#34;/home/{{admin_username}}/.ssh/authorized_keys&amp;#34;
key_data: &amp;#34;{{lookup(&amp;#39;file&amp;#39;, &amp;#39;{{admin_pub_path}}&amp;#39;) }}&amp;#34;
network_interface_names: &amp;#34;{{nic_root_name}}{{item}}&amp;#34;
image:
offer: UbuntuServer
publisher: Canonical
sku: &amp;#39;16.04.0-LTS&amp;#39;
version: latest
with_sequence: count=&amp;#34;{{instances_number}}&amp;#34;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Pour ceux qui veulent d’économiser un copier coller, j’ai mis à disposition ce playbook à l’adresse suivante :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://github.com/zwindler/ansible-deploy-azure" target="_blank" rel="noopener"
&gt;github.com/zwindler/ansible-deploy-azure&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Et il ne reste plus qu’à l’exécuter :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;pip install --user netaddr
echo localhost &amp;gt; hosts
ansible-playbook -i hosts azure-deploy.yml
[...]
TASK [Create test-vmX VM with existing NIC] *****************************************
changed: [localhost] =&amp;gt; (item=1)
PLAY RECAP **************************************************************************
localhost : ok=1 changed=7 unreachable=0 failed=0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/08/azure_vm.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="le-mot-de-la-fin"&gt;Le mot de la fin
&lt;/h2&gt;&lt;p&gt;Bon, on en est où maintenant ?&lt;/p&gt;
&lt;p&gt;Et bien maintenant, vous avez un playbook qui vous permet de déployer des VMs à tour de bras dans Azure certes, mais aussi de les préconfigurer avec votre clé SSH et votre utilisateur administrateur, et seul votre IP (ou celle que vous aurez donné ou un subnet) pourra y accéder en SSH.&lt;br&gt;
Vous avez toutes vos VMs dans un même sous réseau, lui même dans un réseau virtuel.&lt;br&gt;
Vous avez également un AVSET qui vous permet de ne pas avoir toutes vos VMs sur les mêmes hyperviseurs et augmenter la disponibilité de votre application.&lt;br&gt;
Et tout ça, sans rien avoir eu à faire à la main.&lt;/p&gt;
&lt;p&gt;Badass non ?&lt;/p&gt;
&lt;p&gt;Et encore! J’en ai gardé un peu sous le coude, pour d’autres articles ;-)&lt;/p&gt;</description></item><item><title>Sécuriser l’émission de vos certificats avec un CAA (Azure)</title><link>https://blog.zwindler.fr/2018/06/12/securiser-lemission-de-vos-certificats-azure-avec-un-caa/</link><pubDate>Tue, 12 Jun 2018 11:45:10 +0000</pubDate><guid>https://blog.zwindler.fr/2018/06/12/securiser-lemission-de-vos-certificats-azure-avec-un-caa/</guid><description>&lt;img src="https://blog.zwindler.fr/2018/06/azure.webp" alt="Featured image of post Sécuriser l’émission de vos certificats avec un CAA (Azure)" /&gt;&lt;h2 id="caa--azure-"&gt;CAA ? Azure ?!?
&lt;/h2&gt;&lt;p&gt;Et oui, je travaille sur Azure ! Je crois bien que c’est le premier article que je vais faire à ce sujet donc je commence par quelque chose de léger, créer un CAA.&lt;/p&gt;
&lt;p&gt;Au-delà de toute considération purement dogmatique, le cloud de Microsoft fait quand même partie des plus grands, avec une richesse fonctionnelle et une API aussi riche que ce qu’on trouve chez les autres. J’aurai l’occasion de faire d’autres articles sur Azure car j’utilise énormément les modules Ansible développés par les équipes de Microsoft (qui s’appuient sur l’API d’Azure).&lt;/p&gt;
&lt;h2 id="et-donc-le-caa-"&gt;Et donc, le CAA ?
&lt;/h2&gt;&lt;p&gt;Mais cet article parle de CAA. Pour ceux qui ne connaitraient pas, un CAA est un « nouveau » (2017) type d’enregistrement DNS :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;La CAA est une mesure de sécurité qui permet aux propriétaires d’un nom de domaine de préciser dans leur DNS (Domain Name System) les autorités de certification (AC) qui sont autorisées à émettre des certificats pour leur nom de domaine.&lt;/p&gt;
&lt;p&gt;Global Sign (lien mort, pas disponible sur Internet Archive)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Concrètement, si je possède un domaine avec un grand nombre de sites web signés, que je n’utilise qu’une ou deux (ou un nombre fini) autorités de certifications, je peux maintenant spécifier lesquelles (parmi la centaine des AC existantes) sont autorisées à émettre un certificat pour mon domaine. Cela permettra d’éviter que des personnes mal intentionnées génèrent un certificat pour une URL dans un de vos sous domaines.&lt;/p&gt;
&lt;h2 id="comment-ça-fonctionne-"&gt;Comment ça fonctionne ?
&lt;/h2&gt;&lt;p&gt;Il existe donc un nouveau type d’entrée dans votre DNS qui devrait ressembler à ça :&lt;/p&gt;
&lt;table&gt;
&lt;tr&gt;
&lt;th&gt;
Name
&lt;/th&gt;
&lt;th&gt;
Type
&lt;/th&gt;
&lt;th&gt;
Value
&lt;/th&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td rowspan="2"&gt;
zwindler.fr.
&lt;/td&gt;
&lt;td rowspan="2"&gt;
CAA
&lt;/td&gt;
&lt;td rowspan="1"&gt;
0 issue « letsencrypt.org »
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td rowspan="1"&gt;
0 iodef « mailto:zwindler@zwindler.fr »
&lt;/td&gt;
&lt;/tr&gt;
&lt;/table&gt;
&lt;p&gt;Pour l’entrée zwindler.fr., j’ai donc un CAA qui dispose de 2 variables (issue et iodef) :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La première indiquant que seul letsencrypt.org peut générer des certificats pour mon domaine. On peut en avoir plusieurs si on a plusieurs autorités de certification.&lt;/li&gt;
&lt;li&gt;La seconde indiquant qu’il faut m’envoyer un email si jamais quelqu’un qui n’a pas les droits essaye de générer un certificat.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;A noter :&lt;/strong&gt; iodef n’est pas respecté par toutes les autorités de certifications, donc vous n’aurez potentiellement pas d&amp;rsquo;emails en cas de tentative de génération de certificat chez une AC non autorisé.&lt;/p&gt;
&lt;h2 id="ok-comment-je-créé-un-caa-"&gt;Ok, comment je créé un CAA ?
&lt;/h2&gt;&lt;p&gt;Normalement, c’est trivial. Il s’agit d’un enregistrement DNS comme un autre. Par exemple chez OVH, vous pouvez directement le créer depuis l’interface :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2018/06/caa01.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="et-sur-azure-"&gt;Et sur Azure ?
&lt;/h2&gt;&lt;p&gt;Il faut bien que ce soit rigolo. Dans le portail d’Azure, il n’est pas possible de créer (ni même de voir !!!) les champs de types CAA, pourtant disponibles depuis mi 2017.&lt;/p&gt;
&lt;p&gt;La seule solution est d’utiliser l’API REST, la CLI azure, ou Powershell :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/en-us/cli/azure/network/dns/record-set/caa?view=azure-cli-latest" target="_blank" rel="noopener"
&gt;Page de documentation azure cli&lt;/a&gt; (record-set)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.microsoft.com/fr-fr/azure/dns/dns-operations-recordsets" target="_blank" rel="noopener"
&gt;Gérer les enregistrements DNS avec Powershell&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="avec-azure-cli"&gt;Avec Azure cli
&lt;/h2&gt;&lt;p&gt;Du coup je suis parti de la doc pour faire ça :&lt;/p&gt;
&lt;p&gt;En partant du principe que vous avez un compte sur Azure, que vous gérez les DNS de la zone &lt;strong&gt;zwindler.fr&lt;/strong&gt; depuis Azure DNS (dans un resource group appelé &lt;strong&gt;dns-rg&lt;/strong&gt;), voilà ce qu’il faut faire pour créer une protection pour le sous domaine *&lt;strong&gt;.test.zwindler.fr&lt;/strong&gt;.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;az network dns record-set caa add-record --resource-group dns-rg --zone-name zwindler.fr --record-set-name test --flags 0 --tag &amp;#34;issue&amp;#34; --value &amp;#34;letsencrypt.org&amp;#34;
az network dns record-set caa add-record --resource-group dns-rg --zone-name zwindler.fr --record-set-name test --flags 0 --tag &amp;#34;iodef&amp;#34; --value &amp;#34;zwindl3r@zwindler.fr&amp;#34;
az network dns record-set caa list --resource-group dns-rg --zone-name zwindler.fr
{
&amp;#34;caaRecords&amp;#34;: [
{
&amp;#34;flags&amp;#34;: 0,
&amp;#34;tag&amp;#34;: &amp;#34;iodef&amp;#34;,
&amp;#34;value&amp;#34;: &amp;#34;zwindl3r@zwindler.fr&amp;#34;
},
{
&amp;#34;flags&amp;#34;: 0,
&amp;#34;tag&amp;#34;: &amp;#34;issue&amp;#34;,
&amp;#34;value&amp;#34;: &amp;#34;letsencrypt.org&amp;#34;
}
],
&amp;#34;etag&amp;#34;: &amp;#34;aaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaa&amp;#34;,
&amp;#34;fqdn&amp;#34;: &amp;#34;test.zwindler.fr.&amp;#34;,
&amp;#34;id&amp;#34;: &amp;#34;/subscriptions/aaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaa/resourceGroups/dns-rg/providers/Microsoft.Network/dnszones/zwindler.fr/CAA/test&amp;#34;,
&amp;#34;metadata&amp;#34;: null,
&amp;#34;name&amp;#34;: &amp;#34;test&amp;#34;,
&amp;#34;resourceGroup&amp;#34;: &amp;#34;dns-rg&amp;#34;,
&amp;#34;ttl&amp;#34;: 3600,
&amp;#34;type&amp;#34;: &amp;#34;Microsoft.Network/dnszones/CAA&amp;#34;
}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="et-si-je-veux-le-domaine-entier-"&gt;Et si je veux le domaine entier ?
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Et là c’est la blague !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Si vous créez un record-set « &lt;em&gt;test&lt;/em&gt;« , il va vous créer un CAA pour &lt;em&gt;test&lt;/em&gt;.zwindler.fr (voire le champ &lt;strong&gt;fqdn&lt;/strong&gt; dans la réponse du list). Vous n’avez pas la main sur le &lt;strong&gt;fqdn&lt;/strong&gt; directement (que ce soit en création ou en mise à jour), il est créé à partir du nom.&lt;/p&gt;
&lt;p&gt;Or, vous avez très probablement envie de protéger &lt;strong&gt;zwindler.fr&lt;/strong&gt;, pas seulement &lt;strong&gt;test.zwindler.fr&lt;/strong&gt;, car ça n’aurait pas vraiment de sens (on rappelle que le but de la manœuvre et d&amp;rsquo;empêcher des gens de générer des certificats pour des sous domaine de votre domaine) sinon.&lt;/p&gt;
&lt;p&gt;Créer une liste exhaustive de tous les sous domaines possibles me semble complexe ;-).&lt;/p&gt;
&lt;p&gt;L’astuce, que vous ne trouverez pas dans la documentation (en tout cas dans les pages que j’ai lues), est de créer un recordset avec comme nom « @ » (j’avais testé, vide, « * », « . », mais pas « @ »&amp;hellip;).&lt;/p&gt;
&lt;p&gt;Et là, un recordset sera créé pour l’ensemble de votre zone DNS (&lt;strong&gt;zwindler.fr&lt;/strong&gt; dans mon exemple).&lt;/p&gt;
&lt;p&gt;Magie-magie&amp;hellip;&lt;/p&gt;
&lt;h2 id="liens-utiles"&gt;Liens utiles
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.ssllabs.com/ssltest/" target="_blank" rel="noopener"
&gt;Un site pour tester son site en HTTPS (Qualys)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://sslmate.com/caa/" target="_blank" rel="noopener"
&gt;Un site pour générer les CAA records (SSLmate)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>