0

以下の Lambda スクリプトは、AWS アカウントを Trend Micro DSM (AWS アカウントにもある) に追加することになっています。通信を可能にするアカウント間にエンドポイントが設定されます。400 で失敗し、アカウントを追加できません:

ログ:

2020-11-06T13:28:37.612+00:00 開始 RequestId: 074eff37-00cc-480b-affb-2e28f0e2a8af バージョン: $LATEST

2020-11-06T13:28:42.034+00:00 役割を想定: arn:aws:iam::414025531860:role/pcs-pipeline-role

2020-11-06T13:28:42.575+00:00 想定成功!

2020-11-06T13:28:42.575+00:00 /var/runtime/botocore/vendored/requests/api.py:72: DeprecationWarning: 'botocore.vendored.requests' の get() 関数を使用しています。この依存関係は Botocore から削除され、2021 年 1 月 30 日以降に Lambda から削除されます。https://aws.amazon.com/blogs/developer/removing-the-vendored-version-of-requests-from-botocore/ . requests パッケージをインストールし、「要求を直接インポート」して、代わりに requests.get() 関数を使用します。

2020-11-06T13:28:42.575+00:00 非推奨の警告

2020-11-06T13:28:44.927+00:00 Lambda を実行するためのパブリック IP、34.247.33.230/32 を許可して、Trend DSM を一時的に呼び出します

2020-11-06T13:28:45.070+00:00 完了!

2020-11-06T13:28:50.076+00:00 Trend DSM に Org テナントとしてログイン

2020-11-06T13:28:50.076+00:00 /var/runtime/botocore/vendored/requests/api.py:72: DeprecationWarning: 'botocore.vendored.requests' の post() 関数を使用しています。この依存関係は Botocore から削除され、2021 年 1 月 30 日以降に Lambda から削除されます。https://aws.amazon.com/blogs/developer/removing-the-vendored-version-of-requests-from-botocore/ . requests パッケージをインストールし、「要求を直接インポート」して、代わりに requests.post() 関数を使用します。

2020-11-06T13:28:50.076+00:00 非推奨の警告

2020-11-06T13:28:50.233+00:00 /var/runtime/urllib3/connectionpool.py:988: InsecureRequestWarning: 検証されていない HTTPS 要求がホスト 'gdc-pcs-tre-dsmelb-fbsp95snsrjw-2115947587.eu に対して行われています-west-1.elb.amazonaws.com'. 証明書検証を追加することを強くお勧めします。参照: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings

2020-11-06T13:28:50.233+00:00 InsecureRequestWarning,

2020-11-06T13:28:50.319+00:00 200

2020-11-06T13:28:50.319+00:00 ログインしました!

2020-11-06T13:28:50.319+00:00 トレンド組織テナントのクラウド アカウントを取得しています...

2020-11-06T13:28:50.319+00:00 /var/runtime/botocore/vendored/requests/api.py:72: DeprecationWarning: 'botocore.vendored.requests' の get() 関数を使用しています。この依存関係は Botocore から削除され、2021 年 1 月 30 日以降に Lambda から削除されます。https://aws.amazon.com/blogs/developer/removing-the-vendored-version-of-requests-from-botocore/ . requests パッケージをインストールし、「要求を直接インポート」して、代わりに requests.get() 関数を使用します。

2020-11-06T13:28:50.319+00:00 非推奨の警告

2020-11-06T13:28:50.493+00:00 /var/runtime/urllib3/connectionpool.py:988: InsecureRequestWarning: 検証されていない HTTPS 要求がホスト 'xyz-abc-tre-dsmelb-fbsp95snsrjw-7443282981.eu に対して行われています-west-1.elb.amazonaws.com'. 証明書検証を追加することを強くお勧めします。参照: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings

2020-11-06T13:28:50.493+00:00 InsecureRequestWarning,

2020-11-06T13:28:50.528+00:00 取得しました!

2020-11-06T13:28:50.528+00:00 テナント アカウントが既にトレンド DSM 組織テナントにあるかどうかを確認しています

2020-11-06T13:28:50.528+00:00 見つかりません

2020-11-06T13:28:50.528+00:00 トレンド クラウド アカウントとして 11994547362545 を追加しています...

