web-dev-qa-db-fra.com

"Mettez à jour vos certificats SSL / TLS Amazon RDS d'ici le 31 octobre 2019"

Comme beaucoup de gens, j'ai reçu un e-mail me disant de mettre à jour mon instance RDS pour utiliser le nouveau certificat rds-ca-2019 pour les connexions SSL (le précédent étant rds-ca-2015 qui expire le 5 mars 2020). Leur documentation sur le processus est un peu clairsemé et dit des choses comme "Mettez à jour vos applications de base de données pour utiliser le nouveau certificat SSL/TLS." et "Importez le certificat dans votre système d'exploitation." sans plus de détails sur les changements requis du côté client.

Lors de la configuration initiale, je n'ai installé aucun certificat et utilisé une image Vanilla Ubuntu 18.04 EC2. L'instance RDS a été définie pour utiliser rds-ca-2015 et lorsque je me suis connecté à RDS avec psql, il a signalé qu'il utilisait correctement TLSv1.2. Si je regarde les certificats racine installés dans le système d'exploitation, je trouve 4 certificats "Amazon Root CA" numérotés de 1 à 4. Ceux-ci n'expirent pas avant 2038 et 2040.

Donc, ma question comprend 2 parties:

  1. Comment le SSL/TLS fonctionnait-il correctement au départ si je n'avais jamais installé les certificats RDS et certificats intermédiaires fournis par Amazon ?
  2. Si j'ai changé l'instance de base de données RDS pour utiliser rds-ca-2019 et que cela semble "fonctionner", y a-t-il autre chose à faire?
19
Tim Tisdall

Le par défaut sslmode pour PostgreSQL est prefer ce qui signifie qu'il cryptera la connexion avec le certificat fourni par le serveur mais ne le vérifiera pas. Si je devais changer le paramètre sslmode en verify-ca ou verify-full alors j'aurais besoin d'installer les certificats intermédiaires dans un répertoire particulier et ensuite il ferait une vérification correcte.

Comme je ne suis pas préoccupé par une attaque MITM sur mon VPC, je ne pense pas que je vais prendre la peine de passer au mode `` vérifier ''.

13
Tim Tisdall

Le certificat RDS en question est un certificat intermédiaire . Vous pouvez également le connaître en tant que certificat CA. Lorsque j'utilise MySQL Workbench, par exemple, je dois spécifier que

  1. Je souhaite utiliser SSL (TLS)
  2. Utilisez le fichier de chaîne de l'autorité de certification RDS pour vérifier le certificat

MySQL Workbench

Comment le SSL/TLS fonctionnait-il correctement au départ si je n'avais jamais installé le [certificat]?

Cela dépend de la configuration de votre système. Les certificats CA fournissent simplement une autorité de confiance pour le certificat présenté. Il est tout à fait possible de configurer quelque chose qui acceptera n'importe quel certificat, sans tenter de le vérifier (c'est-à-dire que vous utilisez un certificat auto-signé). Une autre option est qu'il existe déjà quelque chose dans votre magasin CA qui lui fait confiance implicitement. C'est moins probable, mais pas impossible.

Si vous faites cela localement (comme vous avez une instance EC2 dans le même VPC que votre instance RDS), vous n'aurez peut-être même pas besoin de SSL.

Si j'ai changé l'instance de base de données RDS pour utiliser rds-ca-2019 et que cela semble "fonctionner", y a-t-il autre chose à faire?

Non, c'est déroutant, mais si vous vous connectez et que vous n'obtenez aucune erreur de certificat, je ne m'en inquiéterais pas.

7
Machavity

Dans ubuntu, ajoutez le ca-cert comme décrit ici: https://askubuntu.com/questions/73287/how-do-i-install-a-root-certificate

wget https://s3.amazonaws.com/rds-downloads/rds-ca-2019-root.pem
Sudo mkdir /usr/local/share/ca-certificates/aws
Sudo mv rds-ca-2019-root.pem /usr/local/share/ca-certificates/aws
Sudo openssl x509 \ 
    -in /usr/local/share/ca-certificates/aws/rds-ca-2019-root.pem \
    -inform PEM \
    -out /usr/local/share/ca-certificates/aws/rds-ca-2019-root.crt
Sudo update-ca-certificates

: Sudo update-ca-certificates
Updating certificates in /etc/ssl/certs...
1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d...

Adding debian:rds-ca-2019-root.pem
done.
done.

Ce lien décrit comment définir l'emplacement du certificat SSL pour une application Django: https://www.digitalocean.com/community/questions/how-to-connect-managed- database-postgres-with-ssl-mode-varify-full-in-Django-app

