news 2026/5/12 6:46:04

[powershell 入门]第9天:PowerShell 安全、代码签名与企业部署 作业及深度解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[powershell 入门]第9天:PowerShell 安全、代码签名与企业部署 作业及深度解析

第9天重点回顾

执行策略(Execution Policy)AllSigned要求所有脚本必须由受信任发布者签名
代码签名:使用Set-AuthenticodeSignature+ 有效证书
SecretManagement 模块:统一管理凭据/密钥(支持 Azure Key Vault、Windows DPAPI 等)
Script Block Logging:通过组策略或注册表启用,记录所有 PowerShell 脚本内容到Windows 事件日志

习题1:创建自签名证书并签署脚本,在AllSigned策略下运行

步骤 1:以管理员身份打开 PowerShell(需写入本地计算机证书存储)
# 创建自签名证书(仅用于测试!有效期1年) $cert = New-SelfSignedCertificate ` -Subject "CN=PowerShell Test Signing" ` -KeyAlgorithm RSA ` -KeyLength 2048 ` -Type CodeSigningCert ` -CertStoreLocation "Cert:\CurrentUser\My" ` -NotAfter (Get-Date).AddYears(1) Write-Host "✅ 证书已创建,Thumbprint: $($cert.Thumbprint)" -ForegroundColor Green

💡 说明:

  • 使用CurrentUser\My避免需要管理员权限(若用LocalMachine则需提权)
  • -Type CodeSigningCert是关键,否则无法用于签名

步骤 2:创建一个测试脚本hello.ps1
'Write-Host "Hello from signed script!" -ForegroundColor Cyan' | Out-File .\hello.ps1 -Encoding UTF8

步骤 3:用证书签署脚本
Set-AuthenticodeSignature -FilePath .\hello.ps1 -Certificate $cert

✅ 成功输出示例:

Directory: C:\test SignerCertificate Status Path ----------------- ------ ---- [Subject] Valid hello.ps1 CN=PowerShell Test Signing ...

步骤 4:设置执行策略为AllSigned并运行
# 设置当前用户策略为 AllSigned Set-ExecutionPolicy -ExecutionPolicy AllSigned -Scope CurrentUser -Force # 首次运行会弹出安全警告 → 选择“运行一次”或“始终运行” .\hello.ps1

