0
votes

Il n'est pas possible d'accéder correctement à la clé publique / privée GPG à partir d'AWS Secrets Manager via python3

J'utilise le package python-gnupg pour créer une clé publique et privée GPG. La clé privée générée que je stocke dans AWS Secrets Manager comme suit.

try:
    secretkey = self.get_secret(secretName)
    if not secretkey:
        self.logger.error("Empty secret key")
        exit(0)

    newdict = json.loads(secretkey)**
    #  newdict = ast.literal_eval(secretkey)
    private_key = newdict['private_key']

    #  private_key = open('/home/ec2-user/GPG/test_private_key.asc').read()
    passphrase = newdict['passphrase']

    gpg = gnupg.GPG(gnupghome=gpgHomeDir)
    import_result = gpg.import_keys(private_key)

    count = import_result.count
    if count == 0:
        self.logger.error("Failed to import private key")
        sys.exit(1)

    dataPath = srcDir + "/" + self.dataSource

    for root, folders, files in os.walk(dataPath):
        if not files:
            self.logger.info("No files found so skipping .....")
            continue
        for filename in folders + files:
            fullpath = os.path.join(root,filename)
            self.logger.info("Fullpath = {0}".format(fullpath))
            out_file = "/tmp/" + filename
            with open(fullpath, "rb") as f:
                status = gpg.decrypt_file(f, passphrase=passphrase, output=out_file)
                if status.ok:
                    s3Prefix = root.replace(srcDir + '/', '')
                    s3ObjKey = s3Prefix + "/" + filename
                    s3InPath = "s3://" + self.inBucketName + "/" + s3Prefix + "/" + filename
                    with open(out_file, "rb") as fl:
                        self.s3Client.upload_fileobj(fl,
                                                     self.inBucketName,
                                                     s3ObjKey
                                                    )
except Exception as e:
    print(str(e))
    self.logger.error(str(e))
    sys.exit(1)

Tout ce que je veux faire est d'extraire la paire clé et valeur du gestionnaire AWS Secrets et d'importer la clé et ensuite décrypter le fichier.

Comme vous le savez tous, JSON n'interprète pas les caractères de nouvelle ligne dans une valeur multi-lignes, de sorte que GPG import_keys ne parvient pas à importer la clé privée. Si je lis juste un fichier local ayant la même clé privée, pas de problème. S'il vous plaît laissez-moi savoir s'il existe une solution de contournement pour ce problème?

Key: private_key
value: -----BEGIN PGP PRIVATE KEY BLOCK-----
Version: GnuPG v2.0.22 (GNU/Linux)

lQO+BF37qDIBCADXq0iJVRYFb43+YU8Ts63hDgZl49ZNdnDVhd9H0JMXRHqtPqt9
bbFePPN47NRe6z6GsbPaPmDqEE9l3KjFnSZB/yCii+2wHZR0ij2g3ATbiAbOoQQy
I6bbUADmHtcfIJByoXVoDk489nUPt84Xyp1lHiBfCtUmq4w62Okq6InlRhxjxcEx
VvSXaCY8YnEXUAgNGpvcKHDejGS9V4djh7r7lgJ/Y+3Xb2eepOfiaCx2Cn8ZMI0q
7eWH0MmSeR4ueOLeb79ZKjpJraBfV91XplgHHiM18oECWWwsQCFiwi1GVOLpX6Fh
HIoUyaRAW2vZyFcNnO7iLbetie6fE884lfHxABEBAAH+AwMCO+Qoh7o3GWVga9f2
gHEeuGGH4KB3aspQZt/zwKpx7YlDB/uLd4q7JQt35nIH6pfYdMwgQt001CRhsGvX
QVKIkvipQvJZgCO8Nix7xYCukH0cI4TXD7S9BmRNMCPi74+Q1J3cDfKHCseynMNF
GzBeCDx6LW3CVfKKs0Mc2ecSl0c8gxaPDi3AfACRMefEAuVQyo82qJKjpI+O/Yik
z40C5OgK0XfetKstxcH4B0bx0o/PrUpYFM/gHHgFkbpVg5citcvFY4VcEkWryVcg
yF0qBPXP0OKBtCUU1ZGiCwRJy8iGd/dOOICcSCfMNy+jzzM3FSVzei69x7MYt3xu
IzCsmHpDvpdL7tiDDHgwajZeFFPTzf7Ic90K6TapQ3H59xPMxnL9K5o9rP1glRY0
8e4zYjYxg9A6Yl3K5zdqs+M1A3Os70HUlWZXZ4LQNcidPd1rhnPnm9eXkyV2ScXl
dE38aOA5pnrL0WZUM3/OLAToMP6h4rjw9WLqqgWlrl6yz9bhZrfRxlhZaEtNs1bi
pgrmPK/a5fK++BjMSuA94EkXTVNjKWNQBzcmrff27M1TMwN+34NWj3dk/a1gyflP
QZgK3MT+0GaMCcvy1EoZ87ffLQrWwFJOw5nT83yG7VBbuerSEk/tk30bxmYN6HzO
zvQgSjDiiH+ANXVupnzDjjBREmH6V1Hv+7Q0vrjKQHd3eYvKJpAWfFr9kO8DzKck
ZkSMj487SjlHbh33z1yupuwAtjyYQ5tN1adSlDa92t0Q08udnFDQtxXEnL6rw/Du
llEuCEVC9UYcNwwQGMsGXQBFFfj1389WHr0hkSOvyS1nPiIku5kNXDhSWq7/okTS
FwnCt+wbZa6TWbXjwKzHzu4LOarV1s8DnYHKNH6HHIqsVR2oJuIuqhyREAqjeP/T
3bQjQXV0b2dlbmVyYXRlZCBLZXkgPG1laHVsQHBoZWFhLm9yZz6JATkEEwECACMF
Al37qDICGy8HCwkIBwMCAQYVCAIJCgsEFgIDAQIeAQIXgAAKCRDO+i9CZ70SvqMn
CACCmdzqZW68j1E45XTHz3fvqdft6fXOyrlMuDdcH2y7Zrl5JS7PlCeHzIcsSMlH
wDYpCG8km7nwZsnWqKsOXFWq1nq/j7Kv5AzR7UmPzTw/1HFSVhIFA0ZZMHAnwp7Y
bcAT+ssvo4To9CjzRp/ZI1k26RFXPWuXETa41DBIVz13Ss4SIaf7UG9FQ55o+2BA
TP48yCQqktiWOoZ0rV1ALSFlE4Gs3UWHcYxxCABA0JB4+FuCRfB8QMreLwFb47wc
dIitbVl0mQx5IXCkqhJKqR62rRy25Put4xnPhXGtXqfoYDVYvYvlsl/FA35cX+Z1
QODnLq/jQ7ZPdaFC7cFqxztk
=RvGa
-----END PGP PRIVATE KEY BLOCK-----

