Helion OpenStack 2.X Redimensionnement d'instance Nova – Activer/Désactiver

2016-03-17

Helion OpenStack 2.X Redimensionnement d'instance Nova – Activer/Désactiver

Machine-translated — the English original is authoritative.

Activer le redimensionnement d'instance et la migration à froid

Par conception, Helion OpenStack 2.X a désactivé le redimensionnement d'instance Nova et la migration à froid de Nova, car ces services présentent un risque de sécurité tel qu'ils sont actuellement implémentés dans OpenStack (Kilo).

Le risque de sécurité

Ces deux services nécessitent un accès ssh sans mot de passe avec la capacité de modifier le système de fichiers sous-jacent. Un nœud de calcul doit pouvoir accéder à tous les autres nœuds de calcul. Cela entraîne une absence d'isolement entre les hôtes si un attaquant ou un virus venait à accéder à l'un d'entre eux.

Avenir : Plusieurs blueprints en amont tentent de résoudre ce problème en s'appuyant sur le processus sécurisé de migration en direct de Nova avec quelques modifications – cela utilise libvirt/qemu pour transférer les données de manière sécurisée via TLS.

Si vous êtes prêt à accepter le risque de sécurité ci-dessus, alors continuez –

Procédure

Cela doit être effectué par un ingénieur Linux/OpenStack compétent. Les étapes sont assez simples :

Activer le redimensionnement d'instance

Par exemple :

# Sur le nœud de déploiement - générer une paire de clés (cela ne doit être fait qu'une seule fois, la même paire de clés doit être utilisée sur chaque hôte de calcul)

ssh-keygen -t rsa -f ~/nova_resize/id_rsa -N ''

# Cela résultera en deux fichiers : la clé privée (id_rsa) et la clé publique (id_rsa.pub)

# transférer la clé privée - répéter cette opération pour tous les nœuds de calcul
scp nova_resize/id_rsa* stack@helion-cp1-comp0001-mgmt:~/

# Sur chaque hôte de calcul, s'assurer que le dossier suivant existe :

mkdir /var/lib/nova/.ssh

# Sur chaque hôte de calcul, copier la clé privée dans le dossier .ssh et définir les permissions/propriétaire appropriés

cp id_rsa /var/lib/nova/.ssh
chmod 600 /var/lib/nova/.ssh/id_rsa
chown nova:nova /var/lib/nova/.ssh/id_rsa

# Sur chaque hôte, ajouter la clé publique à la liste des clés autorisées

cat id_rsa.pub >> /var/lib/nova/.ssh/authorized_keys

# Désactiver la vérification stricte des hôtes sur chaque hôte de calcul

echo 'StrictHostKeyChecking no' >> /var/lib/nova/.ssh/config

# Sur chaque hôte de calcul, s'assurer que l'utilisateur nova peut se connecter à un shell

usermod -s /bin/bash nova

# Modifier les différents fichiers policy.json pour autoriser la migration et le redimensionnement

"compute:resize": "rule:admin_api",

"compute_extension:admin_actions:migrate": "rule:admin_api",

# Sur chaque nœud contrôleur, modifier le fichier nova_policy.json d'Horizon pour activer le redimensionnement

"compute:resize": "",

"compute:confirm_resize": "",

"compute:revert_resize": "", 

# Redémarrer les services Nova et Horizon sur tous les nœuds.

# Le redimensionnement d'instance Nova et la migration à froid de Nova devraient maintenant être opérationnels.

Désactiver le redimensionnement d'instance

Mise en garde

L'un des grands défis liés à la modification de la configuration de cette manière « manuelle » est que lorsque vous procédez à un redéploiement ou à une mise à niveau de votre cloud, ces modifications n'ont pas été capturées dans le référentiel de configuration du Gestionnaire de cycle de vie Helion et ne seront donc pas présentes lors d'un redéploiement du cloud.

Solution – Utiliser des playbooks Ansible pour tous ces changements de configuration et les ajouter au dépôt git HLM

Je suis moi-même nouveau sur Ansible, mais j'ai pu rapidement mettre en place les playbooks suivants pour mettre en œuvre les procédures manuelles identifiées ci-dessus. Il vaut vraiment la peine d'investir quelques jours à expérimenter Ansible si vous ne l'avez jamais fait – c'est un excellent multiplicateur de productivité lorsqu'il s'agit de Helion OpenStack.

Veuillez vous assurer de tester minutieusement ces scripts avant de les mettre en œuvre sur un système de production – comme mentionné, il s'agit de ma première plongée dans cet outil.

