Helion OpenStack 2.X Redimensionar Instancia Nova – Habilitar/Deshabilitar

2016-03-17

Helion OpenStack 2.X Redimensionar Instancia Nova – Habilitar/Deshabilitar

Machine-translated — the English original is authoritative.

Habilitar la Redimensión de Instancias y la Migración en Frío

Por diseño, Helion OpenStack 2.X tiene deshabilitadas la Redimensión de Instancias Nova y la Migración en Frío Nova, ya que estos servicios presentan un riesgo de seguridad tal como están implementados actualmente en OpenStack (Kilo).

El Riesgo de Seguridad

Ambos servicios requieren acceso ssh sin contraseña con la capacidad de modificar el sistema de archivos subyacente. Un nodo de cómputo debe poder acceder a todos los demás nodos de cómputo. Esto resulta en la falta de contención entre hosts si un atacante o virus obtiene acceso a cualquiera de ellos.

Futuro: Hay varios blueprints (planes de mejora) en el proyecto upstream que intentan abordar esto aprovechando el proceso seguro de Migración en Vivo de Nova con algunas modificaciones; esto utiliza libvirt/qemu para transferir datos de forma segura a través de TLS.

Si estás dispuesto a aceptar el Riesgo de Seguridad anterior, procede –

Procedimiento

Esto debe ser realizado por un ingeniero competente en Linux/OpenStack. Los pasos son bastante sencillos:

Habilitar la Redimensión de Instancias

Por ejemplo:

# En el nodo de despliegue - generar un par de claves (esto solo necesita hacerse una vez, el mismo par de claves debe usarse en cada host de cómputo)

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

#Esto resultará en dos archivos: la clave privada (id_rsa) y la clave pública (id_rsa.pub)

# transferir la clave privada - repetir esto para todos los nodos de cómputo
scp nova_resize/id_rsa* stack@helion-cp1-comp0001-mgmt:~/

# En cada host de cómputo asegurarse de que exista la siguiente carpeta:

mkdir /var/lib/nova/.ssh

# En cada host de cómputo copiar la clave privada en la carpeta .ssh y establecer los permisos/propietarios apropiados

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

# En cada host añadir la clave pública a la lista de claves autorizadas

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

# Desactivar la verificación estricta de hosts en cada host de cómputo

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

# En cada host de cómputo asegurarse de que el usuario nova pueda iniciar sesión en una shell

usermod -s /bin/bash nova

# Modificar los varios archivos policy.json para permitir migrar y redimensionar

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

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

# En cada nodo controlador modificar el archivo nova_policy.json de Horizon para habilitar la redimensión

"compute:resize": "",

"compute:confirm_resize": "",

"compute:revert_resize": "", 

# Reiniciar los servicios de Nova y Horizon en todos los nodos.

# Tanto la Redimensión de Instancias Nova como la Migración en Frío Nova deberían estar operativas ahora.

Deshabilitar la Redimensión de Instancias

Precaución

Uno de los grandes desafíos al realizar cambios de configuración como este de forma 'manual' es que, cuando vayas a volver a desplegar o actualizar tu nube, estos cambios no habrán sido capturados en el repositorio de configuración del Administrador de Ciclo de Vida de Helion y, por lo tanto, no estarán presentes en una nube reimplantada.

Solución – Usar Playbooks de Ansible para todos estos cambios de configuración y añadirlos al repositorio git de HLM

Soy nuevo en Ansible, pero pude reunir rápidamente los siguientes playbooks para implementar los procedimientos manuales identificados anteriormente. Vale bien la pena invertir unos días jugando con Ansible si no lo has hecho antes; es un habilitador de productividad fantástico cuando se trata de Helion OpenStack.

Por favor, asegúrate de probar exhaustivamente estos scripts antes de implementarlos en un sistema de producción; como se mencionó, son mi primera incursión en la herramienta.

Las instrucciones para usar los playbooks se pueden encontrar en los comentarios ubicados dentro de cada playbook.

Playbook para Habilitar la Redimensión de Instancias HOS 2.X

