PowerShell安全问题探究

强大的脚本也许会造成安全隐患,虽然PowerShell是在微软发起“可信赖计算计划”之后开发的一款产品,其产品的诞生必须有一名资深软件安全专家,参与到产品设计会议,代码复审等工作中。其虽然可以保证默认情况下是安全的,但是修改一些默认值,可以方便一些功能使用,但是难免会带来一些安全性问题。

PowerShell能实现的操作,图形化界面有的也可以实现,有的图形化界面没有相关属性的设置,但是PowerShell可有设置呀;不管在哪里设置,都是在已拥有的权限主体下处理对象,即使用PowerShel不会完成当前拥有的权限之外的操作。

PowerShell不会阻止恶意软件的操作,比如系统上存在恶意软件,它使用PowerShell做一些你权限范围内的恶意命令,这时候PowerShell并不会阻止恶意软件的操作,但这造成的后果不应归咎于PowerShell,PowerShell并不能充当杀毒软软件来保护系统,这应该是杀毒软件该做的事。

安全设置之一:

设置执行策略,,执行策略是管理PowerShell执行脚本的一种计算机范围的设置选项;用户防止用户被注入,从来执行一些非法脚本。

默认设置是Restricted,即不允许任何脚本运行;

使用如下命令查看当前策略:

PS C:\Users\Administrator> Get-ExecutionPolicy
RemoteSigned

运行Set-ExecutionPolicy命令,设置相应策略,有如下几种设置:

Restricted:默认设置,即除微软提供的一部分配置PowerShell的默认脚本(带有微软的数字签名)外,不允许执行其他任何脚本;

AllSigned:经过CA设计的数字证书签名后的任意脚本,均可执行;

RemoteSigned:PowerShell可运行本地任何脚本,同时也可执行受信任的CA签发的数字证书签名之后的远程脚本,“远程脚本”即存在于远程计算机上的脚本,通过通用命名规则(UNC)方式访问的这些脚本。某些Windows中会区别网络路径和UNC路径,这时,本地网络中的UNC并不会认为是“远程”。IE,火狐和Outlook中下载的脚本,均视为来自网络的脚本;

Unrestricted:可运行所有脚本;

Bypass:该设置主要针对应用程序开发人员,他们会将PowerShell嵌入到他们的应用程序之中。仅在主机应用程序提供了自身的脚本安全层时才使用该选项,其会忽略已经配置好的执行策略。

 

也可以在组策略中设置执行策略,也可以使用PowerShell.exe的-ExecutionPolicy参数来覆盖该设定=这样的目的在于防止了不知情的用户无意中运行一些匿名脚本。

事实上,一些恶意的软件开发者可以更容易直接的访问.Net Framework的函数,而不是费力去使用PowerShell工具或时其他方式;即是若有未经授权的用户有了你计算机的管理员权限执行任意代码,你已经在劫难逃了。

微软强力建议我们执行脚本时使用RemoteSigned策略,并且只在需要运行脚本的机器上采用该策略,其他计算机继续保持默认的Restricted策略。微软解释为该策略保持了安全性和功能的较好平衡。AllSigned更严格,要求所有脚本都需要被数字签名;

注:执行哪个策略较优的问题上,存在大量的意见,多个专家包括微软的一些开发人员认为,使用UNrestricted作为执行策略,他们认为该功能并灭有提供一个安全层,并且也不应该相信该设置可将任何危险的行为隔离开。

安全设置之二:

是数字代码签名,是将一个密码签名应用到一个文本文件的过程。

签名中包含两部分重要信息,一是列出了对脚本签名的公司或组织;二是包含了对脚本的加密副本,并且PowerShell可以解密该副本。

在创建数字签名前,得有一个代码签名的证书,称为第三方证书。均由商业CA签发,比如Cybertrust,GoDabby,Thawte,VeriSign等公司。可能的话,也可以从公司内部的公钥基础设施(PKI)中获取到该证书。正常情况是该证书只签发给公司或者组织,不会发给个人,在公司内部是可以签发给个人的。

如有人使用一个证书对恶意脚本进行签名,那么你可以通过该证书去查找该脚本的作者-这也就是为什么已签名的脚本相对于未签名的脚本更加值得“信任”。但是若你信任一个无法很好验证身份的CA,那么一个恶意脚本的作者可能会获取一个虚假的证书,这样你就无法使用该CA的证书去做追踪。这就是为什么选择一个受信任的CA如此重要。

一旦你获取了一个三级证书(指需要一个包装为带有验证码的证书-通常CA会针对不同的OS以及不同的编程语言提供不同的证书),就可以将该证书安装在本地计算机。安装之后,可使用Set-AuthenticodeSignature Cmdlet将该数字签名应用到一段脚本。可用Help About_Signing命令查看更多的信息。

许多商业的脚本开发环境,例如PowerShell Studio,PowerShell Plus以及PowerGUI等都可进行签名,甚至可以在你保存一段脚本时进行自动签名,这样使得签名过程更加透明。

签名不仅能提供脚本作者的身份信息,也会确保作者对脚本签名之后,不会被他人更改。原理如下:

1,脚本作者持有一个数字证书,该密钥包含两个密钥,一个公钥,一个私钥;

2,当对脚本进行签名时,该签名会使用私钥加密。私钥金额能被脚本开发者访问,同时仅有公钥能够对该脚本解密。在签名中会包含脚本的副本。

3,当PowerShell运行该脚本时,会使用作者的公钥(包含在签名中)解密该签名。如果解密失败,则说明签名被篡改,那么脚本就无法被运行。若签名中的脚本副本与明文副本不符,那么该签名就会被识别为破坏,该脚本也无法被运行。

安全设置之三:2种默认设置

1,Windows不会将PS1文件扩展名视为可执行文件类型,双击PS1文件,默认会使用记事本打开进行编辑,而不会被执行。该配置会保证即使执行策略允许执行该脚本,也不会在不知晓的情况下双击执行;

2,在Shell中不能通过键入脚本名执行该脚本。必须通过绝对路径或相对路径来运行脚本,比如C盘下的test.ps1绝对路径 C:\test,相对路径:.\test.ps1 

第二个设置会防止一些“命令劫持”类型的攻击,在该攻击中,攻击者会在一个文件夹中放置脚本,命名为一些内置的命令名,比如notepad,如果你在该路径下运行了.\notepad,你就被攻击了。但是我们一般会直接执行notepad 而不会加上绝对路径,这就很大程度上防止了命令劫持攻击。

写在最后:

如果你将执行策略设置成AllSigned,使用商业CA提供的代码签名证书,是需要多缴费的,好几千块呢。

这时候你可以找内部的PKI提供的免费证书,也可以自己制作证书。运行Help About_Signing可查询如何获取和使用MakeCert.exe,该工具可用于制作一个本地计算机信任的证书。高版本的PowerShell也可以使用New-SelfSignedCertificate Cmdlet来做同样的工作。该工具会自动在每次保存脚本时对脚本进行签名。

不要修改一些设置使得双击Ps1文件就运行了脚本,这样不安全,另外别人的脚本以及从网上下载的脚本,要看明白了再运行。。。

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值