33、脚本签名与执行策略全解析

脚本签名与执行策略全解析

1. 企业环境中部署代码签名证书

在获取代码签名证书并使用它签署一些脚本后,你可能希望在整个组织中分发这些脚本。然而,如果你的同事没有在他们的机器上正确安装你的代码签名证书,他们将无法信任你的签名。以下是几种大规模分发代码签名证书的方法。

1.1 使用组策略对象(GPO)

由于没有活动目录域服务(AD DS)容器来保存代码签名证书,组策略(GPO)是一种可行的替代方案。在GPO中,证书以注册表项的形式存储,并以同样的方式传输到目标计算机。

要将证书导入到组策略对象中,可借助 Set - GPRegistryValue 将其作为注册表项导入。不过,存储证书对象的注册表项是二进制的,这意味着它们既不可读,也不易操作,而且这些二进制键的结构并未有文档记录。

需要注意的是,这是一种非官方的将证书导入GPO的方法,可能随时失效。截至2021年,仍没有官方的命令行方法来完成此操作,微软建议通过MMC控制台导入证书到组策略。

以下是具体操作步骤:
1. 获取证书指纹

$Certificate = Get-ChildItem -Path 'Cert:\CurrentUser\My' -CodeSigningCert
$Thumbprint = $Certificate.Thumbprint

注意:上述代码仅在用户只有一个代码签名证书时能正常工作。否则,你可能需要查看主题、有效期开始和结束字段来确定正确的证书。
2. 临时导出并重新导入证书到本地计算机存储

$ExportPath = Join-Path -Path $env:TEMP -ChildPath ([guid]::NewGuid().Guid)
Export-Certificate -Cert $Certificate -FilePath $ExportPath
$Params = @{
    FilePath = $ExportPath
    CertStoreLocation = 'Cert:\LocalMachine\Root\'
}
Import-Certificate @Params
Remove-Item -Path $ExportPath

导入证书到计算机存储需要本地管理员权限。
3. 从本地注册表获取证书对象并添加到GPO注册表

$JPParams = @{
    Path = 'HKLM:\SOFTWARE\Microsoft\SystemCertificates\ROOT\Certificates'
    ChildPath = $Thumbprint
}
$Path = Join-Path @JPParams
$CertBlob = Get-ItemPropertyValue -Path $Path -Name 'Blob'
$GPOCertContainerPath = 'HKLM\SOFTWARE\Policies\Microsoft\SystemCertificates'
$Key = "$GPOCertContainerPath\TrustedPublisher\Certificates\$Thumbprint"
$SGParams = @{
    Name = $GPOName
    Key = $Key
    ValueName = 'Blob'
    Value = $CertBlob
    Type = 'Binary'
}
Set-GPRegistryValue @SGParams
  1. 清理临时添加到计算机存储的证书
Remove-Item -Path "Cert:\LocalMachine\Root\$Thumbprint"
1.2 使用Desired State Configuration(DSC)

CertificateDsc 模块中的 CertificateImport 资源允许你将证书导入到几乎任何存储中,而不仅仅是根存储。以下是一个从SMB共享导入代码签名证书的配置示例:

Configuration DeployMySigningCertificate
{
    Import-DscResource -ModuleName CertificateDsc

    Node localhost
    {
        CertificateImport MySigningCertificate
        {
            Thumbprint = '0000000000000000000000000000000000000000'
            Location = 'LocalMachine'
            Store = 'TrustedPublisher'
            Path = '\\ad.example.net\NETLOGON\Administrator.crt'
        }
    }
}

这种方法比使用组策略更简单,且不存在支持方面的问题。

1.3 使用Intune

Intune本身没有将证书部署到受信任发布者存储的原生功能,但Intune支持团队介绍了如何利用自定义配置文件来实现这一目标。

2. 脚本执行策略

脚本执行策略规定了PowerShell运行脚本、加载配置文件和PowerShell模块的条件。以下是对脚本执行策略的详细介绍。

2.1 执行策略类型

