예제 #1
0
def get_notifyslack(trace_id, organization_id, notify_code):
    pm_logger = common_utils.begin_logger(trace_id, __name__,
                                          inspect.currentframe())
    # 全てのチェックを行い、エラーがあった場合はログを出力してエラーレスポンスを返します。
    list_error = validate_notifyslack(notify_code)
    if list_error:
        return common_utils.error_validate(MsgConst.ERR_REQUEST_201,
                                           HTTPStatus.UNPROCESSABLE_ENTITY,
                                           list_error, pm_logger)

    # Slack通知設定情報を取得します。
    try:
        result = pm_orgNotifySlack.query_key(trace_id, organization_id,
                                             notify_code, True)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    if not result:
        return common_utils.get_response_by_response_body(HTTPStatus.OK, [])

    # return data
    response = common_utils.get_response_by_response_body(
        HTTPStatus.OK, result)
    return common_utils.response(response, pm_logger)
예제 #2
0
def create_notifyslack(trace_id, organization_id, data_body):
    pm_logger = common_utils.begin_logger(trace_id, __name__,
                                          inspect.currentframe())

    # リクエストボディのJSONでパースエラーが発生した場合は、ログを出力してエラーレスポンスを返します。
    try:
        body_object = json.loads(data_body)
        notify_code = body_object['notifyCode']
        webhook_url = body_object['webhookUrl']
    except Exception as e:
        return common_utils.error_exception(MsgConst.ERR_REQUEST_202,
                                            HTTPStatus.BAD_REQUEST, e,
                                            pm_logger, True)

    mentions = None
    if common_utils.check_key('mentions', body_object):
        mentions = body_object['mentions']

    # バリデーションチェックを行います。
    list_error = validate_notifyslack(notify_code, webhook_url)
    if list_error:
        return common_utils.error_validate(MsgConst.ERR_REQUEST_201,
                                           HTTPStatus.UNPROCESSABLE_ENTITY,
                                           list_error, pm_logger)

    # Slack通知設定情報を作成します。
    try:
        pm_orgNotifySlack.create(trace_id, organization_id, notify_code,
                                 webhook_url, mentions)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_DB_403,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    # get record created
    try:
        org_notify_slack_created = pm_orgNotifySlack.query_key(
            trace_id, organization_id, notify_code, True)
    except PmError as e:
        return common_utils.error_exception(MsgConst.ERR_402,
                                            HTTPStatus.INTERNAL_SERVER_ERROR,
                                            e, pm_logger, True)

    # return data
    response = common_utils.get_response_by_response_body(
        HTTPStatus.CREATED, org_notify_slack_created)
    return common_utils.response(response, pm_logger)
예제 #3
0
    def test_create_notifyslack_handler_success_record_exist(self):
        test_user = user_id.format(str(3))
        path_parameters = {"organization_id": organization_id}
        body_request = {
            'notifyCode': notify_code,
            'webhookUrl': webhook_url,
            'mentions': mentions
        }

        event_mock = event_create.get_event_object(
            path_parameters=path_parameters,
            trace_id=test_user,
            body=json.dumps(body_request))

        response = notifymail.create_notifyslack_handler(event_mock, {})
        response_body = json.loads(response['body'])

        org_notify_slack = pm_orgNotifySlack.query_key(
            trace_id, organization_id, body_request['notifyCode'], True)

        # check database
        self.assertEqual(org_notify_slack['organizationId'],
                         path_parameters['organization_id'])
        self.assertEqual(org_notify_slack['notifyCode'],
                         body_request['notifyCode'])
        self.assertEqual(org_notify_slack['webhookUrl'],
                         body_request['webhookUrl'])
        self.assertEqual(org_notify_slack['mentions'],
                         body_request['mentions'])

        # check response
        self.assertEqual(response['statusCode'], HTTPStatus.CREATED)
        self.assertEqual(org_notify_slack['organizationId'],
                         response_body['organizationId'])
        self.assertEqual(org_notify_slack['notifyCode'],
                         response_body['notifyCode'])
        self.assertEqual(org_notify_slack['webhookUrl'],
                         response_body['webhookUrl'])
        self.assertEqual(org_notify_slack['mentions'],
                         response_body['mentions'])
        self.assertEqual(org_notify_slack['createdAt'],
                         response_body['createdAt'])
        self.assertEqual(org_notify_slack['updatedAt'],
                         response_body['updatedAt'])
