Helion OpenStack 2.X Nova-Instanz-Vergrößerung – Aktivieren/Deaktivieren
2016-03-17
Machine-translated — the English original is authoritative.
Instanz-Vergrößerung und Kaltmigration aktivieren
Standardmäßig sind bei Helion OpenStack 2.X die Funktionen „Nova Instance Resize“ (Instanz-Vergrößerung) und „Nova Cold Migration“ (Kaltmigration) deaktiviert, da diese Dienste in der aktuellen Implementierung in OpenStack (Kilo) ein Sicherheitsrisiko darstellen.
Das Sicherheitsrisiko
Beide Dienste erfordern einen passwortlosen SSH-Zugriff mit der Möglichkeit, das zugrunde liegende Dateisystem zu ändern. Ein Compute-Knoten muss auf alle anderen Compute-Knoten zugreifen können. Dies führt dazu, dass keine Isolation zwischen den Hosts besteht, sollte ein Angreifer oder ein Virus Zugriff auf einen der Knoten erlangen.
Zukunft: Es gibt mehrere Blueprints (Entwürfe) im Upstream-Bereich, die versuchen, dieses Problem zu lösen, indem sie den sicheren Prozess der Nova Live Migration (Live-Migration) mit einigen Änderungen nutzen – dabei wird libvirt/qemu verwendet, um Daten sicher über TLS zu übertragen.
Wenn Sie bereit sind, das oben genannte Sicherheitsrisiko zu akzeptieren, fahren Sie fort –
Verfahren
Dies sollte von einem kompetenten Linux-/OpenStack-Ingenieur durchgeführt werden. Die Schritte sind recht einfach:
Instanz-Vergrößerung aktivieren
- Passwortlosen SSH auf allen Compute-Knoten aktivieren
- Resize und Kaltmigration in der Datei nova policy.json aktivieren und die Nova-Dienste mit dem Standard-HLM-Prozess neu bereitstellen.
- Wenn Sie diese Funktion auch in der Horizon-GUI haben möchten, ändern Sie die Datei nova_policy.json auf jedem Horizon-Controller-Knoten und stellen Sie die Horizon-Dienste mit dem Standard-HLM-Prozess neu bereit.
Zum Beispiel:
# Auf dem Deployer-Knoten – ein Schlüsselpaar generieren (dies muss nur einmal durchgeführt werden, dasselbe Schlüsselpaar sollte auf jedem Compute-Host verwendet werden)
ssh-keygen -t rsa -f ~/nova_resize/id_rsa -N ''
# Dies führt zu zwei Dateien: dem privaten Schlüssel (id_rsa) und dem öffentlichen Schlüssel (id_rsa.pub)
# Den privaten Schlüssel übertragen – wiederholen Sie dies für alle Compute-Knoten
scp nova_resize/id_rsa* stack@helion-cp1-comp0001-mgmt:~/
# Stellen Sie auf jedem Compute-Host sicher, dass der folgende Ordner existiert:
mkdir /var/lib/nova/.ssh
# Kopieren Sie auf jedem Compute-Host den privaten Schlüssel in den .ssh-Ordner und legen Sie die entsprechenden Berechtigungen/Eigentümer fest
cp id_rsa /var/lib/nova/.ssh
chmod 600 /var/lib/nova/.ssh/id_rsa
chown nova:nova /var/lib/nova/.ssh/id_rsa
# Fügen Sie auf jedem Host den öffentlichen Schlüssel zur Liste der autorisierten Schlüssel hinzu
cat id_rsa.pub >> /var/lib/nova/.ssh/authorized_keys
# Deaktivieren Sie die strikte Host-Überprüfung auf jedem Compute-Host
echo 'StrictHostKeyChecking no' >> /var/lib/nova/.ssh/config
# Stellen Sie auf jedem Compute-Host sicher, dass der nova-Benutzer eine Shell aufrufen kann
usermod -s /bin/bash nova
# Ändern Sie die verschiedenen policy.json-Dateien, um Migrate und Resize zu erlauben
"compute:resize": "rule:admin_api",
"compute_extension:admin_actions:migrate": "rule:admin_api",
# Ändern Sie auf jedem Controller-Knoten die Horizon nova_policy.json-Datei, um Resize zu aktivieren
"compute:resize": "",
"compute:confirm_resize": "",
"compute:revert_resize": "",
# Starten Sie die Nova- und Horizon-Dienste auf allen Knoten neu.
# Sowohl Nova Instance Resize als auch Nova Cold Migration sollten nun funktionsfähig sein.
Instanz-Vergrößerung deaktivieren
- Kehren Sie einfach die oben beschriebenen Schritte um.
Vorsicht
Eine der großen Herausforderungen bei der manuellen Durchführung von Konfigurationsänderungen dieser Art besteht darin, dass diese Änderungen beim erneuten Bereitstellen oder Aktualisieren Ihrer Cloud nicht im Konfigurations-Repository des Helion Lifecycle Managers erfasst wurden und daher in einer neu bereitgestellten Cloud nicht vorhanden sind.
Lösung – Verwenden Sie Ansible Playbooks für所有这些 Konfigurationsänderungen und fügen Sie sie dem HLM git-Repo hinzu
Ich bin selbst neu in Ansible, konnte aber schnell die folgenden Playbooks zusammenstellen, um die oben identifizierten manuellen Verfahren zu implementieren. Es lohnt sich, ein paar Tage mit Ansible zu verbringen, wenn Sie dies noch nicht getan haben – es ist ein fantastischer Produktivitätsbooster im Zusammenhang mit Helion OpenStack.
Bitte stellen Sie sicher, dass Sie diese Skripte gründlich testen, bevor Sie sie in einem Produktionssystem implementieren – wie erwähnt, sind es meine ersten Versuche mit diesem Tool.
Anweisungen zur Verwendung der Playbooks finden Sie in den Kommentaren, die sich in jedem Playbook befinden.
HOS 2.X Playbook zum Aktivieren der Instanz-Vergrößerung
# Autor: Graham Joseph Land
# Blog: allthingscloud.eu
# Twitter: @allthingsclowd
# E-Mail: graham@the above domain
# Datum: 03/03/2016
#
# Name: nova-enable-resize.yml
# Version: 1.1
# Zweck: Dieses Playbook ist eines von 5, die in der richtigen Reihenfolge ausgeführt werden müssen, um die Nova-Instanz-Vergrößerung und Kaltmigration wieder zu aktivieren
#
# Anweisungen:
# 1. Kopieren Sie dieses Playbook in die folgenden beiden Ansible-Verzeichnisse auf dem Deployer-Knoten -> ~/scratch/ansible/next/hos/ansible UND ~/helion/hos/ansible
# 2. Melden Sie sich als der Deployer-Benutzer beim Helion Lifecycle Manager (HLM Deployer) an und wechseln Sie in dieses Verzeichnis -> ~/scratch/ansible/next/hos/ansible
# 3. Aktivieren Sie die Nova-Instanz-Vergrößerung und die Nova-Kaltmigration, indem Sie die folgenden Schritte ausführen:
# 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
---
#
# auf dem Deployer-Knoten
#
- hosts: OPS-LM
tasks:
# Benutzernamen des aktuellen Benutzers ermitteln
- name: get the current username running this playbook
local_action: command whoami
register: username_on_the_host
# Temporäres Verzeichnis erstellen
- name: create directory to store ssh keys
file: path=~/nova_resize state=directory
# Wenn es sich um einen Wiederholungsversuch handelt, den vorhandenen privaten Schlüssel entfernen, um die Erstellung eines neuen Schlüssels zu ermöglichen
- name: for repeat runs remove old private key from directory
file: path=~/nova_resize/id_rsa state=absent
# Wenn es sich um einen Wiederholungsversuch handelt, den vorhandenen öffentlichen Schlüssel entfernen, um die Erstellung eines neuen Schlüssels zu ermöglichen
- name: for repeat runs remove old public key from directory
file: path=~/nova_resize/id_rsa.pub state=absent
# Neue SSH-Schlüssel erstellen
- name: creating SSH keys for nova user login
command: ssh-keygen -t rsa -f '~/nova_resize/id_rsa' -N ""
# Nova policy.json-Datei im mycloud-Repo ändern, um Resize zu aktivieren
- 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'
# Nova policy.json-Datei im mycloud-Repo ändern, um Kaltmigration zu aktivieren
- 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'
#
# auf jedem Compute-Knoten
#
- hosts: NOV-CMP
sudo: yes
vars:
# Den öffentlichen SSH-Schlüssel in eine Variable laden
nova_public_ssh_key: "{{ lookup('file', '~/nova_resize/id_rsa.pub') }}"
tasks:
# Ein .ssh-Verzeichnis erstellen, falls es noch nicht existiert
- name: create nova ssh directory on compute host
file: path=/var/lib/nova/.ssh state=directory owner=nova group=nova mode=0755
# Den privaten Schlüssel in das .ssh-Verzeichnis kopieren
- 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
# Den öffentlichen SSH-Schlüssel zur Datei authorized_hosts hinzufügen
- 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'
# Stricthostkeychecking in der SSH-Konfigurationsdatei auf no setzen
- 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
# Bash-Shell als Standard für den nova-Benutzer festlegen
- name: set nova user shell on each compute node
command: usermod -s /bin/bash nova
# Überprüfen, ob der nova-Benutzer sich lokal ohne Passwort anmelden kann
- name: verify passwordless login for nova user
become: yes
become_user: nova
command: ssh nova@{{ inventory_hostname }} 'echo Passwordless Login Successfully!'
#
# auf jedem Controller-Knoten
#
- hosts: HZN-WEB
sudo: yes
tasks:
# Pfad zur horizons nova_policy_json-Datei finden
- shell: find /opt/stack/venv/ -name nova_policy.json | grep dashboard
register: nova_policy_json
# Nova-Instanz-Vergrößerung in horizons nova_policy_json aktivieren
- 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'
# Nova-Instanz-Vergrößerung in horizons nova_policy_json aktivieren
- 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'
# Nova-Instanz-Vergrößerung in horizons nova_policy_json aktivieren
- 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'
HOS 2.X Playbook zum Deaktivieren der Instanz-Vergrößerung
# Autor: Graham Joseph Land
# Blog: allthingscloud.eu
# Twitter: @allthingsclowd
# E-Mail: graham@the above domain
# Datum: 04/03/2016
#
# Name: nova-disable-resize.yml
# Version: 1.1
# Zweck: Dieses Playbook ist eines von 5, die in der richtigen Reihenfolge ausgeführt werden müssen, um die Nova-Instanz-Vergrößerung und Kaltmigration zu deaktivieren
#
# Anweisungen:
# 1. Kopieren Sie dieses Playbook in die folgenden beiden Ansible-Verzeichnisse auf dem Deployer-Knoten -> ~/scratch/ansible/next/hos/ansible UND ~/helion/hos/ansible
# 2. Melden Sie sich als der Deployer-Benutzer beim Helion Lifecycle Manager (HLM Deployer) an und wechseln Sie in dieses Verzeichnis -> ~/scratch/ansible/next/hos/ansible
# 3. Deaktivieren Sie die Nova-Instanz-Vergrößerung und die Nova-Kaltmigration, indem Sie die folgenden Schritte ausführen:
# 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
---
#
# auf jedem Controller-Knoten
#
- hosts: HZN-WEB
sudo: yes
tasks:
# Pfad zur horizons nova_policy_json-Datei finden
- shell: find /opt/stack/venv/ -name nova_policy.json | grep dashboard
register: nova_policy_json
# Nova-Instanz-Vergrößerung in horizons nova_policy_json deaktivieren
- 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'
# Nova-Instanz-Vergrößerung in horizons nova_policy_json deaktivieren
- 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'
# Nova-Instanz-Vergrößerung in horizons nova_policy_json deaktivieren
- 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'
#
# auf jedem Compute-Knoten
#
- hosts: NOV-CMP
sudo: yes
# Den öffentlichen SSH-Schlüssel in eine Variable laden
vars:
nova_public_ssh_key: "{{ lookup('file', '~/nova_resize/id_rsa.pub') }}"
tasks:
# SSH-Schlüssel aus der authorized_keys-Datei entfernen
- authorized_key: 'user=nova key="{{ nova_public_ssh_key }}" path="/var/lib/nova/.ssh/authorized_keys" state=absent'
# Den privaten Schlüssel aus dem .ssh-Verzeichnis entfernen
- 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
# Stricthostkeychecking in der SSH-Konfigurationsdatei auf yes setzen
- 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
# Bash-Shell als Standard für den nova-Benutzer aufheben
- name: unset nova user shell on each compute node
command: usermod -s /bin/false nova
# Überprüfen, ob der nova-Benutzer sich lokal nicht ohne Passwort anmelden kann
- 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
#
# auf dem Deployer-Knoten
#
- hosts: OPS-LM
tasks:
# Benutzernamen des aktuellen Benutzers ermitteln
- name: get the current username running this playbook
local_action: command whoami
register: username_on_the_host
# Wenn es sich um einen Wiederholungsversuch handelt, den vorhandenen privaten Schlüssel entfernen, um die Erstellung eines neuen Schlüssels zu ermöglichen
- name: remove private ssh key
file: path=~/nova_resize/id_rsa state=absent
# Vorhandenen öffentlichen Schlüssel löschen
- name: delete public ssh key
file: path=~/nova_resize/id_rsa.pub state=absent
# Nova policy.json-Datei im mycloud-Repo ändern, um Resize zu deaktivieren
- 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'
# Nova policy.json-Datei im mycloud-Repo ändern, um Kaltmigration zu deaktivieren
- 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'
# Temporäres Verzeichnis löschen
- name: create directory to store ssh keys
file: path=~/nova_resize state=absent
Originally published on allthingscloud.eu (2016-03-17).