Beispiel #1
0
def test_cannot_manage_accounts_without_permission(
        core_session,
        remote_unmanaged_users_with_mirrored_managed_local_users_qty3,
        windows_test_machine_config, users_and_roles):
    right_data = [
        "Privileged Access Service Power User",
        "role_Privileged Access Service Power User"
    ]
    requestor_session = users_and_roles.get_session_for_user(right_data[0])
    results_role = users_and_roles.get_role(right_data[0])

    account_ids = remote_unmanaged_users_with_mirrored_managed_local_users_qty3

    job_id, success = ResourceManager.manage_multiple_accounts(
        requestor_session, account_ids)
    assert success, "Did not kick off bulk manage accounts job"
    result = ResourceManager.get_job_state(core_session, job_id)
    assert result == "Succeeded", "Job did not execute"

    # Validates accounts are still not managed.
    _validate_accounts_are_not_managed(requestor_session, account_ids, job_id)

    permission_string = "Owner,View,Manage,Delete,Login,Naked,UpdatePassword,RotatePassword,FileTransfer,UserPortalLogin"

    account_id = account_ids[
        2]  # Grant permission to only one of the accounts, the middle one
    result, success = ResourceManager.assign_account_permissions(
        core_session, permission_string, results_role['Name'],
        results_role['ID'], "Role", account_id)
    assert success, "Did not set account permissions " + str(result)

    job_id, success = ResourceManager.manage_multiple_accounts(
        requestor_session, account_ids)
    assert success, "Did not kick off bulk rotate passwords job"
    result = ResourceManager.get_job_state(core_session, job_id)
    assert result == "Succeeded", "Job did not execute"

    # Validate the one account is managed.
    _validate_accounts_are_not_managed(requestor_session,
                                       [account_ids[0], account_ids[1]],
                                       job_id)
    _validate_accounts_are_managed(requestor_session, [account_ids[2]], job_id)

    user_info = requestor_session.get_current_session_user_info().json(
    )['Result']
    username = user_info['Name']
    start_type = 'Cloud.Core.AsyncOperation.AccountBulkManagement.Start.Multi'
    end_type = 'Cloud.Core.AsyncOperation.AccountBulkManagement.Failure.Multi'
    start_message = f'{username} initiated management of {len(account_ids)} accounts'
    end_message = f'{username} failed to manage 2 of 3 accounts'

    RedrockController.expect_event_message_by_type(core_session, start_type,
                                                   start_message)
    RedrockController.expect_event_message_by_type(core_session, end_type,
                                                   end_message)
def test_app_management_user_can_create_job_but_not_delete_servers(clean_bulk_delete_systems_and_accounts, core_session,
                                                                   core_tenant, clean_users, users_and_roles,
                                                                   list_of_created_systems):
    batch = ResourceManager.add_multiple_systems_with_accounts(core_session, 3, 2, list_of_created_systems)
    all_systems, all_accounts = DataManipulation.aggregate_lists_in_dict_values([batch])

    requestor_session = users_and_roles.get_session_for_user('Application Management')

    user_info = requestor_session.get_current_session_user_info().json()['Result']

    all_systems = batch.keys()

    job_id, result = ResourceManager.del_multiple_systems(requestor_session, all_systems)

    result = ResourceManager.get_job_state(core_session, job_id)

    assert result == "Succeeded", "Job did not execute"

    assert len(
        ResourceManager.get_multi_added_system_ids(core_session, all_systems)) == 3, "Wrong number of remaining systems"
    assert len(ResourceManager.get_multi_added_account_ids(core_session,
                                                           all_systems)) == 6, "Wrong number of remaining accounts"

    username = user_info['Name']
    start_type = 'Cloud.Core.AsyncOperation.BulkSystemDelete.Start.Multi'
    end_type = 'Cloud.Core.AsyncOperation.BulkSystemDelete.Failure.Multi'
    start_message = f'{username} initiated delete of {len(all_systems)} systems'
    end_message = f'{username} failed to delete {len(all_systems)} of {len(all_systems)} systems'

    RedrockController.expect_event_message_by_type(core_session, start_type, start_message)
    RedrockController.expect_event_message_by_type(core_session, end_type, end_message)
