如何在 JCL FTP 中保护存储密码?

How to secure store password in a JCL FTP?

我有以下代码使用 JCL 通过 FTP 发送文件:

//FTP00001 EXEC PGM=IKJEFT01,DYNAMNBR=50         
//OUT      DD   SYSOUT=*                         
//AMSDUMP  DD   SYSOUT=*                         
//SYSTSPRT DD   SYSOUT=*                         
//SYSIN    DD   DUMMY                             
//SYSPRINT DD   DUMMY                             
//OUTPUT   DD   SYSOUT=*                         
//SYSTSIN  DD  *                                 
123.234.345.67
myuser1
p4ssw0rd
ascii
cd infos
PUT 'EF35.LMINFO.D180203' info_180203.txt
QUIT
/*

它非常有用,问题是我不想将凭据硬编码到 JCL 中。我们如何隐藏它们,使有权访问 JCL 的任何人都看不到连接详细信息?我也想从输出中隐藏凭据,但请注意,我仍然想查看其余信息:传输的字节数、可能的错误消息等。

我想将 SYSTSIN 内容放在一个文件中,但我会遇到同样的问题:任何有权访问该文件的人都会看到用户并通过。因此,解决这个问题的最佳方法是什么?

我见过的做法是这样的:

//FTP00001 EXEC PGM=IKJEFT01,DYNAMNBR=50         
//OUT      DD   SYSOUT=*                         
//AMSDUMP  DD   SYSOUT=*                         
//SYSTSPRT DD   SYSOUT=*                         
//SYSIN    DD   DUMMY                             
//SYSPRINT DD   DUMMY                             
//OUTPUT   DD   SYSOUT=*                         
//SYSTSIN  DD  DSN=AA.SOMETHING.LOGIN,DISP=SHR
//         DD  DSN=AA.SOMETHING.FTP,DISP=SHR
//         DD  DSN=AA.SOMETHING.LOGOFF,DISP=SHR

其中 AA.SOMETHING.LOGIN 将包含

123.234.345.67
myuser1    <- replace with ACID for this job 
p4ssw0rd   <- replace with password for the ACID

AA.SOMETHING.FTP 会 conatin

ascii
cd infos
PUT 'EF35.LMINFO.D180203' info_180203.txt

AA.SOMETHING.LOGOFF 将包含

QUIT

此 JCL 将通过批处理 ACID 运行,并且只有 ACID 可以 read/write 访问 AA.SOMETHING.LOGIN 文件。因此 FTP 服务器需要将 ACID 添加为用户。这确实是唯一的方法。不过你是对的,任何有权访问 AA.SOMETHING.LOGIN 的人都可以看到凭据,但是因为我们将登录信息与 FTP 命令分开,所以没有理由需要访问登录文件,除非 username/pass 或 IP 地址更改。因此,您将能够更改您有权访问的文件中的任何内容。您还可以更进一步,而不是将 IP 地址放在单独的数据集中,这样您就可以 edit/view 除了登录凭据之外的任何内容。看起来像这样:

//FTP00001 EXEC PGM=IKJEFT01,DYNAMNBR=50         
//OUT      DD   SYSOUT=*                         
//AMSDUMP  DD   SYSOUT=*                         
//SYSTSPRT DD   SYSOUT=*                         
//SYSIN    DD   DUMMY                             
//SYSPRINT DD   DUMMY                             
//OUTPUT   DD   SYSOUT=*                         
//SYSTSIN  DD  DSN=AA.SOMETHING.SERVER,DISP=SHR
//         DD  DSN=AA.SOMETHING.LOGIN,DISP=SHR
//         DD  DSN=AA.SOMETHING.FTP,DISP=SHR
//         DD  DSN=AA.SOMETHING.LOGOFF,DISP=SHR

这还允许您更改服务器、FTP 命令和 logout/cleanup 所有这些都无需访问登录凭据。

唯一真正的缺点是如果您需要更新登录凭据,您需要:

  1. 请求访问文件
  2. 编写另一个 JCL,它将 运行 使用有权访问该文件的 ACID 来更新它

即使考虑到这一点,我仍然认为这是最好的方法。

harrison4 指出 IBM Communications Server 具有此解决方案的架构形式,可以使用数据集或 USS 文件。它记录在 "z/OS Communications Server: IP User's Guide and Commands" 手册中,harrison4 在他的评论中链接到该手册:

https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.1.0/com.ibm.zos.v2r1.halu001/netftp.htm

虽然不言而喻,但我还是要说。将密码存储在数据集或文件中总是不好的做法,除非它们被加密(不是编码,加密)。如果您必须这样做,请确保文件权限或安全管理器配置文件尽可能限制对 file/dataset 的访问。