Projet

Général

Profil

Scénario #16278

Mis à jour par Daniel Dehennin il y a plus de 4 ans

h3. Problème

Actuellement les services OpenNebula ne sont pas accessibles de façon simple et homogène :

* L’interface web *@Sunstone@* écoute sur l’IP de la *@première interface réseau@* sur le port *@9000@* (le port part défaut est *@9869@*)
* Le service XMLRPC *@oned@* n’est accessible que sur *@127.0.0.1@* sur le port *@2633@* (port par défault)
* Le service *@OneFlow@* n’est accessible que sur *@127.0.0.1@* sur le port *@2474@* (port par défault)

h3. Propositions

Livraison pour EOLE *@2.7.2@*

# Permettre le paramétrage de l’IP et du port d’écoute du service XMLRPC avec les variables *@oned_xmlrpc_ip@* et *@oned_xmlrpc_port@*:
** Elles sont déclarées obligatoire en mode expert avec l’IP forcé à *@127.0.0.1@* par project:eole-one-master (non visible où tourne le service *@oned@*, *@oned_xmlrpc_port@* remplace la variable inutilisée *@xmlrpc_port_sunstone@* définie dans project:eole-one-frontend)
# Permettre le paramétrage de l’IP et du port d’écoute du service *@Sunstone@* avec les variables *@one_sunstone_ip@* et *@one_sunstone_port@* (ou conserver *@ip_sunstone@* et *@port_sunstone@*)
** Elles sont déclarées obligatoire en mode expert avec l’IP forcé à *@127.0.0.1@* par project:eole-one-frontend
# Permettre le paramétrage de la taille maximale des requêtes HTTP avec la variable *@one_nginx_max_body_size@*
** Elle est déclarée optionelle en mode expert par project:eole-one-frontend
# Renommer *@activer_onesinglenode@* en *@activer_oned@*
** Elle est déclarée obligatoire avec la valeur forcée à *@oui@* par project:eole-one-master (non modifiable, c’est pour faire des *@%if@* dans les templates)
# Permettre le paramétrage de l’IP et du port d’écoute du service *@noVNC@*
** Ajouter la variable *@one_sunstone_vnc_proxy_ip@*, obligatoire en mode expert avec l’IP forcée *@127.0.0.1@*
** Renommer *@vnc_proxy_port_sunstone@* en *@one_sunstone_vnc_proxy_port@* (c’est plus facile pour faire des grep ;-))
# Fournir un template nginx devant être utilisé par project:eole-one-master et project:eole-one-frontend, en s’inspirant du modèle suivant
<pre>
# Opennebula
upstream oned {
server %%oned_xmlrpc_ip:%%oned_xmlrpc_port;
}

%if %%getVar('activer_onefrontend', 'non') == 'oui'
upstream sunstone {
server %%one_sunstone_ip:%%one_sunstone_port;
}

# Will be useable when https://dev.opennebula.org/issues/3538
# Usable with https://github.com/OpenNebula/one/issues/2781
upstream websocketproxy {
server %%one_sunstone_vnc_proxy_ip:%%one_sunstone_vnc_proxy_port;
}
%end if

%if %%getVar('activer_oneflow', 'non') == 'oui'
upstream one-flow {
server 127.0.0.1:2474;
}
%end if

# Port 80 redirected to SSL
server {
listen 80;
server_name %%nom_domaine_machine;

### Permanent redirect to HTTPS
return 301 https://$server_name:443;
}