可以使用 Get - ExecutionPolicy 命令查看当前活动的执行策略。共有七种类型的执行策略:
| 执行策略 | 说明 |
| — | — |
| AllSigned | 允许脚本运行,但要求所有脚本和配置文件都由受信任的发布者签名,包括用户自己编写的脚本。运行来自未分类为受信任或不受信任的发布者的脚本前,系统会提示用户。 |
| RemoteSigned | 这是Windows Server操作系统的默认执行策略。允许PowerShell脚本运行,但要求从互联网下载的PowerShell脚本和文件由受信任的发布者签名。本地计算机上的未签名脚本可以运行。 |
| Restricted | 这是Windows客户端计算机的默认执行策略。允许运行单个命令,但不允许运行任何脚本、配置文件、模块文件或PowerShell配置文件,即使它们已签名。 |
| Unrestricted | 这是非Windows系统的默认策略,且不可更改。允许运行未签名的脚本,但在运行非本地内部网络区域的脚本或配置文件前会警告用户。 |
| Bypass | 比无限制模式更宽松。在这种模式下,所有脚本都可以运行,且没有警告或提示。通常在PowerShell脚本是更大应用程序的一部分,或PowerShell本身是具有自己安全模型和控制的应用程序基础时使用。 |
| Default | 可作为 Set - ExecutionPolicy 命令的输入,但不是 Get - ExecutionPolicy 的有效输出。该策略根据操作系统类型设置执行策略,Windows客户端计算机的默认策略是受限,Windows服务器的默认策略是远程签名。 |
| Undefined | 表示当前范围内没有设置执行策略。如果没有设置执行策略,有效执行策略是其相应操作系统的默认策略。 |

以下是各执行策略的具体说明:
- AllSigned :该策略要求所有脚本和配置文件都由受信任的发布者签名。签名使用加密签名来提供文件完整性和真实性的信息。运行脚本时会检查签名,以确保脚本内容自签名后未更改,且用于签名的证书来自受信任的源。需要注意的是,此策略并非防止恶意脚本的万无一失的方法,因为系统仍允许运行已签名的脚本,无论其内容如何。
- RemoteSigned :允许本地未签名脚本运行,但要求从互联网下载的脚本和文件由受信任的发布者签名。文件在被Windows检测到来自互联网区域时会被阻止。可以通过以下两种方式解除阻止文件:
- 使用Windows图形用户界面(GUI),右键单击文件并选择“属性”,在“常规”选项卡中,勾选“解除阻止”复选框。
- 使用 Unblock - File 命令:

Unblock-File -Path <Path to file>
  • Restricted :仅允许运行单个命令,不允许运行任何脚本、配置文件、模块文件或PowerShell配置文件,即使它们已签名。此策略通常用于高安全环境或不使用PowerShell进行任何进程的机器。
  • Unrestricted :允许运行未签名的脚本,但在运行非本地内部网络区域的脚本或配置文件前会警告用户。应尽可能避免使用此策略。
  • Bypass :所有脚本都可以运行,没有警告或提示。这种策略在大多数管理良好的环境中很少遇到,通常用于特定的应用场景。
  • Default :使用 Set - ExecutionPolicy - ExecutionPolicy Default 命令可根据操作系统类型设置执行策略。
  • Undefined :使用 Set - ExecutionPolicy - ExecutionPolicy Undefined 命令可取消当前范围内的执行策略设置。如果所有范围的执行策略都未定义,有效执行策略是受限。
2.2 执行策略范围

执行策略的范围表示其影响的广度。有五种不同的范围,按优先级顺序排列如下:
1. MachinePolicy :应用于机器上的所有用户,只能通过组策略设置。Windows PowerShell的机器策略存储在注册表的 HKLM\Software\Policies\Microsoft\Windows\PowerShell 位置,PowerShell 7.0及更高版本的机器策略存储在 HKLM\SOFTWARE\Policies\Microsoft\PowerShellCore 位置。
2. UserPolicy :应用于计算机的当前用户,同样由组策略定义。Windows PowerShell的用户策略存储在注册表的 HKCU\Software\Policies\Microsoft\Windows\PowerShell 位置,PowerShell 7.0及更高版本的用户策略存储在 HKCU\SOFTWARE\Policies\Microsoft\PowerShellCore 位置。
3. Process :应用于当前PowerShell进程,策略存储在PowerShell会话环境变量 $ENV:PSExecutionPolicyPreference 中,直到会话关闭。
4. CurrentUser :应用于机器的当前用户,允许用户使用 Set - ExecutionPolicy 命令设置执行策略。在Windows PowerShell中,此范围的执行策略存储在注册表的 HKCU\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell 位置,在PowerShell 7.0及更高版本中,存储在用户文档目录的 powershell.config.json 配置文件中。
5. LocalMachine :应用于机器上的所有用户,用户在有相应权限的情况下可以使用 Set - ExecutionPolicy 命令更改此范围的执行策略。在Windows PowerShell中,此范围的执行策略存储在注册表的 HKLM\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell 位置,在PowerShell 7.0及更高版本中,存储在PowerShell安装目录的 powershell.config.json 配置文件中。

不同范围的执行策略优先级如下:

graph LR
    A[MachinePolicy] --> B[UserPolicy]
    B --> C[Process]
    C --> D[CurrentUser]
    D --> E[LocalMachine]

