搜索​​​​

清除过滤器

#InterSystems API管理器(IAM)

14 帖子0 关注者

#InterSystems IRIS FAQ

0 帖子0 关注者
公告
Michael Lei · 一月 27, 2023

InterSystems IRIS 持久化类审计包

大家好, 我在 OEX 上加载了一个新软件包,我也计划在本月参加比赛。 简而言之,它为您提供以下内容。 用于 InterSystems IRIS 的持久(表)类以保存记录历史的基类 这些类允许在touch时将持久类记录历史化到另一个持久类中。 这提供了任何记录的完整历史记录。 它允许记录回滚到特定版本。 它可以自动清除旧的历史记录。 请检查一下。 谢谢你们。
文章
Michael Lei · 四月 4, 2023

InterSystems SQL 小妙招

嗨开发者们! 如您所知,InterSystems IRIS 除了Global、对象、文档和 XML 数据模型还支持关系,其中 SQL 语言也被用来处理数据。 与其他关系型 DBMS 一样,InterSystems IRIS 有自己的特点。 我开始这篇文章是为了抛砖引玉,并邀请您分享您的小诀窍 - 我会根据收到的评论更新内容。 开始了! 列出数据库中的所有表: SELECT TABLE_SCHEMA, TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE= 'BASE TABLE' 感谢@Dmitry.Maslennikov 使用当前日期和当前时间作为默认值创建表: CREATE TABLE CUSTOMER ( ID INTEGER PRIMARY KEY NOT NULL , NAME VARCHAR ( 100 ) NOT NULL , PASSWORD VARCHAR ( 20 ) NOT NULL , LAST_UPDATED TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL , REGISTRATION_DATE DATE DEFAULT CURRENT_DATE NOT NULL ); 注意不带括号的函数 CURRENT_TIMESTAMP 和 CURRENT_DATE。 创建在内部使用 ObjectScript 的存储过程/函数: CREATE OR REPLACE FUNCTION IRIS_VERSION() RETURNS VARCHAR LANGUAGE OBJECTSCRIPT { Return $ZV } 调用存储过程/函数: select IRIS_VERSION() as "Version" 调用内部函数。 返回 IRIS 版本: Select $ version 返回当前命名空间: Select $namespace 欢迎大家在评论区留下你的小妙招! 分页查询: select top :row * from PatientInfo where id not in (select top 10(:page-1) id from PatientInfo order by id asc) order by id

#InterSystems IRIS for Health

833 帖子0 关注者
文章
Nicky Zhu · 八月 10, 2022

InterSystems 数据平台互操作功能运行维护管理基础 - 互操作消息管理

InterSystems 数据平台的互操作功能与久经考验的Ensemble和HealthConnect集成引擎产品一脉相承。事实上,使用IRIS的典型客户不但应用了IRIS提供的多模型数据存储、分布式存储等数据存储特性,也广泛地应用如可视化数据转换,可视化数据流程编辑和可视化规则引擎等一系列互操作能力构建异构系统间或组织机构间的数据流程。 那么,在生产环境上,如何监控与评估数据流程的运行状况,在发生问题时如何快速定位并解决故障,就是用户的运维团队需要考虑的问题。 本系列文章将围绕IRIS互操作功能中核心的互操作消息管理,Production管理与优化及互操作告警与通知三个方面介绍互操作功能的运维基础知识和常用技巧,希望能够帮助客户平稳、高效地运用数据平台。 注:本文提到的InterSystems数据平台,包括Caché数据库、Ensemble集成平台、HealthConnect医疗版集成平台和InterSystems IRIS数据平台。 互操作消息管理 消息是互操作功能中各组件间通信的基本方法,在互操作Production业务服务、业务流程和业务操作之间广泛使用。 除承担信息传递的基本功能外,由于常常需要在生产环境中查看消息内容或重发消息以解决问题,消息检索就是大家最常用到的功能,而IRIS特有的结构化消息存储也为开发和运维团队使用和管理消息创造了便利。用户能够通过消息的内容,某项具体属性,来源/目标和发生时间等条件检索和过滤消息,迅速找到自己感兴趣的信息。 我们先回顾下消息的结构与关联的上下文。 消息结构 如图所示,消息分为消息头与消息体两部分。其中消息头(标头)主要用于记录消息发生的来源、趣向、时间和消息类型等上下文信息,而消息体(正文)则为消息的具体内容。 而在消息的上下文中,会话是一个比较重要的概念,它用于表达一次交互过程中,从初始的输入所触发的所有消息。在使用时,需要注意: Message Trace将显示一个会话的所有信息 消息查看器默认只列出会话开始的信息(绿色消息) 消息检索 下图即为平台自带的消息查看器,可通过Ensemble > 查看 > 消息导航访问(Ensemble菜单项在IRIS和HealthConnect产品中的名称为Interoperability,位置,含义均相同,下文中将不再赘述)。 可见其中包含若干预制条件及可灵活扩展的查询条件以应对不同场景的需求。 需要注意的是,对检索所需的消息体或头属性建立索引很重要。因为在生产环境中,production中的消息存量可以轻易达到百万、千万甚至亿级,对于海量数据不经过索引进行检索就性能而言不可行。 应用SQL检索消息 如果需要,也可以使用SQL语句进行搜索 系统资源管理器SQL执行查询。 在运行前切换到正确的命名空间。 可以参考消息查看器使用的SQL语句来修改 在Terminal中,在执行搜索的命名空间中运行以下代码。 Set ^Ens.Debug("UtilEnsMessages", "sql")=1 在消息查看器中执行搜索 根据需要从消息查看器复制、修改和执行SQL。 需要SQL知识 用户可直接运用平台提供的SQL示例检索消息,这样的SQL也为用户学习和掌握IRIS持久话消息的结构和辅助函数等概念提供了基础。 用户在熟悉消息结构,并了解SQL的条件下,配合Search Table、索引等特性,可以实现更复杂的基于消息内容的查询。 其中,关于Search Table的应用,用户也可参考我们的另一篇文章《互操作消息统一管理系列:SearchTable加速检索》。此处不再赘述。 异常消息的处理 重发消息 借助消息的持久化,当通信异常导致消息传递失败时,用户也可通过重发消息重新触发业务 挂起消息 如果业务组件运行错误,可能会挂起消息 手动停止消息 队列查看页 > 选择业务组件 > 挂起按钮 组件配置页 > 作业 > 挂起按钮 挂起后消息保持静止,等待手工处理 用户也可有针对性地查看和处理被挂起的消息。 查看挂起消息 Ensemble > 查看 > 已挂起的消息 重发已挂起消息 从已挂起消息页重发将发送被挂起的这条消息 从消息查看器重发将复制并发送一条新的消息 中断消息 IRIS的业务组件有自动重发消息的能力。但但运维团队明确远端故障已发生,短期内重发消息没有意义时,也可下达指令丢弃消息,不再进行后续处理。 业务组件处于重试状态时 组件配置页 > 作业 > 放弃按钮 Ensemble > 监视器 > 队列 > 点击业务组件 > 选择活动的消息 > Abort 或 Abort All 按钮 中断被堆积的消息 Ensemble > 监视器 > 队列 > 点击业务组件 > 选择排队的消息 > Abort 或 Abort All 按钮
文章
Nicky Zhu · 八月 10, 2022

InterSystems 数据平台互操作功能运行维护管理基础 - Production管理与优化

