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
3 Réponses :
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.
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.
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 (..).
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.