openSUSE:Build Service Concept ACL

跳转到:导航搜索

一份关于通过访问控制列表支持项目和软件包范围访问控制的新草案提案。

范围

访问控制是一种在OBS对象访问上提供类似文件系统访问权限的手段。目前,OBS中仅执行基本的访问控制:一旦您登录到OBS,就可以读取OBS系统中的所有数据。写入访问通过特定的用户角色进行控制。随着访问控制的实施,这种情况发生了变化。OBS内部的所有操作,例如文件、元数据和其他对象,都将受到编码在所谓的访问控制列表(ACL)中的访问控制检查。此实施基于OBS 2.0的组、角色和权限系统。

用例、功能

用例

用例部分在某些方面可能已过时。最初的提案是基于与受保护对象对应的属性来构建ACL。当前的实施基于OBS的组和角色管理。

完全匿名的读取访问权限

我们希望人们无需创建登录即可读取的OBS服务器实例

  • 允许匿名读取整个构建服务
  • 应该能够在任何OBS实例中配置此设置,而无需特殊的全局选项

组合的读/写访问权限

用例A:公司设置,用户应该只能看到他们自己的项目,而看不到其他项目

用例B:具有访问封闭源代码或预发布软件的公共服务器,这些软件不应该公开可见

  • 读访问权限与写访问权限的耦合
  • 每个登录用户只能读取他具有写访问权限的软件包/项目。
  • 问题:访问设置是每个项目还是整个服务器?

应该有一个全局规则,然后是基于用户在特定项目中的角色的特定规则。这是其他权限的实施方式,我们不应在没有理由的情况下偏离。

每个项目可以定义额外的角色(因此具有权利),例如为特定用户或组提供读取权限。

因此,例如,我们可以默认禁止读取,但引入一个“读者”角色。类似于维护者或下载者。如果您将用户或组添加到项目或软件包,他们将获得相应的权限。如果您将其添加到主命名空间(例如openSUSE项目),这也适用于openSUSE:Tools项目,例如。

当然,在这种特定情况下,仅仅在api中实施它是不够的,它必须在后端得到支持。或者我们干脆禁止在这样的实例中使用源链接、聚合、kiwi构建和仓库重用。

分离的读/写访问权限

添加可以授予项目和软件包的单独读取访问权限,除了写入访问权限

细粒度的ACL

当前写入访问权限是针对整个项目/软件包的。增强它以使其细粒度,以控制

  • 对软件包的写入访问权限
  • 对元数据(描述、授予权限)的写入访问权限
  • 添加(顶级)项目的权限
  • 删除项目的权限
  • 添加新软件包的权限
  • 删除软件包的权限

这可以作为ACL实现,也可以使用不同的角色,人们将获得项目或整个构建服务的角色(类似于wordpress具有管理员、编辑、作者、订阅者)

带有ACL的Wordpress类比

  • 仅下载-最终用户,如果已发布/等待发布-下载者
  • 匿名查看-浏览服务(如果未设置其他权限,则可能是默认设置),但不能下载-查看者
  • 读取访问权限-能够读取(和分支?)软件包-订阅者
  • 写入访问权限-能够写入prj/pkg-作者
  • 写入访问权限到请求/元数据-能够接受请求/更改元数据+添加/删除pkg-编辑/审查者
  • prj/pkg的完全访问权限-以上所有内容+属性-管理员

项目路径向下继承,并对每个子项目/软件包进行撤销?例如,不要写入released/stable,但从其他地方继承prj ACL。

权利和组

JanSimon:Wordpress类比在某种程度上是有意义的。我脑海中有这些权利和组(权利)


JanSimon:一旦允许分支/链接,我就看到了一个问题-要么我们继承分支中的某些限制,要么分支将成为破坏acl的可能性。或者分支/链接仅获得“维护者”角色并从原始pkg继承所有者和acl。因此,acl将被保留,用户可以修复并提交到原始pkg。

组访问权限

目前我们只有单个用户并授予他们访问权限,为用户组定义相同的权限可能是有意义的。

项目所有者的视图

关于封闭项目可能需要的一些想法。

所有项目类型都限制写入访问权限。封闭的项目类型限制对源的读取访问权限;秘密/保密的项目类型限制对源和二进制文件的读取访问权限。