Production是开发者基于InterSystems IRIS产品家族实现互操作功能的主要技术架构。而每个Production的运行依赖于三类主要的业务组件: 业务服务(Business Service) 业务流程(Business Process) 业务操作(Business Operation) 三类组件间以消息作为信息交换的主要媒介。因此,要保障互操作业务的稳定运行,除保障软件平台有充足的软硬件资源运行外,保障Production中消息的高效传输以及三类组件的平稳、高效运行则是运维团队面临的主要目标。下面列举的若干项任务则有助于运维团队实现这些目标: 优化业务组件运行效率 Production中的业务组件都有运行池的概念,允许业务组件运行在多个进程上并发工作以提高整体性能。运行池又可以分为私有池和参与者池两类。 私有运行池 业务组件的CPU作业的数量 默认为1即可工作 通过性能测试确定最佳的池大小 拥有私有池的业务组件从私有队列中处理消息 无适配器业务服务的池大小需设置为0 需要多进程时,池大小设为1可以保证信息以先进先出(FIFO)顺序处理 整个消息流中的所有业务组件的池大小都不应大于1 参与者池 Production级的参与者池设置 用于处理公共队列中的请求的CPU作业的数量 由使用公共队列的所有业务流程共享。 业务流程和业务操作的池大小设置。 0 - 使用参与者池和公共队列 非0--使用私人队列,有指定的CPU作业数 对于FIFO,设置池大小=1 参与者池与业务流程的启停 任何一个池大小为0(仅使用公有池)的业务流程被禁用时,所有的参与者都不会启动 防止任何池大小为0的业务组件从公共队列中处理消息 要保障其他参与者正常工作 将要被禁用的组件的Pool Size改为大于0并应用 如果已经禁用,要启动其他参与者 保持组件禁用,但将其Pool Size为大于0并应用 Production的运行维护 Production本身具备一系列的运行状态管理功能,帮助运维团队在生产环境上处理Production运行的一系列任务,包括 Production运行维护 – 自动启动 Ensemble > 管理 自动启动Production > 选择要自动启动的Production 在Ensemble启动时自动启动Production 如果需要的话,会自动调用RecoverProduction()方法,恢复Production状态 系统级启用开关 系统管理 > 配置 > 其他设置 > 启动 > EnsembleAutoStart 默认情况下为 "真"。 在排除故障时,可能需要禁用。 Production运行维护 – 强制关闭 如果Production关闭得太慢 等待关闭超时 显示强制关闭按钮 Production运行维护 – 更新 运行的组件与它的底层类代码不同步,需要Production来更新 业务组件进程因错误而意外关闭,需要重新启动 设置的改变需要业务组件重新启动 更新按钮出现在Production配置页面。 Production运行维护 – 恢复 在非正常关机和一些错误之后出现 如果需要,自动启动Production将在启动前自动恢复 Production运行维护 – 中断 在配置页面上显示 Production被关闭时如果满足如下条件之一: 有同步消息在等待响应。 或者,队列非空,意味着Production还没处理完消息 或者,消息仍在被组件处理 或者,有级别较高的告警请求 Production中断后的选项 重新启动Production以完成消息的处理 如果启动后消息仍然被组件不断重试(提示故障未排除) 修复导致重试的问题 挂起消息 中断消息 在测试系统中(决不能是生产系统),如果你决定必须完全清除所有队列,请调用Ens.Director类的CleanProduction()方法 do ##class(Ens.Director).CleanProduction() Production的配置 Production本身是基于InterSystems的大量预制组件经开发或直接部署产生的软件包,因此将包含大量不需要在代码中固定写好的配置项,例如远程连接的地址,扫描数据表使用的SQL等。运维团队的工作之一,就是在外部环境发生变化,例如第三方系统部署地址发生变化时,通过调整Production的设置来应对变化,而无需更改已部署的代码。 凭据 用于登录远程系统。 在出站适配器的凭据设置中指定 在Ensemble > 配置 > 凭据中设置 Production配置数据的来源 导出Production 配置页 > Production设置 > 操作选项卡 > 导出 创建与类/部件相关的XML文件 验证是否需要额外的类 可用于 部署到另一个实例中 部署到另一个命名空间 保存Production 部署Production Ensemble à 管理 à 部署变化 à 部署 会创建回滚文件及部署日志 导出与部署的当前限制 除业务组件外,组件配置、规则、DT等组件运行依赖的部件不会自动被识别,需要人工选取并导出 DSN, 凭据等含安全信息的配置不会被导出(实例级配置,非Production级配置),需要手动在部署端配置。产品化研发中需要考虑通过自定义任务定期同步到备机或其他实例。 清除Production数据 当Production在生产中运行较长时间后,往往会累积大量的告警,事件日志和互操作消息等运行数据。用户可选择定期删除一部分不再需要的数据,保证磁盘空间的充裕。 直接执行 Ensemble > 管理 > 清除管理数据 直接执行清除任务受限于浏览器进程超时设置,如在清除过程中触发超时,将导致清除进程失效退出,中断消息清除过程。 对于大量消息累积的场景,请使用后台任务周期性执行确保清除效果。由于删除数据时也将产生大量的journal,删除前应在journal所在存储上保留充裕的空间。 后台任务 系统操作 > 任务管理器 > 新任务 空闲超时设置 组件被标记为不活动,如果 组件在给定的#秒内没有活动 黄色表示不活动的组件 Production监控 配置页面 Production运行监控 IRIS平台为用户提供了一系列工具展现组件的运行状态。运维团队需要频繁地使用这些工具用于定位和诊断故障,识别性能瓶颈等。 Production监视器 一页式监控业务服务、业务操作、队列和错误。 点击单个组件了解详情 提供对队列和事件日志的访问 事件日志 检索、过滤和清除日志 联合使用事件日志和可视化追踪 错误、警报和警告事件日志条目显示在可视化追踪中 点击图标可以查看事件日志详情 业务规则日志 Ensemble > 查看 > 业务规则日志 每次尝试匹配规则时的条目 空原因表示没有匹配的规则 日志内容 I/O 记录 组件配置 除了Production信息外,还对输入和输出数据进行存档 TCP输入输出 文件输入输出 输入和输出数据显示在可视化跟踪窗口中 组件状态指示器 状态指示器提供业务组件健康状况的可视化 绿色 – 正常 黄色 – 不活动(项目空闲时间超过其空闲超时设置) 红色 - 错误。 灰色 - 禁用。 暗绿色或暗灰色 -- Production目前没有运行 紫色 - 遇到失败但在重试的信息 消息队列 要查看队列 Ensemble > 监视器 > 队列 > 在队列中点击消息查看详情 Production配置页 > 选择组件 > 队列Tab 组件在给定的#秒内没有活动 可以查看、挂起和中断整个队列的消息处理 消息队列与性能调优 消息队列的变化常常可以用于评估组件性能及识别性能瓶颈,运维团队可以根据瓶颈所在位置和上下游组件队列的变化情况调整Pool Size获得优化性能。 忽然暴增的队列 如果发生在业务操作 通常由外部系统导致 连接中断 暴增的业务高峰 如果发生在业务流程 业务流程可能出现错误,导致它以某种方式 "卡住” 长期堆积的队列 如果发生在业务操作 可能是在向外部应用程序发送消息时出现持续延迟 看看外部系统的性能问题是否能得到解决。 如果不能,考虑增加池子的大小设置(除非需要FIFO) 如果发生在业务流程 考虑增加池(私有池或参与者池)大小的设置(除非需要FIFO) 可能有算法缺陷,考虑优化 多个队列长期堆积 潜在的原因 主机容量不够(内存/CPU/IO) Ensemble需要更多的资源(内存、CPU) 底层的Caché实例可能需要调整(内存、IO) 永远不要低估低速存储的影响 作业 提供关于CPU作业运行配置项的信息 Job # = 操作系统进程ID 状态 Dequeuing - 等待信息被处理(最常看到的) Running - 工作,重试或无限循环 Quiescent - 生产关闭期间的状态 Error 能够按照日程周期运行的作业非常适合用于执行系统运维任务 周期性清除过期Production数据 按照备份策略周期性执行全量、累积和增量备份 定期清除过期的数据库journal 定期对数据库进行一执行检查 定期对数据库执行压缩截断释放空间(慎用) 定期将无法通过mirror同步的配置推送到备机(例如DSN、凭据等) 活动量监控 活动量和持续时间监视器显示每个接口的统计数据 Ensemble > 监视器 > 活动量和持续时间。 按时间段过滤(分钟、小时、天、周、月、年) 可以根据需要建立自己的仪表盘来显示所需数据 也可通过SQL查询 启用活动量收集 将Ens.Activity.Operation.Local Business Operation添加到Production中 为统计数据指定存储命名空间 为Production启用统计数据收集 do ##class(Ens.Util.Statistics).EnableStatsForProduction() 为命名空间的Web应用程序启用DeepSee 系统管理 > 安全 > 应用程序 > Web应用程序 使用PurgeActivityData任务进行清理。 使用作业控制周期任务
文章
Nicky Zhu · 八月 10, 2022

InterSystems 数据平台互操作功能运行维护管理基础 - 互操作告警与通知

