我已经编写了PowerShell命令,而不是重新发明轮子,我想使用RBAC作为一种可行的方式,以在用户通过PowerShell加载程序集时向用户公开命令。
>在进行搜索时(在此处插入您喜欢的搜索引擎),我遇到了左侧字段中较远的内容,例如ACE / ACL。我发现的最接近的是JEA,但这似乎是远程处理所特有的。这违反了目的,因为该模块将在本地加载。
我看到有一种方法可以通过SQL表进行组成员身份验证,但这将需要使服务器/数据库/表站起来,并且破坏了要消耗已经存在的资源的目的。
我已经检出PSPrinicpal.IsInRole(),WindowsPrincipal.IsInRole()和GenericPrincipal.IsInRole(),但是这些都需要在名称空间/类内部进行访问/使用,因此,对于我所需要的内容来说,还不够。我想做如果用户不属于“ 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会话时,通过组成员身份(或缺少成员身份)限制Commandlet的可用性。
(概念)示例:命令集“ Restart-RemoteServer”仅应由“ DevOps”组中的个人运行,而对具有RDP许可的任何人均不可用。机器,因为任何人都可以将模块导入PowerShell(或者默认情况下可以通过PowerShell配置文件加载该模块)。
编辑:找到了一个使用OData的示例,但我希望依赖于AD。
答案 0 :(得分:1)
限制用户的权限。他们应该不能自己执行操作。这应该是主要的,因为通常不会阻止用户编写自己的脚本/模块来执行您的操作。
在您的示例中,具有不正确权限的用户不应在远程服务器上具有关机或重新启动权限,更不用说对模块的访问了。您的模块应该只是在权限方面进行错误捕获。
将命令拆分为不同的模块文件。然后使用您的AD组设置对模块文件的读取权限
在cmdlet中查询广告。例如在powershell中:
((Get-ADPrincipalGroupMembership $env:username | where {$_.name -like "Domain Users"}) -like (get-adgroup "Domain Users"))
JEA。如前所述,您可以通过仅允许用户在锁定的会话中处于活动状态(这些会话可以是本地会话)来限制访问。