Les instructions d'utilisation des playbooks se trouvent dans les commentaires situés dans chaque playbook.

Playbook de activation du redimensionnement d'instance HOS 2.X

# Auteur : Graham Joseph Land
# Blog : allthingscloud.eu
# Twitter : @allthingsclowd
# Email : graham@le domaine ci-dessus
# Date : 03/03/2016
# 
# Nom : nova-enable-resize.yml
# Version : 1.1
# Objectif : Ce playbook est l'un des 5 qui doivent être exécutés dans l'ordre pour réactiver le redimensionnement d'instance nova et la migration à froid
#
# Instructions : 
# 1. Copiez ce playbook dans les deux répertoires ansible suivants sur le nœud de déploiement -> ~/scratch/ansible/next/hos/ansible AND ~/helion/hos/ansible
# 2. Connectez-vous au Gestionnaire de cycle de vie Helion (HLM Deployer) en tant qu'utilisateur deployer et accédez à ce répertoire -> ~/scratch/ansible/next/hos/ansible
# 3. Activez le redimensionnement d'instance nova et la migration à froid nova en effectuant les étapes suivantes :
#      a.) ansible-playbook -v -i hosts/verb_hosts nova-enable-resize.yml
#      b.) cd ~/helion/hos/ansible
#      c.) git add -A
#      d.) git commit -m "Reconfigured Nova's policy.json to allow instance resize and cold migration for admins"
#      e.) cd ~/helion/hos/ansible
#      f.) ansible-playbook -i hosts/localhost config-processor-run.yml
#      g.) cd ~/helion/hos/ansible
#      h.) ansible-playbook -i hosts/localhost ready-deployment.yml
#      i.) cd ~/scratch/ansible/next/hos/ansible
#      j.) ansible-playbook -i hosts/verb_hosts nova-reconfigure.yml
#       k.) ansible-playbook -i hosts/verb_hosts horizon-reconfigure.yml

---
#
# sur le nœud de déploiement
# 
    - hosts: OPS-LM

      tasks:
# obtenir le nom d'utilisateur de l'utilisateur actuel
      - name: get the current username running this playbook
        local_action: command whoami
        register: username_on_the_host

# créer un répertoire temporaire
      - name: create directory to store ssh keys
        file: path=~/nova_resize state=directory

# s'il s'agit d'une réexécution, supprimer la clé privée existante pour faciliter la création d'une nouvelle clé      
      - name: for repeat runs remove old private key from directory
        file: path=~/nova_resize/id_rsa state=absent

# s'il s'agit d'une réexécution, supprimer la clé publique existante pour faciliter la création d'une nouvelle clé
      - name: for repeat runs remove old public key from directory
        file: path=~/nova_resize/id_rsa.pub state=absent

# créer de nouvelles clés ssh
      - name: creating SSH keys for nova user login
        command: ssh-keygen -t rsa -f '~/nova_resize/id_rsa' -N ""

# modifier le fichier nova policy.json dans le dépôt mycloud pour activer le redimensionnement
      - name: modify nova policy.json file in deployer git repo - enable resize
        lineinfile: 'dest=~/helion/my_cloud/config/nova/policy.json state=present regexp="compute:resize" create=yes line="    \"compute:resize\": \"rule:admin_api\"," owner={{ username_on_the_host.stdout }} group={{ username_on_the_host.stdout }} mode=0777'

# modifier le fichier nova policy.json dans le dépôt mycloud pour activer la migration à froid
      - name: modify nova policy.json file in deployer git repo - enable cold migrate
        lineinfile: 'dest=~/helion/my_cloud/config/nova/policy.json state=present regexp="\"compute_extension:admin_actions:migrate\"" create=yes line="    \"compute_extension:admin_actions:migrate\": \"rule:admin_api\"," owner={{ username_on_the_host.stdout }} group={{ username_on_the_host.stdout }} mode=0777'

#
# sur chaque nœud de calcul
#

    - hosts: NOV-CMP
      sudo: yes
      vars:
# charger la clé ssh publique dans une variable
        nova_public_ssh_key: "{{ lookup('file', '~/nova_resize/id_rsa.pub') }}"

      tasks:
# créer un répertoire .ssh s'il n'existe pas déjà
      - name: create nova ssh directory on compute host
        file: path=/var/lib/nova/.ssh state=directory owner=nova group=nova mode=0755

# copier la clé privée dans le répertoire .ssh
      - name: copy nova ssh private key to .ssh directory and set correct permissions on compute nodes
        copy: src=/home/stack/nova_resize/id_rsa dest=/var/lib/nova/.ssh/id_rsa owner=nova group=nova mode=0600