在互操作功能运行过程中,IRIS可以识别异常情况的发生,自动生成告警事件并通过预制的互操作组件将告警转发给干系人;另外,IRIS也内建了告警工作台,可供运维团队基于工作流实现对告警的管理。 告警设置与转发 Production告警设置 在Production级别可以设置对连接异常的告警设置,及告警组件设置 组件告警设置 控制何时触发警报。 队列计数警报。 队列中的信息数量 队列等待警报。 消息在队列中停留的秒数 不活动超时。 业务组件不活动的秒数 在v2012.1之前,不会触发告警 警报宽限期 与外部连接有关的错误可以有宽限期设置 设置重新建立连接的时间,超时且连接不成功才会发出告警 业务服务 警报宽限期 业务操作 再次发出警报宽限期 转发告警 EnsLib.EMail.AlertOperation 内置告警转发组件 通过Email转发 路由到其他接口转发 REST - 短信 REST - 钉钉 用户需要执行的规划 什么样的告警需要即时通知 告警的通知是否应该成为一个应用 包含告警组件的Production 包含告警组件与业务组件的Production形态如下 其中,用于告警的业务组件包括 告警托管 在互操作功能中产生的告警可以选择转发到第三方系统触发告警运维工作流,也可以在IRIS中进行托管,通过IRIS提供的较为简单的工作流定义实现对告警的统一存储及管理。 工作原理 告警管理BP 决定是否产生新的托管告警 可以设置告警的所有者 通知管理BP 决定如何发送告警 决定谁将收到通知 将告警通知发送到指定组件 告警监视BS(可选组件) 可以将过期告警升级 决定是否发出提醒 典型的告警数据流如下 其中,告警数据产生后经过平台自动丰富,最终形成可供运维人员操作的托管告警 托管告警流程 告警处理流程可能的选择: 告警仅写入日志文件,没有自动通知。 一个简单的告警通知系统,所有告警都通过Email发给用户 根据告警类型和生成告警的组件,将选定告警通过路由发送给不同的用户 实现告警管理框架,用于发送告警通知、升级未解决的告警,并记录当前状态和为解决告警而采取的操作的历史记录 告警路由规则 在告警管理器中可以应用规则,通过路由规则来定义告警的流向。 来源 允许根据不同的故障组件采取不同的行动 消息类 Ens.AlertRequest或无 目标 其他消息路由,用于进一步的路由 业务操作作为最终目标 可以通过数据转换根据传递目标定制告警 托管告警管理 通过Ensemble > 监视器 > 我的托管警报可进入告警管理页 该功能基于IRIS自身的用户设置。告警责任人的分配、告警级别管理、后续操作时限等,都可以在该页上进行操作。 也可通过SQL查询和操作已产生的告警 对于需要自定义工作流的用户,也可以考虑在此基础上实现流程。 祝老师您好,请问系统级别的告警如何推送,就像系统日志中告警级别为2的日志。 Hi, 有两个办法: 1. 自己写代码扫描messages.log获得这些告警 2. 扩展平台内置的告警通知类,可以自定义传感器、消息订阅器和通知分发器,参见 https://docs.intersystems.com/irisforhealth20223/csp/docbook/DocBook.UI.Page.cls?KEY=GCM_healthmon#GCM_healthmon_sysmon_userdefined 感谢祝老师的答复,第一种方法已经实现,我研究下第二种方法。
文章
Lilian Huang · 九月 1, 2022

InterSystems IRIS 中的数据模型

在我们开始谈论数据库和现有的不同数据模型之前,我们最好先谈谈什么是数据库以及如何使用它。 一个数据库是以电子方式存储和访问的有组织的数据集合。 它用于存储和检索通常与主题或活动相关的结构化、半结构化或原始数据。每个数据库的核心至少存在一个用于描述其数据的模型。 并且根据它所基于的模型,一个数据库可能具有略微不同的特征并存储不同数据类型。 要写入、检索、修改、排序、转换或打印数据库中的信息,需要使用称为数据库管理系统 (DBMS) 的软件。 数据库及其各自的数据库管理系统的大小、容量和性能增加了几个数量级。 各个领域的技术进步使之成为可能,例如处理器、计算机内存、计算机存储和计算机网络。 一般来说,数据库技术的发展根据数据模型或结构分为四代:导航型、关系型、对象型和后关系型。 与以特定数据模型为特征的前三代不同,第四代包括许多基于不同模型的不同数据库。 它们包括列、图、文档、组件、多维、键值、内存等。所有这些数据库都由一个单一的名称 NoSQL 联合起来(没有 SQL,或者现在更准确地说不仅仅是 SQL)。 而且,现在出现了一个新的类,叫做NewSQL。 这些是现代关系数据库,旨在为在线事务处理工作负载(读写)提供与 NoSQL 系统相同的可扩展性能,同时使用 SQL 和维护 ACID。 顺便说一下,在这些第四代数据库中,有那些支持上述提及的多种数据模型的数据库。 它们被称为多模型数据库。 这种类型的数据库的一个很好的例子是 InterSystems IRIS。 这就是为什么我将使用它来给出不同类型模型的示例。 第一代数据库使用分层或网络模型。 前者的核心是一个树形结构,即每条记录只有一个所有者。 您可以在 InterSystems IRIS 的示例中看到其工作原理,因为它的主要模型是分层的,并且所有数据都存储在globals(即 B*-trees)中。 您可以在此处here.阅读有关globals的更多信息。 我们可以在 IRIS 中创建这棵树: Set ^a("+7926X", "city") = "Moscow" Set ^a("+7926X", "city", "street") = "Req Square" Set ^a("+7926X", "age") = 25 Set ^a("+7916Y", "city") = "London" Set ^a("+7916Y", "city", "street") = "Baker Street" Set ^a("+7916Y", "age") = 36 在数据库中查看: 在 Edgar F. Codd 于 1969 年提出他的关系代数和他的数据存储理论之后,使用关系原理。之后,关系型数据库产生了。 关系(表)、属性(列)、元组(行)以及最重要的事务和 ACID 要求的使用使这些数据库非常流行,并且现在仍然如此。 例如,我们有架构: 我们可以创建和填充表: 如果我们编写查询: select p.ID, p.Name, a.Country, A.City from My.Person p left join My.Address a on p.Address = a.ID 我们将收到答案: 尽管关系数据库具有显着优势,但随着对象语言的普及,将面向对象的数据存储在数据库中变得很有必要。 这就是为什么 1990 年第一个面向对象(object-oriented )和对象关系数据库产生原因。 后者是在关系数据库的基础上通过添加附加组件来模拟对象工作而创建的。 前者是在 OMG(对象管理组)联盟的建议和 ODMG(对象数据管理组)之后从头开始开发的。 这些面向对象数据库的主要思想如下: 可以使用以下方式访问单个数据仓库: • 对象定义语言——模式定义,允许类定义、它们的属性、关系和方法, • 对象查询语言——声明性的,几乎类似于 SQL 的语言,允许从数据库中获取对象, • 对象操作语言——允许修改和保存数据库中的数据,支持事务和方法调用。 该模型允许使用面向对象的语言从数据库中获取数据。 如果我们采用与前面示例相同的结构但采用面向对象的形式,我们将拥有以下类: Class My.Person Extends %Persistent { Property Name As %Name; Property Address As My.Address; } Class My.Address Extends %Persistent { Property Country; Property City; } 我们可以使用面向对象的语言创建对象: set address = ##class(My.Address).%New() set address.Country = "France" set address.City = "Marseille" do address.%Save() set person = ##class(My.Person).%New() set person.Address = address set person.Name = "Quouinaut, Martin" do person.%Save() 不幸的是,对象数据库并没有成功地从其主导地位与关系数据库竞争,结果出现了许多对象关系映射技术。 无论如何,随着 2000 年代 互联网的普及和对数据存储的新要求的出现,其他数据模型和 数据库管理系统开始出现, 其中,IRIS 中使用了这些模型中的两个,即是文档模型和列模型。 面向文档的数据库用于管理半结构化数据。 这是不遵循固定结构并在其中携带结构的数据。 这种数据库中的每个信息单元都是一个简单的对:一个密钥和一个特定的文档。 该文档通常采用 JSON 格式并包含信息。 由于数据库不需要一定的模式,所以也可以在同一个仓库中集成不同类型的文档。 如果我们再看前面的例子,我们可以有这样的文档: { "Name":"Quouinaut, Martin", "Address":{ "Country":"France", "City":"Paris" } } { "Name":"Merlingue, Luke", "Address":{ "Country":"France", "City":"Nancy" }, "Age":26 } 这两个字段数不同的文档存储在 IRIS 数据库中没有任何问题。 2022.2 版中将提供的模型的最后一个示例是列模型。 在这种情况下,数据库管理系统是按列而不是按行存储数据表。 列方向允许更有效地访问数据以查询列的子集(无需读取不相关的列),并提供更多数据压缩选项。 当列中的数据相似时,按列压缩也更有效。 但是,它们在插入新数据时通常效率较低。 您可以这样创建此表: Create Table My.Address ( city varchar(50), zip varchar(5), country varchar(15) ) WITH STORAGETYPE = COLUMNAR 在这种情况下,类是这样的: Spoiler 然后我们插入数据: insert into My.Address values ('London', '47000', 'UK') insert into My.Address values ('Paris', '54000', 'France') insert into My.Address values ('Kyiv', '03000', 'Ukraine') 在globals里我们看到: 如果我们用city names打开globals,我们将看到 : 如果我们写一个查询: select City from My.Address 我们收到数据: 在这种情况下,数据库管理系统 只需读取一个全局变量即可获得整个结果。 并且在阅读时节省时间和资源。 因此,我们讨论了 InterSystems IRIS 数据库支持的 5 种不同的数据模型。 这些是层次模型、关系模型、对象模型、文档模型和列模型。 希望您在尝试找出可用的模型时会发现这篇文章很有用。 如果您有任何问题,请随时在评论中提出。
文章
Qiao Peng · 四月 14, 2022