项目是开放的

这是一个典型的开源项目。

  • 项目和软件包出现在列表中
  • 只有命名的人/组才能更新项目和源代码
  • 源代码是自由可用的
  • 生成软件包的仓库是可用的

项目是关闭的

这种类型的项目保护源代码,但二进制文件很容易访问。

  • 项目和软件包出现在列表中
  • 只有命名的人/组才能看到项目中的源代码。
  • 源代码被ACLed
  • 源代码不会泄露
  • 二进制文件可用,因此泄漏不是问题。
  • 生成软件包的仓库是可用的

这里最重要的附加要求是源代码ACL的管理应该简单,以避免意外泄漏。例如,添加软件包/子项目并意外使源代码世界可读应该非常困难(不可能?)

当来自“关闭”项目中的软件包复制到其他地方时,它们应该默认保留其关闭的权限。

项目是保密的

这种类型的项目是封闭的,但可见的。只有授权用户才能访问源代码和二进制文件。某些其他项目可以使用二进制文件。

  • 项目和软件包出现在列表中和构建队列中
  • 只有命名的人/组才能看到项目中的源代码
  • 源代码被ACLed
  • 二进制文件被ACLed
  • 源代码和二进制文件不会泄露
  • 生成软件包的仓库受到ACL保护
  • 项目可以被特定项目用于构建[1]

[1] 相同的顶级命名空间,或者这可能意味着项目充当用户ID并具有权限。

项目是秘密的

这种类型的项目是完全封闭的。对于未授权的用户,唯一的可见性应该是无法识别的资源使用情况。与保密非常相似。

  • 只有命名的人/组才能看到有关该项目的任何信息。
  • 当项目正在构建时,它显示<private>而不是任何项目数据
  • 源代码不会泄露
  • 二进制文件不会泄露
  • 受保护的生成软件包的仓库
  • 项目不能被其他项目用于构建

功能

架构和实现

ACL位于OBS 2.0引入的两项功能之上:角色和权限管理以及可自由定义的用戶组。ACL使用4个专门定义的权限‘source_access’、‘private_view’、‘download_binaries’、‘access’。此外,预先存在的角色“maintainer”、“reader”和“downloader”已使用特定的预定义权限进行了修改(这些权限可以随时使用角色和权限编辑器动态更改)。最后,添加了4个新的标志‘sourceaccess’、‘binarydownload’、‘privacy’和‘access’到项目和软件包描述中,以指示某些信息仅可由特定用户或组读取,或者信息是隐藏的。

简介

如何使用ACL

使用ACL有4个步骤(其中一些是可选的,只能由OBS实例的管理员执行)。第一步是将列出的权限分配给角色、用户或组(只有管理员才能执行此步骤,并且对于预定义的角色“maintainer”、“reader”和“downloader”不需要)。第二步是添加一个组,用于将特殊用户添加到打算使用ACL的项目中(此操作只能由管理员执行)。第三步是在项目创建时通过将它们添加到项目元数据中来保护项目,并使用适当的保护标志。第四步是将具有ACL权限添加到项目元数据中的新预定义角色中的其他用户或组。

ACL可以保护哪些信息

受保护的信息分为4类。类别1(标志‘sourceaccess’)是源代码。类别2(标志‘binarydownload’)是二进制软件包或日志文件或构建。类别3(标志‘privacy’)是项目或软件包信息,例如构建状态。类别4(标志‘access’)是任何可查看或可访问的项目或软件包的所有信息(完全阻止所有访问和信息)。

详细信息

权限和角色的绑定发生在 OBS 管理界面中的角色编辑器中。管理员可以动态地将权限分配给角色,创建新角色,并将用户分配给组,以及将用户或组分配给角色。OBS 的所有 API 调用都已进行 ACL 访问工具化处理(这意味着位于 src/api/config/routes.rb 中的列表),这些调用处理受访问控制的对象。特别是,但不限于,所有列表操作和所有文件访问操作。

权限和标志的对应关系