# ajouter la clé ssh publique au fichier authorized_hosts
      - name:  add nova ssh public key to the authorized_keys file on each compute nodes
        lineinfile: 'dest=/var/lib/nova/.ssh/authorized_keys state=present backup=yes create=yes line="\"{{ nova_public_ssh_key }}\"" owner=nova group=nova mode=0644'

# définir stricthostkeychecking sur no dans le fichier de configuration ssh
      - name: turn off strict host checking on each compute nodes
        lineinfile: dest=/var/lib/nova/.ssh/config state=present backup=yes regexp="^StrictHostKeyChecking" create=yes line="StrictHostKeyChecking no" owner=nova group=nova mode=0644

# définir le shell bash par défaut pour l'utilisateur nova
      - name: set nova user shell on each compute node
        command: usermod -s /bin/bash nova

# vérifier que l'utilisateur nova peut se connecter sans mot de passe localement
      - name: verify passwordless login for nova user
        become: yes
        become_user: nova
        command: ssh nova@{{ inventory_hostname }} 'echo Passwordless Login Successfully!'

#
# sur chaque nœud contrôleur
#
    - hosts: HZN-WEB
      sudo: yes

      tasks:

# trouver le chemin vers le fichier horizons nova_policy_json
      - shell:  find /opt/stack/venv/ -name nova_policy.json | grep dashboard
        register: nova_policy_json

# activer le redimensionnement d'instance nova dans horizons nova_policy_json
      - name: enable nova instance resize in horizon
        lineinfile: 'dest={{ nova_policy_json.stdout }} state=present backup=yes regexp="compute:resize" create=yes line="    \"compute:resize\": \"rule:admin_api\"," owner=horizon-venv group=horizon-venv mode=0664'

# activer le redimensionnement d'instance nova dans horizons nova_policy_json
      - name: enable nova instance confirm resize in horizon
        lineinfile: 'dest={{ nova_policy_json.stdout }} state=present backup=yes regexp="compute:confirm_resize" create=yes line="    \"compute:confirm_resize\": \"rule:admin_api\"," owner=horizon-venv group=horizon-venv mode=0664'

# activer le redimensionnement d'instance nova dans horizons nova_policy_json
      - name: enable nova instance revert resize in horizon
        lineinfile: 'dest={{ nova_policy_json.stdout }} state=present backup=yes regexp="compute:revert_resize" create=yes line="    \"compute:revert_resize\": \"rule:admin_api\"," owner=horizon-venv group=horizon-venv mode=0664'

Playbook de désactivation du redimensionnement d'instance HOS 2.X

# Auteur : Graham Joseph Land
# Blog : allthingscloud.eu
# Twitter : @allthingsclowd
# Email : graham@le domaine ci-dessus
# Date : 04/03/2016
# 
# Nom : nova-disable-resize.yml
# Version : 1.1
# Objectif : Ce playbook est l'un des 5 qui doivent être exécutés pour désactiver le redimensionnement d'instance nova et la migration à froid
#
# Instructions : 
# 1. Copiez ce playbook dans les deux répertoires ansible suivants sur le nœud de déploiement -> ~/scratch/ansible/next/hos/ansible AND ~/helion/hos/ansible
# 2. Connectez-vous au Gestionnaire de cycle de vie Helion (HLM Deployer) en tant qu'utilisateur deployer et accédez à ce répertoire -> ~/scratch/ansible/next/hos/ansible
# 3. Désactivez le redimensionnement d'instance nova et la migration à froid nova en effectuant les étapes suivantes :
#      a.) ansible-playbook -v -i hosts/verb_hosts nova-disable-resize.yml
#      b.) cd ~/helion/hos/ansible
#      c.) git add -A
#      d.) git commit -m "Reconfigured Nova's policy.json to disable instance resize and cold migration for admins"
#      e.) cd ~/helion/hos/ansible
#      f.) ansible-playbook -i hosts/localhost config-processor-run.yml
#      g.) cd ~/helion/hos/ansible
#      h.) ansible-playbook -i hosts/localhost ready-deployment.yml
#      i.) cd ~/scratch/ansible/next/hos/ansible
#      j.) ansible-playbook -i hosts/verb_hosts nova-reconfigure.yml
#       k.) ansible-playbook -i hosts/verb_hosts horizon-reconfigure.yml

---
#
# sur chaque nœud contrôleur
#
    - hosts: HZN-WEB
      sudo: yes

      tasks:

# trouver le chemin vers le fichier horizons nova_policy_json
      - shell:  find /opt/stack/venv/ -name nova_policy.json | grep dashboard
        register: nova_policy_json

# désactiver le redimensionnement d'instance nova dans horizons nova_policy_json
      - name: disable nova instance resize in horizon
        lineinfile: 'dest={{ nova_policy_json.stdout }} state=present backup=yes regexp="compute:resize" create=yes line="    \"compute:resize\": \"!\"," owner=horizon-venv group=horizon-venv mode=0664'

# désactiver le redimensionnement d'instance nova dans horizons nova_policy_json
      - name: disable nova instance confirm resize in horizon
        lineinfile: 'dest={{ nova_policy_json.stdout }} state=present backup=yes regexp="compute:confirm_resize" create=yes line="    \"compute:confirm_resize\": \"!\"," owner=horizon-venv group=horizon-venv mode=0664'

# désactiver le redimensionnement d'instance nova dans horizons nova_policy_json
      - name: disable nova instance revert resize in horizon
        lineinfile: 'dest={{ nova_policy_json.stdout }} state=present backup=yes regexp="compute:revert_resize" create=yes line="    \"compute:revert_resize\": \"!\"," owner=horizon-venv group=horizon-venv mode=0664'
#
# sur chaque nœud de calcul
#

    - hosts: NOV-CMP
      sudo: yes

# charger la clé ssh publique dans une variable
      vars:
        nova_public_ssh_key: "{{ lookup('file', '~/nova_resize/id_rsa.pub') }}"

      tasks:
# supprimer la clé ssh du fichier authorized_keys 
      - authorized_key: 'user=nova key="{{ nova_public_ssh_key }}" path="/var/lib/nova/.ssh/authorized_keys" state=absent'

# supprimer la clé privée du répertoire .ssh
      - name: copy nova ssh private key to .ssh directory and set correct permissions on compute nodes
        file: path=/var/lib/nova/.ssh/id_rsa state=absent

# définir stricthostkeychecking sur yes dans le fichier de configuration ssh
      - name: turn on strict host checking on each compute nodes
        lineinfile: dest=/var/lib/nova/.ssh/config state=present backup=yes regexp="^StrictHostKeyChecking" create=yes line="StrictHostKeyChecking yes" owner=nova group=nova mode=0644

# désactiver le shell bash par défaut pour l'utilisateur nova
      - name: unset nova user shell on each compute node
        command: usermod -s /bin/false nova

# vérifier que l'utilisateur nova ne peut pas se connecter sans mot de passe localement
      - name: verify passwordless login fails for nova user - RED FAILURE IS GOOD!!!
        become: yes
        become_user: nova
        command: ssh nova@{{ inventory_hostname }} 'echo Passwordless Login Successfully ... NOT!'
        ignore_errors: yes

#
# sur le nœud de déploiement
# 
    - hosts: OPS-LM

      tasks:
# obtenir le nom d'utilisateur de l'utilisateur actuel
      - name: get the current username running this playbook
        local_action: command whoami
        register: username_on_the_host

# s'il s'agit d'une réexécution, supprimer la clé privée existante pour faciliter la création d'une nouvelle clé      
      - name: remove private ssh key
        file: path=~/nova_resize/id_rsa state=absent

# supprimer la clé publique existante 
      - name: delete public ssh key
        file: path=~/nova_resize/id_rsa.pub state=absent

# modifier le fichier nova policy.json dans le dépôt mycloud pour désactiver le redimensionnement
      - name: modify nova policy.json file in deployer git repo - disable instance resize
        lineinfile: 'dest=~/helion/my_cloud/config/nova/policy.json state=present regexp="compute:resize" create=yes line="    \"compute:resize\": \"\"," owner={{ username_on_the_host.stdout }} group={{ username_on_the_host.stdout }} mode=0777'

# modifier le fichier nova policy.json dans le dépôt mycloud pour désactiver la migration à froid
      - name: modify nova policy.json file in deployer git repo - disable cold migrate
        lineinfile: 'dest=~/helion/my_cloud/config/nova/policy.json state=present regexp="\"compute_extension:admin_actions:migrate\"" create=yes line="    \"compute_extension:admin_actions:migrate\": \"\"," owner={{ username_on_the_host.stdout }} group={{ username_on_the_host.stdout }} mode=0777'

# supprimer le répertoire temporaire
      - name: create directory to store ssh keys
        file: path=~/nova_resize state=absent

Originally published on allthingscloud.eu (2016-03-17).

← All posts