CyberArk ITATS004E python 脚本中用户的身份验证失败
CyberArk ITATS004E Authentication failure for User in python script
我正在尝试实现一个 python 脚本,该脚本在远程 CyberArk 机器上执行本地 bash 脚本或简单命令。这是我的代码:
if __name__ == '__main__':
for ip in IP_LIST:
bash_cmd = f"ssh -o stricthostkeychecking=no {USER}%{LOCAL_USER}%{ip}@{PROXY} 'bash -s' < {BASH_SCRIPT}"
exit_code = subprocess.call(bash_cmd, shell=True)
print(exit_code)
bash_cmd = f"scp {USER}%{LOCAL_USER}%{ip}@{PROXY}:server_info_PY.txt ."
exit_code = subprocess.call(bash_cmd, shell=True)
print(exit_code)
主要问题是我收到 CyberArk 身份验证错误 most 次,但并非总是如此,所以它是随机的,我不知道为什么:
PSPSD072E Perform session error occurred. Reason: PSPSD033E Error receiving PSM For SSH server
response (Extra information: [289E [4426b00e-cc44-11ec-bca1-005056b74f99] Failed to impersonate as
user <user>. Error: [ITATS004E Authentication failure for User <user>.
在这种情况下,ssh 退出代码是 255,但如果我检查远程计算机上的 sshd 服务日志,则没有错误。我什至尝试使用 os 库来执行 bash 命令,但我得到了相同的结果。
我在考虑多次执行此脚本后挂起多个 ssh 会话,但在远程计算机上我只找到我正在使用的那个。
有人可以解释一下发生了什么,或者您有什么想法吗?
注意: 我没有任何访问 PSM 服务器的权限,它存储在变量 PROXY[=14= 中]
编辑 1: 我尝试使用 Paramiko 库创建 ssh 连接,但我收到与 Paramiko 相关但与 CyberArk 无关的身份验证错误。我还尝试了基于 Paramiko 的 Fabric 库,但它没有用。
如果我尝试从我的终端手动 运行 相同的 ssh 命令,它可以工作,我可以看到它首先连接到 PROXY,然后连接到 ip 远程机器。从脚本方面看,由于 CyberArk 身份验证错误,他甚至无法连接到 PROXY。
编辑 2: 我在执行 python 脚本时记录了所有命令 运行ning 的一些信息,我发现第一个命令是启动是 /bin/sh/ -c 加上 ssh 字符串:
/bin/sh -c ssh <user>@<domain>
这可能是主要问题吗? /bin/sh -c 的前置?或者这是使用子流程库时的正常行为?有一种方法可以在没有这个前缀的情况下只执行 ssh 命令吗?
编辑 3: 我删除了 shell=True 但遇到了相同的验证错误。因此,如果我手动执行 ssh 命令,我不会出错,但如果它是从 python 脚本执行的,我会收到错误,但我无法使用 [ 在进程级别找到任何矛盾=57=] aux 在这两种情况下。
由于身份验证错误是随机的,我只是添加了一个 while 循环来重置 known_hosts 文件并运行 ssh 命令 n 重试。
succeeded_cmd_exec = False
retries = 5
while not succeeded_cmd_exec:
if retries == 0:
break
bash_cmd = f'ssh-keygen -f "{Configs.KNOWN_HOSTS}" -R "{Configs.PROXY}"'
_, _, exit_code = exec_cmd(bash_cmd)
if exit_code == 0:
radius_password = generate_password(Configs.URI, Configs.PASSWORD)
bash_cmd = f"sshpass -p \"{radius_password}\" ssh -o stricthostkeychecking=no {Configs.USER}%{Configs.LOCAL_USER}%{ip}@{Configs.PROXY} 'ls'"
stdout, stderr, exit_code = exec_cmd(bash_cmd)
if exit_code == 0:
print('Output from SSH command:\n')
print(stdout)
succeeded_cmd_exec = True
else:
retries = retries - 1
print(stdout)
print('SSH command failed, retrying ... ')
print('Sleeping 15 seconds')
time.sleep(15)
else:
print('Reset known hosts files failed, retrying ...')
if retries == 0 and not succeeded_cmd_exec:
print(f'Failed processing IP {ip}')
exec_cmd函数定义如下:
def exec_cmd(bash_cmd: str):
process = subprocess.Popen(bash_cmd, shell=True, executable='/bin/bash', stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
process.wait()
return stdout.decode('utf-8'), stderr.decode('utf-8'), process.returncode
我正在尝试实现一个 python 脚本,该脚本在远程 CyberArk 机器上执行本地 bash 脚本或简单命令。这是我的代码:
if __name__ == '__main__':
for ip in IP_LIST:
bash_cmd = f"ssh -o stricthostkeychecking=no {USER}%{LOCAL_USER}%{ip}@{PROXY} 'bash -s' < {BASH_SCRIPT}"
exit_code = subprocess.call(bash_cmd, shell=True)
print(exit_code)
bash_cmd = f"scp {USER}%{LOCAL_USER}%{ip}@{PROXY}:server_info_PY.txt ."
exit_code = subprocess.call(bash_cmd, shell=True)
print(exit_code)
主要问题是我收到 CyberArk 身份验证错误 most 次,但并非总是如此,所以它是随机的,我不知道为什么:
PSPSD072E Perform session error occurred. Reason: PSPSD033E Error receiving PSM For SSH server
response (Extra information: [289E [4426b00e-cc44-11ec-bca1-005056b74f99] Failed to impersonate as
user <user>. Error: [ITATS004E Authentication failure for User <user>.
在这种情况下,ssh 退出代码是 255,但如果我检查远程计算机上的 sshd 服务日志,则没有错误。我什至尝试使用 os 库来执行 bash 命令,但我得到了相同的结果。
我在考虑多次执行此脚本后挂起多个 ssh 会话,但在远程计算机上我只找到我正在使用的那个。
有人可以解释一下发生了什么,或者您有什么想法吗?
注意: 我没有任何访问 PSM 服务器的权限,它存储在变量 PROXY[=14= 中]
编辑 1: 我尝试使用 Paramiko 库创建 ssh 连接,但我收到与 Paramiko 相关但与 CyberArk 无关的身份验证错误。我还尝试了基于 Paramiko 的 Fabric 库,但它没有用。
如果我尝试从我的终端手动 运行 相同的 ssh 命令,它可以工作,我可以看到它首先连接到 PROXY,然后连接到 ip 远程机器。从脚本方面看,由于 CyberArk 身份验证错误,他甚至无法连接到 PROXY。
编辑 2: 我在执行 python 脚本时记录了所有命令 运行ning 的一些信息,我发现第一个命令是启动是 /bin/sh/ -c 加上 ssh 字符串:
/bin/sh -c ssh <user>@<domain>
这可能是主要问题吗? /bin/sh -c 的前置?或者这是使用子流程库时的正常行为?有一种方法可以在没有这个前缀的情况下只执行 ssh 命令吗?
编辑 3: 我删除了 shell=True 但遇到了相同的验证错误。因此,如果我手动执行 ssh 命令,我不会出错,但如果它是从 python 脚本执行的,我会收到错误,但我无法使用 [ 在进程级别找到任何矛盾=57=] aux 在这两种情况下。
由于身份验证错误是随机的,我只是添加了一个 while 循环来重置 known_hosts 文件并运行 ssh 命令 n 重试。
succeeded_cmd_exec = False
retries = 5
while not succeeded_cmd_exec:
if retries == 0:
break
bash_cmd = f'ssh-keygen -f "{Configs.KNOWN_HOSTS}" -R "{Configs.PROXY}"'
_, _, exit_code = exec_cmd(bash_cmd)
if exit_code == 0:
radius_password = generate_password(Configs.URI, Configs.PASSWORD)
bash_cmd = f"sshpass -p \"{radius_password}\" ssh -o stricthostkeychecking=no {Configs.USER}%{Configs.LOCAL_USER}%{ip}@{Configs.PROXY} 'ls'"
stdout, stderr, exit_code = exec_cmd(bash_cmd)
if exit_code == 0:
print('Output from SSH command:\n')
print(stdout)
succeeded_cmd_exec = True
else:
retries = retries - 1
print(stdout)
print('SSH command failed, retrying ... ')
print('Sleeping 15 seconds')
time.sleep(15)
else:
print('Reset known hosts files failed, retrying ...')
if retries == 0 and not succeeded_cmd_exec:
print(f'Failed processing IP {ip}')
exec_cmd函数定义如下:
def exec_cmd(bash_cmd: str):
process = subprocess.Popen(bash_cmd, shell=True, executable='/bin/bash', stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = process.communicate()
process.wait()
return stdout.decode('utf-8'), stderr.decode('utf-8'), process.returncode