Beispiel #3
0
def test_cannot_rotate_passwords_without_permission(core_session, remote_users_with_mirrored_managed_local_users_qty3,
                                                    windows_test_machine_config, users_and_roles):
    right_data = ["Privileged Access Service Power User", "role_Privileged Access Service Power User"]
    requestor_session = users_and_roles.get_session_for_user(right_data[0])
    results_role = users_and_roles.get_role(right_data[0])

    remote_ip = windows_test_machine_config['ip_address']

    account_ids, accounts = BulkOperations.grab_relevant_users(core_session, remote_users_with_mirrored_managed_local_users_qty3)
    passwords_fetched = BulkOperations.checkout_users(core_session, accounts)

    job_id, success = ResourceManager.rotate_multiple_passwords(requestor_session, account_ids)
    assert success, "Did not kick off bulk rotate passwords job"
    result = ResourceManager.get_job_state(core_session, job_id)
    assert result == "Succeeded", "Job did not execute"

    BulkOperations.validate_users_with_login(remote_ip, passwords_fetched)  # Verify passwords are still right
    permission_string = "Owner,View,Manage,Delete,Login,Naked,UpdatePassword,RotatePassword,FileTransfer," \
                        "UserPortalLogin "

    account_id = passwords_fetched[1][3]  # Grant permission to only one of the accounts, the middle one
    result, success = ResourceManager.assign_account_permissions(core_session, permission_string,
                                                                 results_role['Name'], results_role['ID'],
                                                                 "Role", account_id)
    assert success, "Did not set account permissions " + str(result)

    job_id, success = ResourceManager.rotate_multiple_passwords(requestor_session, account_ids)
    assert success, "Did not kick off bulk rotate passwords job"
    result = ResourceManager.get_job_state(core_session, job_id)
    assert result == "Succeeded", "Job did not execute"

    BulkOperations.validate_users_with_login(remote_ip, passwords_fetched, [True, False, True])

    user_info = requestor_session.get_current_session_user_info().json()['Result']
    username = user_info['Name']
    start_type = 'Cloud.Core.AsyncOperation.BulkPasswordRotationJob.Start.Multi'
    end_type = 'Cloud.Core.AsyncOperation.BulkPasswordRotationJob.Failure.Multi'
    start_message = f'{username} initiated password rotation of {len(account_ids)} accounts'
    end_message = f'{username} failed to rotate 2 of 3 account passwords'

    RedrockController.expect_event_message_by_type(core_session, start_type, start_message)
    RedrockController.expect_event_message_by_type(core_session, end_type, end_message)
def test_other_user_cant_see_secret_created_by_first_user(core_session, users_and_roles, created_system_id_list,
                                                          swap_roles):
    roles = ["Privileged Access Service Administrator", "Privileged Access Service Power User"]

    if swap_roles:
        roles_new = [roles[1], roles[0]]
        roles = roles_new

    batch = ResourceManager.add_multiple_systems_with_accounts(core_session, 2, 2, created_system_id_list)
    all_systems, all_accounts = DataManipulation.aggregate_lists_in_dict_values([batch])

    deleter_user_0_session = users_and_roles.get_session_for_user(roles[0])
    deleter_user_0_role = users_and_roles.get_role(roles[0])
    deleter_user_0_role_name = deleter_user_0_role['Name']
    deleter_user_0_role_id = deleter_user_0_role['ID']
    other_user_1_session = users_and_roles.get_session_for_user(roles[1])

    for account_id in all_accounts:
        permission_string = 'Owner,View,Manage,Delete,Login,Naked,UpdatePassword,FileTransfer,UserPortalLogin'
        result, success = ResourceManager.assign_account_permissions(core_session, permission_string,
                                                                     deleter_user_0_role_name, deleter_user_0_role_id,
                                                                     "Role", account_id)
        assert success, "Did not set account permissions " + str(result)

    for system_id in all_systems:
        permission_string = 'Grant,View,Edit,Delete,ManageSession,AgentAuth,RequestZoneRole,AddAccount,UnlockAccount'
        result, success = ResourceManager.assign_system_permissions(core_session, permission_string,
                                                                    deleter_user_0_role_name, deleter_user_0_role_id,
                                                                    "Role", system_id)
        assert success, "Did not set system permissions " + result

    secret_name = f"secret{guid()}"
    job_id, result = ResourceManager.del_multiple_systems(deleter_user_0_session, batch.keys(), secretname=secret_name)

    result = ResourceManager.get_job_state(core_session, job_id)
    assert result == "Succeeded", "Job did not execute"

    remaining_accounts = set(ResourceManager.get_multi_added_account_ids(core_session, created_system_id_list))
    remaining_systems = set(ResourceManager.get_multi_added_system_ids(core_session, created_system_id_list).values())

    assert remaining_accounts == set(), "Remaining accounts did not match expectation"
    assert remaining_systems == set(), "Remaining systems did not match expectation"

    secret_id = RedrockController.get_secret_id_by_name(deleter_user_0_session, secret_name)
    assert secret_id is not None, f"Secret was not visible to creator '{roles[0]}' user, either because it wasn't created or because of a permissions issue"

    secret_id = RedrockController.get_secret_id_by_name(other_user_1_session, secret_name)
    assert secret_id is None, f"Secret should not be '{roles[1]}' user when created by '{roles[0]}' user"

    secret_id = RedrockController.get_secret_id_by_name(core_session, secret_name)
    assert secret_id is not None, f"Sys admin should be able to see secret created by {roles[0]}"