InterSystems 数据平台与三级等保 - 第三篇

8. 应用安全 InterSystems数据平台上可能运行着多种应用,例如Web网页应用、SOAP服务、REST API、HL7 接口、SQL服务等等。这些应用种类繁多,面临的安全风险也是巨大的,例如代码注入攻击和HTTP的跨站请求伪造攻击等。 这其中代码注入攻击和针对Web应用的攻击尤其需要重视。 8.1 代码注入攻击 代码注入攻击通常和我们编写的程序相关,需要在程序编写时注意避免。 8.1.1 SQL注入攻击 SQL注入攻击是典型的代码注入攻击,通过从外部注入恶意SQL语句获得数据权限并获得敏感数据。关系型访问方式都是通过客户端SQL语句传入执行的,因此它是数据库重点需要防范的。 InterSystems数据平台并不支持以分号分割的多条SQL语句作为一个SQL命令执行,因此它本身免疫了主要的SQL注入攻击手段。 InterSystems数据平台支持动态SQL,即允许SQL命令作为方法的字符串参数传入,这会给SQL注入攻击留有隐患。在编程时,应避免开放服务用于接受完整的SQL语句作为参数,而是通过SQL动态传参来构建运行时SQL。 InterSystems数据平台支持行级安全,这有助于避免在SQL注入攻击时,将所有数据返回给攻击请求。 8.1.2 $ZF InterSystems数据平台提供了系统函数$ZF,用以调用外部命令。其中$ZF(-1)和$ZF(-2)用以调用服务器操作系统的命令。这可能会成为代码攻击的隐患。 在使用$ZF开发服务时,应避免把完整的操作系统命令作为字符串参数传入来执行,而应仅传入必要的数据,由服务器端方法来组成需要执行的操作系统命令,避免注入攻击。 8.2 Web应用安全管理 InterSystems数据平台提供多种Web应用,都是基于HTTP/HTTPS协议的,例如InterSystems数据平台的管理门户网页、用户自定义的网页、开放的SOAP服务、RESTful API。 既然走HTTP/HTTPS,所以首先应该部署专用Web服务器,并配置HTTPS来提供这些Web服务,在传输通道上保障安全。 除了传输通道,要得到更安全的生产环境,还有其它的安全设置需要检查和配置。 8.2.1 CSP/ZEN用户自定义网页应用 每个InterSystems数据平台等命名空间默认都有一个Web应用,可以通过它提供用户自定义网页应用。也可以创建一个新的Web应用提供用户自定义的网页应用。 第一个要检查的项目,是要看看这些默认创建的Web应用是否需要。如果不需要,应该禁用 – 取消选中“Enable Application”。 第二个要检查的项目,是这个Web应用使用的身份认证方式。在生产环境上,不应该使用“未验证”方式,所以应该取消选中该选项。 第三个要设置合适的“必要的资源”,它是对网页应用的资源权限要求。必须具有该资源的使用权限的用户,才能访问该网页应用。 第四个要决定是否开启防CSRF攻击,建议开启“Prevent Login CSRF attack”。 8.2.2管理门户 InterSystems数据平台的管理门户就是CSP/ZEN开发的网页应用,它具有大部分系统管理和监控能力,例如安全配置、高可用配置等。 除了8.2.1提到的对网页应用的安全配置项目之外,InterSystems数据平台预置了一系列系统角色和系统资源,用于让不同用户对管理门户的不同功能页面具有不同的权限。例如操作员角色(%Operator)不具有创建、修改用户的权限。 这些用户权限检查是通过配置给管理页面的系统资源来判断的,只有对这些页面系统资源有权限的用户才能访问该管理页面。 为了提供更细颗粒度的管理,除了配置给管理门户页面上的系统资源,用户可以将自定义资源加到管理门户页面上。这样,用户需要同时具有系统定义的页面资源权限和用户自定义资源权限才能访问和使用管理页面。 如何查看系统预置的管理页面资源和配置自定义资源?在每个管理门户页面菜单项上,都有链接,点击它就可以查看该管理页面分配的系统资源和自定义资源。如果要添加自定义资源,点击“分配”,就可以在弹出的页面中进行配置。 通过配置自定义资源,可以实现任意颗粒度的管理门户权限控制。 如果您在管理互操作产品,想了解系统提供的预定义安全资源,可以参考文档 8.2.3 SOAP服务 除了SQL服务,SOAP服务是InterSystems数据平台经常要开放的服务类型之一。如果您的生产环境上开放了SOAP服务,应该检查它的安全配置。 开启SOAP服务 InterSystems数据平台的SOAP服务也是通过Web应用开放的。默认情况下,Web应用是没有开放“入站Web服务”的,也就是说默认Web应用是不能提供SOAP服务的。如果需要开放SOAP服务,需要选中对应Web应用的“入站Web服务”。 注意:如何仅是查看WSDL,并不需要开启此选项。 开启SOAP服务测试页功能 InterSystems数据平台还提供SOAP服务测试页功能,该功能可以使用Web页面来测试SOAP服务,而不需要通过SOAPUI等工具。 为了安全,默认SOAP服务测试页功能是未开启的。如果需要开启,需要通过系统安全设置项开启: SET ^SYS("Security","CSP","AllowPrefix",<SOAP应用路径>,"%SOAP.")=1 注意: 1. <SOAP应用路径>最后需要加"/",例如 "/csp/user/" 2. 该设置项不影响SOAP服务,仅影响测试页 SOAP认证与权限 在生产环境上,不应该发布无需认证的SOAP服务。因此也需要取消选中“未验证”方式。 同时通过“必要的资源”设置,可以为SOAP服务指定需要的权限。 SOAP安全协议 另外,SOAP本身有很多安全协议,例如WS-Security, WS-Policy, WS-SecureConversation, WS-ReliableMessaging... 它们提供SOAP消息头及消息体加密、数字签名等机制保障SOAP服务安全。 InterSystems数据平台支持这些SOAP安全协议,可以通过这些协议加强SOAP服务的安全。 8.2.4 RESTful API RESTful API越来越多的用于轻量化的服务提供。与SOAP服务类似,InterSystems数据平台的RESTful API也是通过Web应用提供的。 因此上面介绍的Web服务的安全检查项也适用于RESTful API应用。 另外,如果部署了InterSystems API管理器,它本身也提供了安全相关的功能,例如用户认证、权限控制等。因此也要检查InterSystems API管理器的安全设置。 8.3 安全建议 不要拼接SQL语句,而是通过传参数构建运行时的SQL 避免使用动态SQL 启用行级安全 将$ZF调用封装在方法中,避免将操作系统命令通过字符串传入 部署独立的Web服务器,并启用HTTPS 禁用"未验证"的身份验证方式 选择"密码"或"Kerberos" 开启防跨站请求伪造(CSRF) 攻击 增加必要的资源权限要求 对"应用程序角色"配置合适的角色 为SOAP服务建立独立的Web应用,不使用命名空间默认的Web应用发布SOAP服务 不应该发布不需要用户认证的SOAP服务和RESTful API! 使用合适的认证策略,例如密码或用户名令牌 使用合适的SOAP安全协议,例如消息加密、数字签名 在部署了InterSystems API管理器时,通过它进一步约束安全选项 9. 安全审计 InterSystems数据平台提供审计能力,提供防篡改的审计数据库,用于记录审计事件。审计数据可以查看、搜索和导出。 通过管理门户 > 系统 > 安全管理 > 审计 可以开启和配置审计。 InterSystems数据平台预置了一系列系统审计事件,例如用户登录事件、登录失败事件等。并非所有的预置系统审计都默认开启,用户可以在系统审计事件配置页面进行配置,决定审计哪些系统事件。 除了系统预置的审计事件,InterSystems数据平台运行用户自定义审计事件,例如谁修改了特定的类。通过管理门户 > 系统 > 安全管理 > 用户定义的审计事件 可以创建自定义审计。 9.1 安全建议 开启审计 对重要的用户级事件建立自定义审计事件 定期分析审计的用户行为模型,识别发现异常请求 10. 备份与恢复 数据平台的备份与恢复是保障数据安全的另一项机制。定期的备份保障在意外发生时数据可以最大限度的恢复。例如是误删除了数据和代码,InterSystems数据平台的镜像高可用也无法恢复这些误删除的内容,因为误删除也会在备机上重做。这时,备份是唯一可以恢复误删除数据的希望。 所以应该有备份恢复的自动化策略,定期地执行备份,并将备份保存在与生产环境隔离的地点妥善保存。 InterSystems数据平台支持多种备份工具和备份策略。 备份工具: 冷备份 – 卸载数据库,拷贝数据库文件,加载数据库。冷备份需要计划宕机时间 联机热备份 – InterSystems数据平台提供的在线备份,无需计划宕机时间。数据规模很大时,备份时间较长 外部备份(快照备份) – 在线备份,无需计划宕机时间。通常速度很快,但需要外部备份工具 InterSystems数据平台使用内建的联机热备份工具时,支持这些备份策略: 全备份 – 备份全部数据 增量备份 – 备份上次备份之后修改的所有数据 补充备份 - 备份上次全备份之后修改的所有数据 可以使用这些备份方式,组合成一个自动的备份计划,例如:周日执行全备份、周一周二执行增量备份、周三执行补充备份、周四周五周六执行增量备份。 这些备份文件和备份之后的所有日志文件(Journal文件)和数据平台配置文件,以及项目相关的静态文件一起,例如网页文件,才是完整的生产环境备份集。完整的备份集才能保证恢复到指定的时间节点上。 有了备份并不是万无一失,需要验证备份是否可用。应该建立备份集恢复测试的环境,定期对备份集进行恢复测试,以确保备份集是可用的。 10.1 安全建议 建立自动的备份任务 备份应保存在独立的存储和隔离的物理位置 定期检查备份集的可用性 11. 正确安装InterSystems数据平台 在InterSystems数据平台安装时,会提示选择安全级别。因此在安装时,就应该选择正确的安全级别,避免后期大量的安全配置检查和调整。 InterSystems数据平台安装时会提供3个安全级别选择:Minimal、Normal和Locked Down。 Minimal:是针对于本机开发环境安装的安全级别、也是最低的安全级别,通常是被用于开发者在自己的笔记本电脑上安装InterSystems数据平台的开发实例。它几乎没有安全限制,例如允许无认证登录、匿名用户拥有%All的权限。因此绝不应该在生产环境上以此级别安装。如果您已经以Minimal安全级别安装了生产环境,那应该立刻修改安全配置。 Normal:是针对通常用途的安全级别,收紧了安全策略,可以作为大多数生产环境的初始安全配置。建议生产环境安装时,以此级别进行安装,并在安装之后按需调整安全配置。 Locked Down:是针对高安全需求的生产环境的安全级别。它禁用了多数服务、收紧了服务策略,因此安装后就已经提供了一个较为安全的实例。 Minimal Normal Locked Down 安全设置 密码模式 3.32ANP 3.32ANP 8.32ANP 不活动禁用天数* 0 90天 90天 启用_SYSTEM用户 是 是 否 分配给用户UnknownUser的角色 %All 无 无 服务策略 Use 权限为公共权限 是 是 否 需要认证 否 是 是 服务 %Service_Bindings 启用 启用 禁用 %Service_CacheDirect 启用 禁用 禁用 %Service_CallIn 启用 禁用 禁用 %Service_ComPort 禁用 禁用 禁用 %Service_Console* 启用 启用 启用 %Service_ECP 禁用 禁用 禁用 %Service_Monitor 禁用 禁用 禁用 %Service_Telnet* 禁用 禁用 禁用 %Service_Terminal† 启用 启用 启用 %Service_WebGateway 启用 启用 启用 12. InterSystems 数据平台的安全建议工具 InterSystems数据平台提供安全检查和建议工具。通过管理门户 >系统 > 安全管理 > 安全顾问 即可使用该工具。 安全建议工具会提示安全建议,点击“详细信息”链接,会自动跳到对应安全配置页面。在生产环境上线前,建议使用该工具进行检查。 13. InterSystems 数据平台三级等保检查清单 针对三级等保合规,检查清单如下: 1. 配置基于TLS的数据加密通道** 所有对InterSystems 数据平台的连接方式都配置使用加密通道 2. 部署独立的Web服务器 配置Web服务器应用HTTPS,并禁用不安全的 HTTP 方法 3. 服务配置 关闭不必要的服务 对必要开启的服务,选择安全的认证方式 禁用“未验证”方式 进一步限定允许接入的IP地址 4. 加强认证 系统级禁用 “无认证” 选用更安全的认证方式 5. 收紧授权** 数据库应该设置自己独立的资源,而非使用%DB_%DEFAULT 谨慎使用公共权限 创建自己需要保护的新资源** 6. 用户与角色 仅管理员有%All角色 要求用户账号更安全的密码模式 设置密码错误数次后停用账号 7. 数据安全 对敏感数据进行全数据库加密 合理的数据读写权限 必要时,添加行级和列级安全** 8. 应用安全 不要拼接SQL语句,而是通过传参数构建运行时的SQL** 避免使用动态SQL** 启用行级安全** 将$ZF调用封装在方法中,避免将操作系统命令通过字符串传入** 禁用不必要的Web应用 ** 对Web应用,禁用"未验证"的身份验证方式 对Web应用,开启防跨站请求伪造(CSRF) 攻击 对Web应用,对"应用程序角色"配置合适的角色,不应随意赋予%All ** 为SOAP服务建立独立的Web应用,不使用命名空间默认的Web应用发布SOAP服务 ** 不应该发布不需要用户认证的SOAP服务和REST API! 使用合适的SOAP安全策略,例如消息加密、数字签名 9. 审计 开启审计 对重要的用户级事件建立自定义审计事件 ** 定期分析审计的用户行为模型,识别发现异常请求 ** 10. 备份与恢复 建立自动的备份任务 备份应保存在独立的存储和隔离的物理位置 定期检查备份集的可用性 注:**项目不是三级等保的必查项,但建议进行检查和配置。
公告
jieliang liu · 四月 18, 2022

