Oracle 分 布 式 数 据 库 远 程 数 据 访 问 的 安 全 性 
------------------------------------------------------------------------------------ 数 据 库 的 安 全 性 是 指 保 护 数 据 以 防 止 非 法 用 户 使 用, 避 免 数 据 被 有 意 或 无 意 地 丢 失、 泄 露 或 破 坏。 随 着 企 业CIMS 工 程 的 实 施 和 各 个 子 系 统 的 建 立, 各 个 子 系 统 之 间 需 要 经 常 共 享 数 据, 而 不 同 的 子 系 统 往 往 分 布 在 不 同 的 服 务 器 中。 如 何 安 全 有 效 地 访 问 各 系 统 所 需 的 数 据, 防 止 数 据 库 数 据 的 丢 失 以 及 非 法 用 户 的 侵 入, 以 及 保 证 各 系 统 的 物 理 位 置 与 调 用 的 应 用 程 序 无 关( 即 保 证 各 系 统 的 位 置 透 明 性), 是 数 据 库 管 理 人 员 所 面 临 的 重 要 问 题。 远 程 数 据 库 访 问 
---- 分 布 式 数 据 库(Distributed Database) 是 存 储 在 多 个 计 算 机 上 的 一 组 数 据 库, 但 表 现 在 用 户 面 前 的 是 单 个 逻 辑 的 数 据 库。 也 就 是 说, 其 中 的 每 个 数 据 库 都 由 它 本 地 的 数 据 库 管 理 系 统 来 控 制, 它 们 彼 此 之 间 的 管 理 和 维 护 都 是 分 开 的 和 互 不 依 赖 的。 但 是 在 若 干 数 据 库 中 的 数 据 可 以 同 时 存 在 和 修 改, 好 像 在 一 个 数 据 库 中 似 的, 有 很 高 的 透 明 性。 这 样 使 得 对 远 程 数 据 的 存 取 非 常 简 单, 不 需 要 知 道 对 象 到 底 在 哪 里, 也 使 对 象 可 以 移 动 位 置 而 不 会 影 响 最 终 用 户 或 数 据 库 应 用。 
---- 远 程 数 据 库 访 问 是 通 过 建 立 数 据 库 链 路 来 实 现 的, 数 据 库 链 路 是 通 过Oracle 通 信 软 件SQL *Net 来 工 作 的。 各 服 务 器 上 的SQL *Net 要 根 据 网 络 的 情 况 来 配 置, 网 络 中 每 一 台 服 务 器 都 有 一 个 特 定 的 名 称, 这 个 名 称 在 数 据 库 链 路 中 称 为 连 接 串(connect string), 如 图1 所 示。 如 果 服 务 器server1 上 的 用 户A 要 访 问server2 上 的 用 户B 的 表emp, 首 先 要 在 服 务 器server1 的 用 户A 中 建 立 一 条 数 据 库 链 路, 命 令 如 下: ---- SQL>create public database link linkname connect to username identified by password using‘connect string’ ---- 其 中,linknam 为 数 据 库 链 路 名, 这 里 可 取 为Mylink;username 为 用 户B 的 名 称;Password 为 用 户B 的 口 令;connect string 为server2。 ---- 这 样 在 服 务 器server1 中, 用 户A 就 可 以 通 过 下 列 语 句 来 访 问 服 务 器server2 中 用 户B 的 表emp: ---- SQL>select * from B.emp@mylink; ---- 为 了 保 证 数 据 库 访 问 的 透 明 性, 在 用 户A 下 可 以 建 立 下 面 的 同 义 词: ---- SQL>create synonym emp for b.emp@mylink; ---- 这 样 用 户A 就 可 以 用 下 面 命 令 来 访 问 用 户B 的 表emp: ---- SQL>select * from emp; 本 地 数 据 库 访 问 与 远 程 数 据 库 访 问 的 安 全 性 比 较 
---- 本 地Oracle 数 据 库 可 以 有 许 多 个 用 户, 用 户 之 间 是 相 互 独 立 的, 如 果 不 进 行 授 权, 它 们 之 间 就 无 法 进 行 相 互 访 问。 如 图2 所 示, 假 设server1 上 有 两 个Oracle 用 户G 和H, 用 户G 要 访 问 用 户H 的 表emp, 则 在 用 户B 下 要 执 行 下 列 命 令: 
---- SQL>grant select on emp to g; ---- 这 样 用 户H 就 可 以 如 此 访 问 表empz: ---- SQL>select * from g.emp ---- 同 样 可 在 用 户G 下 建 同 义 词: ---- SQL>create synonym emp for g.emp; ---- 根 据 需 要 还 可 以 将emp 的insert、update 和delete 等 特 权 授 予 用 户H, 如 果 只 想 让 表emp 的 某 些 列 让 用 户H 操 作, 就 可 在 表emp 的 相 应 列 上 建 立 视 图, 并 将 视 图 的 特 权 授 予 用 户H 即 可, 这 样 就 保 证 了 用 户G 只 能 访 问 用 户H 授 权 的 表, 数 据 库 的 安 全 性 在 这 方 面 就 得 到 了 保 证。 ---- 对 于 分 布 式 远 程 数 据 库, 如 图3 所 示, 假 如 用 户A 要 访 问 用 户b1,b2, …bn , 则 在 用 户A 下 要 建 立n 条 链 路。 同 样 如 果A 要 访 问 用 户c1,c2, …cn 也 要 建 立n 条 链 路。 如 果server1 上 也 有n 个 用 户, 为 了 保 证server1 上 的 用 户 对server2 和server3 上 各 用 户 的 访 问, 则 需 在server1 上 建2n ×n 条 链 路, 这 不 但 增 加 了 维 护 的 困 难, 而 且 这 种 方 法 在 应 用 中 也 难 以 实 施。 ---- 通 过 分 析 数 据 库 链 路 的 创 建 过 程, 可 以 看 出 数 据 库 链 路 包 含 下 列 连 接 信 息: ---- 1. 远 程 数 据 库 的 主 机 名 称。 ---- 2. 远 程 数 据 库 上 的 一 个 有 效 账 户 名 称。 ---- 3. 此 账 户 的 口 令。 ---- 在 使 用 时, 数 据 库 链 路 实 际 上 将 作 为 一 个 用 户 登 录 到 远 程 数 据 库 中, 并 在 远 程 数 据 访 问 完 成 之 后 退 出 远 程 数 据 库。 一 个 数 据 库 链 路 可 以 是 为 一 个 单 个 用 户 所 私 有, 也 可 以 是 公 有 的, 即 本 地 数 据 库 的 所 有 用 户 都 可 以 使 用 此 链 路。 ---- 利 用 数 据 库 链 路 来 访 问 远 程 数 据 库 具 有 下 列 缺 点: 无 论 是 私 有 数 据 库 链 路 还 是 公 共 数 据 库 链 路, 都 将 远 程 数 据 库 用 户 的 口 令 记 录 在 本 地 数 据 库 字 典 中, 如 果 远 程 数 据 库 用 户 的 口 令 变 更, 则 本 地 数 据 库 链 路 的 口 令 也 必 须 跟 着 变 更, 否 则 就 会 出 错。 同 时 本 地 数 据 库 用 户 知 道 远 程 数 据 库 用 户 的 口 令, 因 此 远 程 数 据 库 用 户 的 数 据 极 不 安 全, 且 本 地 用 户 通 过 数 据 库 链 路 访 问 远 程 表, 具 有 和 远 程 表 所 有 者 同 样 的 权 力, 这 同 样 是 一 个 很 大 的 安 全 隐 患。 
---- 为 了 解 决 上 述 两 个 问 题, 首 先 必 须 尽 量 减 少 数 据 库 链 路, 想 办 法 控 制 利 用 数 据 库 链 路 访 问 远 程 数 据 库 表 的 用 户 权 限。 
远 程 数 据 库 访 问 的 安 全 措 施 
---- 通 过 上 面 的 讨 论, 我 们 自 然 想 到 是 否 能 将 保 证 本 地 数 据 库 访 问 安 全 性 的 具 体 措 施 与 远 程 数 据 库 访 问 的 链 路 结 合 起 来, 充 分 利 用 两 者 的 优 势, 保 证 远 程 数 据 库 访 问 与 本 地 数 据 库 访 问 一 样 安 全 和 方 便。 具 体 步 骤 如 下: 
在 各 服 务 器 上 都 建 立 一 个 用 户 名 相 同 和 口 令 相 同 的mid 用 户, 它 除 了 具 有create session 特 权 外 没 有 其 他 任 何 权 限, 其 主 要 功 能 是 将 远 程 用 户 通 过 数 据 库 链 路 的 直 接 访 问 变 为 间 接 访 问。 它 的 角 色 就 像 一 个 安 全 卫 士, 将 非 法 访 问 请 求 过 滤 掉, 从 而 保 证 数 据 库 的 安 全。 它 的 另 一 个 优 点 是 用 户 根 本 用 不 着 知 道 远 程 数 据 库 的 分 布 情 况, 而 可 以 像 访 问 本 地 数 据 库 一 样 访 问 远 程 数 据 库。 在 各 服 务 器 上 以mid 用 户 的 用 户 名 和 口 令 建 立 公 共 的 数 据 库 链 路, 针 对 相 连 的 服 务 器 各 建 一 条。 如 图3 所 示 的 网 络, 每 台 服 务 器 只 需 建 两 条 公 共 的 数 据 库 链 路。 在 每 台 服 务 器 上, 将 别 的 服 务 器 需 要 访 问 的 表 的 权 限 授 予mid 用 户。 在 每 台 服 务 器 上, 建 立 所 需 访 问 的 远 程 表 的 私 有 或 公 共 同 义 词。 
---- 举 例 说 明。 如 图3 所 示, 假 如server1 上 的 用 户A 要 访 问server2 上 的 用 户b1 的 表emp1, 则 用 户b2 的 表emp2 在 远 程server2 上 发 出 语 句: 
---- SQL>GRANT SELECT ON b1.emp1 TO mid; ---- SQL>GRANT SELECT ON b2.emp2 TO mid; ---- 在 本 地server1 上 发 出 以 下 语 句: ---- SQL>CREATE PUBLIC DATABASE LINK midserver2 CONNECT TO mid IDENTIFIED BY mid USING 'connect string'; ---- SQL>CREATE SYNONYM a.emp1_syn FOR b1.emp1@midserver2; ---- SQL>CREATE SYNONYM a.emp2_syn FOR b2.emp2@midserver2; 总 结 
---- 本 方 法 很 好 地 解 决 了 远 程 数 据 库 访 问 的 安 全 性 问 题, 它 具 有 下 列 优 点: 
操 作 简 单、 维 护 方 便、 安 全 性 强, 它 为 远 程 数 据 库 访 问 设 置 了 一 道 防 火 墙。 远 程 数 据 库 相 互 访 问 的 数 据 链 路 减 到 了 最 少。 且 由 于 各 服 务 器 上 都 有 一 个 用 户 名 和 口 令 相 同 的 用 户, 根 本 不 必 担 心 服 务 器 上 因 用 户 口 令 的 改 变 而 影 响 数 据 链 路。 便 于 管 理。 服 务 器 上 用 户 需 要 访 问 的 远 程 数 据 库 用 户 的 那 些 表 都 可 以 在 相 应 的 数 据 字 典 中 查 到, 各 系 统 的 相 互 依 赖 关 系 十 分 清 楚。 便 于 用 户 的 迁 移。 当 服 务 器 发 生 故 障 而 需 要 将 用 户 移 植 到 别 的 服 务 器 时, 只 需 更 改 各 服 务 器 上 的 同 义 词, 应 用 程 序 不 需 要 改 变。 通 过 数 据 库 访 问mid 代 理 用 户, 并 通 过 在 远 程 数 据 库 中 为 表 建 立 相 应 的 视 图, 不 但 可 以 控 制 用 户 访 问 的 权 限, 而 且 可 以 控 制 用 户 访 问 的 内 容。 这 在 增 强 安 全 性 的 同 时, 也 减 少 了 网 络 的 流 量。