Używam pakietu python-gnupg do tworzenia publicznego i prywatnego klucza GPG. Wygenerowany klucz prywatny, który przechowuję w menedżerze tajemnic AWS w następujący sposób.

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

Chcę tylko wyodrębnić parę klucz i wartość z menedżera AWS Secrets i zaimportować klucz, a później odszyfrować plik.

Jak wszyscy wiecie, JSON nie interpretuje znaków nowego wiersza w wartości wieloliniowej, więc GPG import_keys nie może zaimportować klucza prywatnego. Jeśli po prostu przeczytam plik lokalny z tym samym kluczem prywatnym, nie ma problemu. Daj mi znać, jeśli istnieje obejście tego problemu?

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)
2
Mehul 20 grudzień 2019, 06:00

3 odpowiedzi

Secrets Manager nie wymaga przechowywania danych w formacie JSON, może przechowywać dowolne ciągi znaków lub dane binarne.

Możesz albo podzielić wszystko i przechowywać w osobnych sekretach, albo użyć formatu danych, który obsługuje nowe wiersze, takie jak XML.

0
JoeB 20 grudzień 2019, 21:19
SecretBinary nie jest obsługiwany w konsoli. Należy użyć polecenia AWS CLI "aws secretsmanager create-secret --name private-pgp-key --secret-binary file://private_key.asc --region us-east-1" . Sekret zostaje utworzony, ale podczas dekodowania przy użyciu kodu dostarczonego przez AWS zgłasza błąd „Nieprawidłowe wypełnienie”. Należy pamiętać, że dane klucza prywatnego to dane ASCII.
 – 
Mehul
24 grudzień 2019, 23:20
Jeśli jest to ASCII, możesz po prostu zapisać go jako ciąg. Jeśli chcesz użyć konsoli, przejdź do konsoli Menedżera sekretów i kliknij „Zapisz nowy sekret” -> „Inny typ sekretu” -> „Zwykły tekst”, a następnie wklej klucz GPG w polu tekstowym.
 – 
JoeB
26 grudzień 2019, 08:08

Muszę użyć formatu base64 do przechowywania klucza PGP w następujący sposób.

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)

Teraz musimy zapisać b64encoded_private_key.asc do menedżera sekretów AWS w następujący sposób.

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

Nie możemy przechowywać hasła w tym samym sekretie, więc musimy utworzyć oddzielny sekret dla hasła w następujący sposób.

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

UWAGA: Typ tajny dla klucza prywatnego jest binarny, podczas gdy dla hasła jest to zwykły tekst.

Po utworzeniu sekretu możemy użyć kodu menedżera sekretów AWS, aby uzyskać klucz prywatny i hasło. Kod AWS Secrets Manager dekoduje klucz prywatny za pomocą metody base64.b64decode(..).

3
Mehul 4 luty 2020, 02:38

Klucz prywatny, który będziesz przechowywać, nie będzie zawierał znaków specjalnych, takich jak „\n”, „\r”. Aby rozwiązać ten problem, skopiuj dane wyjściowe private_key, które będą zawierały znaki specjalne.

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

Umieść ten klucz prywatny w swoim sekretie i uzyskaj go za pomocą get_secret()

Uwaga: zobaczysz dodatkowy '' w kluczu prywatnym, który będzie korzystał z load_json, aby to obsłużyć, musisz użyć private_key.replace('\n','\n')

Twój kod będzie wyglądał jak poniżej.

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

Wtedy będziesz mógł zdobyć klucze.

0
Kiran Mane 19 listopad 2020, 15:11