def transform()

in source/lambda/es_loader/siem/sf_okta.py [0:0]


def transform(logdata):
    # event.outcome フィールドへ情報を投入
    if logdata.get('outcome'):
        if logdata.get('outcome', {}).get('result'):
            outcome = logdata['outcome']['result'].lower()
            if outcome == 'success' or outcome == 'allow':
                logdata['event']['outcome'] = 'success'
            elif outcome == 'failure' or outcome == 'deny':
                logdata['event']['outcome'] = 'failure'
            else:
                logdata['event']['outcome'] = 'unknown'

    # User name や email などのユーザー関連の情報を ECS フィールドとしてマッピング
    if logdata.get('actor', {}).get('type'):
        if logdata['actor']['type'] == 'User':
            q = r"^(?P<name>.*)@(?P<domain>.*)$"
            n = re.match(q, logdata['actor']['alternateId'])
            if n:
                name_domain_new_dict = {
                    'user': {'domain': n.group('domain'), 'name':  n.group('name'), 'email': logdata['actor']['alternateId']}}
                utils.merge_dicts(logdata, name_domain_new_dict)
            user_new_dict = {
                'client': {'user': {'full_name': logdata['actor']['displayName'], 'id': logdata['actor']['id']}},
                'source': {'user': {'full_name': logdata['actor']['displayName'], 'id': logdata['actor']['id']}},
                'related': {'user': logdata['actor']['displayName']}}
            utils.merge_dicts(logdata, user_new_dict)

    # 独自フィールドに対して Prefix を付与
    # Okta 独自のフィールドと他ログのフィールドで Type のコンフリクト等が発生するのを防ぐ

    # logdata 直下にある Okta 独自フィールド名
    # フィールド名が camel case のものは snake case へ変換する
    okta_fields = ['actor', 'debugContext',
                   'request', 'outcome', 'transaction', 'authenticationContext', 'securityContext', 'displayMessage',
                   'uuid', 'version', 'severity', 'published', 'legacyEventType', 'eventType']
    for field in okta_fields:
        if logdata.get(field):
            snake_field_name = str_camel_to_snake(field)
            tmp_okta_dict = set_prefix(
                logdata[field], snake_field_name, 'okta')
            utils.merge_dicts(logdata, tmp_okta_dict)
            del logdata[field]

    # target フィールドは独自フィールドだが中身が配列となっている場合があるため別処理
    if logdata.get('target'):
        target_new_dict = {'okta': {'target': [logdata.get('target')]}}
        utils.merge_dicts(logdata, target_new_dict)

        for key in logdata['target']:
            if key['type'] == 'AppInstance':
                app_new_dict = {
                    'okta': {'target': {
                        'app_name': {
                            'alternate_id': key['alternateId'],
                            'display_name': key['displayName']
                        }}}}
                utils.merge_dicts(logdata, app_new_dict)

    # Client フィールドは ECS も混ざっているため、一つずつ対応
    tmp_okta_client_dict = {'okta': {
        'client': {
            'device': logdata['client']['device'],
            'ip': logdata['client']['ipAddress'],
            'user_agent': dict_camel_to_snake(logdata['client']['userAgent']),
            'id': logdata['client']['id'],
            'zone': logdata['client']['zone']
        }}}
    utils.merge_dicts(logdata, tmp_okta_client_dict)

    # 不要な独自フィールドを削除
    del logdata['target']
    del logdata['client']['device']
    del logdata['client']['ipAddress']
    del logdata['client']['userAgent']
    del logdata['client']['geographicalContext']
    del logdata['client']['id']
    del logdata['client']['zone']

    return logdata