def execute_send_result_slack(trace_id, check_history_id, language):
    pm_logger = common_utils.begin_logger(trace_id, __name__,
                                          inspect.currentframe())

    # チェック結果テーブルのCheckHistoryIndexから、チェック履歴ID{CheckHistoryId}をキーとしてチェック結果一覧を取得します。
    try:
        list_check_result = pm_checkResults.query_history_index(
            trace_id, check_history_id)
    except PmError as e:
        msg_err = "チェック結果の取得に失敗しました。"
        pm_logger.error(msg_err)
        common_utils.write_log_pm_error(e, pm_logger, msg_err)
        return

    if (not list_check_result):
        msg_err = "チェック結果の取得に失敗しました。"
        pm_logger.error(msg_err)
        return

    # チェック結果一覧のうちの一つから、組織IDを取得します。
    organization_id = list_check_result[0]['OrganizationID']
    organization_name = list_check_result[0]['OrganizationName']
    project_name = list_check_result[0]['ProjectName']

    # 組織別Slack通知設定テーブルから、組織ID、通知コードCHECK_CISをキーとして設定情報を取得します。
    try:
        org_notify_slack = pm_orgNotifySlack.query_key(trace_id,
                                                       organization_id,
                                                       CommonConst.NOTIFY_CODE)
    except PmError as e:
        msg_err = "Slack設定情報の取得に失敗しました。:OrganizationID={0}, CheckCode={1}".format(
            organization_id, CommonConst.NOTIFY_CODE)
        pm_logger.error(msg_err)
        common_utils.write_log_pm_error(e, pm_logger, msg_err)
        return

    if (not org_notify_slack):
        msg_err = "Slack設定情報の取得に失敗しました。:OrganizationID={0}, CheckCode={1}".format(
            organization_id, CommonConst.NOTIFY_CODE)
        pm_logger.error(msg_err)
        return

    # S3から通知Slack設定ファイルを取得します。
    try:
        config = FileUtils.read_yaml(trace_id, CommonConst.S3_SETTING_BUCKET,
                                     CommonConst.NOTIFY_CONFIG_CIS_RESULT_MAIL)
    except PmError as e:
        msg_err = "通知Slack設定ファイルの取得に失敗しました。:s3://{0}/{1}".format(
            common_utils.get_environ(CommonConst.S3_SETTING_BUCKET),
            CommonConst.NOTIFY_CONFIG_CIS_RESULT_MAIL)
        pm_logger.error(msg_err)
        common_utils.write_log_pm_error(e, pm_logger, msg_err)
        return

    if language not in CommonConst.LANGUAGE_SUPPORT:
        language = CommonConst.LANGUAGE_DEFAULT

    path_file_template = config[
        CommonConst.KEY_GET_PATH_FILE_TEMPLATE_SLACK.format(language=language)]

    # メッセージ本文を作成します。
    try:
        template_message = FileUtils.read_decode(trace_id,
                                                 CommonConst.S3_SETTING_BUCKET,
                                                 path_file_template)
    except PmError as e:
        msg_err = "Slack通知本文テンプレートファイルの取得に失敗しました。:s3://{0}/{1}".format(
            common_utils.get_environ(CommonConst.S3_SETTING_BUCKET),
            path_file_template)
        pm_logger.error(msg_err)
        common_utils.write_log_pm_error(e, pm_logger, msg_err)
        return

    executed_date_time = date_utils.toString(
        date_utils.toDate(list_check_result[0]['ExecutedDateTime'],
                          date_utils.UTC), date_utils.PATTERN_YYYYMMDDHHMM,
        date_utils.get_time_zone_by_language(language))

    check_results = []
    for check_result in list_check_result:
        account_aws = CommonConst.AWS_ACCOUNT_MAIL.format(
            check_result['AWSAccount'][:4], check_result['AWSAccount'][4:8])
        check_result = {
            "accountAWS": account_aws,
            "okCount": check_result['OKCount'],
            "ngCount": check_result['NGCount'],
            "criticalCount": check_result['CriticalCount'],
            "managedCount": check_result['ManagedCount'],
            "errorCount": check_result['ErrorCount']
        }
        check_results.append(check_result)

    template = Template(template_message)
    context = {
        'organizationName': organization_name,
        'projectName': project_name,
        'executedDateTime': executed_date_time,
        'checkResults': check_results
    }
    body = template.render(context)
    mentions = slack_common.convert_command_slack(org_notify_slack['Mentions'])
    body = CommonConst.KEY_BODY_MESSAGE_SLACK.format(mentions=mentions,
                                                     body=body)

    notify_slack = {
        "username":
        config[CommonConst.KEY_USER_NAME_SLACK.format(language=language)],
        "icon_url":
        config['slack.iconurl'],
        "text":
        body
    }
    notify_slack = json.dumps(notify_slack)
    try:
        slack_common.send_message_slack(trace_id,
                                        org_notify_slack['WebhookURL'],
                                        notify_slack)
    except PmError as e:
        msg_err = "Slack通知のリクエスト送信に失敗しました。:OrganizationID={0}, CheckCode={1}".format(
            organization_id, CommonConst.NOTIFY_CODE)
        pm_logger.warning(msg_err)
        common_utils.write_log_pm_error(e, pm_logger, msg_err)