优先级高的范围的执行策略会覆盖优先级低的范围的执行策略。例如,如果机器策略是无限制,而当前用户策略是受限,那么用户的有效执行策略是无限制。

2.3 安全考虑

需要注意的是,执行策略本身并不是抵御威胁的完整防线。它可以帮助防止用户无意中运行不受信任的脚本,但有决心的攻击者仍可以绕过定义的执行策略,即使策略设置得很严格。

2.4 设置执行策略

可以通过以下几种方式设置执行策略,也可以组合使用:
- Set - ExecutionPolicy 命令
- 组策略
- 注册表
- AppLocker
- Windows Defender应用程序控制

以上就是脚本签名和执行策略的详细介绍,合理使用这些技术可以提高系统的安全性和脚本执行的可控性。

脚本签名与执行策略全解析

3. 执行策略范围的优先级分析

执行策略范围的优先级是理解和应用脚本执行策略的关键。下面通过具体的例子来深入分析不同范围执行策略的优先级情况。

假设存在以下几种执行策略设置情况:
| 范围 | 策略设置 |
| — | — |
| MachinePolicy | Unrestricted |
| UserPolicy | Restricted |
| Process | RemoteSigned |
| CurrentUser | AllSigned |
| LocalMachine | Unrestricted |

根据优先级顺序 MachinePolicy > UserPolicy > Process > CurrentUser > LocalMachine ,最终的有效执行策略将由 MachinePolicy 决定,即 Unrestricted 。这意味着,无论其他范围设置了何种策略,只要 MachinePolicy 有设置,就会以它为准。

再看另一种情况:
| 范围 | 策略设置 |
| — | — |
| MachinePolicy | 未设置 |
| UserPolicy | 未设置 |
| Process | 未设置 |
| CurrentUser | Restricted |
| LocalMachine | RemoteSigned |

由于 MachinePolicy UserPolicy Process 都未设置,此时 CurrentUser 的优先级最高,所以有效执行策略为 Restricted

4. 不同执行策略的应用场景分析

不同的执行策略适用于不同的场景,下面详细分析各种执行策略的应用场景。

4.1 AllSigned策略应用场景
  • 高安全要求的企业环境 :在一些对数据安全和系统稳定性要求极高的企业中,如金融机构、政府部门等,所有脚本都必须由受信任的发布者签名,以确保脚本的完整性和来源的可靠性。这样可以有效防止内部人员或外部攻击者通过恶意脚本进行数据泄露、系统破坏等操作。
  • 敏感数据处理场景 :当处理敏感数据时,如客户的个人信息、商业机密等,使用 AllSigned 策略可以保证处理这些数据的脚本是经过认证的,避免因脚本被篡改而导致数据泄露或错误处理。
4.2 RemoteSigned策略应用场景
  • 开发和测试环境 :对于开发人员和测试人员来说,他们经常需要在本地编写和运行脚本,同时也会从互联网上下载一些工具脚本。 RemoteSigned 策略允许本地未签名脚本运行,方便开发和测试工作的进行,同时要求从互联网下载的脚本签名,保证了从外部获取的脚本的安全性。
  • 普通企业办公环境 :在企业办公环境中,员工可能会编写一些简单的脚本用于自动化日常工作,同时也会从网络上获取一些资源。这种策略既满足了员工的工作需求,又能在一定程度上防止从互联网下载的恶意脚本的运行。
4.3 Restricted策略应用场景
  • 公共计算机或 kiosk 环境 :在公共计算机或 kiosk 环境中,为了防止用户随意运行脚本导致系统安全问题,通常会采用 Restricted 策略。只允许用户运行单个命令,限制了脚本的执行,提高了系统的安全性。
  • 对 PowerShell 使用较少的环境 :在一些对 PowerShell 使用需求较低的环境中,如普通的办公电脑,为了减少潜在的安全风险,也可以使用 Restricted 策略。
4.4 Unrestricted策略应用场景

虽然 Unrestricted 策略存在一定的安全风险,但在某些特定场景下仍然有其应用价值。
- 已知安全的脚本执行 :当确定某个脚本是安全的,并且需要快速执行时,可以临时将执行策略设置为 Unrestricted 。例如,在进行系统维护时,执行一些经过严格测试的脚本。
- 特定应用程序的依赖脚本 :某些应用程序可能依赖于 PowerShell 脚本来完成一些初始化或配置工作,并且这些脚本已经经过了严格的安全审查。在这种情况下,可以使用 Unrestricted 策略来确保应用程序的正常运行。

4.5 Bypass策略应用场景
  • 自动化系统集成 :在一些自动化系统中,PowerShell 脚本作为整个系统的一部分,需要在没有任何警告或提示的情况下运行。 Bypass 策略可以满足这种需求,确保脚本能够顺利执行。
  • 嵌入式 PowerShell 应用 :当 PowerShell 被嵌入到其他应用程序中,并且应用程序有自己的安全模型和控制机制时,可以使用 Bypass 策略。
