Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[TECH] Monter les versions des packages de l'API. #1767

Merged
merged 24 commits into from Sep 28, 2020

Conversation

VincentHardouin
Copy link
Member

@VincentHardouin VincentHardouin commented Aug 11, 2020

🦄 Problème

Nous utilisons beaucoup de package qui ne sont pas à jour.

Screenshot 2020-08-11 at 21 10 50

Afin de fiabiliser, sécuriser la plateforme et profiter des dernières fonctionnalité, il faut tenir au maximum à jour les dépendances.

🤖 Solution

Monter les versions des dépendances suivantes :

@VincentHardouin VincentHardouin self-assigned this Aug 11, 2020
@VincentHardouin VincentHardouin added the team-captains This is your captain speaking label Aug 11, 2020
@pix-service
Copy link
Contributor

@laura-bergoens
Copy link
Member

Pas encore fait, mais je prends le check de version majeure sur node-pg

@HEYGUL
Copy link
Contributor

HEYGUL commented Aug 12, 2020

Le soucis d'xml-crypto est lié à notre fork de samlify qui date. Il va falloir le mettre à jour également.

@HEYGUL HEYGUL force-pushed the tech-bump-api-packages branch 3 times, most recently from 548c856 to c8db2ee Compare August 12, 2020 18:50
@octo-topi
Copy link
Contributor

Pas encore fait, mais je prends le check de version majeure sur node-pg

Il n'y a que 2 entrées

  • l'une mineure (Support passing a string of command line options flags)
  • l'autre majeure mais rétro-compatible

Switch internal protocol parser & serializer to pg-protocol. The change is backwards compatible

@octo-topi
Copy link
Contributor

J'ai testé un peu partout pix-app / pix-orga /swagger => OK .

Copy link
Contributor

@sbedeau sbedeau left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ok pour moi
Quelle est l'intention derrière l'hétérogénéité dans la gestion des versions de paquets ? Certains ont gagné un ^, d'autres l'ont perdu.

@sbedeau sbedeau added the team-evaluation PR relatives à l'expérience d'évaluation label Aug 14, 2020
@VincentHardouin
Copy link
Member Author

Ok pour moi
Quelle est l'intention derrière l'hétérogénéité dans la gestion des versions de paquets ? Certains ont gagné un ^, d'autres l'ont perdu.

Je parle au nom de GUL, je pense qu'il a du écrire les versions à la main : npm install lodash@20.0.0 et donc a perdu l'hétérogénéité.
Après, dans les faits cela change rien le package-lock.json verrouille nos versions. Cela change juste pour la version que npm va installer lors d'un : npm update <nom_du_paquet>. En suivant avec un npm outdated on voit très bien quelle est la dernière version qui doit-être installée.

@laura-bergoens
Copy link
Member

laura-bergoens commented Aug 14, 2020

Du coup le breaking-change côté node-pg c'est le changement d'un comportement par défaut lors de l'instanciation d'un client ->

Previously we white listed the parameters passed here and did slight massaging of some of them. The main breaking change here is that now if you do this:
const client = new Client({ ssl: true })
Now we will use the default ssl options to tls.connect which includes rejectUnauthorized being enabled. This means your connection attempt may fail if you are using a self-signed cert. To use the old behavior you should do this:
const client = new Client({ ssl: { rejectUnauthorized: false } })

source
Vu qu'on passe par knex, je pense (j'espère) qu'ils ont rendu cette contrainte invisible pour nous 🤞 donc je dirai qu'on n'a rien à faire de notre côté

@laura-bergoens
Copy link
Member

@VincentHardouin Je veux aussi signaler qu'on a des petites nouveautés au niveau des logs :
nouveauté
je pense que ça serait bien de savoir de quoi il s'agit

@VincentHardouin
Copy link
Member Author

@VincentHardouin Je veux aussi signaler qu'on a des petites nouveautés au niveau des logs :
nouveauté
je pense que ça serait bien de savoir de quoi il s'agit

Je viens de trouver ça : knex/knex#3921 (comment)

@jonathanperret
Copy link
Member

jonathanperret commented Aug 19, 2020

La dernière version de samlify offre cette possiblité, cf ce commit).

