QIBM

    技术2022-07-21  106

    在当今的IT专业人员词典中,黑客,网络钓鱼,Sarbanes Oxley和HIPAA等术语正变得越来越普遍。 尽管他们很熟悉,但是如果您对当前的IBM i安全性实施方案没有完全的信心,它们可能会使您有些颤抖。 如今,安全性已成为热门话题,因为企业中最重要的资产之一就是存储在数据库中的信息。 因此,建立,实施和维护完善的数据库安全策略必须位于IT部门优先级列表的顶部或附近。 在您需要定期问自己的问题列表中,这些问题是:“您是否正在尽一切可能使数据安全可靠?安全实施中是否存在任何空白?如果是,是否有任何方法可以解决这些空白? ” IBM i平台提供了许多安全性功能,包括确保数据安全的方法。 本文向您介绍了“开放数据库文件”出口点,以及如何使用它来解决IBM i数据库安全性实现中的潜在漏洞。

    注:本文先前于2007年以IBM白皮书的形式发布。现在,该文章在IBM i区域中以IBMdeveloperWorks®的形式重新发布,以扩大其了解范围,并提高对许多DB2 i版客户发现的主题和技术的认识。有用。 即使该信息已有多年历史,但细节仍然是相关且准确的。

    出口点

    如果您是IBM i程序员或管理员,则可能已经意识到,甚至可能已经实现了出口点,以帮助管理和保护IBM i应用程序环境和数据。 出口点定义为系统功能或程序中的特定点,可以将控制权传递给一个或多个指定的出口程序。 使用出口点,您可以编写程序以在每次系统上发生特定事件时执行自定义处理。

    QIBM_QDB_Open

    在IBM i V5R3中,添加了对QIBM_QDB_OPEN(开放数据库文件出口)的支持。 只要打开系统上的数据库表,此退出点就可以调用程序。 正确设置出口点之后,当系统上的任何作业发出打开物理文件,逻辑文件,SQL表或SQL视图的请求时,将调用出口程序。 无论打开请求的来源如何,都会执行此操作; 其中包括编程接口(例如记录级访问和SQL)以及非编程接口(例如IBM i Navigator,IBM Query / 400,用于i的IBM DB2 Web Query,IBM数据文件实用程序(DFU)甚至是IBM i命令“打开查询文件(OPNQRYF)和显示物理文件成员(DSPPFM)”。当数据库打开并发生调用时,退出程序在发出打开请求的同一作业中运行,并且可以实际设置返回码值拒绝公开请求。

    了解数据库打开

    当请求完全打开时,出口点将调用出口程序。 完全开放会导致创建开放数据路径(ODP)。 ODP提供了从程序到表的直接路径,因此程序可以发出输入和输出操作来访问表中的数据。 如果使用出口点,那么重要的是要了解何时发生全开。 此事件的发生时间取决于多种条件,包括您请求的数据库访问类型:RLA或SQL。

    记录级访问

    记录级访问(也称为本机I / O )是高级语言(HLL)程序(例如RPG和COBOL)访问文件内容的传统方式。 如今,许多程序仍使用记录级访问来访问数据。 记录级别的完全打开访问发生在程序发出打开操作或方法时,而不是在实际尝试访问数据的过程中(例如READ或CHAIN操作)。

    当RPG程序使用记录级别访问时,表在程序的文件规范部分(F-spec)中定义。 实际发生打开的时间取决于F规范中是否指定了USROPN关键字。 如果不是,则在首次调用该程序时会发生隐式的完全打开。 但是,如果指定了USROPN关键字,则程序必须使用OPEN操作或内置的%OPEN函数显式打开表。 无论哪种情况(隐式或显式打开),RPG程序分配给最后一条记录(LR)指示符的值都指示该程序后续调用的表打开行为。 如果打开了LR,则在程序结束之前关闭表,并在每次后续调用程序时发生完全打开。 但是,如果该程序未打开LR,则所有表都将保持打开状态,以便以后对该程序进行调用,从而使它们免于完全打开的负担。 在这种情况下,ODP保持不变,程序处于所谓的重入模式。

    具有记录级别访问权限的另一种打开方式是“共享打开方式”,该技术用于在同一作业或路由步骤中的多个程序之间共享文件的ODP。 一个程序对文件进行完全打开,该作业中的所有其他程序可以对该文件使用相同的ODP,从而节省了系统资源,例如处理器,内存和磁盘。 通过在替代中指定SHARE(* YES)参数或通过在打开文件之前创建文件命令来控制共享打开。 共享打开通常在调用OPNQRYF命令的应用程序中使用。

    SQL访问

    HLL程序和远程接口[例如开放式数据库连接(ODBC),Java数据库连接(JDBC)和ADO.NET]可以使用SQL访问表。 显然,在游标上使用SQL OPEN语句时会发生打开。 启动SELECT INTO,INSERT,DELETE和UPDATE语句时,打开不是那么明显。 与所有SQL语句一样,这些打开由数据库管理器执行,数据库管理器在内部为应用程序打开表。 在初始执行打开游标或其他SQL语句期间,数据库管理器执行完全打开。 当关闭游标或语句完成运行时,表将关闭。 如果在同一作业或连接中第二次运行同一语句,则将重复该过程并发生另一个完全打开。 第二次执行后,数据库管理器实际上并未关闭该表; 对于同一作业或连接中的语句的后续执行,它保持打开状态。 在语句的第三次执行期间,数据库管理器不必执行完全打开,因为表已经打开。 这称为“伪打开”,此时,该语句处于通常称为“ ODP重用模式”的状态。 与本机I / O操作中的共享打开相比,伪打开的特性和行为相似。

    调用出口程序

    理解打开类型很重要,因为仅在请求完全打开时才调用出口点程序。 伪打开,共享打开或重入模式下的程序访问表时,不会调用出口程序。

    对于定义为多表联接SQL视图,逻辑文件或Query / 400查询,退出程序仅被调用一次,但是其输入参数列表包含正在打开的视图或逻辑文件,以及包含视图或逻辑文件的每个基础表。 退出程序要分别提取和处理每个条目。

    另外,许多表(由IBM提供)和临时表从出口点的控制中排除。 因此,即使请求完全打开,如果要打开的表位于QTEMP,QSYS,QSYS2或其他几个系统库中,也不会调用退出程序。 有关这些库的完整列表,请参考IBM i信息中心中的QIBM_QDB_OPEN出口点条目。

    用例

    与IBM i环境上的多个出口点一样,QIBM_QDB_OPEN的主要实现是补充安全性,特别是数据库安全性。 它可以通过以下方式用于增强现有的安全性实现:

    协助执行安全策略 执行某种级别的审核,以尝试确定存在安全漏洞的位置

    实施数据库安全策略

    过去,保护数据非常简单。 用户配置文件设置(例如初始程序和职位描述)可能会限制用户只能使用5250个应用程序。 例如,可以将用户配置文件的极限能力参数设置为* YES,以防止用户获得命令行。 可以依靠该应用程序为特定用户封送对特定表的访问。 这种应用程序级别的安全性足以保护数据。 不需要对象级别的安全性,因为没有其他接口可以访问数据。 在当今的环境中,应用程序级别的安全性还不够。 您必须考虑并阻止试图访问主应用程序外部敏感表的用户或进程未经授权访问远程数据库对象的威胁。 外部应用程序和接口,例如IBM i Navigator和其他基于ODBC或JDBC的工具,允许用户访问不受主线应用程序控制或影响的系统的访问权限,因此不受安全性的控制。内置到该应用程序中。

    如果应用程序级安全性描述了您的环境,则强烈建议您至少研究实现对象级安全性的选项。 从长远来看,这是保护数据的最佳,最有效的方法之一。 有关对象级安全性的更多信息,请参阅《 IBM i信息中心》和《 IBM i安全性参考》手册。

    补充应用程序级安全性

    如果您确定实现对象级安全性是一项艰巨的任务,或者只是不存在投资回报(ROI),请考虑使用退出点来帮助您解决安全性方面的一些不足。 对于5250应用程序,您仍然可以依靠应用程序级别的安全性和用户配置文件中的设置来阻止来自基于5250的传统应用程序界面的未经授权的访问。 另外,您可以使用出口点通过上述远程接口来阻止不受限制的访问。

    提供安全粒度

    解决方案提供商可以使用此出口点(和其他系统出口点)来允许其客户定制,控制和管理本地和远程数据库对象访问策略。 例如,退出程序可能使用一个安全表,其中包含敏感数据库表和授权用户的列表,以及这些用户的本地和远程访问权限(请参阅表1)。

    表1:退出程序安全性表的示例
    数据库表 用户资料 本地访问 远程访问 命令 科宝 ñ ÿ 命令 KMILL ÿ ñ 命令 杰瑞克 ÿ ÿ

    当数据库开放请求针对表ORDERS调用时,退出程序可以确定所请求的访问类型(本地或远程),在安全性表中查找以验证发出请求的用户是否具有对该表的访问类型,并且因此,允许或拒绝数据库打开请求。

    使用表1中的示例数据,用户编写的退出程序执行以下任务:

    防止用户COBBG从基于5250的主应用程序界面中打开ORDERS表; 但确实允许该用户通过ODBC接口访问ORDERS,以填充报表的电子表格。 允许用户KMILL从基于5250的主应用程序中打开ORDERS,但可以阻止该用户使用远程接口访问数据。 允许用户JAREK从本地和远程接口打开ORDERS。

    您甚至可以更进一步,仅允许在一周中的某些天或一天中的某些小时进行远程访问。 因为您编写出口点程序,所以可以控制对特定用户的访问,这些用户可以在特定条件下访问表。 如您所见,出口点提供了一定程度的安全粒度,这在使用对象级安全性时是不可能的。

    稽核

    从审计的角度来看,出口点可以帮助您捕获与数据库安全性有关的信息,例如:

    尝试访问敏感表的用户 打开是否是SQL查询的结果 打开操作的类型(读取,插入,更新和删除) 尝试打开表时使用的程序和接口

    比较出口点与对象审核

    如果您熟悉IBM i上的安全性功能,那么您可能会知道审计日志,它使您可以指示系统捕获和记录任何与安全性相关的事件的发生。 这些事件记录在称为日志接收器的特殊系统对象中。 审计日志的子集功能之一是能够记录对对象(例如敏感表)的访问。 这称为对象审核 。

    例如,要为FLGHT400C模式中的AGENTS表设置对象审计,请从IBM i OS命令行发出以下命令:

    CHGSYSVAL SYSVAL(QAUDCTL)值(* OBJAUD) CHGOBJAUD OBJ(FLGHT400C / AGENTS)OBJTYPE(* FILE)OBJAUD(* ALL)

    任何访问该表的尝试都会记录到审核日志中。 以后可以使用IBM i OS Display Journal(DSPJRN)或Display Audit Journal Entries(DSPAUDJRNE)命令显示或提取审计信息。

    从审计的角度来看,对象审计和出口点的功能似乎相似,但是两者之间存在一些关键差异。

    管理:使用对象审核,在设置完之后,系统将接管并负责捕获和记录对象的每次访问。 使用出口点,IBM i程序员负责编写程序以提取和记录访问尝试的详细信息,并负责创建日志表和其他支持对象。 对象级权限:如果对象级权限阻止发出请求的用户访问表,则不会调用出口点程序。 由于对象访问受到限制,因此不会打开表,也不会调用出口点程序。 这样做的负面影响是,退出程序无法记录此类未经授权的访问尝试的发生。 但是,对象审核可以检测到此类访问请求,即使它们不成功。 采取行动的能力:对象审核只能记录对象访问的发生。 它不能阻止访问尝试,也不能立即触发工作流程来向某人警告访问尝试。 只要对象级权限不阻止调用出口点程序,则出口点使程序员能够阻止访问或执行必要的工作流任务。

    有关IBM i审计日志和对象审计的更多信息,请参阅《 IBM i信息中心》和《 IBM i安全性》参考手册。

    将出口点与数据库触发器进行比较

    您可能更熟悉数据库触发器的概念,数据库触发器是与数据库表关联的用户编写的程序或SQL例程。 读取行或表中发生更改时,无论启动更改的接口如何,数据库管理器都会自动激活(触发)数据库触发器。 数据库触发器的主要目的是监视数据库更改并执行与这些更改相关的任务。 在评估是否使用出口点或触发器来满足您的安全性要求时,需要考虑以下几点:

    管理:出口点是全局(即系统范围)设置。 您只需要在一个地方进行设置并编写退出程序即可。 根据要启用触发器的表的数量,数据库触发器可能需要更多干预。 这是因为您必须为要审核的每个表添加触发器。 此外,为了确保检测到每种类型的数据库访问,必须向每个表添加四个触发器:每个触发器分别用于READ,UPDATE,INSERT和DELETE(尽管每个触发器可以调用相同的程序)。 要执行审核任务,这两种方法都要求您编写程序来创建支持对象。 对象级权限:与出口点一样,如果对象级权限阻止用户访问表,则不会调用数据库触发器。 性能:由于通常会为要处理的每一行调用触发器,因此就性能而言它们可能会更昂贵。 如果查询处理许多行,则尤其明显。 另外,READ触发器可能很昂贵,必须谨慎使用。 在某些使用READ触发器的情况下,例如查询包含分组字段时,必须在处理该语句之前创建表的临时副本。 如上所述,仅在请求完全打开时才调用出口程序。 与触发器相比,这通常导致更少的程序调用和处理。 提供的信息:触发器的优点是,在审核的事件中可以访问实际数据。 在更新的情况下,行的前后图像都提供给触发程序。 但是,出口点程序在完全打开期间被调用,并且不提供有关所访问的行的任何信息。 采取行动的能力:与出口点一样,如果对象级权限未阻止用户访问表,则数据库触发器可以阻止访问数据库或执行其他工作流任务的尝试。 为了阻止访问,触发程序仅发出错误信号,以防止请求的操作成功完成。

    在决定使用哪种方法时,大部分取决于您的审核要求。 一些审计法规(例如HIPAA)规定,应用程序必须针对敏感数据库和所访问行的内容记录每次访问尝试。 在这种情况下,您实际上别无选择,只能使用触发器来满足您的审核要求。

    有关数据库触发器的更多信息,请参阅《 IBM红皮书: 用于iSeries的DB2通用数据库上的存储过程,触发器和用户定义的函数》。

    下表总结了每种审核方法。

    表2:审计方法的比较
    方法 行政 需要编程 被对象级权限禁用 性能 提供的行内容 采取行动的能力 出口点 系统范围的设置 是 是 仅在完全打开时调用 没有 是 对象级审核 系统范围的设置 没有 没有 记录事件 没有 没有 数据库触发器 每个表设置 是 是 呼吁每一行 是 是

    编写出口点程序

    如前所述,在注册出口点之后,它将成为系统范围的设置; 每当系统上的许多数据库表发生完全打开时,都会调用退出程序。 重要的是要了解,发出数据库打开请求的作业在继续打开请求之前会等待退出程序完成。 根据退出程序的编写方式和功能,这可能会对应用程序性能产生深远的负面影响。 需要重复说明的是,不小心实现出口点可能会对应用程序性能产生重大影响。

    如果决定使用出口点,则在设计阶段需要注意以下注意事项。

    确保您的程序可以处理多个表打开的情况(例如在逻辑文件,视图或查询中定义的多个表联接以及在SQL语句中指定的多个表或视图的情况下)。 例如,如果打开了一个多表联接视图,则退出程序仅被调用一次,但是传递给该视图以及构成联接视图的每个表的列表。 为了彻底处理打开请求,您的程序必须能够处理此列表中的每个视图或表。 如果退出程序本身正在打开表,请确保检查并处理潜在的递归程序调用; 否则,您的程序将发现自己处于递归无限循环中。 另外,如果退出程序使用记录级访问打开表,则必须在F-spec部分中指定USROPN关键字。 确定导致调用该程序的表不是要在退出程序中打开的表之后,可以在程序中显式打开它。 同样,不执行这些操作会导致递归循环。 本文后面将详细讨论处理递归循环问题的主题。 如果退出程序将返回码更改为0,则数据库打开失败。 如果程序未更改返回码或将其更改为1 ,则打开请求将被接受,打开请求将继续。 退出程序必须是线程安全的。

    一个简单的RPG示例

    考虑到这些注意事项,这是一个用RPG编写的退出程序的简单示例。 该程序以包含标题信息的数据结构传递,例如:当前用户,打开的表数,请求的打开类型(输入,输出,更新,删除)以及偏移值。 偏移值包含列表结构的起始地址,以及有关每个已打开表的信息。 该程序执行以下任务:

    它提取提出数据库打开请求的当前用户的名称。 它使用标题结构中的偏移量值来计算表列表的起始地址 从表列表中,提取要打开的表。 如果要打开的表是FLIGHTS,而请求打开的当前用户是COBBG,则返回码设置为0 ,程序结束。 将返回码设置为0指示数据库管理器阻止打开请求。 如果所有表都不是FLIGHTS,则程序将在不更改返回代码的情况下结束。 这允许数据库打开请求继续进行。

    示例1:一个简单的RPG程序

    h dftactgrp(*no) actgrp(*caller) * d DBOP0100 ds qualified d HeaderSize 10i 0 d FormatName 8 d ArrayOffset 10i 0 d FileCount 10i 0 d ElementLength 10i 0 d JobName 10 d UserName 10 d JobNumber 6 d CurrentUser 10 d QueryOpen 1 d DBOPFile ds qualified based(DBOPFilePtr) d FileName 10 d Library 10 d Member 10 d 2 d FileType 10i 0 d UnderlyingPF 10i 0 d InputOption 1 d OutputOption 1 d UpdateOption 1 d DeleteOption 1 d returnCode s 10i 0 d i s 10i 0 d userNam s like(dbop0100.UserName) d fileNam s like(dbopFile.fileName) d curUser s like(dbop0100.currentUser) c *entry plist c parm DBOP0100 c parm ReturnCode /free // Extract current user from passed in structure curUser = dbop0100.CurrentUser; // Process each table being opened by the request for i = 1 to DBOP0100.FileCount; DBOPFilePtr =
    转载请注明原文地址:https://ipadbbs.8miu.com/read-29965.html
    最新回复(0)