Project

General

Profile

Scénario #16278

Les services OpenNebula doivent être accessibles derrière un reverse proxy

Added by Daniel Dehennin over 7 years ago. Updated almost 4 years ago.

Status:
Terminé (Sprint)
Priority:
Normal
Assigned To:
-
Category:
-
Start date:
05/06/2019
Due date:
10/31/2019
% Done:

100%

Story points:
7.0
Remaining (hours):
0.00 hour
Velocity based estimate:
Release:
Release relationship:
Auto

Description

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)

Propositions

Livraison pour EOLE 2.7.2

  1. 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 eole-one-master (non visible où tourne le service oned, oned_xmlrpc_port remplace la variable inutilisée xmlrpc_port_sunstone définie dans eole-one-frontend)
  2. 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 eole-one-frontend
  3. Permettre le paramétrage de la taille maximale des requêtes HTTP avec la variable one_nginx_max_body_size
  4. Renommer activer_onesinglenode en activer_oned
    • Elle est déclarée obligatoire avec la valeur forcée à oui par eole-one-master (non modifiable, c’est pour faire des %if dans les templates)
  5. 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 ;-))
  6. Fournir un template nginx devant être utilisé par eole-one-master et eole-one-frontend, en s’inspirant du modèle suivant
    # 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
    }
    
  7. Modifier la configuration du proxy noVNC
    • Pour qu’il écoute sur 127.0.0.1
      --- 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
      
    • Pour que les clients utilise le port HTTPS avec le contournement https://github.com/OpenNebula/one/issues/2781
      --- 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
      
    • Pour ne plus utiliser TLS sur 127.0.0.1
      --- 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
      

À 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)

Améliorations possibles

Critères d’acceptation

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

Subtasks

Tâche #28173: Demande de mise en variable pour WSSFerméPhilippe Caseiro

Tâche #28784: Proposition d'évolution pour l'ouverture de l'API XMLRPCFerméVincent Febvre

Tâche #29180: Création variables xml-rpcFerméPhilippe Caseiro

Tâche #29182: Permettre le paramétrage de l’IP et du port d’écoute du service SunstoneFerméVincent Febvre

Tâche #29183: Renommer activer_onesinglenodeFerméPhilippe Caseiro

Tâche #29184: Fournir un template nginxFerméVincent Febvre

Tâche #29196: Ajouter le nom dns de la VIP à la liste des noms inclus dans les demandes et certificats SSL.Reporté

Tâche #29197: Limiter l'accès à SUNSTONEReportéPhilippe Caseiro

Tâche #29203: Faire fonctionner l'API XML-RPC en mode HAFerméPhilippe Caseiro


Related issues

Related to Distribution EOLE - Tâche #17496: L’API XMLRPC ne peut pas être accessible à distance Fermé 10/13/2016
Related to EOLE OpenNebula - Bac à idée #29095: Les services frontend OpenNebula doivent être installable séparément du contrôleur Nouveau
Related to Distribution EOLE - Tâche #29148: Validation du scénario : Les services OpenNebula doivent être accessibles derrière un reverse proxy Fermé 10/16/2019
Blocked by Distribution EOLE - Tâche #29208: La procédure de mise à jour des propriétés des volumes de sauvegarde n’est pas fiable Fermé 10/25/2019

History

#1 Updated by Daniel Dehennin over 7 years ago

  • Assigned To set to Daniel Dehennin

#2 Updated by Daniel Dehennin over 7 years ago

  • Parent task deleted (#16215)

#3 Updated by Daniel Dehennin over 7 years ago

  • Tracker changed from Tâche to Proposition Scénario
  • Subject changed from La configuration nginx n’utilise pas l’IP d’écoute de sunstone to Permettre à Sunstone d’écouter sur 127.0.0.1
  • Description updated (diff)
  • Status changed from Nouveau to À formaliser
  • Assigned To deleted (Daniel Dehennin)
  • Target version deleted (sprint 2016 22-24 - Equipe MENESR)
  • Estimated time deleted (1.00 h)

#4 Updated by Daniel Dehennin almost 7 years ago

  • Subject changed from Permettre à Sunstone d’écouter sur 127.0.0.1 to Les services OpenNebula doivent être accessibles derrière un reverse proxy
  • Description updated (diff)

#5 Updated by Daniel Dehennin almost 7 years ago

  • Project changed from eole-one-frontend to EOLE OpenNebula
  • Status changed from À formaliser to Nouveau

#6 Updated by Daniel Dehennin almost 7 years ago

  • Tracker changed from Proposition Scénario to Scénario
  • Start date deleted (06/02/2016)
  • Release set to EOLE 2.6.1

#7 Updated by Joël Cuissinat almost 7 years ago

  • Story points set to 6.0

#8 Updated by Daniel Dehennin almost 7 years ago

  • Description updated (diff)

#9 Updated by Daniel Dehennin almost 7 years ago

  • Description updated (diff)

#10 Updated by Scrum Master almost 7 years ago

  • Story points changed from 6.0 to 8.0

#11 Updated by Luc Bourdot over 6 years ago

  • Release changed from EOLE 2.6.1 to EOLE 2.6.1.1

#12 Updated by Scrum Master over 6 years ago

  • Release changed from EOLE 2.6.1.1 to EOLE 2.6.2

#13 Updated by Joël Cuissinat almost 6 years ago

  • Release deleted (EOLE 2.6.2)

#14 Updated by Daniel Dehennin about 4 years ago

Il est possible de faire en sorte que les flux noVNC passent par le reverse proxy nginx, voir l’astuce dans la demande GitHub 2781.

#15 Updated by Gilles Grandgérard about 4 years ago

  • Release set to Carnet de produit (Cadoles)

#16 Updated by Gilles Grandgérard almost 4 years ago

  • Story points changed from 8.0 to 1.0

#17 Updated by Gilles Grandgérard almost 4 years ago

  • Story points changed from 1.0 to 7.0

#18 Updated by Joël Cuissinat almost 4 years ago

  • Due date set to 10/31/2019
  • Target version set to Prestation Cadoles 42-44
  • Start date set to 10/14/2019

#19 Updated by Daniel Dehennin almost 4 years ago

  • Description updated (diff)

#20 Updated by Daniel Dehennin almost 4 years ago

  • Description updated (diff)

#21 Updated by Joël Cuissinat almost 4 years ago

  • Related to Tâche #29147: Validation du scénario : L'intégration proxy dans un domaine AD doit fonctionner pour toutes les architectures added

#22 Updated by Joël Cuissinat almost 4 years ago

  • Related to deleted (Tâche #29147: Validation du scénario : L'intégration proxy dans un domaine AD doit fonctionner pour toutes les architectures)

#23 Updated by Joël Cuissinat almost 4 years ago

  • Related to Tâche #29148: Validation du scénario : Les services OpenNebula doivent être accessibles derrière un reverse proxy added

#24 Updated by Daniel Dehennin almost 4 years ago

  • Status changed from Nouveau to Terminé (Sprint)

#25 Updated by Joël Cuissinat almost 4 years ago

  • Release changed from Carnet de produit (Cadoles) to EOLE 2.7.2

Also available in: Atom PDF