# SSL reverse-proxy
server {
listen 443 default_server;
listen [::]:443 default_server ipv6only=on;

ssl on;
ssl_certificate %%server_pem;
ssl_certificate_key %%server_key;

%if %%getVar('activer_onefrontend', 'non') == 'oui'
# Make sure static files can be accessed directly by location /
root /usr/lib/one/sunstone/public;
index index.html index.htm;
%end if

server_name %%nom_domaine_machine;

access_log /var/log/nginx/opennebula-access.log;
error_log /var/log/nginx/opennebula-error.log;

%if %%getVar('one_nginx_max_body_size', 'non') != 'non'
client_max_body_size %%one_nginx_max_body_size;
%end if

%if %%getVar('activer_onefrontend', 'non') == 'oui'
location / {
try_files $uri @sunstone;
}

location /websockify {
proxy_pass http://websocketproxy;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

# Wait 15 minutes before closing the connexion
# if nothing move on the VNC screen
proxy_send_timeout 15m;
proxy_read_timeout 15m;
}

location @sunstone {
include proxy_params;
proxy_pass_request_headers on;
proxy_pass http://sunstone;
}
%end if

%if %%getVar('activer_oned', 'non') == 'oui'
location /RPC2 {
include proxy_params;
proxy_pass http://oned;
}
%end if
}
</pre>
# Modifier la configuration du proxy *@noVNC@*
** Pour qu’il écoute sur 127.0.0.1
<pre><code class="diff">
--- a/tmpl/sunstone-server.conf
+++ b/tmpl/sunstone-server.conf
@@ -124,7 +124,7 @@
# :vnc_request_password: true | false
# Request VNC password for external windows, by default it will not be requested
#
-:vnc_proxy_port: %%vnc_proxy_port_sunstone
+:vnc_proxy_port: %%one_sunstone_vnc_proxy_ip:%%one_sunstone_vnc_proxy_port
:vnc_proxy_support_wss: yes
:vnc_proxy_cert: /etc/one/ssl/certs/novnc.crt
:vnc_proxy_key: /etc/one/ssl/private/novnc.key
</code></pre>
** Pour que les clients utilise le port HTTPS avec le contournement https://github.com/OpenNebula/one/issues/2781
<pre><code class="diff">
--- a/tmpl/sunstone-server.conf
+++ b/tmpl/sunstone-server.conf
@@ -130,6 +130,7 @@
:vnc_proxy_key: /etc/one/ssl/private/novnc.key
:vnc_proxy_ipv6: false
:vnc_request_password: false
+:vnc_client_port: 443/websockify

# Login Session Length in seconds, defaults to 1 hour.
#:session_expire_time: 3600
</code></pre>
** Pour ne plus utiliser TLS sur 127.0.0.1
<pre><code class="diff">
--- a/tmpl/sunstone-server.conf
+++ b/tmpl/sunstone-server.conf
@@ -125,9 +125,9 @@
# Request VNC password for external windows, by default it will not be requested
#
:vnc_proxy_port: %%one_sunstone_vnc_proxy_ip:%%one_sunstone_vnc_proxy_port
-:vnc_proxy_support_wss: yes
-:vnc_proxy_cert: /etc/one/ssl/certs/novnc.crt
-:vnc_proxy_key: /etc/one/ssl/private/novnc.key
+:vnc_proxy_support_wss: no
+:vnc_proxy_cert:
+:vnc_proxy_key:
:vnc_proxy_ipv6: false
:vnc_request_password: false
:vnc_client_port: 443/websockify
</code></pre>

h3. À ne pas oublier

En mode *@HA@* le service XMLRPC écoute sur le port *@2633@* de toutes les IPs pour qu’un slave puisse communiquer avec le maître, nous voyons deux possibilités :
* Concerver le mode de fonctionnement actuel (accès direct sur le port *@2633@*)
* Obliger les slaves à passer par le HTTPS ce qui nécessite un déploiment de la CA du maître (ce qui est faisable par la commande d’enrôlement)

h3. Améliorations possibles

* Certains scripts peuvent sûrement être raccourcis en les réécrivant en ruby avec l’"API OpenNebula":http://docs.opennebula.org/5.0/integration/system_interfaces/ruby.html:
** Le script shell de 468 lignes eole-one-master:source:postservice/30-one-mng@776da48
** Le script python de 361 lignes eole-one-master:source:postservice/31-one-netmng@776da48
** Le script shell de 148 lignes eole-one-master:source:postservice/99-init-hapy-master@776da48
* Un fichier de configuration pour définir les "paramètres":http://docs.opennebula.org/5.0/operation/users_groups_management/manage_users.html#shell-environment *@ONE_AUTH@*, *@ONE_XMLRPC@* ainsi que les variables utilisés par les scripts afin de minimiser les appels à *@creoled@*

h3. Critères d’acceptation

# L’interface web de Sunstone n’est accessible que sur le port 443
# L’ouverture des consoles VNC utilise le port 443 (pas de certificat supplémentaire à accepter par rapport à la connexion à Sunstone)
# Les tests CreoleLint sont OK dans Jenkins
# L’enregistrement de nœuds supplémentaires est fonctionnel (test jenkins *@test-hapy-002@*)

Retour