Le lien vers le commit est cassé et je ne trouve pas de changement de version de samlify ?

@jonathanperret
Copy link
Member

Du coup le breaking-change côté node-pg c'est le changement d'un comportement par défaut lors de l'instanciation d'un client ->

Previously we white listed the parameters passed here and did slight massaging of some of them. The main breaking change here is that now if you do this:
const client = new Client({ ssl: true })
Now we will use the default ssl options to tls.connect which includes rejectUnauthorized being enabled. This means your connection attempt may fail if you are using a self-signed cert. To use the old behavior you should do this:
const client = new Client({ ssl: { rejectUnauthorized: false } })

source
Vu qu'on passe par knex, je pense (j'espère) qu'ils ont rendu cette contrainte invisible pour nous 🤞 donc je dirai qu'on n'a rien à faire de notre côté

@jbuget avait déjà fait une tentative de passage à pg@8 dans #1433 et renoncé… est-ce que quelque chose a changé ?

@jonathanperret
Copy link
Member

@jbuget avait déjà fait une tentative de passage à pg@8 dans #1433 et renoncé… est-ce que quelque chose a changé ?

J'avais creusé le sujet à l'époque et trouvé quelques infos supplémentaires mais j'avais mis ça uniquement dans un message Slack privé à @jbuget 🤦 … je remets l'essentiel ici :

Les certificats des serveurs PG de Scalingo sont pas nickels : le nom par lequel on y accède ne figure pas dans le certificat.

Error [ERR_TLS_CERT_ALTNAME_INVALID]: Hostname/IP does not match certificate's altnames: Host: pix-api-revi-8433.postgresql.dbs.scalingo.com. is not in the cert's altnames: DNS:f74cd2aa-6768-4d4f-8e8b-219680cadc65.pix-api-revi-8433.postgresql.dbs.scalingo.com, DNS:ip-10-0-0-214, DNS:f74cd2aa-6768-4d4f-8e8b-219680cadc65

En lisant les sources de node-postgres tu peux voir qu’il est possible d’ignorer ce souci en mettant PGSSLMODE=no-verify dans l’environnement (ce qui remet le comportement qu’on avait jusque là en fait)

En attendant que Scalingo ait corrigé les certificats (bon, faudrait déjà leur signaler… je vais m’en occuper). Dans tous les cas c’est de la config spécifique à l’environnement, ça ne va pas dans le code.

Si tu retournes voir le code de node-postgres (et pg-connection-string) tu verras que les options sont à peu près toutes accessibles via la connectionString ou l’environnement, ce qui est très bien parce que ça permet de ne pas mettre dans le code des spécificités de l’environnement.

du coup, je me demande, dès lors qu’on sera passé en v8, s’il ne faudra pas carrément enlever cette option du knex file, qui est très mal (voire pas du tout) documentée dans knex, maintenant que le mode par défaut est SSL

Aah oui, j’avais oublié cette ligne ssl: ('true' === process.env.DATABASE_SSL_ENABLED) — effectivement elle n’a rien à faire là, on doit pouvoir contrôler tout ça depuis l’environnement. En pg@7 je viens de tester (en exigeant les connexions SSL sur le PG de pix-api-review-pr1433), elle n’a aucun effet parce que l’URL fournie par scalingo contient déjà sslmode=require.

Avec pg@8 sans cette ligne c’est un poil plus compliqué tant que les certificats ne sont pas corrigés, parce qu’il faut à la fois forcer le SSL et désactiver la validation du certificat. Malheureusement pg@8 interprète sslmode=require (ou prefer) comme sslmode=verify-full (ce qui n’est pas conforme avec ce que fait un outil comme psql), et si on met PGSSLMODE=no-verify il désactive la vérification mais sans activer le SSL! Mais on peut s’en sortir avec : PGSSLMODE=no-verify et DATABASE_URL="$SCALINGO_POSTGRESQL_URL&sslmode=require

@jonathanperret
Copy link
Member

Quelques tests supplémentaire avec pg@8 du coup :

✅ Scalingo a corrigé le problème de certificats