[视频] InterSystems Globals与灵活的数据建模

各位开发者们好, InterSystems IRIS 数据平台的最大特点之一是它允许您创建自己的自定义,您可以使用InterSystems IRIS 中支持的所有其他模型,例如对象和关系结构,而无需创建任何自定义结构。 ⏯ InterSystems Globals与灵活的数据建模 Globals 请各位开发者关注我们的Bilibili 频道InterSystems Bilibili 主页!
公告
Claire Zheng · 一月 28, 2022

InterSystems 开发者竞赛:Python

亲爱的社区开发者们,大家好! 欢迎积极参与新一轮InterSystems开发者竞赛! 这次我们聚集Python! 🏆 InterSystems Python竞赛🏆 竞赛时间: 2022年2月7日 - 27日 奖金总额: $10000 - 更多获奖机会! 奖品 1. 专家提名奖(Experts Nomination)- 获奖者由我们特别挑选的专家团选出: 🥇 第一名 - $4,000 🥈 第二名 - $2,000 🥉 第三名 - $1,000 🌟 第四名-第十五名 - $100 2. 社区提名奖(Community Nomination)- 获得总投票数最多的应用: 🥇 第一名 - $1,000 🥈 第二名 - $750 🥉 第三名 - $500 如果同时多位参赛者获得同样的票数,均被视为优胜者,将平分奖 谁可以参加? 任何开发者社区的成员均可参加,InterSystems内部员工除外(InterSystems contractor员工可以参加)。还没有账号?现在来建一个! 👥 开发者可以组团 创建一个协作应用程序,组团限定人数为2-5人。 请注意,要在您的README文件中标注您的团队成员——社区用户profile 参赛时间安排 🛠 2月7日 - 20日: 应用开发、提交阶段。 ✅ 2月21日 - 27日: 投票阶段。 注意:在整个参赛期间(开发与投票期间),开发者可持续编辑、提升其应用 主题 最新 发布 的 InterSystems IRIS 2021.2版本提供了 Embedded Python 功能,而且将 PEX 扩展到 Python. 我们邀请您在一个新的编程竞赛中使用嵌入式Python ! 也欢迎使用Python原生API或Python PEX的应用程序。 提交一个开源的应用程序,通过InterSystems IRIS或InterSystems IRIS for Health(医疗版)使用嵌入式Python或原生Python API或Python PEX。 一般要求 有效应用程序:100%全新的Open Exchange Apps或已有的应用程序(但有显著提升)。所有参赛者/团队提交的应用程序只有经过我们团队的审核之后才会被批准参赛。 该应用可以在 IRIS Community Edition or IRIS for Health Community Edition or IRIS Advanced Analytics Community Edition上运行。 该应用需开源并在GitHub上发布。 该应用的README文件应为英文,包含安装步骤,并包含视频demo或/和应用程序如何运行的描述。 资源助力 1. 通过InterSystems IRIS开发Python应用: Learning Path Writing Python Application with InterSystems Embedded Python Documentation Native API for Python Documentation PEX Documentation 2. ObjectScript Package Manager (ZPM)初学者: How to Build, Test and Publish ZPM Package with REST Application for InterSystems IRIS Package First Development Approach with InterSystems IRIS and ZPM 3. 如何将您的APP提交给大赛: How to publish an application on Open Exchange How to submit an application for the contest 4. 项目示例 interoperability-python pex-demo python-examples WebSocket AOC2021 Python Faker 5. 视频 Introduction to Embedded Python Embedded Python: Bring the Python Ecosystem to Your ObjectScript App Embedded Python for ObjectScript Developers: Working with Python and ObjectScript Side-By-Side Embedded Python with Interoperability InterSystems IRIS Native Python API in AWS Lambda 参赛评比 投票规则即将发布,敬请期待! So! 期待您的精彩提交– 加入我们的编程马拉松,赢取大奖! ❗️ Please check out the Official Contest Terms here.❗️
文章
Qiao Peng · 四月 11, 2022