2020-11-06T13:28:50.528+00:00 /var/runtime/botocore/vendored/requests/api.py:72: DeprecationWarning: 'botocore.vendored.requests' の post() 関数を使用しています。この依存関係は Botocore から削除され、2021 年 1 月 30 日以降に Lambda から削除されます。https://aws.amazon.com/blogs/developer/removing-the-vendored-version-of-requests-from-botocore/ . requests パッケージをインストールし、「要求を直接インポート」して、代わりに requests.post() 関数を使用します。

2020-11-06T13:28:50.528+00:00 非推奨の警告

2020-11-06T13:28:50.693+00:00 /var/runtime/urllib3/connectionpool.py:988: InsecureRequestWarning: 検証されていない HTTPS 要求がホスト 'xyz-abc-tre-dsmelb-fbsp95snsrjw-7443282981.eu に対して行われています-west-1.elb.amazonaws.com'. 証明書検証を追加することを強くお勧めします。参照: https://urllib3.readthedocs.io/en/latest/advanced-usage.html#ssl-warnings

2020-11-06T13:28:50.693+00:00 InsecureRequestWarning,

2020-11-06T13:28:51.373+00:00 400

2020-11-06T13:28:51.373+00:00 失敗!




`No lines are selected.
import os
import json
import time
import boto3
from botocore.vendored import requests
import layer as utils
def handler(event, context):
    try:
        # Extract the Job ID
        job_id = event['CodePipeline.job']['id']
        event_data = utils.parse_event_data(event)
        print(event_data)
        trend_micro_deep_security_integration(event_data['TenantAccountId'], event_data['Organisation'])
        utils.put_job_success(job_id)
    except Exception as err:
        utils.put_job_failure(job_id, str(err))
def trend_micro_deep_security_integration(tenant_account_id, tenant_organisation):
    #retrieve trend tenant password from ssm param store
    client = boto3.client('ssm', region_name='eu-west-1')    
    TREND_TENANT_PASSWORD = client.get_parameter(Name='TrendTenantPassword', WithDecryption=True)['Parameter']['Value']
    #assume role in aws provider account for trend dsm
    sts_client = boto3.client('sts')
    trend_account_role_arn = 'arn:aws:iam::654533721364:role/{}'.format(os.environ['DEPLOY_ROLE'])
    TREND_SESSION = utils.get_sts_session(sts_client, trend_account_role_arn)
    #determine public ip of executing lambda function
    public_ip = requests.get('https://checkip.amazonaws.com').text.rstrip()    
    global LAMBDA_PUBLIC_IP
    LAMBDA_PUBLIC_IP = '{}/32'.format(public_ip)
    #add lambda public ip as temp ingress cidr ip
    SG_ID = 'sg-01ct911f8ch7d2ed5'
    changed = authorize_trend_elb_ingress(TREND_SESSION, SG_ID)
    if changed:
        time.sleep(5)
    org_name = tenant_organisation.upper().strip()
    #log into trend dsm
    payload = get_trend_auth_payload_json(org_name, TREND_TENANT_PASSWORD)
    cookie = get_trend_org_cookie(org_name, payload)
    # check and if required, add tenant account into their trend tenant for the assigned org
    dsm_account_names = get_trend_org_cloud_accounts(cookie)
    if not is_account_in_trend_dsm(dsm_account_names, tenant_account_id):
        success = add_trend_cloud_account(cookie, tenant_account_id)
    else:
        success = True
    # always remove temp ingress rule
    revoke_trend_elb_ingress(TREND_SESSION, SG_ID)
    #if any error when adding account, throw exception
    if not success:
        raise Exception("Failed to add tenant as cloud account in Trend Deep Security Manager!")
    print("Trend Micro Deep Security Manager integration complete!")
    
## TREND DEEP SECURITY HELPER FUNCTIONS ###
def trend_sg_ingress_rule_exists(sg_rules):
    for elem in sg_rules:
        matches = [ x for x in elem['IpRanges'] if x['CidrIp'] == LAMBDA_PUBLIC_IP ]
        if any(matches):
            return True
    return False
def authorize_trend_elb_ingress(TREND_SESSION, SECURITY_GROUP_ID):
    ec2 = TREND_SESSION.resource('ec2', region_name='eu-west-1')
    elb_security_group = ec2.SecurityGroup(SECURITY_GROUP_ID)
    if trend_sg_ingress_rule_exists(elb_security_group.ip_permissions):
        return False
    print("Allowing public IP for executing Lambda, {}, to temporarily call Trend DSM".format(LAMBDA_PUBLIC_IP))
    elb_security_group.authorize_ingress(
        CidrIp=LAMBDA_PUBLIC_IP,
        FromPort=777,
        ToPort=777,
        IpProtocol='tcp',
    )
    print("DONE!")
    return True
def revoke_trend_elb_ingress(TREND_SESSION, SECURITY_GROUP_ID):
    ec2 = TREND_SESSION.resource('ec2', region_name='eu-west-1')
    elb_security_group = ec2.SecurityGroup(SECURITY_GROUP_ID)
    if not trend_sg_ingress_rule_exists(elb_security_group.ip_permissions):
        return False
    print("Revoking public IP for executing Lambda, {}, from Trend DSM ELB SG".format(LAMBDA_PUBLIC_IP))
    elb_security_group.revoke_ingress(
        CidrIp=LAMBDA_PUBLIC_IP,
        FromPort=777,
        ToPort=777,
        IpProtocol='tcp',
    )
    print("DONE!")
def is_account_in_trend_dsm(dsm_names, account_id):
    print("Checking if tenant account already in Trend DSM Org Tenant")
    for dsm_account_name in dsm_names:
        if account_id == dsm_account_name[-12:]:
            print("Found!")
            return True
    
    print("Not found")
    return False    
def get_trend_org_cookie(org_name, payload):
    print("Logging into Trend DSM as Org tenant")
    headers = {'content-type': "application/json", 'accept': "application/json"  }
    r = requests.post(
        url = "https://xyz-abc-tre-dsmelb-fbsp95snsrjw-2912957566.eu-west-1.elb.amazonaws.com/rest/authentication/login",
        headers= headers,
        data = payload,
        verify=False
    )
    print(r.status_code)
    print("Logged in!")
    return r.text
def get_trend_auth_payload_json(org_name, org_tenant_password):
   auth = {
       'dsCredentials' : { 'userName' : 'MasterAdmin' , 'password' : org_tenant_password, 'tenantName' : org_name}
   }
   return json.dumps(auth)
def get_trend_org_cloud_accounts(cookie_string):
    cookie = {'sID': cookie_string}
    headers = {'content-type': "application/json", 'accept': "application/json"  }
    print("Getting cloud accounts for Trend org tenant...")
    r = requests.get(
        url = "https://xyz-abc-tre-dsmelb-fbsh952n1rbw-2185847414.eu-west-1.elb.amazonaws.com/rest/cloudaccounts/",
        headers= headers,
        cookies=cookie,
        verify=False
    )
    resp = r.json()['ListCloudAccountsResponse']
    print("Retrieved!")
    return [ x['name'] for x in resp['cloudAccount'] ]
def add_trend_cloud_account(cookie_string, account_id):
    cookie = {'sID': cookie_string}
    headers = {'content-type': "application/json", 'accept': "application/json"  }
    info = {}
    info['AddAwsAccountRequest'] = {}
    info['AddAwsAccountRequest']['crossAccountRole'] = {}
    info['AddAwsAccountRequest']['crossAccountRole']['roleArn'] = 'arn:aws:iam::{}:role/gdc-pcs-trend-micro-dsm-role'.format(account_id)
    info['AddAwsAccountRequest']['crossAccountRole']['externalId'] = '7F4DC12D-53B2-1BEX-7CB7-8759CDADEB71'
    print('Adding {} as Trend cloud account...'.format(account_id))
    r = requests.post(
        url = "https//xyz-abc-tre-dsmelb-fbsp95snsrjw-7443282981.eu-west-1.elb.amazonaws.com/rest/cloudaccounts/aws",
        headers= headers,
        cookies=cookie,
        data = json.dumps(info),
        verify=False
    )
    print(r.status_code)
    if r.status_code == 200:
        print("Done!")
        return True
    else:
        print("Failed!")
        return False`



4

0 に答える 0