4.6 Default策略应用场景

Default 策略主要用于快速恢复系统的默认执行策略设置。当系统的执行策略被误修改或需要进行统一配置时,可以使用 Set - ExecutionPolicy - ExecutionPolicy Default 命令将执行策略恢复到操作系统的默认设置。

4.7 Undefined策略应用场景

Undefined 策略通常用于取消当前范围内的执行策略设置,让系统根据其他范围的设置或默认策略来确定有效执行策略。例如,在进行测试或调试时,可能需要临时取消某个范围的执行策略设置。

5. 执行策略设置的操作步骤总结

设置执行策略可以通过多种方式,下面分别介绍具体的操作步骤。

5.1 使用 Set - ExecutionPolicy 命令
  1. 打开 PowerShell 控制台,以管理员身份运行。
  2. 根据需要设置的执行策略和范围,使用以下命令:
# 设置当前用户范围的执行策略为 AllSigned
Set-ExecutionPolicy -ExecutionPolicy AllSigned -Scope CurrentUser
  1. 确认设置是否成功,可以使用 Get - ExecutionPolicy 命令查看当前活动的执行策略。
5.2 使用组策略
  1. 打开组策略管理控制台(GPMC)。
  2. 创建或编辑相应的组策略对象(GPO)。
  3. 在 GPO 中找到“计算机配置”或“用户配置” -> “管理模板” -> “Windows 组件” -> “Windows PowerShell”。
  4. 根据需要设置脚本执行策略,如启用“执行策略”并选择相应的策略类型。
  5. 链接 GPO 到目标组织单位(OU)。
5.3 使用注册表
  1. 打开注册表编辑器(regedit)。
  2. 根据不同的范围和 PowerShell 版本,找到相应的注册表位置:
    • Windows PowerShell 的 MachinePolicy HKLM\Software\Policies\Microsoft\Windows\PowerShell
    • Windows PowerShell 的 UserPolicy HKCU\Software\Policies\Microsoft\Windows\PowerShell
    • Windows PowerShell 的 CurrentUser HKCU\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell
    • Windows PowerShell 的 LocalMachine HKLM\SOFTWARE\Microsoft\PowerShell\1\ShellIds\Microsoft.PowerShell
    • PowerShell 7.0 及更高版本的 MachinePolicy HKLM\SOFTWARE\Policies\Microsoft\PowerShellCore
    • PowerShell 7.0 及更高版本的 UserPolicy HKCU\SOFTWARE\Policies\Microsoft\PowerShellCore
  3. 在相应的注册表位置中,找到或创建名为 ExecutionPolicy 的 DWORD 值。
  4. 根据需要设置的值:
    • 1:Restricted
    • 2:AllSigned
    • 3:RemoteSigned
    • 4:Unrestricted
    • 5:Bypass
    • 6:Undefined
    • 7:Default
5.4 使用 AppLocker
  1. 打开本地安全策略(secpol.msc)。
  2. 找到“应用程序控制策略” -> “AppLocker”。
  3. 右键单击“脚本规则”,选择“创建新规则”。
  4. 根据需要设置规则,如允许或拒绝特定的脚本运行。
  5. 配置规则的条件,如文件路径、发布者等。
5.5 使用 Windows Defender 应用程序控制
  1. 打开 Windows Defender 安全中心。
  2. 选择“设备安全性” -> “应用和浏览器控制”。
  3. 找到“基于声誉的保护”和“应用程序控制”部分。
  4. 根据需要配置应用程序控制策略,如创建自定义规则来允许或阻止特定的脚本运行。
6. 总结与建议

脚本签名和执行策略是保障系统安全和脚本执行可控性的重要手段。通过合理使用代码签名证书和选择合适的执行策略,可以有效防止恶意脚本的运行,提高系统的安全性。

在实际应用中,建议根据不同的环境和需求选择合适的执行策略。对于高安全要求的环境,优先考虑使用 AllSigned Restricted 策略;对于开发和测试环境,可以使用 RemoteSigned 策略;对于特定的应用场景,可以根据实际情况选择 Unrestricted Bypass 等策略。

同时,要注意执行策略的范围和优先级,确保策略的设置符合预期。在设置执行策略时,可以结合多种方式,如组策略、注册表等,以满足不同的管理需求。

此外,虽然执行策略可以在一定程度上提高系统的安全性,但不能完全依赖它来抵御所有的安全威胁。还需要结合其他安全措施,如防火墙、杀毒软件等,构建多层次的安全防护体系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值