InterSystems 数据平台与三级等保 - 第一篇

数据平台不仅要安全,还要合规,三级等保是我们要符合的主要安全规范。InterSystems的数据平台和集成平台产品都和三级等保有关。如果没有正确配置它们的安全选项,就会影响到整个系统的安全,影响到合规性。 在生产环境上,如何配置安全的InterSystems的数据平台,并达到三级等保的要求? 这个系列文章,针对InterSystems 数据平台的安全架构,围绕对三级等保的合规性展开,介绍如何配置出一个安全、合规的数据平台。 注:本文提到的InterSystems的数据平台,包括Caché数据库、Ensemble集成平台、HealthConnect医疗版集成平台和InterSystems IRIS数据平台。 三级等保的要求 三级等保要求 对数据平台的要求 身份鉴别 确保用户身份是真实、准确的 访问控制 控制:谁、以什么方式、从什么设备可以访问什么数据和功能? 入侵防范 防范静态数据、传输中的数据、日志和备份中的数据被入侵 恶意代码防范 防止恶意代码被植入和执行,例如SQL注入 可信验证 数据完整性 保证数据完整性和一致性的能力 数据备份恢复 对数据的备份与恢复能力和策略 InterSystems数据平台安全架构 InterSystems数据平台提供了一个完善的安全架构,用以保护从接入到数据保存的各个层面的数据安全: InterSystems数据平台提供丰富的安全相关特性,用以保障系统安全性和合规性: 我们按数据的流向逐一展开,看看应该如何加强InterSystems数据平台的安全。 1. InterSystems数据平台连接通道安全 客户端可以使用多种技术连接到InterSystems数据平台,包括ODBC/JDBC、Java、.net、TCP、Telnet、HTTP、SOAP、REST等。除了客户端的连接,InterSystems数据平台之间也有很多连接通道,例如高可用镜像成员之间、数据平台和Web网关之间… 这些连接通道都应该考虑使用SSL/TLS进行通讯加密,从而保护数据的安全和一致性。 1.1配置InterSystems数据平台的超级服务器接入通道加密 除了通过HTTP、SOAP、REST之外的客户端,其它的客户端都连接到InterSystems数据平台的超级服务器。InterSystems数据平台在系统范围内使用SSL/TLS协议为超级服务器端口通道加密。 配置步骤如下: 在管理门户中,通过路径 系统 > 安全管理 > SSL/TLS 配置,建立名为%SuperServer的SSL/TLS配置项。参考文档 在管理门户中,通过路径 系统 > 安全管理 > SSL/TLS 配置,在超级服务器SSL/TLS支持 选项上选中“要求”。它的三个选项分别为: 禁用(默认选项)- 拒绝使用TLS的客户端连接 启用 - 允许使用TLS的客户端连接,但不必要 要求 – 仅接受使用TLS的客户端连接 如果Telnet也要通过TLS加密传输,将上面配置的基础上,再建立一个名为%TELNET/SSL的SSL/TLS配置项,然后将上图的Telnet server SSL/TLS support 设置为“要求”。具体配置 1.2 配置客户端使用SSL/TLS连接到InterSystems数据平台的超级服务器 不同的客户端技术配置SSL/TLS的方式不同,具体的配置详见: Java .net ODBC/Studio/Windows Terminal Windows配置 这里以ODBC为例,看看Windows客户端上ODBC设置的步骤: 1. 在Windows客户端上下载IRIS服务器上的CA证书文件,并保存在指定目录。例如:c:\InterSystems\certificates\certificateSQLaaS.pem 2. 在Windows客户端上编辑并保存C:\Program Files (x86)\Common Files\InterSystems\IRIS\SSLDefs.ini,其中[IRISServer]是你起的SSL/TLS配置名,后面的Address和Port是 InterSystems数据平台的服务器地址和超级服务器端口号。[TLSConfig]是SSL/TLS的配置项,注意其中的CAfile是第一步得到的CA证书文件路径。 [IRISServer] Address=172.168.3.10 Port=1972 SSLConfig=TLSConfig [TLSConfig] TLSMinVersion=16 TLSMaxVersion=32 CipherList=ALL:!aNULL:!eNULL:!EXP:!SSLv2 Ciphersuites=TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_128_GCM_SHA256 KeyType=2 VerifyPeer=1 Password= CAfile=c:\InterSystems\certificates\certificateSQLaaS.pem 3. 配置Windows的ODBC DSN,选中“Password with SSL/TLS", 并在“SSL/TLS Server Name”中填写SSLDefs.ini中特定的配置名,例如:IRISServer 之后ODBC客户端就可以使用这个DSN通过TLS加密传输连接到InterSystems数据平台了。 1.3 安全建议 虽然不是三级等保必须的,建议配置和开启InterSystems数据平台的超级服务器SSL/TLS连接。 2. Web服务器 InterSystems 数据平台在安装时,可以选择安装一个私有的Apache,用于访问管理门户和基于HTTP的开发、测试,例如网页应用、SOAP和RESTful API。 这个私有Apache并不是全功能的,因此不应作为生产环境的Web服务器,尤其是生产环境有基于HTTP的服务、应用或接口时。这时,应该部署独立的Web服务器和InterSystems Web网关,连接到InterSystems的数据平台。并且应该配置HTTPS,而非使用无加密的HTTP。 InterSystems的数据平台支持Apache、IIS和Nginx等Web服务器。 2.1 独立Web服务器的配置 如何配置独立的Web服务器和InterSystems Web网关,如何配置Web服务器的HTTPS?请参考这篇非常棒的社区系列文章: WebGateway系列 2.2 安全建议 生产环境上,部署独立的Web服务器,而非使用InterSystems 数据平台的私有Web服务器。 Web服务器应使用HTTPS,而非HTTP,提供Web服务。 3. 服务与接口 InterSystems数据平台提供一系列服务和接口,用于各种外部系统和技术的接入,例如常见的ODBC/JDBC的SQL客户端、开发者使用的Studio、管理员常用的Telnet。另外,InterSystems数据平台组件和实例之间的连接也是通过服务实现的,例如Web网关和InterSystems数据平台之间的连接、配置为镜像高可用的多台InterSystems数据平台之间的连接。 3.1 InterSystems数据平台的服务 下表列出了InterSystems数据平台的服务和它们服务的对象: 服务名称 描述 %Service_Bindings 控制 SQL 或对象访问方式,包括Studio、XDBC客户端、Java、C++、ActiveX %Service_CacheDirect 控制 Caché 直连访问方式 %Service_CallIn 控制使用CallIn的C/C++应用的访问 %Service_ComPort 控制从Windows系统COM端口的访问 %Service_Console 控制Windows本地服务器上 CTERM (TRM:pid) 和 Windows 控制台访问 %Service_Terminal 控制UNIX, Linux, Mac本地服务器上的控制台访问 %Service_DataCheck 控制实例间数据一致性检查DataCheck时,作为数据源的访问 %Service_DocDB 控制文档数据库的访问 %Service_ECP 控制是否ECP %Service_Login 控制通过 SYSTEM.Security.Login的登录访问 %Service_Mirror 控制镜像成员访问 %Service_Monitor 控制 SNMP 和远程监视命令 %Service_Shadow 控制此系统是否可以是shadow来源 %Service_Sharding 控制是否可以作为分片服务器访问 %Service_Telnet 控制来自于Windows 服务器的本地或远程Telnet 会话访问 %Service_CSP %Service_WebGateway %Service_CSP(Caché/Ensemble)或%Service_WebGateway(IRIS)控制通过Web网关的访问,也就是web应用 %Service_Weblink 控制旧有的WebLink应用访问 3.2 InterSystems数据平台服务的安全选项 这些向外开放的服务和接口有多种机制保护安全: 是否启用 是否是公用服务(意味着所有用户都有权限) 身份认证的方式 接入客户端的IP限制 其它特殊限制 在管理门户>系统>安全管理>服务,可以对每一项服务进行单独的安全配置: 3.3 安全建议 关闭不必要的服务。 对开启的服务,应选择安全的认证方式,不应使用“未验证”方式。 进一步限定允许接入的客户端IP地址。 4. 用户认证 用户认证是保障数据安全的核心之一。 4.1 InterSystems数据平台的用户认证机制 InterSystems数据平台支持多种用户认证机制,包括: Kerberos 基于操作系统的认证 IRIS用户名/密码 LDAP 代理认证 – 用户自定义认证 无认证 – 无需用户认证,进来的用户自动为UnknownUser 二阶段认证 它同时可以开启和使用多种用户认证,允许用户使用不同的认证方式接入数据平台。在启用多种用户认证机制时,InterSystems数据平台会以一定优先顺序来应用用户认证机制: Kerberos > 基于操作系统的认证 > IRIS用户名/密码 >无认证 LDAP > 代理认证 >无认证 4.2 用户认证方式的设置 这些用户认证方式,可以在系统层面开启或禁用,也可以在服务/接口层面进行选择。对于InterSystems数据平台提供的Web应用,例如网页应用、SOAP服务和RESTful API,还可以在Web应用层面进行用户认证方式的配置。 系统层面的配置,在管理门户>系统>安全管理>Authentication/Web Session Options ; 服务层面的配置,见3.2; 应用层面的配置,将在后面的应用安全章节详细介绍。 4.3 安全建议 系统级禁用 “无认证”,和其它不需要使用的认证方式 系统级,采用更安全的认证方式 5. 用户授权 InterSystems数据平台提供一套基于角色的权限控制机制,它可以保障细颗粒度的数据与服务安全。 5.1基于角色的权限控制机制 在这套机制下,被保护的数据与服务被称之为资产。资产可以是任何具体事物,例如数据库、服务、平台应用、管理工具,甚至可以是抽象的事物,例如工作身份、“对患者联系方式的权限”。 权限控制机制是: InterSystems数据平台定义资源,对应一个或多个资产;系统已经定义了一系列系统资源,同时用户可以自定义资源。 对资源的许可,例如读、写、使用,就是权限; 将权限分配给InterSystems数据平台定义的角色和/或用户; 用户就具有了相应的资产权限。 5.2资源的权限配置 通过管理门户>系统>安全管理>资源,管理可以创建新资源、配置已有资源的权限。 以%开头的资源是系统已经创建好的资源,例如: %Admin_* 是工作身份资源 %DB_* 是数据库资源 %Service_* 是服务资源 %Ens_* 是互操作相关的资源 其中,对资源的权限可以被设置为“公有权限”,即所有用户都有相应的权限。 5.3 安全建议 用户自定义的数据库应该设置自己独立的资源,而非使用%DB_%DEFAULT 谨慎使用公共权限 创建自己需要保护的新资源
文章
Qiao Peng · 四月 11, 2022