def test_app_management_user_can_create_job_but_not_delete_accounts(
        clean_bulk_delete_systems_and_accounts, core_session, core_tenant,
        clean_users, users_and_roles, list_of_created_systems):
    batch = ResourceManager.add_multiple_systems_with_accounts(
        core_session, 2, 2, list_of_created_systems)
    all_systems, all_accounts = DataManipulation.aggregate_lists_in_dict_values(
        [batch])

    assert len(
        ResourceManager.get_multi_added_system_ids(
            core_session,
            all_systems)) == 2, "Added systems not reflected in search"
    assert len(
        ResourceManager.get_multi_added_account_ids(
            core_session,
            all_systems)) == 4, "Added accounts not reflected in search"

    requestor_session = users_and_roles.get_session_for_user(
        'Application Management')

    job_id, result = ResourceManager.del_multiple_accounts(
        requestor_session, all_accounts)

    result = ResourceManager.get_job_state(core_session, job_id)

    assert result == "Succeeded", "Job did not execute"

    assert len(ResourceManager.get_multi_added_system_ids(core_session,
                                                          all_systems)) == 2, \
        "Expected 2 added systems to be found, but received different number"
    assert len(ResourceManager.get_multi_added_account_ids(core_session,
                                                           all_systems)) == 4, \
        "Expected 4 added accounts to be found, but received different number"

    user_info = requestor_session.get_current_session_user_info().json(
    )['Result']
    username = user_info['Name']
    start_type = 'Cloud.Core.AsyncOperation.BulkAccountDelete.Start.Multi'
    end_type = 'Cloud.Core.AsyncOperation.BulkAccountDelete.Failure.Multi'
    start_message = f'{username} initiated delete of {len(all_accounts)} accounts'
    end_message = f'{username} failed to delete {len(all_accounts)} of {len(all_accounts)} accounts'

    RedrockController.expect_event_message_by_type(core_session, start_type,
                                                   start_message)
    RedrockController.expect_event_message_by_type(core_session, end_type,
                                                   end_message)
def test_add_and_delete_system_with_multiple_benchmarks_per_test(
        core_session, created_system_id_list, csv_benchmark):
    """
    This test demonstrates measuring multiple things within the same pytest test

    See example output at bottom of this file
    """
    start, end, info = csv_benchmark
    info(filenamesuffix="Bulk System Delete Time Test")
    for i in range(3):
        info(row=f"Test Run {i+1}")
        info(column="Generate Systems")
        start()
        batch = ResourceManager.add_multiple_systems_with_accounts(
            core_session, 2, 2, created_system_id_list)
        end()
        secret_name = f"secret{guid()}"
        info(column="Delete Job")
        start()
        job_id, result = ResourceManager.del_multiple_systems(
            core_session, batch.keys(), secretname=secret_name)
        result = ResourceManager.get_job_state(core_session, job_id)
        assert result == "Succeeded", "Job did not execute"
        end()
        info(column="Query Systems and Accounts")
        start()
        remaining_accounts = set(
            ResourceManager.get_multi_added_account_ids(
                core_session, created_system_id_list))
        remaining_systems = set(
            ResourceManager.get_multi_added_system_ids(
                core_session, created_system_id_list).values())
        assert remaining_accounts == set(
        ), "Remaining accounts did not match expectation"
        assert remaining_systems == set(
        ), "Remaining systems did not match expectation"
        end()
        info(column="Query Secret")
        start()
        secret_id = RedrockController.get_secret_id_by_name(
            core_session, secret_name)
        assert secret_id is not None, "No secret was created"
        end()
