如何避免在 COBOL 程序中硬编码凭据?
How to avoid hardcoding credentials inside a COBOL program?
我有以下代码连接到 COBOL 程序中的外部数据库:
MOVE 'I2SFG04' TO WK-USER
MOVE '12345' TO WK-PASS
EXEC SQL
CONNECT TO :WK-EXT-MACHINE
USER :WK-USER
USING :WK-PASS
END-EXEC.
但是正如您猜到的那样,我不想对用户进行硬编码并在 COBOL 程序中传递。那么是否有一种安全的方式来存储它们,以便有权查看 COBOL 程序的任何人都看不到凭据?
我的第一个方法是用 SYSIN 内容创建一个文件(受 RACF 保护),这样 COBOL 程序可以加载它,但它不会显示在源代码中。像这样:
//STEP001 EXEC PGM=IKJEFT01
//STEPLIB DD DSN=I2SJR04.SYS.DBRMLIB,DISP=SHR
//SYSIN DD DSN=EF35.PRIVATE.DB.LOGIN,DISP=SHR
//SYSOUT DD SYSOUT=*
//SYSTSIN DD *
DSN SYSTEM(SSID)
RUN PROGRAM(MYCOBB) PLAN(PLANNAME) -
LIB('I2SJR04.SYS.LOADLIB')
END
/*
EF35.PRIVATE.DB.LOGIN 文件的内容:
I2SFG04
12345
有没有更好的方法来处理这种情况?
我能看到的唯一陷阱是,如果有人在哪里重新编码和重新编译程序以输出详细信息。
因此,也许您可以采取额外的步骤,使用 RACF 保护的程序库,该程序将编译到该程序库中。
我会尽力回答这个问题。我没有直接使用 COBOL 调用数据库。我们有一堆由另一个小组维护的服务器程序,但我确实做了一些挖掘。这就是我们使用 DB2 数据库的方式。我也不太清楚我们在幕后做了什么,所以你的情况可能会有所不同。以下是我的理解:
我们有一个 JCL 可以执行如下所示的程序:
//STEP01 EXEC PGM=PGM001
//*
//*------- DB2 Plan ------------------------*
//DSNPARMS DD DSN=XX.DBNAME.DBPLAN.JOBNAME,
// DISP=(MOD,DELETE,DELETE),
// UNIT=SYSDA,
// SPACE=(TRK,(0))
//*
//INPUT (input files for job)
//OUTPUT (output files for job)
DSNPARMS 文件本身是空的,它用作占位符,其中包含调用数据所需的所有相关信息。文件名的结构是SystemResourceCode.DatabaseName.PlanName.JobName
根据我的理解(对于 DB2 数据库),所需要做的就是相应地设置计划和集合,并将它们全部绑定到 ACID。
所以基本上 ACID 与数据库集合相关联,该集合包含一组数据库计划。
数据库计划指向数据库包。所以简而言之,如果与您的 ACID 相关联的集合中有适当的计划,您应该能够在没有登录凭据的情况下访问数据库,因为 DBMS 知道基于 ACID 这里是您实际有权访问的所有计划。
这也意味着需要设置 TSS 访问,以便需要访问 运行 具有该 ACID 的 JCL 的任何人都可以 运行 它。
我真的没有后端的任何示例代码,但我希望这个解释足以让您在某个地方通过硬编码凭据。与数据库人员交谈并询问他们有关设置计划和集合的信息。他们或许可以从那里为您提供帮助。
如果是 IBM zOS 大型机,则无需提供任何凭据。
您的连接将使用 运行ning 作业的用户 ID。
您只需告诉您的 DBA 作业将使用的 JCL 用户 ID
运行 under -- 然后他将授予对您正在使用的计划的访问权限。
更复杂、更安全的解决方案是编写一个简短的汇编程序,从安全系统(RACF、ACF2、Top Secret)本身获取用户和密码。
如果您将 IBM RACF 产品作为您的安全产品,下面是一个叙述:
https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.1.0/com.ibm.zos.v2r1.ichd100/passret.htm
这种方法所做的是将是否允许获取密码的逻辑交到安全管理员手中,而不是程序员手中。您可以向世界展示您的源代码,但如果安全系统不授予对凭据的访问权限,则用户可以看到什么都无关紧要。另外,这种类型的东西通常可以被审计,所以你可以很容易地得到每次 user/password 被引用的完整列表。
我有以下代码连接到 COBOL 程序中的外部数据库:
MOVE 'I2SFG04' TO WK-USER
MOVE '12345' TO WK-PASS
EXEC SQL
CONNECT TO :WK-EXT-MACHINE
USER :WK-USER
USING :WK-PASS
END-EXEC.
但是正如您猜到的那样,我不想对用户进行硬编码并在 COBOL 程序中传递。那么是否有一种安全的方式来存储它们,以便有权查看 COBOL 程序的任何人都看不到凭据?
我的第一个方法是用 SYSIN 内容创建一个文件(受 RACF 保护),这样 COBOL 程序可以加载它,但它不会显示在源代码中。像这样:
//STEP001 EXEC PGM=IKJEFT01
//STEPLIB DD DSN=I2SJR04.SYS.DBRMLIB,DISP=SHR
//SYSIN DD DSN=EF35.PRIVATE.DB.LOGIN,DISP=SHR
//SYSOUT DD SYSOUT=*
//SYSTSIN DD *
DSN SYSTEM(SSID)
RUN PROGRAM(MYCOBB) PLAN(PLANNAME) -
LIB('I2SJR04.SYS.LOADLIB')
END
/*
EF35.PRIVATE.DB.LOGIN 文件的内容:
I2SFG04
12345
有没有更好的方法来处理这种情况?
我能看到的唯一陷阱是,如果有人在哪里重新编码和重新编译程序以输出详细信息。
因此,也许您可以采取额外的步骤,使用 RACF 保护的程序库,该程序将编译到该程序库中。
我会尽力回答这个问题。我没有直接使用 COBOL 调用数据库。我们有一堆由另一个小组维护的服务器程序,但我确实做了一些挖掘。这就是我们使用 DB2 数据库的方式。我也不太清楚我们在幕后做了什么,所以你的情况可能会有所不同。以下是我的理解:
我们有一个 JCL 可以执行如下所示的程序:
//STEP01 EXEC PGM=PGM001
//*
//*------- DB2 Plan ------------------------*
//DSNPARMS DD DSN=XX.DBNAME.DBPLAN.JOBNAME,
// DISP=(MOD,DELETE,DELETE),
// UNIT=SYSDA,
// SPACE=(TRK,(0))
//*
//INPUT (input files for job)
//OUTPUT (output files for job)
DSNPARMS 文件本身是空的,它用作占位符,其中包含调用数据所需的所有相关信息。文件名的结构是SystemResourceCode.DatabaseName.PlanName.JobName
根据我的理解(对于 DB2 数据库),所需要做的就是相应地设置计划和集合,并将它们全部绑定到 ACID。
所以基本上 ACID 与数据库集合相关联,该集合包含一组数据库计划。
数据库计划指向数据库包。所以简而言之,如果与您的 ACID 相关联的集合中有适当的计划,您应该能够在没有登录凭据的情况下访问数据库,因为 DBMS 知道基于 ACID 这里是您实际有权访问的所有计划。
这也意味着需要设置 TSS 访问,以便需要访问 运行 具有该 ACID 的 JCL 的任何人都可以 运行 它。
我真的没有后端的任何示例代码,但我希望这个解释足以让您在某个地方通过硬编码凭据。与数据库人员交谈并询问他们有关设置计划和集合的信息。他们或许可以从那里为您提供帮助。
如果是 IBM zOS 大型机,则无需提供任何凭据。
您的连接将使用 运行ning 作业的用户 ID。
您只需告诉您的 DBA 作业将使用的 JCL 用户 ID 运行 under -- 然后他将授予对您正在使用的计划的访问权限。
更复杂、更安全的解决方案是编写一个简短的汇编程序,从安全系统(RACF、ACF2、Top Secret)本身获取用户和密码。
如果您将 IBM RACF 产品作为您的安全产品,下面是一个叙述: https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.1.0/com.ibm.zos.v2r1.ichd100/passret.htm
这种方法所做的是将是否允许获取密码的逻辑交到安全管理员手中,而不是程序员手中。您可以向世界展示您的源代码,但如果安全系统不授予对凭据的访问权限,则用户可以看到什么都无关紧要。另外,这种类型的东西通常可以被审计,所以你可以很容易地得到每次 user/password 被引用的完整列表。