3 Run cumanage operations in an AWS hosted stack. 11 from Crypto.Cipher
import AES
12 from Crypto.Protocol.KDF
import PBKDF2
13 from Crypto.Util
import Counter
14 from pwgen
import pwgen
20 SALT =
'LTzkm1w/p3ReDm9kmfmnwQ==' 26 '''Return key using PBKDF2''' 31 salt.encode(ENCODING),
37 '''Encrypt given data using password and PBKDF2 key stretching''' 39 aes_cipher = AES.new(key, AES.MODE_CTR, counter=Counter.new(128))
40 return aes_cipher.encrypt(data.encode(ENCODING))
44 '''Manage Client Certificates''' 47 def setup_args(self, parser):
48 self.add_subcommand(UploadCertificateCommand)
52 '''Upload Client Certificates to AWS''' 56 def setup_args(self, parser):
57 self.add_argument(
'--secret-id', action=
'store', required=
True,
58 help=
'Path for secret storage')
59 self.add_argument(
'--certificate-file', action=
'store',
60 help=
'Certificate file to encrypt and upload')
61 self.add_argument(
'--output',
'-o', action=
'store',
62 help=
'Name of output file if specified')
66 def read_file(filename):
67 with open(filename,
'r')
as fh:
70 secret_id = args.secret_id
71 if args.certificate_file:
72 certificate = read_file(args.certificate_file)
74 certificate = sys.stdin.read()
76 private_key = pwgen(50)
83 with open(args.output,
'wb')
as output:
84 output.write(encrypted_certificate)
86 print(encrypted_certificate)
89 '<green>Encrypted and Uploaded Certificate</green>',
96 '<green>Created/Updated Encryption Keys: %s</green>' % (
97 ', '.join(secret_arns)),
103 '''Update new secrets value for `secret_id`''' 105 for region
in AWS_REGIONS:
106 client = boto3.client(
'secretsmanager', region_name=region)
109 secret_dictionary[
'salt'] = salt
110 secret_dictionary[
'password'] = private_key
119 '''Return the JSON data for the provided `secret_id` 121 If there is no secret for the provided `secret_id` return an empty 125 response = client.get_secret_value(SecretId=secret_id)
126 return json.loads(response[
'SecretString'])
127 except client.exceptions.ResourceNotFoundException:
132 '''Create or Update secret value of the provided `secret_id`''' 133 json_secrets = json.dumps(secrets)
135 response = client.create_secret(
137 SecretString=json_secrets
140 response = client.put_secret_value(
142 SecretString=json.dumps(secrets)
144 return response[
'ARN']
def get_secret_value(client, secret_id)
def __derive_key__(password, salt=None)
def __encrypt_data__(password, salt, data)
def put_secret_value(client, secret_id, secrets)
def update_secrets_value(secret_id, salt, private_key)