# Autor: Graham Joseph Land
# Blog: allthingscloud.eu
# Twitter: @allthingsclowd
# Email: graham@el dominio anterior
# Fecha: 03/03/2016
# 
# Nombre: nova-enable-resize.yml
# Versión: 1.1
# Propósito: Este playbook es uno de 5 que deben ejecutarse en orden para volver a habilitar la redimensión de instancias nova y la migración en frío
#
# Instrucciones: 
# 1. Copiar este playbook a los siguientes dos directorios de ansible en el nodo de despliegue -> ~/scratch/ansible/next/hos/ansible AND ~/helion/hos/ansible
# 2. Iniciar sesión en el Administrador de Ciclo de Vida de Helion (HLM Deployer) como el usuario deployer y cambiar a este directorio -> ~/scratch/ansible/next/hos/ansible
# 3. Habilitar la redimensión de instancias nova y la migración en frío nova realizando los siguientes pasos:
#      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 "Reconfigurado policy.json de Nova para permitir redimensión de instancias y migración en frío para administradores"
#      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

---
#
# en el nodo de despliegue
# 
    - hosts: OPS-LM

      tasks:
# obtener nombre de usuario del usuario actual
      - name: obtener el nombre de usuario actual ejecutando este playbook
        local_action: command whoami
        register: username_on_the_host

# crear directorio temporal
      - name: crear directorio para almacenar claves ssh
        file: path=~/nova_resize state=directory

# si es una re-ejecución, eliminar la clave privada existente para facilitar la creación de una nueva clave      
      - name: para re-ejecuciones eliminar la clave privada antigua del directorio
        file: path=~/nova_resize/id_rsa state=absent

# si es una re-ejecución, eliminar la clave pública existente para facilitar la creación de una nueva clave
      - name: para re-ejecuciones eliminar la clave pública antigua del directorio
        file: path=~/nova_resize/id_rsa.pub state=absent

# crear nuevas claves ssh
      - name: creando claves SSH para el inicio de sesión del usuario nova
        command: ssh-keygen -t rsa -f '~/nova_resize/id_rsa' -N ""

# modificar el archivo nova policy.json en el repositorio mycloud para habilitar la redimensión
      - name: modificar el archivo nova policy.json en el repositorio git del despliegue - habilitar redimensión
        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'

# modificar el archivo nova policy.json en el repositorio mycloud para habilitar la migración en frío
      - name: modificar el archivo nova policy.json en el repositorio git del despliegue - habilitar migración en frío
        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'

#
# en cada nodo de cómputo
#

    - hosts: NOV-CMP
      sudo: yes
      vars:
# cargar la clave pública ssh en una variable
        nova_public_ssh_key: "{{ lookup('file', '~/nova_resize/id_rsa.pub') }}"

      tasks:
# crear un directorio .ssh si no existe ya
      - name: crear directorio ssh de nova en el host de cómputo
        file: path=/var/lib/nova/.ssh state=directory owner=nova group=nova mode=0755

# copiar la clave privada al directorio .ssh
      - name: copiar la clave privada ssh de nova al directorio .ssh y establecer los permisos correctos en los nodos de cómputo
        copy: src=/home/stack/nova_resize/id_rsa dest=/var/lib/nova/.ssh/id_rsa owner=nova group=nova mode=0600

# añadir la clave pública ssh al archivo authorized_hosts
      - name:  añadir la clave pública ssh de nova al archivo authorized_keys en cada nodo de cómputo
        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'

# establecer stricthostkeychecking en no en el archivo de configuración ssh
      - name: desactivar la verificación estricta de hosts en cada nodo de cómputo
        lineinfile: dest=/var/lib/nova/.ssh/config state=present backup=yes regexp="^StrictHostKeyChecking" create=yes line="StrictHostKeyChecking no" owner=nova group=nova mode=0644

# establecer bash shell como predeterminado para el usuario nova
      - name: establecer shell de usuario nova en cada nodo de cómputo
        command: usermod -s /bin/bash nova

# verificar que el usuario nova pueda iniciar sesión sin contraseña localmente
      - name: verificar inicio de sesión sin contraseña para el usuario nova
        become: yes
        become_user: nova
        command: ssh nova@{{ inventory_hostname }} 'echo Passwordless Login Successfully!'

#
# en cada nodo controlador
#
    - hosts: HZN-WEB
      sudo: yes

      tasks:

# encontrar la ruta al archivo horizons nova_policy_json
      - shell:  find /opt/stack/venv/ -name nova_policy.json | grep dashboard
        register: nova_policy_json

# habilitar la redimensión de instancias nova en horizons nova_policy_json
      - name: habilitar redimensión de instancias nova en 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'

# habilitar la redimensión de instancias nova en horizons nova_policy_json
      - name: habilitar confirmación de redimensión de instancias nova en 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'

# habilitar la redimensión de instancias nova en horizons nova_policy_json
      - name: habilitar reversión de redimensión de instancias nova en 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 para Deshabilitar la Redimensión de Instancias HOS 2.X

