Helion OpenStack 2.X Redimensionar Instancia Nova – Habilitar/Deshabilitar
2016-03-17
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
- Habilitar ssh sin contraseña en todos los nodos de cómputo
- Habilitar la redimensión y la migración en frío en el archivo nova policy.json y volver a implementar los servicios de nova utilizando el proceso estándar HLM.
- Si deseas tener esta capacidad dentro de la interfaz gráfica de usuario (GUI) de Horizon, también modifica el archivo nova_policy.json en cada nodo controlador de Horizon y vuelve a implementar los servicios de horizon utilizando el proceso estándar HLM.
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
- Simplemente invierte los pasos descritos anteriormente.
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).