1
votes

Connectez-vous à la base de données Postgres à l'aide d'AWS Secrets Manager

Je voulais utiliser AWS Secrets Manager pour se connecter à postgres sans utiliser le nom d'utilisateur et le mot de passe sous forme de texte brut. Je ne suis pas sûr que cela soit faisable, veuillez me pardonner sinon. Actuellement, c'est ce que j'utilise pour me connecter à postgres en utilisant psycopg2:

 import psycopg2

conn = psycopg2.connect(host="hostname",port='5432',database="db", user="admin", password="12345")

J'ai déjà stocké le nom d'utilisateur et le mot de passe dans le gestionnaire de secrets mais je ne sais pas comment l'utiliser ici. Veuillez aider


0 commentaires

3 Réponses :


0
votes

Vous devez utiliser le processus ci-dessous:

  1. connectez-vous au gestionnaire de secrets AWS.
  2. Récupérez le nom d'utilisateur et le mot de passe. Vous devez le mapper comme vous l'avez stocké dans le gestionnaire de secrets.
  3. Stockez-le dans une variable et transmettez-le à la chaîne de connexion.

Vous trouverez ci-dessous l'exemple de script python fourni par amazon :

import boto3
import base64
from botocore.exceptions import ClientError


def get_secret():

    secret_name = "<<{{MySecretName}}>>"
    region_name = "<<{{MyRegionName}}>>"

    # Create a Secrets Manager client
    session = boto3.session.Session()
    client = session.client(
        service_name='secretsmanager',
        region_name=region_name
    )

    # In this sample we only handle the specific exceptions for the 'GetSecretValue' API.
    # See https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html
    # We rethrow the exception by default.

    try:
        get_secret_value_response = client.get_secret_value(
            SecretId=secret_name
        )
    except ClientError as e:
        if e.response['Error']['Code'] == 'DecryptionFailureException':
            # Secrets Manager can't decrypt the protected secret text using the provided KMS key.
            # Deal with the exception here, and/or rethrow at your discretion.
            raise e
        elif e.response['Error']['Code'] == 'InternalServiceErrorException':
            # An error occurred on the server side.
            # Deal with the exception here, and/or rethrow at your discretion.
            raise e
        elif e.response['Error']['Code'] == 'InvalidParameterException':
            # You provided an invalid value for a parameter.
            # Deal with the exception here, and/or rethrow at your discretion.
            raise e
        elif e.response['Error']['Code'] == 'InvalidRequestException':
            # You provided a parameter value that is not valid for the current state of the resource.
            # Deal with the exception here, and/or rethrow at your discretion.
            raise e
        elif e.response['Error']['Code'] == 'ResourceNotFoundException':
            # We can't find the resource that you asked for.
            # Deal with the exception here, and/or rethrow at your discretion.
            raise e
    else:
        # Decrypts secret using the associated KMS CMK.
        # Depending on whether the secret is a string or binary, one of these fields will be populated.
        if 'SecretString' in get_secret_value_response:
            secret = get_secret_value_response['SecretString']
        else:
            decoded_binary_secret = base64.b64decode(get_secret_value_response['SecretBinary'])

    # Your code goes here.  


3 commentaires

Le code que vous avez partagé, je l'ai trouvé dans le gestionnaire de secrets, ma question est de savoir comment passer le nom d'utilisateur et le mot de passe dans de nouvelles variables et l'utiliser dans la chaîne de connexion. Dois-je d'abord exécuter le code ci-dessus et transmettre les clés secrètes aux champs de nom d'utilisateur et de mot de passe? rds = json.dumps (client.get_secret_value (SecretId = "postgres") ['Sec‌ retString'])


Oui, exécutez le code ci-dessus et la ligne ci-dessous stockera cette valeur dans la variable secret ..secret = get_secret_value_response ['SecretString'] ... utilisez la variable secret comme paramètre de votre chaîne de connexion postgres.


Si vous créez le secret à l'aide de la console avec des paires clé / valeur, il sera stocké en tant que blob JSON. Vous devrez d'abord analyser le JSON dans un dict, puis accéder aux paires clé / valeur. Voir la réponse de Parimal.



3
votes

Vous pouvez stocker vos informations d'identification (nom d'utilisateur / mot de passe) dans SecretsManager à l'aide de la console. Vous pouvez les stocker sous forme de paires clé / valeur, par exemple -

session = boto3.session.Session()
client = session.client(
    service_name='secretsmanager',
    region=< region_name >
)
secret = client.get_secret_value(
         SecretId=secret_name
)
secret_dict = json.loads(secret['SecretString'])

username = secret_dict['username']
passw = secret_dict['password']

conn = psycopg2.connect(host="hostname",port='5432',database="db", user=username, password=passw)

Pour utiliser ceci dans votre script Python, vous pouvez faire quelque chose comme ceci -

{ "username": "admin", "password": "12345" }

Notez qu'il s'agit d'un exemple simplifié sans gestion des erreurs. Vous devez également renseigner la bonne région à la place de dans l'exemple.


0 commentaires

0
votes

J'ai créé une bibliothèque open source appelée pysecret , cela rend l'API très propre et simple à utiliser. Voici la documentation de l'intégration d'AWS Secret Manager: https://github.com/MacHu-GWU/pysecret-project#aws-key-management-service-and-secret-manager-integration

  1. mettez manuellement votre valeur secrète dans json ou créez-en une avec pysecret .
aws = AWSSecret(profile_name=aws_profile) # in lambda code, don't need ``profile_name=aws_profile``
username = aws.get_secret_value(secret_id="my-example-secret", key="password") # admin
password = aws.get_secret_value(secret_id="my-example-secret", key="password") # mypassword

Ensuite, vous devriez pouvoir voir le secret créé dans votre console aws.

  1. lisez votre valeur secrète dans la fonction lambda ou dans l'un de vos codes python .
from pysecret import AWSSecret

aws_profile = "my_aws_profile"
aws = AWSSecret(profile_name=aws_profile)

secret_id = "my-example-secret"
secret_data = {
    "host": "www.example.com",
    "port": 1234,
    "database": "mydatabase",
    "username": "admin",
    "password": "mypassword",
}
aws.deploy_secret(name=secret_id, secret_data=secret_data) # or you can pass kms_key_id if you created a custom kms key

Si vous écrivez du code pour la fonction Lambda , vous pouvez jeter un œil à mon autre réponse ici Utilisation d'AWS Secrets Manager avec Python (Lambda Console)

J'espère que cela répond à votre question .


0 commentaires