Key: passphrase
Value: secret123


0 commentaires

3 Réponses :


0
votes

Secrets Manager ne vous oblige pas à stocker les données au format JSON, il peut stocker des chaînes arbitraires ou des données binaires .

Vous pouvez soit choisir de tout casser et de le stocker dans des secrets séparés, soit utiliser un format de données prenant en charge de nouvelles lignes comme XML.


2 commentaires

SecretBinary n'est pas pris en charge dans la console. Il faut utiliser la commande AWS CLI "aws secretsmanager create-secret --name private-pgp-key --secret-binary file: //private_key.asc --region us-east-1". Le secret est créé mais lors du décodage à l'aide du code fourni par AWS, il génère une erreur "Remplissage incorrect". Veuillez noter que les données de la clé privée sont des données ASCII.


Si c'est ASCII, vous pouvez simplement le stocker sous forme de chaîne. Si vous souhaitez utiliser la console, allez dans la console Secrets Manager et cliquez sur "Stocker un nouveau secret" -> "Autre type de secret" -> "Plaintext" puis collez la clé GPG dans la zone de texte.



1
votes

Je dois utiliser le format base64 pour stocker la clé PGP comme suit.

import base64
import gnupg

try:
    gpg = gnupg.PGP(gnupghome="/home/guest/GPG")
    input_data = gpg.gen_key_input(key_type='RSA',
                                   key_length=2048,
                                   name_email="guest@xyz.com"
                                   passphrase="pass123")
    key = gpg.gen_key(input_data)
    ascii_armored_public_key = gpg.export_keys(key.fingerprint, armor=True)
    ascii_armored_private_key = gpg.export_keys(key.fingerprint, True, armor=True)
    b64_encoded_private_key = base64.b64encode(ascii_armored_private_key.encode())

    binaryPrivKeyFile = "/tmp/b64encoded_private_key.asc"
    with open(binaryPrivKeyFile, 'wb') as bPrivFile:
        bPrivFile.write(b64_encoded_private_key)
except Exception as e:
    print(str(e))
    sys.exit(1)

Nous devons maintenant stocker b64encoded_private_key.asc dans AWS Secrets Manager comme suit.

$ aws secretsmanager create-secret --name private-key --secret-binary fileb: //b64encoded_private_key.asc --region us-east-1

Nous ne pouvons pas stocker la phrase de passe dans le même secret, nous devons donc créer un secret distinct pour la phrase de passe comme suit.

$ aws secretsmanager create-secret --name passwd --secret-string '{"passphrase": "pass123"}' --region us-east-1

REMARQUE: le type de secret pour la clé privée est binaire tandis que pour la phrase de passe, il s'agit de texte brut.

Après avoir créé le secret, nous pouvons utiliser le code du gestionnaire de secrets AWS pour obtenir la clé privée et la phrase de passe. Le code AWS Secrets Manager décode la clé privée à l'aide de la méthode base64.b64decode (..).


0 commentaires

0
votes

La clé privée que vous stockerez n'aura pas de caractères spéciaux comme '\ n', '\ r'. Pour résoudre ce problème, copiez la sortie de private_key, qui contiendra des caractères spéciaux.

private_key = open ('/ home / ec2-user / GPG / test_private_key.asc'). read () private_key

Placez cette clé privée dans votre secret et récupérez-la en utilisant get_secret ()

Remarque: vous verrez le '' supplémentaire dans la clé privée qui utilisera load_json, pour gérer que vous devez utiliser private_key.replace ('\ n', '\ n')

Votre code ressemblera à ci-dessous.

private_key = newdict ['private_key'] private_key = private_key.replace ('\ n', '\ n')

Ensuite, vous pourrez récupérer les clés.


0 commentaires