我有编写的PowerShell命令,而不是重新发明轮子,我想使用RBAC作为在PowerShell中加载程序集时通过导入模块向用户公开命令的可行方法。
在进行我的搜索(在这里插入您最喜欢的搜索引擎)时,我遇到了左侧字段中很远的东西,比如ACE / ACL。我发现的最接近的是JEA,但这看起来特别适用于遥控;这会破坏目的,因为模块将在本地加载。
我看到有一种方法可以通过SQL表进行组成员身份验证,但这需要站在服务器/数据库/表中,并且无法消耗已经存在的资源。
我已经检查了PSPrinicpal.IsInRole(),WindowsPrincipal.IsInRole()和GenericPrincipal.IsInRole()但是这些需要在命名空间/类中进行访问/使用,因此,对于我正在尝试做的事情来说还不够;如果用户不属于'x'组,则阻止[a]特定命令[s]在“Import-Module”上可用;我认为需要在课堂装饰上做些什么呢?
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的例子,但我更愿意依赖AD。
((Get-ADPrincipalGroupMembership $env:username | where {$_.name -like "Domain Users"}) -like (get-adgroup "Domain Users"))