DATABASES = {
'default': {
    'ENGINE': 'Django.db.backends.postgresql_psycopg2',
    'NAME': '<name>',
    'USER': '<user>',
    'PASSWORD': '<password>',
    'Host' : '<Host>',
    'PORT' : '25060',   
    'OPTIONS':{
        'sslmode':'verify-full',
        'sslrootcert': os.path.join(BASE_DIR, 'ca-certificate.crt')

}

Ce message dans Stackoverflow https://stackoverflow.com/a/58214922/1415254 décrit comment se connecter en utilisant les paramètres de ligne de commande pour psql.

psql "Host={hostname} sslmode=prefer sslrootcert={ca-cert.pem} \
sslcert={client-cert.pem} sslkey={client-key.pem} port={port} user={user} \
dbname={db}"

Aussi

psqlrc and ~/.psqlrc

Unless it is passed an -X or -c option, psql attempts to read and execute commands
from the system-wide startup file (psqlrc) and then the user's personal startup
file (~/.psqlrc), after connecting to the database but before accepting normal
commands. These files can be used to set up the client and/or the server to taste,
typically with \set and SET commands.

Et plus de détails ici (tout à la fin): https://info.crunchydata.com/blog/ssl-certificate-authentication-postgresql-docker-containers

# the first parameter specifies which TLS mode to use to connect
export PGSSLMODE="verify-full"
# the following two parameters point to the client key/certificate
export PGSSLCERT="`pwd`/certs/client.crt"
export PGSSLKEY="`pwd`/keys/client.key"
# this parameter points to the trusted root CA certificate
export PGSSLROOTCERT="`pwd`/certs/ca.crt"

Liste complète des variables d'environnement ici: https://www.postgresql.org/docs/9.2/libpq-envars.html

4
vinh

Cette mise à jour du certificat présente deux aspects:

  1. Côté serveur: toutes les instances RDS créées avant le 2019-11-01 nécessitent un redémarrage. Cela entraîne une panne de ~ 5 minutes. Cela les mettra à jour pour que les nouveaux certificats soient en place.
  2. Si vos clients utilisent SSL (désactivé/préféré par défaut), vous devez mettre à jour les certificats (intermédiaire + chaîne) d'AWS partout où vos clients s'exécutent.

Postgres utilise "prefer" comme moyen par défaut pour les clients de se connecter, ce qui signifie qu'ils essaieront SSL si disponible, mais se replieront sinon. Ainsi, les clients existants avec une configuration de connexion par défaut continueront de fonctionner.

2
Ron Wail

Tout comme l'OP post lui-même, postgres a le sslmode par défaut défini sur prefer, et voici l'extrait du document:

I don't care about encryption, but I wish to pay the overhead of encryption if the server supports it.

Ainsi, par défaut, le pilote pg ne vérifiera pas les certificats sauf indication contraire; et c'est exactement la raison pour laquelle les questions originales d'OP fonctionnent au départ, et fonctionnent également après la mise à niveau du RDS vers rds-ca-2019.

L'une des variables d'environnement pour la connexion à postgres est via DATABASE_URL, sous la forme de

postgres://username:password@Host/database?sslmode=verify-full&sslrootcert=config/ca/rds-combined-ca-bundle.pem

et c'est là que vous pouvez spécifier les sslmode et sslrootcert si vous décidez de vérifier les certificats intermédiaires. Le contenu de sslrootcert doit être l'un des suivants ...

https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem
https://s3.amazonaws.com/rds-downloads/rds-ca-2019-root.pem

HTH

2
MrAtheist

Avant de mettre à niveau l'autorité de certification dans RDS vers rds-ca-2019, sans interruption de connexion, vous pouvez mettre à niveau le certificat côté client.

Si votre RDS a rds-ca-2015, vous devez mettre à niveau la clé côté client avec ceci https://s3.amazonaws.com/rds-downloads/rds-combined-ca-bundle.pem .

Selon le document AWS https://docs.aws.Amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html Il indique que le fichier rds-combine-ca-bundle.pem a les deux certificats intermédiaires et racine.

Une fois que vos applications ont un fichier ca combiné, vous devez procéder à la mise à niveau de votre RDS vers l'autorité de certification rds-ca-2019.

De cette façon, sans temps d'arrêt, vous pouvez mettre à niveau l'autorité de certification dans RDS vers rds-ca-2019.

1
Piyush Sonigra

Toute nouvelle instance de base de données RDS créée après le 1er novembre 2019 utilise les nouveaux certificats par défaut. Si votre instance RDS est créée avant la date susmentionnée, vous devez mettre à jour le certificat.

Pour changer l'autorité de certification de rds-ca-2015 à rds-ca-2019 pour une instance de base de données

  1. Connectez-vous à AWS Management Console et ouvrez la console Amazon RDS à https://console.aws.Amazon.com/rds/ .
  2. Dans le volet de navigation, choisissez Bases de données, puis choisissez l'instance de base de données que vous souhaitez modifier.
  3. Choisissez Modifier. La page Modifier l'instance DB apparaît. référer les pièces jointes
  4. Dans la section Réseau et sécurité, choisissez rds-ca-2019. référer les pièces jointes.
  5. Choisissez Continuer et vérifiez le résumé des modifications.
  6. Pour appliquer les modifications immédiatement, choisissez "Appliquer immédiatement". Le choix de cette option provoque une panne.
  7. Sur la page de confirmation, passez en revue vos modifications. S'ils sont corrects, choisissez Modify DB Instance pour enregistrer vos modifications.
0
Mohan Balakrishnan