Как я могу выставить или ограничить команды через членство в группе (например, RBAC)? - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть команды PowerShell, которые я написал, и вместо того, чтобы заново изобретать колесо, я хочу использовать RBAC в качестве жизнеспособного средства предоставления команд пользователям при загрузке сборок в PowerShell (через Import-Module).

Проводя мой поиск в (вставьте ваш любимый поисковик здесь), я сталкивался с вещами, которые находятся далеко в левом поле, такими как ACE / ACL.Самым близким, что я нашел, был JEA , но это выглядит как специфическое для удаленного взаимодействия;что противоречит цели, так как модуль будет загружен локально.

Я видел, что есть способ выполнить проверку членства в группе с помощью таблицы SQL, но для этого потребуется поставить сервер / базу данных / таблицу и победитьцель использования ресурсов, которые уже существуют.

Я извлек PSPrinicpal.IsInRole () , WindowsPrincipal.IsInRole () и GenericPrincipal.IsInRole () , но для этого требуется доступ / использование внутри пространства имен / класса и, следовательно, их недостаточно для того, что я пытаюсь сделать;который запрещает доступ к [a] определенной команде [s] в «Import-Module», если пользователь не принадлежит к группе «x»;что, я считаю, должно было бы быть сделано для украшения самого класса?

namespace ExamplePowerShell
{
    using System;
    using System.Management.Automation;
    using System.ServiceModel;

    /// <summary>
    ///     Initializes a new instance of the <see cref="RestartRemoteServer"/> class.
    /// </summary>
    [SOMETHING SHOULD GO HERE?]
    [Cmdlet(VerbsLifecycle.Restart, "RemoteServer")]
    public class RestartRemoteServer : Cmdlet
    {
        ....
    }
}

Спросите: Есть ли способ использовать RBAC, без необходимости заново изобретать всю предпосылку с нуля?

В настоящее время все команды доступны любому, кто загружает модуль, и вместо того, чтобы создавать отдельный модуль (который не является какой-либо формой безопасности, если пользователь может найти другой модуль), я хочу убедиться, чтоНикто другой не может запустить эти команды без соответствующего членства в группе.

Цель: Ограничить доступность командлета членством в группе (или его отсутствием), когда сборка импортируется в локальнуюСеанс PowerShell.

(Концепция) Пример: Командлет Restart-RemoteServer должен быть доступен для запуска только лицам из группы "DevOps" и никому не должен быть доступен.с разрешением RDP на машину, так как любой может импортировать модуль в PowerShell (или он может быть загружен по умолчанию через профили PowerShell).

Редактировать: Найден пример, который использует OData , но япредпочел бы зависеть от нашей эры.

1 Ответ

0 голосов
/ 13 февраля 2019
  1. Ограничьте права ваших пользователей. Они не должны иметь возможность выполнять действия самостоятельно.Это должно быть первичным, поскольку обычно ничто не мешает пользователям писать свои собственные скрипты / модули, чтобы делать то, что делают ваши.

    В вашем примере пользователи с неправильными разрешениями не должны иметь разрешения на отключение или перезапуск на удаленных серверах, а тем более доступ к вашему модулю.Ваш модуль должен просто делать ошибки на стороне прав доступа.

  2. Разделить команды на разные файлы модуля. Затем установить разрешения на чтение файлов модуля с помощью AD.группы

  3. Запрос AD в вашем командлете. Например, в powershell:

    ((Get-ADPrincipalGroupMembership $env:username | where {$_.name -like "Domain Users"}) -like (get-adgroup "Domain Users"))

  4. JEA. Как вы уже упоминали, вы можете ограничить доступ, разрешив своим пользователям быть активными только в заблокированных сеансах (эти сеансы могут быть локальными).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...