$ </dev/null scalingo -a pix-api-review-pr1767 run -s S 'openssl s_client -starttls postgres -connect pix-api-revi-396.postgresql.dbs.scalingo.com:34164 | openssl x509 -noout -text' | grep DNS:
-----> Connecting to container [one-off-851]...
-----> Process 'openssl s_client -starttls postgres -connect pix-api-revi-396.postgresql.dbs.scalingo.com:34164 | openssl x509 -noout -text' is starting...

                DNS:25728d5e-515b-4a7e-839a-31721ec2ad9f.pix-api-revi-396.postgresql.dbs.scalingo.com, DNS:ip-10-0-0-89, DNS:25728d5e-515b-4a7e-839a-31721ec2ad9f, DNS:pix-api-revi-396.postgresql.dbs.scalingo.com

(on voit bien apparaître le nom d'hôte indiqué dans SCALINGO_POSTGRESQL_URL, à savoir pix-api-revi-396.postgresql.dbs.scalingo.com, dans la liste des noms d'hôte acceptables par le certificat).

✅ La connection SSL à la base fonctionne, grâce à PGSSLMODE=require

Attention, pour avoir un test comparable à ce qui se passe en production, il faut aller sur le dashboard de base de données Scalingo de la review app et bien forcer les connexions SSL!

Une fois ceci fait, on constate que l'application arrive à se connecter à PG:

Scalingo:pix-api-review-pr1767 ~ $ node -e "require('./db/knex-database-connection').knex('users').count().then(console.log).then(process.exit)"
[ { count: 53 } ]

Mais attention, ça ne marche que parce que la variable PGSSLMODE=require est présente dans l'environnement. Si on essaie sans :

Scalingo:pix-api-review-pr1767 ~ $ PGSSLMODE= node -e "require('./db/knex-database-connection').knex('users').count().then(console.log).then(process.exit)"
[ { count: 53 } ]
(node:81) UnhandledPromiseRejectionWarning: error: pg_hba.conf rejects connection for host "192.168.100.2", user "pix_api_revi_396", database "pix_api_revi_396", SSL off
    at createQueryBuilder (/app/node_modules/knex/lib/util/make-knex.js:313:26)
    at Object.knex (/app/node_modules/knex/lib/util/make-knex.js:99:12)
    at [eval]:1:42
    at Script.runInThisContext (vm.js:120:18)
    at Object.runInThisContext (vm.js:309:38)
    at Object.<anonymous> ([eval]-wrapper:10:26)
…

Et ce bien que l'URL fournie par Scalingo (SCALINGO_POSTGRESQL_URL) se termine par sslmode=prefer.

Même si on force l'URL à contenir sslmode=require, ce n'est pas mieux :

Scalingo:pix-api-review-pr1767 ~ $ PGSSLMODE= DATABASE_URL=${SCALINGO_POSTGRESQL_URL/prefer/require} node -e "require('./db/knex-database-connection').knex('users').count().then(console.log).then(process.exit)"
(node:103) UnhandledPromiseRejectionWarning: error: pg_hba.conf rejects connection for host "192.168.100.2", user "pix_api_revi_396", database "pix_api_revi_396", SSL off

Bref, en l'état il faudra bien s'assurer d'avoir la variable d'environnement PGSSLMODE=require sur toutes les applications. Après une vérification rapide, c'est déjà le cas y compris en production. D'ailleurs, j'ai aussi vérifié : le comportement ci-dessus se produisait déjà avec pg@7, ce qui explique probablement la présence de cette variable.

DATABASE_SSL_ENABLED n'a pas d'effet

DATABASE_SSL_ENABLED est à true sur toutes les applications mais la connexion s'établit correctement même si on l'enlève ou qu'on la passe à false. Cette variable (et donc cette ligne ) devraient donc pouvoir être supprimées.

@jonathanperret
Copy link
Member

Un dernier petit résultat : si on met ssl=true dans l'URL de connexion (ex. DATABASE_URL=$SCALINGO_POSTGRESQL_URL&ssl=true) alors ça déclenche bien la connexion SSL même sans PGSSLMODE=require… pas sûr que ce soit une meilleure solution.

@MelanieMEB MelanieMEB added the cross-team Toutes les équipes de dev label Aug 27, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

10 participants