授予访问权限和访问标志之间存在 1:1 的对应关系。它通过以下操作执行:如果设置了访问标志,并且用户直接获得了授予的权限,或者他被分配了一个获得了授予权限的角色,或者他是通过角色或直接权限分配获得了权限的组的成员,那么他就可以访问受保护的对象。

源路径

OBS 的源路径是访问源文件的任何现有方法。这些方法是

1. _link
2. "link" directives in a project
3. published build repositories with source packages
4. API calls with 'source/' prefix
5. access to source via OBS Interconnect (special of 4.)

请注意,文件的最终结果可能是包含差异链接的列表,这些链接必须一直跟踪到最终对象。最终结果会被扩展。

二进制路径

OBS 的二进制路径是访问构建结果的任何现有方法。这些方法是

1. _aggregate
2. "path repository" directives in a project
3. Imaging Descriptions - KIWI descriptions, product definitions
4. published build repositories with binary packages
5. API calls with 'build/' prefix
6. access to binary packages via OBS Interconnect (special of 5.)

请注意,kiwi 和产品文件也可以链接到 _link 文件行,并可能包含差异文件或通过项目链接。

概述表

关于 API 调用保护的说明:如果一个 API 调用进入,则将匹配该调用的模式从上到下应用。因此,如果存在“O.”情况,则当没有其他情况匹配时才应用它。

关于权限的概述(与 acl 相关)

download_binaries - This permission is related to the binarydownload flag
source_access     - This permission is related to the sourceaccess flag
private_view      - This permission is related to the privacy flag
access            - This permission is related to the access flag

关于标志的概述(与 acl 相关)

privacy        - project looks like binary-only project. no packages visible, but available as build target
sourceaccess   - sources inside the package files are not available
binarydownload - built binaries are unavailable
access         - hides existence and access to a project and its packages (also jobs/workers invisible).

关于角色的概述

Admin              - has the right to access all below
reader             - is a special role for getting sourceaccess
reviewer           - is special to review workflow, needs all permissions (privacy, sourceaccess, access)
downloader         - has binarydownload permission (does he need also privacy ?)
maintainer         - has by default permissions privacy, sourceaccess, access, binarydownload

关于用户的概述

Admin              - has the role Admin usually
_nobody_           - user used for accessing the OBS interconnect
authenticated user - can only use special permissions where one of the roles, usually maintainer in objects he owns