⚠️关键提示

  • 首次运行时,PowerShell 会弹出“发布者不受信任”对话框
  • 点击“更多选项” → “始终运行”,系统会将该证书添加到“受信任的发布者”存储(Cert:\CurrentUser\TrustedPublisher
  • 之后即可无提示运行

🔍 验证证书是否被信任
# 查看受信任的发布者 Get-ChildItem Cert:\CurrentUser\TrustedPublisher # 查看脚本签名状态 Get-AuthenticodeSignature .\hello.ps1

✅ 若StatusValidStatusMessage为 "签名有效",则成功。


✅ 习题2:使用 SecretManagement 存储数据库连接字符串

目标:安全存储敏感字符串(如"Server=db;Database=prod;User=sa;Password=Secret123!"),避免明文写入脚本。

步骤 1:安装必要模块(首次使用)
Install-Module Microsoft.PowerShell.SecretManagement -Force -AllowClobber Install-Module Microsoft.PowerShell.SecretStore -Force # 本地存储后端

💡SecretStore是微软官方提供的本地加密存储(基于 DPAPI)


步骤 2:注册 SecretStore 保险库(Vault)
Register-SecretVault -Name LocalSecretStore -ModuleName Microsoft.PowerShell.SecretStore

首次注册会提示设置密码(用于解锁本地保险库)


步骤 3:将连接字符串存为SecureString并保存
# 构造连接字符串(实际中可能来自用户输入或配置) $plainText = "Server=db.example.com;Database=SalesDB;User=admin;Password=P@ssw0rd!" # 转为 SecureString $secureString = ConvertTo-SecureString $plainText -AsPlainText -Force # 存入保险库(SecretManagement 自动处理 SecureString) Set-Secret -Name "DB_ConnectionString" -Secret $secureString -Vault LocalSecretStore

✅ 输出:无错误即成功


步骤 4:在脚本中安全读取
# 从保险库获取(返回 SecureString) $secureConn = Get-Secret -Name "DB_ConnectionString" -Vault LocalSecretStore # 转回明文(仅在需要时,如传给 SqlConnection) $marshal = [System.Runtime.InteropServices.Marshal] $ptr = $marshal::SecureStringToBSTR($secureConn) $connectionString = $marshal::PtrToStringBSTR($ptr) $marshal::FreeBSTR($ptr) Write-Host "连接字符串已加载(长度: $($connectionString.Length) 字符)" -ForegroundColor Green # 实际使用:[System.Data.SqlClient.SqlConnection]::new($connectionString)

🔒 安全优势:

  • 脚本中不出现明文密码
  • SecureString在内存中加密
  • 保险库受操作系统保护(DPAPI)

✅ 习题3:启用 Script Block Logging 并验证日志

目标:记录所有执行的 PowerShell 脚本内容到 Windows 事件日志(用于审计/取证)

步骤 1:启用 Script Block Logging(通过注册表)
# 创建注册表项(需管理员权限) $regPath = "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging" if (-not (Test-Path $regPath)) { New-Item $regPath -Force | Out-Null } Set-ItemProperty -Path $regPath -Name "EnableScriptBlockLogging" -Value 1 Set-ItemProperty -Path $regPath -Name "EnableScriptBlockInvocationLogging" -Value 1 # 可选:记录调用上下文 Write-Host "✅ Script Block Logging 已启用。请重启 PowerShell 生效。" -ForegroundColor Yellow
计算机配置 → 管理模板 → Windows 组件 → PowerShell → ✔ 启用 PowerShell Script Block 日志记录

步骤 2:重启 PowerShell,运行测试脚本
# 任意脚本(会被完整记录) Get-Process | Where-Object CPU -gt 100

步骤 3:在事件查看器中查找日志
  1. 打开事件查看器eventvwr.msc
  2. 导航至:
    应用程序和服务日志 → Microsoft → Windows → PowerShell → Operational
  3. 查找事件 ID 4104(Script Block Logging 的标准 ID)

✅ 日志内容包含:

  • 完整的脚本文本(<ScriptBlockText>
  • 执行用户
  • 进程 ID
  • 是否被混淆(Obfuscated)
或通过 PowerShell 查询:
Get-WinEvent -LogName "Microsoft-Windows-PowerShell/Operational" | Where-Object Id -eq 4104 | Select-Object TimeCreated, Message | Format-List

🔍 示例输出片段:

Message : Creating Scriptblock text (1 of 1): Get-Process | Where-Object CPU -gt 100 ...

🧠 第9天安全能力总结

技术用途企业价值
代码签名 + AllSigned防止未授权脚本执行满足合规要求(如 PCI DSS、ISO 27001)
SecretManagement安全存储密钥/密码消除脚本硬编码凭据风险
Script Block Logging审计所有 PowerShell 活动满足 SOC2、GDPR 日志留存要求

⚠️ 重要安全提醒

  1. 自签名证书 ≠ 生产方案:企业应使用 PKI(如 AD CS)颁发代码签名证书
  2. SecretStore 仅限本地开发:生产环境应使用Azure Key VaultHashiCorp Vault
  3. Script Block Logging 需配合 SIEM:单独日志难分析,建议接入 Splunk/ELK

🚀 延伸挑战

  • 将 SecretManagement 与 Azure Key Vault 集成
  • 编写 GPO 脚本批量部署AllSigned策略
  • 使用Get-WinEvent+ 正则自动检测可疑脚本(如IEX
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/10 17:39:12

震撼!山东牛蒡酒最新排名出炉,榜首竟是它!

震撼&#xff01;山东牛蒡酒最新排名出炉&#xff0c;榜首竟是它&#xff01;引言近年来&#xff0c;随着消费者对健康饮品需求的不断增加&#xff0c;牛蒡酒作为一种独特的保健酒品&#xff0c;逐渐在市场上崭露头角。山东作为中国牛蒡的主要产地之一&#xff0c;其牛蒡酒品牌…

作者头像 李华
网站建设 2026/5/10 2:36:27

基础数据结构:栈、队列、链表

文章目录栈核心操作练习题队列核心操作练习题链表核心操作栈 先进后出 栈是一种限制访问端点的线性表&#xff0c;它只允许在表的一端进行插入和删除操作。这一端被称为栈顶&#xff0c;另一端称为栈底 就如同一个杯子&#xff0c;杯子的顶端相当于栈顶&#xff0c;底端就相…

作者头像 李华
网站建设 2026/5/10 4:49:56

JVM 运行时数据区的各个组件分别存储什么内容

以 Java 8 为背景,系统、清晰地为你讲解 JVM(Java Virtual Machine)运行时数据区的各个组件分别存储什么内容,并重点剖析 堆(Heap) 的作用,辅以实际代码说明。 一、Java 8 中 JVM 内存结构概览 在 Java 8 中,JVM 的运行时数据区主要包括以下五个部分: 堆(Heap) ✅…

作者头像 李华
网站建设 2026/5/11 12:35:21

虚拟仿真教学的困境与挑战

随着信息技术的不断进步&#xff0c;虚拟仿真教学已成为现代教育变革的重要推动力。它通过模拟真实场景&#xff0c;为学生提供沉浸式学习体验&#xff0c;极大地提升了教学互动性和实效性。然而&#xff0c;在广泛应用过程中&#xff0c;虚拟仿真教学也暴露出诸多困境与挑战&a…

作者头像 李华
网站建设 2026/5/10 18:07:33

西城微科手提秤PCBA方案:精准便携背后的技术核心与全场景赋能

在物流快递、仓储盘点、户外作业、商业零售等众多场景中&#xff0c;手提秤以其便携灵活的特性成为不可或缺的计量工具。消费者与企业用户对其核心诉求高度一致&#xff1a;高精度测量、稳定可靠运行、长久续航能力以及小巧的体积设计。西城微科深耕电子衡器领域近二十年&#…

作者头像 李华
网站建设 2026/5/10 18:06:21

揭秘MCP PL-600多模态Agent设计:如何实现跨模态协同与自主决策

第一章&#xff1a;MCP PL-600多模态Agent设计概述MCP PL-600是一种面向复杂任务场景的多模态智能代理系统&#xff0c;融合了自然语言理解、视觉识别与动作决策能力。该系统通过统一的语义空间对文本、图像和传感器数据进行联合建模&#xff0c;实现跨模态信息的高效对齐与推理…

作者头像 李华