InterSystems 数据平台与三级等保 - 第二篇

6. 用户与角色 InterSystems 数据平台对用户和角色提供全面的管理和安全配置功能。加强数据平台的安全,需要加强对于用户和角色的管理。 6.1 用户管理 系统提供了一系列预置的用户账户,这些账户管理对应特殊的系统功能: 用户 说明 UnknownUser 匿名用户,通过“未验证”方式登录到系统的用户 _SYSTEM SQL系统管理员 SuperUser 超级用户 Administrator 安装系统的用户 Admin 系统管理员 CSPSystem Web网关管理员 IAM IAM用户 _PUBLIC 内部使用 _Ensemble 内部使用 6.1.1 系统级用户安全配置 InterSystems数据平台有一些系统级别的用户安全配置,例如密码模式、密码有效天数、无效登录限制(多少次登录失败后要禁用用户账户)、非活动限制(多少天未登录后禁用用户账户)等。这些系统级配置通过管理门户>系统>安全管理>系统范围的安全参数: 三级等保对于用户的密码强度是有要求的。弱密码只需要0.19毫秒就能被破解,而8位强密码破解需要上百年。密码强度可以通过上面配置页面的密码模式或密码验证routine来配置: 密码模式只能配置简单的密码强度约束逻辑,例如3.32ANP意思是允许3位到32位长度到密码,密码可以由字符、数字和符号组成。 密码验证routine可以配置任意复杂的密码强度约束逻辑,它通过用户自定义的密码检查逻辑进行判断。例如要求“密码必须是包括数字、大写字母和半角符号的8位以上的字符串”,可以在%SYS命名空间下编写一个routine,里面提供密码验证逻辑的方法。方法名由自己决定,它有两个固定的参数Username和Password,您只要实现密码约束逻辑:如果符合约束,返回$$$OK,否则返回相应的错误提示即可。 这里给出一个routine示例,这个%SYS下的routine名为IRISPWD,里面的CHECK方法用于判断密码合规性,它利用正则表达式判断密码是否符合“必须是包括数字、大写字母和半角符号的8位以上的字符串”的约束,违反约束时给出提示错误。 #include %occInclude CHECK(Username,Password) PUBLIC { s tValid=(Password?8.E)&&(Password?.E1.U.E)&&(Password?.E1.N.E)&&(Password?.E1.P.E) q:(tValid=0) $$$ERROR($$$GeneralError,"密码需要是包括数字、大写字母和半角符号的8位以上的字符串") q $$$OK } 然后将方法调用的名称更新到“系统范围的安全参数”中的密码验证routine中。方法调用名称是方法名^Routine名,本示例为CHECK^IRISPWD。 设置好后即可生效,但要注意它不会对旧有密码进行验证。当设置或修改用户密码后保存时,它会进行检查,对违反约束的密码设置,会报如下错误提示: 6.1.2用户管理 通过管理门户>系统>安全管理>用户,可以创建、管理用户。在这里可以执行每个用户的初始密码设置、账户启用/禁用条件,用户的角色设置、SQL权限等管理。 另外,也可以查看用户的概要信息,它会显示用户的权限列表、登录历史等信息: 注意: CSPSystem用户是CSP网关登录到InterSystms IRIS/Cache'的用户。如果需要修改它的密码,需要先在IRIS/Cache'用户管理页面修改CSPSystem的密码,然后再登录到CSP网关上修改CSP网关连接IRIS服务器的账户信息,保持二者密码一致。1. 登陆到私有Apache的CSP网关或独立安装的Web服务器的CSP网关,访问http://<IP+端口>/csp/bin/Systems/Module.cxw 2. 修改CSP网关连接IRIS服务器的账户信息: 2.1 Configuration>Default Parameters>Security>User Name 和Password2.2 Configuration>Server Access>Connection Security>User Name 和Password 6.2 角色管理 InterSystems数据平台预置了一些%开头的系统角色,例如%Developer开发者角色、%Manager系统管理员角色、%Operator系统操作员角色。 其中%All是一个特殊角色,它是超级用户角色,属于这个角色下的用户都是超级用户。因此属于这个角色的用户数量不宜过多,当然也不建议少于2个,以避免密码遗失造成无法管理系统而只能进入紧急模式。 6.3 安全建议 1.仅管理员有%All角色,尤其要确保UnknownUser没有%All角色 2.删除不需要的系统角色和系统用户 3.要求用户账号更安全的密码模式 4.设置密码错误数次后停用账号 7. 数据安全 InterSystems数据平台提供了丰富的数据安全特性,包括数据与数据库加密、数据访问控制机制。这里相当多的特性都是三级等保要求的。 7.1 数据加密 InterSystems数据平台内建多种加密算法,包括AES CBC (128, 192, 256位)、HMAC、MD5、SHA-1、SHA-512、PKCS、PBKDF2、Base64等。同时,它可以直接调用外部的Python、Java和.net算法库,实现包括国密SM算法在内的算法扩展。 它支持对全数据库加密,或仅对数据元素加密。 7.1.1 全数据库加密 全数据加密时,InterSystems数据平台使用AES加密算法,自动负责数据库数据的加解密。加密的数据库在加载时,需要向系统提供密钥。通常密钥保存在可移除的设备上,例如U盘,仅在加密数据库加载时使用,加载后就可以移除并保存在安全的地方。 InterSystems数据平台的数据库和命名空间架构让用户可以将需要加密保护的数据,例如患者基本信息数据和支付数据单独保存在一个较小的数据库中。 在全数据库加密的情况下,可以对日志、审计日志都进行加密,从而避免任何的数据泄密渠道。这样,即便数据库文件、日志文件和审计日志被盗走,没有密钥文件都无法解密数据。 创建一个新密钥文件及新的加密数据库的过程非常简单,在管理门户即可完成: 产生密钥文件。只有管理员才有权限产生密钥文件。 输入密钥文件产生路径、管理员账户、密钥文件管理密码、AES加密位数,保存时会产生用于加密的密钥文件。 注意,产生的密钥文件的管理是需要权限的 – 只有密钥管理员才可以激活该密钥文件并使用它进行数据库加密。在密钥文件产生后,尽快加入多个可以管理该密钥的管理员,并为他们设置不同的密钥密码,以避免一个密钥管理员账户失效。 密钥文件产生后,你就可以将其拷贝到安全的位置,并将原始产生的文件删除。如果你有多个密钥,应记住密钥ID (如下图的0535458F-A895-4915-BADF-2C257602880D)和密钥文件、密码的关系。 激活密钥文件 在InterSystems数据平台实例上激活密钥,才能使用它进行数据库加解密。只有密钥管理员,使用密钥文件的密码才能激活密钥。 每个实例可以激活多个密钥,因为你可能有使用不同密钥加密后的数据库文件。可以设置某个密钥为默认密钥,新产生的加密数据库会使用默认密钥加密;同时可以设置某个密钥文件为默认的Journal日志密钥,新的Journal日志会使用默认Journal密钥加密。 这里还可以设置密钥使用的方式:“交互”或“无人参与”。 “无人参与”需要将密钥文件保存在一个InterSystems数据平台启动时可以访问到的固定路径上,因此不推荐使用。“交互”方式下,InterSystems数据平台会在启动和加载加密数据库时向管理员询问密钥位置,因此更加安全。 创建加密的数据库: 在数据库创建过程中,选择加密数据库。这样InterSystems数据平台会使用当前默认的密钥进行加密。 现在你就有了一个加密的数据库了,里面的任何数据都是被加密的。即便数据库文件被copy走,只要没有密钥文件,这个数据库就无法被加载或解密其中的数据。 在今后的InterSystems数据库平台的启动过程中,都将要求输入加密密钥文件的完整路径、密钥管理员账户和密钥文件密码: 如果要对之前未加密的数据库加密、或者将加密数据库重新部署为不加密的数据库、或者为加密数据库更换加密密钥,这些操作需要通过^EncryptionKey 管理工具完成,而不能在管理门户中完成。参见文档 7.1.2 数据元素加密 除了全数据库加密,用户也可以选择通过代码控制仅对特定数据元素加密,因此它可以控制非常细颗粒度的加密策略。 InterSystems数据平台提供系统类%SYSTEM.Encryption,里面有密钥创建和管理、加密解密的方法。用户开发的程序可以使用这些方法进行密钥管理和加解密工作。 如何使用的文档在这里。 7.2 数据访问控制 InterSystems数据平台提供多个层面的数据访问控制机制。包括: 数据库层面的访问权限控制,即数据库读、写权限控制 SQL层面的访问权限控制,包括 SQL操作的权限,例如创建表和视图的权限 对表、视图级别的访问权限 对存储过程的执行权限 行级安全 – 例如每个医生只能看自己的出诊记录 列级安全 – 例如医生角色可以看到患者表中除了患者支付卡号列之外的其它数据 这些数据访问控制机制可以自由组合,满足严格的数据访问控制。 7.3 安全建议 对敏感数据进行全数据库加密,并保存好密钥文件和密钥文件密码 合理的数据读写权限 必要时,添加行级和列级安全
公告
Claire Zheng · 四月 11, 2022

