远程PowerShell双跳问题 明文凭证存储方案访问被拒排查
跨服务器SSIS调用Python脚本双跳问题排查
场景说明
服务器A通过SSIS执行进程步骤运行PowerShell命令,调用部署在服务器B上的Python脚本,该Python脚本需要通过Windows身份验证回连服务器A上的SQL Server。
初始失败方案
初始调用命令如下,执行直接失败:
Invoke-Command -ComputerName ServerB -FilePath '\\ServerB\MyPythonScript.py'
失败原因为典型的Kerberos双跳问题:Windows凭证仅能传递到第一层远程PowerShell会话,无法继续向后透传给SQL Server连接请求。
调整后的概念验证方案
为快速验证链路可行性,临时采用明文传入指定凭证的方式启动Python脚本(验证通过后会替换为更高安全等级的实现),调整后调用命令如下:
Invoke-Command -ComputerName ServerB -FilePath '\\ServerB\MyPowerShellWrapper.ps1'
配套的MyPowerShellWrapper.ps1脚本内容:
$Username = 'BLAH' $Password = ConvertTo-SecureString -String 'FOO' -AsPlainText -Force [pscredential]$cred = New-Object System.Management.Automation.PSCredential ($userName, $Password) Start-Job -Name PythonJob -Scriptblock {python.exe 'C:\MyPythonScript.py'} -Credential $cred Wait-Job -Name Pythonjob
当前报错
调整后方案依然执行失败,PowerShell返回错误:
An error occurred while starting the background process. Error reported: Access is denied.(启动后台进程时发生错误,返回报错:访问被拒绝)
报错根因与修复方式
当前配置存在3个核心遗漏点,按优先级排查即可:
- 远程会话权限不足
通过Invoke-Command建立的远程PowerShell会话默认以网络登录身份运行,Start-Job -Credential参数会调用本地作业调度服务以指定身份创建独立进程,要求发起远程连接的SSIS运行账号满足两个条件:- 在服务器B上被加入
Remote Management Users本地组 - 被组策略授予
作为批处理作业登录的权限
如果使用的是本地账号而非域账号,还需要在服务器B上将注册表项HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\System\LocalAccountTokenFilterPolicy设置为1,关闭UAC远程令牌过滤限制。
- 在服务器B上被加入
- 目标运行账号权限缺失
传入的BLAH账号需要在服务器B上满足以下权限要求:- 拥有
作为批处理作业登录权限 - 对Python解释器可执行文件、
C:\MyPythonScript.py脚本路径拥有读取、执行权限 - 对服务器A上的目标SQL Server实例拥有对应的Windows身份验证访问权限
- 拥有
- 脚本本身存在笔误+实现方式冗余
脚本里存在逻辑瑕疵:Wait-Job指定的作业名是Pythonjob,和之前定义的PythonJob名称不一致,会导致等待逻辑失效。另外远程会话中使用Start-Job创建后台作业本身会额外增加一层权限校验,完全没必要,验证阶段可以直接替换为Start-Process拉起进程,权限要求更低、日志更易排查,修改后的wrapper脚本如下:$Username = 'BLAH' $Password = ConvertTo-SecureString -String 'FOO' -AsPlainText -Force [pscredential]$cred = New-Object System.Management.Automation.PSCredential ($Username, $Password) $runProc = Start-Process -FilePath "python.exe" -ArgumentList "C:\MyPythonScript.py" -Credential $cred -Wait -NoNewWindow -PassThru exit $runProc.ExitCode
安全提示:明文硬编码密码仅可用于临时功能验证,正式环境请优先配置Kerberos约束委派(为服务器B的机器账号授予到服务器A SQL服务的委派权限,从根源解决双跳问题,无需传递任何凭证),或使用gMSA组托管服务账号、DPAPI加密存储凭证替代明文方案,避免账号泄露风险。
内容的提问来源于stack exchange,提问作者Cazzym Hawkins
相关产品推荐
相关产品推荐