def test_power_user_cant_see_secret_created_by_sysadmin_bsd(core_session, users_and_roles, created_system_id_list):
    batch = ResourceManager.add_multiple_systems_with_accounts(core_session, 2, 2, created_system_id_list)

    secret_name = f"secret{guid()}"
    job_id, result = ResourceManager.del_multiple_systems(core_session, batch.keys(), secretname=secret_name)

    result = ResourceManager.get_job_state(core_session, job_id)
    assert result == "Succeeded", "Job did not execute"

    remaining_accounts = set(ResourceManager.get_multi_added_account_ids(core_session, created_system_id_list))
    remaining_systems = set(ResourceManager.get_multi_added_system_ids(core_session, created_system_id_list).values())

    assert remaining_accounts == set(), "Remaining accounts did not match expectation"
    assert remaining_systems == set(), "Remaining systems did not match expectation"

    requester_session = users_and_roles.get_session_for_user("Privileged Access Service Power User")

    secret_id = RedrockController.get_secret_id_by_name(core_session, secret_name)
    assert secret_id is not None, "No secret was created"

    secret_id = RedrockController.get_secret_id_by_name(requester_session, secret_name)
    assert secret_id is None, "Secret should not be visible to Privileged Access Service Power User"
def test_missing_permissions_on_bsd_accounts_and_systems(core_session, users_and_roles, created_system_id_list,
                                                         explicit_missing_delete_permission):
    """

    Make three systems, with accounts
    System 0 - Delete permissions on every account and on system
    System 1 - Delete permissions on HALF its accounts and on system
    System 2 - Delete permissions on every of its accounts, but not on system

    Then Bulk System Delete. All accounts with delete permissions will be gone. Systems 0 and 1 will remain.

    :param explicit_missing_delete_permission: If True, the permission string will be set without Delete. If False, the permissions will not be modified (with Delete missing assumed)
    :param core_session: Authenticated Centrify Session.
    :param users_and_roles: Fixture to create New user with PAS Power Rights
    :param created_system_id_list: A list for holding created systems, that will be deleted after the test
    :return:
    """
    original_systems = 3
    original_accounts_per_system = 4

    batch = ResourceManager.add_multiple_systems_with_accounts(core_session, original_systems,
                                                               original_accounts_per_system, created_system_id_list)

    # These two variables will have extra set items added below from System 1
    deleted_accounts, expected_preserved_accounts = set(batch[created_system_id_list[0]]).union(
        set(batch[created_system_id_list[2]])), set()

    split1, split2 = DataManipulation.shuffle_and_split_into_two_lists(batch[created_system_id_list[1]])
    deleted_accounts = deleted_accounts.union(set(split1))
    expected_preserved_accounts = expected_preserved_accounts.union(set(split2))

    # System 1 fails to delete because some of its child accounts are not deleted
    # System 2 fails for missing delete permission
    expected_preserved_systems = {created_system_id_list[1], created_system_id_list[2]}
    delete_system_permissions = {created_system_id_list[0], created_system_id_list[1]}

    requester_session = users_and_roles.get_session_for_user("Privileged Access Service Power User")
    results_role = users_and_roles.get_role("Privileged Access Service Power User")

    for account_id in deleted_accounts:
        permission_string = 'Owner,View,Manage,Delete,Login,Naked,UpdatePassword,FileTransfer,UserPortalLogin'
        result, success = ResourceManager.assign_account_permissions(core_session, permission_string,
                                                                     results_role['Name'], results_role['ID'], "Role",
                                                                     account_id)
        assert success, "Did not set account permissions " + str(result)

    if explicit_missing_delete_permission:
        for account_id in expected_preserved_accounts:
            permission_string = 'Owner,View,Manage,Login,Naked,UpdatePassword,FileTransfer,UserPortalLogin'
            result, success = ResourceManager.assign_account_permissions(core_session, permission_string,
                                                                         results_role['Name'], results_role['ID'],
                                                                         "Role", account_id)
            assert success, "Did not set account permissions " + str(result)

    for system_id in created_system_id_list:
        if system_id in delete_system_permissions:
            permission_string = 'Grant,View,Edit,Delete,ManageSession,AgentAuth,RequestZoneRole,AddAccount,UnlockAccount'
        else:
            if not explicit_missing_delete_permission:
                continue
            permission_string = 'Grant,View,Edit,ManageSession,AgentAuth,RequestZoneRole,AddAccount,UnlockAccount'
        result, success = ResourceManager.assign_system_permissions(core_session, permission_string,
                                                                    results_role['Name'], results_role['ID'], "Role",
                                                                    system_id)
        assert success, "Did not set system permissions " + result

    job_id, result = ResourceManager.del_multiple_systems(requester_session, batch.keys())

    result = ResourceManager.get_job_state(core_session, job_id)
    assert result == "Succeeded", "Job did not execute"

    remaining_accounts = set(ResourceManager.get_multi_added_account_ids(core_session, created_system_id_list))
    remaining_systems = set(ResourceManager.get_multi_added_system_ids(core_session, created_system_id_list).values())

    assert remaining_accounts == expected_preserved_accounts, "Remaining accounts did not match expectation"
    assert remaining_systems == expected_preserved_systems, "Remaining systems did not match expectation"