InterSystems Globals开发者竞赛获奖者名单出炉!来看看这优秀的应用吧!

Hi开发者们, 我们非常高兴地向大家宣布此次 InterSystems Globals开发者竞赛的获奖者! 第19届编程大赛的优胜者名单如下: 专家提名奖(Experts Nomination)- 获奖者由我们特别挑选的专家团选出: 🥇 第一名,奖金 $4,000 获奖项目 global-mindmap 开发者 @Yuri.Gomes 🥈 第二名,奖金 $2,000 获奖项目 globals-tool 开发者 @Dmitry.Maslennikov 🥉 第三名,奖金 $1,000 获奖项目 iris-globals-graphDB 开发者 @Muhammad.Waseem 更多获奖者: 🏅 奖金$100 ,获奖项目 python-globals-serializer-example 开发者 @José.Pereira 🏅 奖金$100 ,获奖项目 global-archiver 开发者 @Lorenzo.Scalese 🏅 奖金$100 ,获奖项目 blockchain - [ IRIS python ] 开发者 @davimassaru.teixeiramuta 🏅 奖金$100 ,获奖项目 Globals: Embedded Python vs. ObjectScript 开发者 @Robert.Cemper1003 🏅 奖金$100 ,获奖项目 zpm-generate-ui 开发者 @MikhailenkoSergey 🏅 奖金$100 ,获奖项目 GlobalToJSON-XL-Academic 开发者 @Robert.Cemper1003 🏅 奖金$100 ,获奖项目 Cubes 开发者 @Sean.Connelly 🏅 奖金$100 ,获奖项目 GlobalToJSON-Efficient 开发者 @Robert.Cemper1003 🏅 奖金$100 ,获奖项目 iris-globals-contest 开发者 @Oliver.Wilms 🏅 奖金$100 ,获奖项目 GlobalToJSON-Compact 开发者 @Robert.Cemper1003 🏅 奖金$100 ,获奖项目 global-name-search 开发者 @Jailton.Viçôzo 🏅 奖金$100 ,获奖项目 React-UI-Global 开发者 @Evgeniy.Potapov 社区提名奖(Community Nomination)- 获得总投票数最多的应用: 🥇 第一名,奖金 $1,000 ,获奖项目 globals-tool 开发者 @Dmitry.Maslennikov 🥈 第二名,奖金 $750 ,获奖项目 python-globals-serializer-example 开发者 @José.Pereira 🥉 第三名,奖金 $500 ,获奖项目 iris-globals-graphDB 开发者 @Muhammad.Waseem 恭喜所有优胜者! 感谢大家对本次比赛的关注和付出,是你们的付出让这次大赛熠熠生辉!ღ( ´・ᴗ・` )比心🙌 接下来呢? 如果没有获奖,也不要灰心气馁!要知道,失败是成功之母,坚持下去就能成功 (^-^)V 准备好,期待五月的大赛吧! 😎