# Autor: Graham Joseph Land
# Blog: allthingscloud.eu
# Twitter: @allthingsclowd
# Email: graham@el dominio anterior
# Fecha: 04/03/2016
# 
# Nombre: nova-disable-resize.yml
# Versión: 1.1
# Propósito: Este playbook es uno de 5 que deben ejecutarse para deshabilitar la redimensión de instancias nova y la migración en frío
#
# Instrucciones: 
# 1. Copiar este playbook a los siguientes dos directorios de ansible en el nodo de despliegue -> ~/scratch/ansible/next/hos/ansible AND ~/helion/hos/ansible
# 2. Iniciar sesión en el Administrador de Ciclo de Vida de Helion (HLM Deployer) como el usuario deployer y cambiar a este directorio -> ~/scratch/ansible/next/hos/ansible
# 3. Deshabilitar la redimensión de instancias nova y la migración en frío nova realizando los siguientes pasos:
#      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 "Reconfigurado policy.json de Nova para deshabilitar redimensión de instancias y migración en frío para administradores"
#      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

---
#
# en cada nodo controlador
#
    - hosts: HZN-WEB
      sudo: yes

      tasks:

# encontrar la ruta al archivo horizons nova_policy_json
      - shell:  find /opt/stack/venv/ -name nova_policy.json | grep dashboard
        register: nova_policy_json

# deshabilitar la redimensión de instancias nova en horizons nova_policy_json
      - name: deshabilitar redimensión de instancias nova en 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'

# deshabilitar la redimensión de instancias nova en horizons nova_policy_json
      - name: deshabilitar confirmación de redimensión de instancias nova en 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'

# deshabilitar la redimensión de instancias nova en horizons nova_policy_json
      - name: deshabilitar reversión de redimensión de instancias nova en 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'
#
# en cada nodo de cómputo
#

    - hosts: NOV-CMP
      sudo: yes

# cargar la clave pública ssh en una variable
      vars:
        nova_public_ssh_key: "{{ lookup('file', '~/nova_resize/id_rsa.pub') }}"

      tasks:
# eliminar la clave ssh del archivo authorized_keys 
      - authorized_key: 'user=nova key="{{ nova_public_ssh_key }}" path="/var/lib/nova/.ssh/authorized_keys" state=absent'

# eliminar la clave privada del directorio .ssh
      - name: copiar la clave privada ssh de nova al directorio .ssh y establecer los permisos correctos en los nodos de cómputo
        file: path=/var/lib/nova/.ssh/id_rsa state=absent

# establecer stricthostkeychecking en yes en el archivo de configuración ssh
      - name: activar la verificación estricta de hosts en cada nodo de cómputo
        lineinfile: dest=/var/lib/nova/.ssh/config state=present backup=yes regexp="^StrictHostKeyChecking" create=yes line="StrictHostKeyChecking yes" owner=nova group=nova mode=0644

# desestablecer bash shell como predeterminado para el usuario nova
      - name: desestablecer shell de usuario nova en cada nodo de cómputo
        command: usermod -s /bin/false nova

# verificar que el usuario nova NO pueda iniciar sesión sin contraseña localmente
      - name: verificar que el inicio de sesión sin contraseña falla para el usuario nova - EL FALLO ROJO ES BUENO!!!
        become: yes
        become_user: nova
        command: ssh nova@{{ inventory_hostname }} 'echo Passwordless Login Successfully ... NOT!'
        ignore_errors: yes

#
# en el nodo de despliegue
# 
    - hosts: OPS-LM

      tasks:
# obtener nombre de usuario del usuario actual
      - name: obtener el nombre de usuario actual ejecutando este playbook
        local_action: command whoami
        register: username_on_the_host

# si es una re-ejecución, eliminar la clave privada existente para facilitar la creación de una nueva clave      
      - name: eliminar clave ssh privada
        file: path=~/nova_resize/id_rsa state=absent

# eliminar clave pública existente 
      - name: eliminar clave ssh pública
        file: path=~/nova_resize/id_rsa.pub state=absent

# modificar el archivo nova policy.json en el repositorio mycloud para deshabilitar la redimensión
      - name: modificar el archivo nova policy.json en el repositorio git del despliegue - deshabilitar redimensión de instancias
        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'

# modificar el archivo nova policy.json en el repositorio mycloud para deshabilitar la migración en frío
      - name: modificar el archivo nova policy.json en el repositorio git del despliegue - deshabilitar migración en frío
        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'

# eliminar directorio temporal
      - name: crear directorio para almacenar claves ssh
        file: path=~/nova_resize state=absent

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

← All posts