这是 dacscheck 命令,可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器
程序:
您的姓名
dacscheck - 授权检查
概要
数据检查 [-行政[-app 应用名称[-语境 文件[-D名称=值]
[-F 字段_间隔[-fd 域[-fh 主机[-缩略词 姓名[-fn 联邦名称]
[-倾倒[-组 组_vfs[-h[-i IDENT[-他 IDENT]
[-伊尔格 IDENT[-ieuid[-ieuidg[-iuid[-iuidg[-lg[-二 LOG_LEVEL]
[-名称比较 方法[-q]
[-重定向[-角色 角色_vfs[-规则 规则_vfs[-v[-变量 名称=值]
[-vfs vfs_uri[--] 对象
商品描述
该程序是 DACS 套房。 这是一个独立的程序,既不接受
通常 DACS 命令行选项(选项) 也不访问任何 DACS 配置
文件。
简单地说, 数据检查 查看访问控制规则以测试给定用户是否获得授权
做某事或访问某事。 命令的退出状态给出了结果
测试,除非 -q 给定标志,将一行打印到标准输出,指示
结果。 它提供了对 DACS的访问控制规则
评估引擎,即使对于 Web 服务以外的程序,它也适用于
细粒度的访问控制决策。
进一步来说, 数据检查 检查是否应根据以下内容授予对象请求
指定的访问控制规则和给定的评估上下文。 为了完成它的工作, 数据检查
只需要知道几件事:
1. 在哪里可以找到要应用的访问控制规则;
2. 被访问对象的名称; 和
3. 可选的,一个评估上下文,它指定了一个访问的身份
测试和可以被规则引用的变量。
该命令不执行任何身份验证; 它假定调用者(或
执行环境)已经建立了访问控制的身份
决定是必需的。 它可以像任何其他命令一样使用:从命令行运行或
shell 脚本,由编译程序执行,或从脚本语言调用,例如
as Perl的[1] PHP[2]。 Python [3] 红宝石[4],和 Tcl/Tk[5]。
一些简单的例子将说明如何 数据检查 可以使用。
备注
为了便于阅读,本文档中的示例已经过简化; 在实际使用中,
应该出现绝对路径名,应该执行错误检查,等等。 还,
此 数据检查 程序及其所需的规则必须设置文件权限
适当。
第一个示例显示了 shell 脚本如何调用 数据检查 测试用户是否
运行它是允许这样做的。 从操作系统获取用户身份;
它假定用户已从命令行调用脚本,因此
已经登录系统。 在示例中, 数据检查 通过身份获得
系统调用,但脚本可能会选择传递 日志名称 or USER
环境变量。
shell 脚本只是询问 数据检查 如果有效的uid(见 盖特伊德(2)[6]) 是
允许访问 /myapp。 的退出状态 数据检查 ($?) 给出结果。 这
pathname /myapp 本质上是一个标签,用于查找访问控制规则
申请; 在这个例子中,它只代表程序的名称。 它可能是
程序的文件名,但不必如此。
#! / bin / sh的
dacscheck -q -ieuid -rules /usr/local/myapp/rules /myapp
st="$?"
如果测试 "${st}" != 0
然后
echo "访问被拒绝"
退出“${st}”
fi
echo "访问被授予"
# 做一些事情
退出0
目录 /usr/local/myapp/rules 可能包含一个名为 acl-app.0 的文件,该文件授予
只能访问鲍勃和爱丽丝:
用户(“:bob”)或用户(“:alice”)
备注
访问控制规则在 dacs文件(5)[7]。 与 dacs_acs(8)[8],这些
规则必须被索引 达克赛克(1)[9]。 例如,在一个常见的用例中, DACS
未使用配置文件,规则集由 数据检查 可能是
使用如下命令索引:
% dacsacl -un -vfs "[acls]file:///users/bobo/my-rules" -vfs "[dacsacls]:file:///dev/null"
If 达克赛克 在上面的例子中成功,一个名为 INDEX 的文件将被创建或
在 /users/bobo/my-rules 目录中更新,其中包含规则的文件
也被发现。 如果 INDEX 看起来正确,则通常可以忽略警告消息。
CGI 程序可以从调用它的用户的身份 REMOTE_USER
环境变量和调用 数据检查,如以下 shell 脚本所示,
它使用与上面相同的规则:
#! / bin / sh的
如果测试 "${REMOTE_USER}x" = "x"
然后
idarg=""
其他
idarg="-i ${REMOTE_USER}"
fi
回声“上下文类型:文本/纯文本”
扔出去 ””
# 注意:将 2>&1 追加到下一行的末尾以捕获错误信息
dacscheck -q ${idarg} -rules /usr/local/myapp/rules /myapp
st="$?"
如果测试“${st}”= 0
然后
echo "访问被授予"
其他
echo "访问被拒绝"
fi
退出0
这个例子可以很容易地翻译成任何允许外部
要调用的程序并检查其退出状态。 这是 PHP 中的一个类似示例:
$user = $_SERVER["REMOTE_USER"];
putenv("REMOTE_USER=$user");
system("/usr/local/dacs/bin/dacscheck -q -fn DEMO -icgi
-rules /usr/local/myapp/rules /myapp", $st);
如果($st != 0){
// 访问被拒绝,退出
退出($st);
}
// 访问被授予,继续
备注
有些人可能会质疑进行程序调用的意义 数据检查 测试用户是否
调用它只允许运行程序。 乍一看,似乎
一个人可以通过简单地设置文件权限来获得相同的结果,这样只有
bob 和 alice 可以运行该程序。 如果可以的话,粗粒度测试
做完了 数据检查 在示例中将是不必要的。 事实证明,有
不止于此。
在传统的 Unix 类型系统上设置文件权限以实现此目的需要
在中创建一个新组 / etc / group,通常只能由一个人完成的事情
系统管理员。 因此,普通用户必须要么打扰系统
管理员每次必须创建或修改这样的组,或者找一些其他的
实现相同结果的方法(例如,通过加密,使用特殊的 setuid 或 setgid
提供密码保护访问的命令,或其他一些笨拙且可能的命令
不安全的解决方案)。
为了解决这个限制和其他限制,许多 Unix 类型的操作系统现在包括
使用基于 ACL 的文件系统扩展传统的 Unix 文件权限
机制(例如,提供 获取方法(1)[10]和 Setfacl(1)[11] 命令,以及
ACL(3)[12] ACL 安全 API)。
数据检查 提供类似的功能,但对于 随意 名称, 不仅对于对象
在文件系统中,以及关于 随意 身份,不仅对于那些已知的
到操作系统。 例如,一个 CGI 脚本可以调用 数据检查 测试访问
代表 Web 服务器已知的用户(例如,通过使用创建的帐户)
密码(1)[13]) 但在底层系统上没有帐户。 所以,
除了跨平台可移植和在没有 ACL 类型文件的系统上可用
权限, 数据检查 是比大多数操作更通用的解决方案
系统提供。 然而,与系统提供的基于 ACL 的机制相比,
数据检查 is 而不去 透明地调用(即,它不是由
访问文件等资源时的操作系统)。 另外,关于
测试是否允许用户运行程序,该程序通常会
执行测试本身,因此必须开始执行。
有关其他信息:
· 运用 FreeBSD 的 访问控制列表[14],德鲁·拉维尼, 电灯网[15],22 年 05 月 XNUMX 日。
· POSIX 访问控制列表 in Linux[16],迈克·彼得斯, linux.com[17],2 年 04 月 XNUMX 日。
· 对于 Solaris, 的Solaris 10 ACL(2)[18] 星期天 微[19]和 运用 的Solaris
访问控制列表[20] 由 部门 of 电脑 科学 公爵 大学[21]。
因为授权检查由 数据检查 是完全分开的
由操作系统为系统调用执行,一个 Unix的 root 等身份没有
特殊权利或能力 数据检查 担心,除非规则已经
写给他们。 这同样适用于应用 Unix的 组。
下一个示例演示了一些典型的 Perl的 代码可以通过以下方式改进 数据检查。 该
代码片段:
如果($logged_in_as_root || $logged_in_as_current_admin){
# 做一些特权...
}
这取决于根据值正确初始化的两个变量
$ username, 可以替换为:
# 判断 $username 是否有管理员权限
$output = `dacscheck -q -i $username -app myapp /myapp/admin`;
$is_admin = ($?>> 8) == 0;
如果($is_admin){
# 做一些特权...
}
# 之后...
如果($is_admin){
# 做一些其他的特权...
}
新的授权测试取决于运行程序的身份($ username)
以及确定是否应授予该身份访问权限的单独规则集
/myapp/admin,它只是一个规则的标签,可能如下所示:
用户(“%:管理员”)
此规则授予访问权限当且仅当 $ username 是的一个部件 DACS 名为 admin 的组
或与之相关 DACS 角色。 该组中的成员可以动态更改,
甚至可以减少到零。
重要的观察是 此 条件 这 确定 是否 此 用户 运行
Free Introduction Perl的 码 具有 行政 权限 旨在 定义 学校以外 of 此 程序 和 能够 be
变 也完全不需要 修改 此 码 和 经常 也完全不需要 甚至 修改 ACCESS 控制 定位、竞价/采购和分析/优化数字媒体采购,但算法只不过是解决问题的操作和规则。.
本文档中使用的一些概念在别处进行了描述。 变量,变量
在访问控制规则中使用的命名空间和表达式在
dacs.表达式(5)[22]。 命名 DACS 讨论在 达克(1)[23],和 DACS 组和角色
涵盖在 dacs.groups(5)[24]。
安全性
明确地 数据检查、它的调用者和相关资源必须与
代表的用户 数据检查 正在运行,否则用户可以访问
资源直接或颠覆访问控制测试。 所以, 数据检查 以及
调用者必须比代表其运行的用户具有更高的特权,或者
这两个程序都必须在安全的上下文中运行。 这通常意味着两者 数据检查
并且它的调用者应该与用户隔离运行(如在远程服务器上)或作为
与用户不同的有效用户 ID。
为什么选择
执行授权测试的程序通常包含如下代码:
·》如果当前用户提供了合适的密码,则执行以下
代码,否则不要”,或
·“如果当前用户是管理员,请执行以下操作”,或
·》如果当前用户被允许执行更新操作,则显示这些菜单
项目,否则不显示它们”
复杂的应用程序可能充斥着这些类型的测试,使它们容易受到
错误和安全问题。 更改安全策略可能涉及修改
整个应用程序或应用程序套件。 此外,密码处理通常是
纳入此类计划; 因为密码管理可能需要大量
实施工作并且很难安全地完成,尝试利用
现有的实现。
与自定义编码的解决方案相比, 数据检查 有很多优点:
数据驱动的政策
与专门编写的访问控制逻辑相反,数据驱动(基于规则)
功能优越,因为:
· 访问控制规则与代码分离,因此更改为一组规则
自动应用于整个应用程序或集合中这些规则的所有使用
应用程序; 如果策略更改,则无需修改代码。
· 错误修复和规则改进自动提供给程序
使用 数据检查; 无需重新编译应用程序。
· 管理规则的人不必是应用程序的人
程序员(甚至是懂代码的人),所以委派
责任要容易得多。 这减少了所需的编程量
当需要更改时,减少代码维护工作,并减少
出错的机会。
· 通常更容易理解(和表达)描述一个事物的一组规则。
访问控制策略; 实现相同策略的代码会更复杂
并且难以理解,增加了出错的机会。
编程效率
· 简化了应用程序,减少了编程时间和精力,因为
现有的访问控制代码(即 数据检查) 被重用。
· 无需编写任何代码即可构建复杂的规则。 DACS
功能可用,例如角色和组,并可用于构建
比可能的更简单和更具表现力的授权策略
手工编码。
便携性
规则独立于平台,可以从使用的应用程序远程存储
它们,并且可以进行远程评估。 数据检查 可用于多种
的平台。
增加分享
规则可以在不同情况下由不同程序共享和使用。
灵活性
· 因为它不依赖于网络服务器,所以几乎任何人都可以使用它
基于 CGI 的程序。
· 关于 DACS,它可以在以下情况下使用 mod_auth_dacs[25]
模块不能与 阿帕奇,或在哪里 阿帕奇 根本无法使用。
· 因为是作为普通命令实现的, 数据检查 可以从
命令行或从几乎任何脚本或程序调用。
· 对于基于 CGI 的程序, 数据检查 可以在没有任何系统帮助的情况下使用
行政人员; 例如,它不需要配置 Web 服务器来提供
CGI 程序的授权,因为所有访问控制功能都是
程序内执行。
提高安全性
数据检查 既不执行身份验证也不依赖任何特定的身份验证
方法,因此可以在不影响身份验证的情况下更改身份验证方法
应用程序的使用 数据检查. 可以使用任何受支持的身份验证方式,而不是
只有典型的基于密码的方法。
虽然表现 数据检查 不应该成为许多应用程序的一个因素,
C/C++ API 可以在有问题的地方使用。 此 API 可用于合并 数据检查
编译程序和可扩展语言的功能,例如 Perl的, Python ,
Tcl/Tk及 PHP.
身份
要测试访问的身份由程序提供或由
程序从其执行环境。 这个身份被转换成 DACS的 内部
表示。
可以指定多个身份; 支票是代表所有人的工会进行的
身份。 例如,如果指定了身份 bob 和 alice,则规则
满足任一身份可以授予访问权限。
如果未提供身份,则代表未经身份验证的用户进行检查。
身份可以是:
· 一个登录名 数据检查 映射到程序的真实或有效 uid
(即运行程序的用户);
· 一种 DACS 用户身份(例如:carol、DSS:bob 或EXAMPLE-COM::DEMO:alice,请参阅
达克(1)[26]);
· 一个简单的名字(bob 相当于:bob); 或者
· 用英文表达的名字 简洁 句法[27],它给出了一个用户名,并且可选地,
身份的角色和属性。 不使用任何已过期的身份。
笔记
· 数据检查 验证给定的身份的语法,转换和扩展它
如有必要,转换为简洁的语法,然后将其转换为内部
代表凭证。 这些凭据在程序执行时被销毁
终止。
不管它是如何指定的,每个身份都必须满足句法
的要求 DACS 此转换和扩展后的用户身份(请参阅
达克(1)[26])。 例如,如果将登录名指定为身份,则它必须是
作为一个组件有效 DACS 用户身份; 因此,它不能包含任何
无效字符。
· 如果没有为某个身份提供 IP 地址,则从 REMOTE_ADDR
环境变量可用时,否则使用默认值 127.0.0.1。 这
与凭证关联的 IP 地址使用 用户() 谓词。
· 如果正在测试的身份包括联合名称,由于默认
联盟名称不太可能是正确的,可能有必要告诉
数据检查 使用哪个联合名称进行比较 -fn 旗。
以下是一些可能遵循的身份示例 -i 旗:
粮食
:鲍勃
DSS:鲍勃
{u = 鲍勃}
{u="鲍勃"}
{u="alice",g="admin"}
{u="DSS:bob",g="guest"}
{u="bob",a="a", g="guest"}
备注
这个字符串可能需要在命令行上适当地引用,因为大括号
字符对某些 shell 很重要; 例如,
-i '{u="鲍勃"}'
阿帕奇 和其他网络服务器设置环境变量 REMOTE_USER 到经过认证的
调用 Web 服务的身份。 只要它的语法合适,这个身份就可以是
传递给 数据检查。 对于 DACS- 包装的网络服务, DACS 身份在此可用
变量。
默认情况下,与规则关联的联盟、管辖区和主机名是
派生自系统的主机名,由返回 获取主机名(3)[28]。 如果那个名字是
不合适,因为它不是 FQDN(即,它不是完全限定的域名,因为
它不包含句点),检查每个别名(使用
的gethostbyname(3)[29]) 直到找到 FQDN。 司法管辖区名称来自
所选 FQDN 的最左侧组件以及联合域和名称来自
剩余成分。 如果没有找到 FQDN,系统的主机名将被选为
辖区名称和默认值将用作联合域和名称(EXAMPLE.COM
和EXAMPLE-COM,分别)。
如果发现系统的主机名是(或明确指定为)demo.example.com,对于
例如,将按照规则评估期间的指示设置以下变量:
· ${会议::FEDERATION_NAME} 和 ${DACS::联邦} 都设置为EXAMPLE-COM(点是
映射到破折号以形成有效名称)
· ${会议::FEDERATION_DOMAIN} 设置为EXAMPLE.COM
· ${Conf::JURISDICTION_NAME} 和 ${DACS::司法管辖区} 设置为辖区名称,
演示
· ${DACS::HTTP_HOST} 设置为 demo.example.com:80
通常,可以表示规则和身份,以便为联邦选择的名称
和管辖权并不重要。 但是,如果情况并非如此,并且默认值
被选择 数据检查 不正确,它们可以在命令行上设置。 在一些
在某些情况下,司法管辖区名称可能适合作为
应用程序,例如。
无论其起源如何,联邦和管辖区名称必须始终为
语法有效(见 达克(1)[26])。
对象
虽然对象通常是实际的东西,例如文件、菜单或变量,但它可以
也可以是一个抽象,比如一个操作。 数据检查 与名称一起工作 - 以
URIs - 而不是对象 为 se. It 不 而不去 关联 任何 特别 意 -
名字, it 仅仅 使用 他们 至 定位 an 相应 ACCESS 控制 排除。 因此,
如果规则编写者和参考规则的应用程序就命名达成一致
方案,所选择的名称在很大程度上是无关紧要的。
应用程序将名称分配给每个需要添加的对象或对象类
由访问控制规则引用。 最简单的,只需要一个名称(名称
的应用程序,例如)。 在更复杂的情况下,各种各样的对象
需要命名。 名称的选择和命名层次结构的细节取决于
特定的应用程序,很像软件包运行时的组织
文件和目录组织取决于特定的包。
这款 对象 参数是与访问中指定的服务匹配的名称
控制规则。 它可以是 URI 或绝对路径名(以
斜线字符),并且可以附加一个可选的查询字符串组件。 一个
绝对路径名 径 在内部映射到 URI 为 file://径; 例如,/myapp 是
解释为 file:///myapp(见 RFC 1738[30])。
命名对象的 URI 的各种组件可用作 DACS 变量
和环境变量(见下文)。 如果给出查询字符串,则对其进行解析并
各个参数通过 参数 命名空间,就像对于
DACS- 包装的网络服务。
备注
只有 径 URI 的组成部分在以下情况下被考虑 DACS 匹配对象的名称
针对访问控制规则的 url_pattern。 目前,对象名称不是
自动规范化或解决(见 RFC 3986[31]),通常由
Web 服务器,因此相对路径组件,例如“.” 和“..”应该避免。
违反的规则 评价 语境
在可能影响表达式计算的执行上下文中计算规则
隐式地或可以通过变量显式地检查。
建立 数据检查 不咨询 DACS 配置文件, CONF 命名空间是
用几个变量实例化。 目前,其中只有 VFS 指令可用。
这款 参数 命名空间被实例化,如果 对象 参数有一个查询字符串组件。
这款 DACS 命名空间使用一些标准变量(例如
${DACS::司法管辖区}) 但也可以从命令行以各种方式实例化
和从文件。
这款 环保 命名空间是从环境中实例化的。 语法无效的变量
名字被默默地忽略。
许多通常由 Web 服务器设置的变量由 数据检查 基于该
对象名称。 这些变量在 环保 和 DACS 命名空间。 例如,如果
对象名称为 https://example.com:8443/myapp/edit-menu?entry=item1,如下
变量将按指示设置:
${Env::HTTPS}=开启
${Env::SERVER_NAME}=example.com
${Env::SERVER_ADDR}=142.179.101.118
${Env::HTTP_HOST}=example.com:8443
${Env::SERVER_PORT}=8443
${Env::REQUEST_URI}=/myapp/edit-menu
${Env::DOCUMENT_ROOT}=/
${Env::REQUEST_METHOD}=GET
${Env::SERVER_SOFTWARE}=dacscheck-1.4.8b
${Env::QUERY_STRING}=条目=item1
${环境::ARG_COUNT}=1
${Env::CURRENT_URI}=/myapp/edit-menu?entry=item1
${Env::CURRENT_URI_NO_QUERY}=/myapp/edit-menu
同名变量也将被设置在 DACS 命名空间并导出为
环境变量。 的价值 ${参数::条目} 将是 item1。 请求方法
默认为 GET。 变量 ${环境::REMOTE_USER} (因此 ${DACS::REMOTE_USER} 和
环境变量 REMOTE_USER) 将根据上指定的第一个身份进行设置
命令行; 如果没有指定身份,这个变量将是未定义的。
An 例如: 应用程序
为了说明这些部分如何组合在一起,让我们考虑一个假设的(但现实的)
日历应用程序命名 石灰 写在 Perl的 并作为 CGI 程序调用。 好
仅允许已通过 Web 服务器身份验证的用户读取、创建或更新
她自己的日历,除非日历的所有者允许她执行阅读
或更新日历上的操作。 每个所有者都可以指定哪些用户可以访问她
自己的日历和允许的访问类型。
可以很容易地指定此授权策略。 一种方法是使用:
· 一个主要规则,它委派为每个人指定安全策略的责任。
用户的日历给该用户。
· 每用户、每日历规则,说明哪些用户可以访问日历以及在什么
方式或方式。
程序的管理员可能会收集应用程序的所有运行时文件
目录/usr/local/cal及其子目录,组织如下:
/usr/local/cal/rules/{acl-rule.0,acl-rule.1,...}
申请的一般规则
/usr/local/cal/用户/用户名
拥有的日历的根目录 用户名
/usr/local/cal/用户/用户名/cal-1/数据/*
每个日历数据文件
/usr/local/cal/用户/用户名/规则/{acl-cal1.0,acl-cal2.0,...}
按日历 DACS 访问控制文件
/usr/local/cal/用户/用户名/组/*
每用户 DACS 组列表,每个文件一个
鉴于这些命名约定:
· 为了测试它是否应该执行一个特定的操作,应用程序会调用
数据检查,告诉它使用它在 /usr/local/cal/rules 中找到的规则。
· 应用程序的一般规则将授权访问控制决策
名称与 /users/ 匹配的对象用户名/* 访问控制规则
目录 /usr/local/cal/users/用户名/ 规则。 这些规则将描述哪些用户,
如果有的话,将被允许在日历上执行给定的操作。
· 应用程序将使用 /users/ 形式的对象名称用户名/cal-1?OP=操作
作为论据 数据检查. cal-1 的规则集将确定给定的
允许身份执行请求 操作 在日历上。 例如,
alice(所有者)可能会被授予访问权限,而不管 OP 论据,
而 bob 可能只有在 OP=read 时才被授予访问权限,而所有其他人可能会被拒绝
使用权。 之后,alice 可能会定义一组她命名为 family 的用户并更改
规则以允许该组的任何成员读取和更新访问权限。
用户的访问控制规则本身可以受到访问控制。 命令行、GUI、
或 Web 界面将使管理员和用户能够管理规则。
查看 示例[32] 节示例规则。
这绝不是组织日历的唯一方法,基于委托的
不需要方法。 管理员可能会改为将所有规则放在一个
公共目录,如 /usr/local/cal/rules/acl-用户名.0/{acl-cal1.0,acl-cal2.0,...},或
让他们更接近他们控制的日历,比如
/usr/local/cal/用户/用户名/cal-1/acl-cal1.0。
可以编写规则来返回一个操作,而不是测试是否允许操作
约束字符串,告诉调用者允许哪种(或多种)访问。 这
程序的输出行将包含引号内的约束字符串。
比较 数据检查 - dacs_acs
dacs_acs(8)[8] 是 DACS 被调用的组件 阿帕奇 (由 DACS
mod_auth_dacs[25]模块,实际上)对Web服务进行访问控制处理
要求。 它的操作通常对 Web 服务不可见; dacs_acs 它的所有
在执行 Web 服务或返回网页之前工作。
数据检查 执行类似于 -仅检查 的运作方式 dacs_acs in
它只是返回一个访问控制决定。 之间有重要区别
然而,这两个程序。
数据检查:
· 不是 CGI 程序(尽管它可以从一个程序中调用);
· 不需要 mod_auth_dacs[25];
· 不使用任何 DACS 配置文件;
· 不直接与网络服务器或任何其他交互 DACS 程式; 和
· 在调用它的用户的权限级别运行,而不是在调用它的用户的权限级别运行
阿帕奇.
而 数据检查 使用普通 DACS 访问控制规则(dacs文件(5)[7]),不像大多数
DACS 命令它不咨询任何 DACS 配置文件。 评价环境
访问控制规则是 类似 到 Web 服务测试,但它不是
相同,因为图片中不需要网络服务器。 除了属性
与约束相关,pass_credentials 等属性没有意义 数据检查.
使用和配置 DACS by 数据检查 被大大简化,因为没有真正的
定义了联邦或司法管辖区; 一个完全独立的环境是
创建以便单个程序或一组相关程序可以同时执行
粗粒度和细粒度的访问控制测试。 没有联邦或管辖权
使用了加密密钥,并没有真正的 DACS 凭据已创建。 联邦和
辖区名称是实例化的,但那些编写规则的人通常不需要
知道他们。
配置
参数在检查时被处理(从左到右),它们的顺序可以是
重大; 例如,由 -fh 标志可能会影响选项
遵循它,例如使用字符串插值的那些。 正好一个 对象 论点是
必需的。
-行政
命令行后面的所有身份都是 DACS 满足的身份
dacs_admin() 功能。 参考 ADMIN_IDENTITY 配置指令
配置文件(5)[33] 和身份的“a”属性。
-app 应用名称
指定用于构建默认路径的应用程序名称(请参阅 -规则 和
-组 标志)。
-语境 文件
变量定义 DACS 命名空间被读取,每行一个,格式
姓名=折扣值 (在周围有可选的引号 折扣值)。 该 姓名 必须在语法上
有效的。 如果 文件 is -,读取标准输入。 例如,如果 文件 包含两个
行数:
FOO=一
BAZ=二
然后在访问控制规则内 ${DACS::FOO} 将具有值“一”和
${DACS::BAZ} 将具有值“二”。 这个标志可以重复,尽管
标准输入只能读取一次。
-D名称=值
这相当于 -变量 名称=值.
-倾倒
执行所有初始化,显示评估上下文,然后退出。
-F 字段_间隔
查找角色时,使用字符 字段_间隔 作为字段分隔符
而不是默认值。 详细请参考中 VFS 指令的描述
配置文件(5)[34]。
备注
请注意,只有第一次出现的字符(从左到右)是
作为分隔符处理。
-fd 域
使用 VHDL 语言编写 域 作为联盟的域名。 它必须在语法上有效。
-fh 主机
使用 VHDL 语言编写 主机,一个完全限定的域名,作为系统的主机名并派生
联邦和管辖区名称。 它必须在语法上有效。
-缩略词 姓名
使用 VHDL 语言编写 姓名 作为司法管辖区名称。 它必须在语法上有效。
-fn 联邦名称
使用 VHDL 语言编写 联邦名称 作为联盟名称。 它必须在语法上有效。
-组 组_vfs
默认情况下, 数据检查 希望找到 DACS 以目录为根的组定义
dacscheck/groups 相对于 DACS_HOME(例如,/usr/local/dacs/dacscheck/groups),或者如果
-app 应用名称 给出,根目录下 dacscheck/应用名称/组相对于
DACS_HOME(例如,/usr/local/dacs/dacscheck/myapp/groups)此标志指定
不同的位置。 它可以是一个绝对路径名(它将被字符串插入
-看 配置文件(5)[35]) 或语法中的 URI VFS[34] 配置指令。
例子:
-groups "[groups]dacs-fs:/local/groups"
-组/home/bob/mygroups
默认情况下,对 %FOO:people 组的引用将映射到名为
目录 FOO 中的 people.grp 相对于 DACS 组目录。
-h
打印使用说明。
-i IDENT
在检查期间,给定的身份被添加到有效的身份集中。 这个
身份不一定在系统上有帐户。 如果 IDENT 是空的
字符串,但是,该标志无效; 当标志为
用过 -i ${Env::REMOTE_USER:-""},例如 REMOTE_USER 可能不是
设置。
-icgi
如果环境变量 REMOTE_USER 设置为有效的简单名称或 DACS
身份,它被添加到检查期间有效的身份集中。 如果
变量未设置或无效,此标志无效。
-icgig
像 -icgi 标志,除了将添加与用户名关联的任何角色。
-他 IDENT
给定的身份是“本地的”,必须与系统上的一个帐户相对应; 如果
-组 标志有效,帐户的组成员身份将作为角色添加到
IDENT.
-伊尔格 IDENT
像 -伊尔格 标志,除了帐户的组成员身份将作为角色添加到
IDENT 无论是否 -组 标志有效。
-ieuid
程序的有效 uid 被添加到身份集合中。 如果 -组
标志有效,帐户的组成员身份将作为角色添加到 IDENT.
-ieuidg
程序的有效 uid 被添加到身份集合中。 该帐户的
组成员身份将作为角色添加到 IDENT 无论是否 -组
标志有效。
-iuid
程序的真实 uid 被添加到身份集中。 如果 -组 标志是
实际上,帐户的组成员身份将作为角色添加到 IDENT.
-iuidg
程序的真实 uid 被添加到身份集中。 帐户组
成员资格将作为角色添加到 IDENT 无论是否 -组 标志是
有效。
-lg
对于命令行中的每个本地身份,使用其 Unix 组
身份角色的成员资格。
-二 LOG_LEVEL
将调试输出级别设置为 LOG_LEVEL (见 达克(1)[23])。 默认级别是
警告,以及 -v 标志会提高调试或跟踪的级别。
-名称比较 方法
完全像 名称_比较[36] 指令,设置用于比较的默认方法
各种上下文中的 DACS 名称 方法,这可能是(不区分大小写)大小写,
nocase,或默认。
-q
保持安静,除了错误信息; 结果不会打印到标准输出。 这 -v
和 -二 标志与此无关。
-重定向
如果访问被拒绝并且适用的规则调用 重定向()[37] 与
BY_SIMPLE_REDIRECT 参数,然后将指定的 URL 打印到 stdout。 这旗
启用 -q 旗。
-角色 角色_vfs
将使用以下命令查找命令行上每个身份的角色
角色_vfs. 它可以是绝对路径名(这将是字符串插值 - 请参阅
配置文件(5)[35]) 或语法中的 URI VFS[34] 配置指令。 如果
找到任何角色,它们将被添加到为用户指定的任何其他角色
(无论是明确列出的还是从 Unix 组成员身份获得的)。 例如,如果
/usr/local/myapp/roles 包含:
bobo:用户
奥吉:管理员,用户
哈雷:客人
然后命令行:
% dacscheck -roles /usr/local/myapp/roles -i auggie /myapp/admin
将测试身份 {u="auggie",g="admin,users"} 的访问权限。
-规则 规则_vfs
默认情况下, 数据检查 期望使用以目录 dacscheck/acls 为根的规则集
相对于 DACS_HOME(例如,/usr/local/dacs/dacscheck/acls),或者如果标志 -app
应用名称 给出,根目录下 dacscheck/应用名称/acls 相对于 DACS_HOME
(例如,/usr/local/dacs/dacscheck/myapp/acls)。 此标志指定不同的规则集
要使用的。 它可以是绝对路径名(这将是字符串插值 - 请参阅
配置文件(5)[35]) 或语法中的 URI VFS[34] 配置指令。
例子:
-rules "[acls1]dacs-fs:/local/acls"
-规则/usr/local/myrules
这个标志可以重复; 规则集将按照它们的顺序进行检查
在命令行中指定。
-v
提高调试输出的级别。 标志可以重复。
-变量 名称=值
像 -语境 标志,这将一个变量定义添加到 DACS 命名空间。 这
变量 DACS::名称 将被分配字符串 折扣值。 该 姓名 必须在语法上
有效的。 该标志可以重复。
-vfs vfs_uri
添加 vfs_uri 作为一个 VFS[34] 配置指令。 这个标志可以重复,用
后来的事件比之前的事件具有更高的“优先级”(就好像它们
后来出现在 dacs.conf 中; 看 配置文件(5)[33])。
--
这标志着标志参数的结束。
示例
为了说明如何 数据检查 可能与实际应用程序一起使用,这里有一些示例。
前几个继续前面描述的假设日历应用程序。
1. 文件 /usr/local/cal/rules/acl-rule.0 可能如下所示:
<委托 url_pattern="/users/alice/*"
rule_uri="/usr/local/cal/users/alice/rules/>
<委托 url_pattern="/users/bob/*"
rule_uri="/usr/local/cal/users/bob/rules/>
用户(“身份验证”)
此规则将对特定用户的日历的请求重定向到该用户的访问权限
控制规则。 它还表示对应用程序二进制文件的访问仅限于
经过身份验证的用户。 应用程序可能会发出如下命令:
% dacscheck -i $REMOTE_USER -rules /usr/local/cal/rules 对象
这将返回 0 的退出状态,如果 REMOTE_USER 被授予访问权限 对象;
否则将返回退出状态 1。 更好的选择是使用以下命令:
% dacscheck -icgi -rules /usr/local/cal/rules 对象
这将使用户未经身份验证,如果 REMOTE_USER 未设置或无效。
2. 文件/usr/local/cal/users/alice/rules/acl-cal1.0 包含用户的规则
alice 的“日历 1”,可能看起来像:
用户(“:爱丽丝”)
回报(1)
${Args::OP} eq“读取”
用户(“:鲍勃”)
此规则表示允许 alice 完全访问日历(没有
操作限制),但 bob 只有读访问权限。 数据检查 将
调用 /users/alice/cal-1?OP=create, /users/alice/cal-1?OP=update, 或
/users/alice/cal-1?OP=read 测试授权以执行创建、更新或
分别对日历进行读取操作。
3. 如果 alice 定义了一个 DACS 她称之为家庭的组,并添加了名字 julia 和
auggie 到该组,她可能会通过添加以下内容来修改上述规则:
${Args::OP} 等式“读取”
或 ${Args::OP} eq “更新”
用户(“%:爱丽丝家庭”)
此规则表示允许 alice-family 组的任何成员读取和更新
访问此日历。 命令:
% dacscheck -i julia /users/alice/cal-1?OP=更新
将报告授予访问权限。
4. alice 的组成员 alice-family 可能会在文件中指定
/usr/local/cal/users/alice/groups/family
用户(“:爱丽丝”)
回报(1)
此规则仅允许 alice 管理该组的成员资格,但她是自由的
修改规则以允许其他人管理她的组。
5. 作为这个应用程序的最后一个例子,alice 的规则也可能被访问
控制:
用户(“:爱丽丝”)
回报(1)
此规则仅允许 alice 管理该组的成员资格,但她是自由的
修改规则以允许其他人管理她的组。
6. 一个流行的开源 Web 日志分析器程序,用 Perl 编写,可以作为
CGI 程序。 该程序包括安全规定,可以限制访问
通过用户名(使用 REMOTE_USER作为
由网络服务器导出),或基于用户的 IP 地址(使用 REMOTE_ADDR).
实现了大约 40 行代码(加上各种初始化)
这个安全策略基本上可以用几行代码代替:
我的 $exit_value = 0;
系统“/usr/local/dacs/bin/dacscheck”、“-q”、“-icgi”、“-rules”、
"/usr/local/webstats/acls", "/webstats";
$exit_value = $? >> 8;
# print "dacscheck 为用户\"$remote_user\"\n" 返回了 $exit_value;
如果($exit_value != 0){
# dacscheck 拒绝访问; 打印消息并退出
退出 1;
}
# dacscheck 授予访问权限,所以继续
Tips:
这款 DACS 发行版包括一个 Perl 模块
(/usr/local/dacs/lib/perl/DACScheck.pm) 使 数据检查 使用起来更容易一些。
上面的例子可以写成:
使用 DACScheck.pm;
dacscheck_rules("/usr/local/webstats/acls");
我的 $result = dacscheck_cgi("/webstats");
如果($结果!= 1){
# dacscheck 拒绝访问; 打印消息并退出
退出 1;
}
# dacscheck 授予访问权限,所以继续
一个简单的 DACS 可以编写访问控制规则来复制程序的安全性
功能(使用 用户() 和 从() 谓词,见 dacs.表达式(5)[22]),但是
可以轻松添加更复杂的策略,无需修改 Perl
再次编程。
诊断
如果访问被授予,程序退出 0,如果访问被拒绝,则退出 1。 任何其他退出状态
表示发生错误。
使用 onworks.net 服务在线使用 dacscheck