def check_result_notification(check_history_id, language):
    trace_id = check_history_id
    pm_logger = common_utils.begin_logger(trace_id, __name__,
                                          inspect.currentframe())
    try:
        list_check_result = pm_checkResults.query_history_index(
            trace_id, check_history_id)
    except PmError as e:
        pm_logger.error("チェック結果取得に失敗しました。: CheckHistoryID=%s",
                        check_history_id)
        return

    if (not list_check_result):
        pm_logger.error("チェック結果がありません。: CheckHistoryID=%s", check_history_id)
        return

    is_all_record_ok = True
    for check_result in list_check_result:
        if (check_result['NGCount'] > 0 or check_result['CriticalCount'] > 0
                or check_result['ErrorCount'] > 0):
            is_all_record_ok = False
            break

    # 全てOKだった場合は、ログを出力してこの処理をスキップします。
    if (is_all_record_ok is True):
        pm_logger.info("チェック結果が全て正常なため、結果通知処理をスキップします。")
        return

    organization_id = list_check_result[0]['OrganizationID']
    org_notify_mail_destinations = []

    # Lambda関数呼び出し時のPayloadには、チェック履歴IDをJSONとして渡します。
    payload = {'CheckHistoryId': check_history_id, 'Language': language}
    service_name = common_utils.get_service_name()
    stage = common_utils.get_stage()

    try:
        org_notify_mail_destinations = pm_orgNotifyMailDestinations.query_key(
            trace_id, organization_id, CommonConst.NOTIFY_CODE)
    except PmError as e:
        pm_logger.error("宛先の取得に失敗しました。結果通知処理をスキップします。")

    if (not org_notify_mail_destinations):
        pm_logger.info("宛先が未設定のため、結果通知処理をスキップします。")
    else:
        # セキュリティチェック結果通知メール送信処理のLambdaを非同期で呼び出します。
        function_name = CommonConst.EXECUTE_SEND_RESULT_EMAIL.format(
            service_name, stage)
        aws_common.lambda_invoke(trace_id, function_name, json.dumps(payload))

    # 組織別Slack通知設定テーブルから、組織ID、通知コードCHECK_CISをキーとして設定情報を取得します。
    try:
        org_notify_slack = pm_orgNotifySlack.query_key(trace_id,
                                                       organization_id,
                                                       CommonConst.NOTIFY_CODE)
    except PmError as e:
        pm_logger.error("Slack通知設定の取得に失敗しました。結果Slack通知処理をスキップします。")
        return

    if (not org_notify_slack):
        pm_logger.info("Slack通知が未設定のため、結果Slack通知処理をスキップします。")
        return

    # セキュリティチェック結果通知Slack送信のLambdaを非同期で呼び出します。
    function_name_send_slack = CommonConst.EXECUTE_SEND_RESULT_SLACK.format(
        service_name, stage)
    aws_common.lambda_invoke(trace_id, function_name_send_slack,
                             json.dumps(payload))