0

当前尝试使用来自 AWS 机密管理器的用户凭据连接 sftp 服务器,并且密码包含双引号特殊字符,从而导致问题。下面是示例代码,

    import sys
    import boto3
    import base64
    from botocore.exceptions import ClientError
    import hashlib
    import pysftp


    secret_name = "SFTP_TEST"
    region_name = "eu-central-1"
    _SFTP_DETAILS = {}

    pass1= "E?%/?s\"N1sS#OnXN"
    cnopts = pysftp.CnOpts()
    cnopts.hostkeys = None
    cnopts.log = True
    basepath ='/test/'

    def get_connect(secret_name,region_name):
        session = boto3.session.Session()
        client = session.client(service_name='secretsmanager', region_name=region_name.strip())
        if secret_name.strip() not in _SFTP_DETAILS:
            try:
                get_secret_value_response = client.get_secret_value(SecretId=secret_name.strip())
            except Exception as e:
                raise e
            else:
                if 'SecretString' in get_secret_value_response:
                    secret = get_secret_value_response['SecretString']
                    print("Secret value Original ==>",secret)
                    secretValue = json.loads(secret)
                    awsValue = secretValue.get(secret_name.strip())
                    sftpStrValue = awsValue.replace("“","\"").replace("”","\"")
                    print("Secrete Value After JSON loader ==>",sftpStrValue)
                    sftpValues = json.loads(sftpStrValue)
                    _HOST_NAME = sftpValues.get("url")
                    _USER_NAME = sftpValues.get("username")
                    _PASSWORD = sftpValues.get("password")
                    print("Secrete Password:::" + _PASSWORD) 
                    _PORT = sftpValues.get("port")
                    with pysftp.Connection(_HOST_NAME, username=_USER_NAME, password=_PASSWORD, port=int('22'), cnopts=cnopts) as sftp:
                        print("I am in SFTP SERVER")
                        for attr in sftp.listdir_attr(basepath):
                            print("listdir is",attr)    
                    _SFTP_DETAILS[secret_name] = [_HOST_NAME.strip(),_USER_NAME.strip(),_PASSWORD.strip(),_PORT.strip()]
        return _SFTP_DETAILS[secret_name.strip()] 
get_connect()

在这里,我们从 AWS 机密管理器获取密码 (_PASSWORD) 并传递给 pysftp.Connection 函数,但无法连接。

在这里,如果我是硬编码密码,即上面代码中的 pass1,那么它可以正常工作并且能够连接。无法从 python 或 AWS Secrets Manager 得到问题。

您能否告诉我为什么在硬编码正常工作时来自 AWS 机密管理器的密码不起作用。这里要求将密码保存在 AWS Secrets Manager 中。

对此的任何帮助表示赞赏。

4

1 回答 1

0

我在 AWS Secret Manager 控制台中将此作为我的秘密:

密钥 | 秘密值

测试键 | afgvbq3tg"afsvgqag"af.qw/asffq3gvd13

如果我通过以下方式获得 secret_value:

secret = client.get_secret_value(SecretId="test_secret_ron")

并打印secret["SecretString"],结果将如下所示:

'{"TEST_KEY":"afgvbq3tg\\"afsvgqag\\"af.qw/asffq3gvd13"}'

一旦您通过以下方式将此字符串转换为字典:

json.loads(secret["SecretString"])

预期的字典将反映字符串的正确格式:

{'TEST_KEY': 'afgvbq3tg"afsvgqag"af.qw/asffq3gvd13'}

在此处输入图像描述

于 2019-11-08T09:18:36.213 回答