受隐私标志保护的 API 调用(API 调用见 src/api/config/routes.rb

1. 'build/:project/_result' - lists buildresults of a project, in combinations
2. 'source/:project'        - lists packages of a project, empty if user / group has no permission
3. 'public/source/:project' - lists packages, same as 2. but auth with "_nobody_", see also OBS interconnect
O.  Other index functions   - not protected. Index functions list object  names

受 sourceaccess 标志保护的 API 调用(API 调用见 src/api/config/routes.rb

1. 'build/:project/:repository/:arch/:package/_log'      - build log, if user / group has no access, 403 is returned
2. 'source/:project/:package/:file'                      - source file, if user / group has no access, 403 is returned
3. 'source/:project/:package'                            - source file list, if user / group has no access, 403 is returned
4. 'source/:project'                                     - project list, if user / group has no access, 403 is returned
A1. OBS interconnect                                     - rerouted, using auth of "_nobody_"
A2. Files of 1. with access granted                      - special checking rules applied see below
O.  Other index function                                 - not protected. Index functions lists object names

受 binarydownload 标志保护的 API 调用(API 调用见 src/api/config/routes.rb

1.  'build/:project/:repository/:arch/:package/_log'      - build log, if user / group has no access, 403 is returned
2.  'build/:project/:repository/:arch/:package/:filename' - binary package, if user / group has no access, 403 is returned
3.  'published/:project/:repository/:arch/:filename'      - binary package, if user / group has no access, 403 is returned
A1. OBS interconnect                                      - rerouted, using auth of "_nobody_"
O.  Other index function                                  - not protected. Index functions lists object names

受 access 标志保护的 API 调用(API 调用见 src/api/config/routes.rb

1.  Any Index function              - hides access protected objects
2.  Any Access function             - protects objects with 404 - object not found
A1. OBS interconnect                - rerouted to 1. or 2., using auth of "_nobody_"
A2. Files of 2. with access granted - special checking rules applied see below
O.  Other index or access function  - should not be applicable, must be covered by 1. or 2.

涵盖动作与角色的表(记录用户可见的动作)

动作与角色 _anonymous_ 已认证但未参与的用户 审核者(专用于审核流程) 下载者 维护者 管理员
查看项目中的软件包(隐私标志) no no yes yes yes yes

涵盖动作与权限标志的表(记录 api 上的动作)

动作与权限 privacy binarydownload sourceaccess access
build_controller/get result (隐私标志) no yes no no no

限制

本节包含 OBS 当前状态以及底层构建过程(debian 和 rpm)中未记录、文档记录稀少或显而易见但存在的行为,这些行为无法更改,因为它们是固有存在的。约束记录的一个问题是“向后兼容性”。

兼容性

ACL 的实现是在保持 OBS 2.0 存在状态的情况下完成的。这意味着 osc 命令行客户端以及 WebUI 1.9 和 WebUI 2.x 应该能够开箱即用地工作。

特别是“access”标志,它还在所有可能的地方隐藏一个项目,对于没有访问权限的用户来说,该项目被视为不存在。

OBS 互连

OBS 互连当前可以在没有身份验证的情况下使用,因此选择将所有这些访问视为由用户“_nobody_”执行。由于该用户的角色和权限可以被修改,因此 OBS 互连的安全性可以由管理员动态更改。

源 RPM 处理和发布

当前,存在一个安全带,禁止任何源软件包被放入受保护项目的构建结果池中。原因是 _aggregates 实际上允许您访问只有二进制访问权限时才能访问项目的源代码。另一个原因是源软件包也会发布到发布者存储库。

此解决方案可能会在后续版本中更改。

存储库发布

发布当前不受任何访问控制保护。建议维护者为受保护的项目关闭发布。原因是 OBS 的下游链的授权接口缺失。

此解决方案可能会在后续版本中更改。

特殊安全检查

内部存在特殊的安全检查,以防止用户无意中打开受 ACL 保护的项目或软件包。这意味着以下类型的引用

1. links / aggregates - files with the name "_link" or "_aggregate"
2. Imaging Descriptions - KIWI , product definitions
3. project meta - Tags with "link project" or "path repository" directives

是需要特殊处理的情况。由于它们本身可能包含引用存储库或项目或软件包的数据,因此会检查是否存在以下安全漏洞

1. A link points from an unprotected object to a protected object
2. The user has no access to the position where the references points to

当然,这些对象可能存在链式关系,例如链接到链接到项目或产品到链接到项目。

最后但并非最不重要的一点是,只有管理员才能将现有且未受保护的项目提升到受保护级别。原因是项目或软件包构建结果可能已经发布,或者项目或软件包可能已经被上述任何引用使用。

此功能可能会在后续版本中更改,并且可能会被动态且灵活的解决方案取代。

从旧版本更新

更新复杂的安装,特别是从 2.0,可能会导致需要手动执行许多更改。原因是 OBS 引入了权限和组/角色管理。

这意味着管理员应该交叉检查为创建或将要创建的角色分配的权限。

链接和分支

如果创建分支项目,则在创建新项目时,它将继承其分支项目的权限。

对于创建分支或链接的现有项目,请参阅上述关于安全规则的说明。

状态

当前状态是,OBS git master 的完整 API 已使用 ACL 代码工具化,API 控制器的关键部分已进行代码检查,并且现在大部分 API 调用都在 OBS 测试套件中有一个测试用例。工作正在进行中,以使 ACL 尽可能安全。完整的 API 现在已工具化,以隐藏“access”标志的所有信息,并且源和二进制路径受到“sourceaccess”、“binarydownload”和“access”标志的保护。当前 git master 的代码滴入正在一些较大的 OBS 系统中进行测试,最值得注意的是 openSUSE Buildsystem,因为您可以公开访问它。您可以在 OBS 项目 openSUSE:Tools:Unstable 中找到此代码库的快照。

对于 OBS 2.1

由于 2.1 的审查状态,“access”将仅通过补丁提供。用户可以尝试此新功能。为了不误导用户,因为 OBS 的二进制路径在 2.1 中没有完全保护,所以选择了禁用它的选项。尽管如此,标志 binarydownload、sourceaccess、privacy、access 已实现

1. after security review, "access" is switched off, can be used by a patch
2. the source path (access to sources in packages) has been reviewed

OBS 2.1 的安全警告列表

OBS Release 2.1 Beta 1 及更高版本出于安全原因已停用“privacy”和“access”标志。这并不是因为它们不起作用,也不是因为它们会使系统更不安全,而是因为它们的存在不应该让您作为管理员或用户产生虚假的安全感。

有一个补丁可以重新启用这两个标志,并附带安全警告

  • 如果启用了 KIWI 和产品构建,则可以访问受保护项目的二进制路径
  • 单个软件包二进制保护无法正常工作,因为当前 OBS 无法将二进制软件包识别为单独的对象
  • 如果您将未受保护的项目安全级别提升为受保护,现有的“链接”(上述任何可能性)到该项目都不会被切断
  • OBS 的发布存储库当前不受单独的访问控制保护。如果您不关闭发布,并且在将其发送到您的 Web 服务器之前不筛选发布的存储库,您将发布受保护项目的二进制软件包
  • 通过“access”隐藏项目尚未 100% 有效。通过复杂的 API 调用,可能可以猜测项目或软件包或其他对象的名称。无论如何,激活“access”应该阻止任何 API 显式列出任何隐藏对象
  • 尚不清楚请求控制器是否可以向您提供受“access”保护的隐藏对象的信息
  • 如果 WebUI 启用缓存,则可能暴露隐藏信息。我们希望在 2.1 版本系列中解决此问题
  • OBS 互连在访问 ACL 保护的对象时,正在使用用户“_nobody_”。如果这不够安全,管理员应更改“_nobody_”的权限/角色/组设置
  • 迁移到 OBS 2.1 不会更改已经更改或添加的组、角色或权限,以免让管理员感到困惑。请小心为用户和组设置适当的权限和角色

如果我们在尚未列出的问题,本节将进行修订。此外,我们尝试在适当的努力下,通过新的 2.1.x 版本修复任何新问题。

对于 OBS 2.2

以下列表是 2.2 的 TODO 列表。此版本的目标是使所有标志 binarydownload、sourceaccess、privacy、access 已实现、审核并激活

1. hiding of objects improvement by:
1a. uniform error messages / refactoring ACL code
1b. correct instrumenting of all put methods
2. all remaining uninstrumented API have to be instrumented for ACL
3. remaining holes in the binary path have to be closed
4. the binary path has to be reviewed for security issues
5. testsuite has to be further enhanced
6. review WebUI caching code. Which caches across the users
7. clarify how to deal with notification of hidden content
OI. fix any popping up security issues

具体来说,从上面的列表中包括项目

- check the request controller for hiding
- "_link + patches" mode
- run testsuite also with .kiwi and .product files

OBS 2.2 的安全警告列表

测试

Adrian Schröter 相对频繁地更新这些“Alpha 快照”,通常每 1-2 周更新一次,并且每天在 git master 上运行测试套件。测试套件配置非常容易,请参阅下面的链接,建议所有 OBS 维护者在任何 git 提交之前运行测试。这在 OBS 2.0 分支之后引入,并大大减少了格式错误的更改。感谢 Jan-Simon Möller 将许多测试用例放入测试套件中进行 ACL 检查。有关 OBS 测试,请参阅 Development and Test

示例

以下示例旨在说明 ACL 直接或间接可能涉及的位置。适用的规则在上面的实现细节中描述。

使用 ACL 标志和角色的示例项目元数据

这是一个幻想的项目元数据文件,其中包含用户、组、ACL 标志以及使用 <link project="<path project=" 指令检查的两个引用案例,这些指令会检查是否存在保护违规行为。

<user userid="MartinMohring" role="maintainer" />
<!-- grant user full write and read access -->

<group groupid="MeeGo-Reviewer" role="maintainer" />
<!-- grant group full write and read access -->

<group groupid="MeeGo-Developers" role="reader" />
<!-- grant group full source read access -->

<group groupid="MeeGo-BetaTesters" role="downloader" />
<!-- grant group access to packages/images -->

  <sourceaccess>
    <disable/>
  </sourceaccess>
  <!-- disable read access - unless granted explictely.
          This flag will not accept arch or repository arguments. -->

  <binarydownload>
    <disable/>
  </binarydownload>
  <!-- disable access - unless granted explictely -
          to packages/image and logfiles -->

  <access>
    <disable/>
  </access>
  <!-- disable access - unless granted explictely-,
          project will not visible or found via search,
          nor will any source or binary or logfile be accessable.
          This flag will not accept arch or repository arguments. -->

  <privacy>
    <disable/>
  </privacy>
  <!-- project will not visible or found via search.
          This flag will not accept arch or repository arguments. -->

  <link project="openSUSE:Tools"/>

  <repository name="openSUSE_11.2">
    <path repository="standard" project="openSUSE:11.2"/>
    <arch>i586</arch>
    <arch>x86_64</arch>
  </repository>

使用需要 ACL 检查的存储库的产品定义示例

下面是产品定义开头。<repository path="obs:// 指令是 ACL 访问检查的一部分,以及其他由 <xi:include href= 引用文件

<?xml version="1.0" encoding="UTF-8"?>
<productdefinition xmlns:xi="http://www.w3.org/2001/XInclude">
<products>
 <product id="OBS-Addon-Factory">
        <vendor>openSUSE</vendor>
        <name>OBS-Addon-Factory</name>
        <version>2.0.0</version>
        <release>0</release> 
        <summary>openSUSE Build Service Add on for Factory</summary>
        <description>This Addon can be installed on current openSUSE Factory installations.
It provides a full Build Service server instance.
        </description>

        <buildconfig>
            <producttheme>openSUSE</producttheme>
        </buildconfig>

        <installconfig>
            <datadir>suse</datadir>
            <descriptiondir>suse/setup/descr</descriptiondir>
            <distribution>OBS-Addon-Factory</distribution>
        </installconfig>
        <runtimeconfig/>
    </product>
   </products>

    <repositories>
        <repository path="obs://openSUSE:Tools/openSUSE_Factory"/>
        <repository path="obs://openSUSE:Factory/standard"/>
    </repositories>

    <xi:include href="archsets.inc" />

使用需要 ACL 检查的存储库的 KIWI 文件示例

下面是 KIWI 文件的开头。<source path="obs:// 指令是 ACL 访问检查的一部分。

<?xml version="1.0"?>
<image schemeversion="3.7" name="buildhost-opensuse-11.1">
	<description type="system">
		<author>Adrian Schroeter</author>
		<contact>adrian@suse.de</contact>
		<specification>openSUSE buildhost system</specification>
	</description>
        <profiles>
                <profile name="xen" description="Boot with xen kernel/mboot.c32"/>
        </profiles>
	<preferences>
	      <type compressed="true" primary="true" filesystem="ext3" boot="netboot/suse-11.1" bootprofile="xen">pxe</type>
	      <version>1.4.0</version>
	      <size unit="M">687</size>
	      <packagemanager>zypper</packagemanager>
	      <rpm-check-signatures>False</rpm-check-signatures>
	</preferences>
        <drivers type="drivers">
                <file name="drivers/ide/*"/>
                <file name="drivers/block/loop.ko"/>
                <file name="fs/ext4/*"/>
                <file name="fs/ext3/*"/>
                <file name="fs/ext2/*"/>
                <file name="fs/binfmt_aout.ko"/>
                <file name="fs/binfmt_misc.ko"/>
                <file name="fs/mbcache.ko"/>
                <file name="fs/quota_v1.ko"/>
                <file name="fs/quota_v2.ko"/>
                <file name="fs/jbd/*"/>
                <file name="drivers/xen/*"/>
                <file name="drivers/ata/*"/>
                <file name="drivers/acpi/dock.ko"/>
        </drivers>
	<repository type="rpm-md" priority="1">
		<source path="obs://openSUSE:Tools/openSUSE_11.1"/>
	</repository>
	<repository type="rpm-md" priority="2">
		<source path="obs://openSUSE:11.1:Update/standard"/>
	</repository>
	<repository type="rpm-md" priority="3">
		<source path="obs://openSUSE:11.1/standard"/>
	</repository>