自动化研究产物 — 非上游项目。
本仓库是由自动化工具链为拉瓦尔大学(Université Laval)硕士论文构建的一次性实验环境,用于复现已发表的 GitHub Actions 工作流漏洞。它是
ONSdigital/ras-collection-instrument在提交493dc3d7c85f39c44e879941df9d5682865da109(2020-12-03)时的逐字快照,依据该项目自身的许可证重新分发,该许可证文件已原样包含在本快照中。上游项目未参与其中,也从未成为攻击目标,此处研究的漏洞已公开。本仓库中的每个密钥和变量均为随机生成的虚拟值——不存在任何真实凭据。操作引用和运行器镜像均固定为 2020-12-03 时解析到的版本;有关对快照所做的所有更改,请参阅工具链输出中的
pinning.md。如有疑问或异议:[email protected]
这是 RAS Collection Instrument 微服务,负责上传采集练习(collection exercises)和采集工具(collection instruments)。它还可用于将采集工具下载为 .xlsx 文件,并支持通过搜索过滤器查找采集工具。 该服务能够将采集练习与采集工具进行关联和解除关联。练习与工具之间是一对多的关系,因此一个采集练习可以拥有多个采集工具。 JSON schema 中的每个采集工具都包含样本单元引用、类型和摘要 ID,以及附加属性。 该服务主要与采集练习服务通信,同时也与 party、case 和 survey 服务交互。 有关采集工具的日志信息会发送到 rabbitmq。
采集工具存储在一个 instrument 表中,包含以下字段:
type = 采集练习的类型(即 SEFT、EQ 等) instrument_id = 工具的 UUID stamp = 采集工具创建时的时间戳 survey_id = 关联调查的 UUID classifiers = 调查分类器 survey = 调查本身 seft_file = 工具的 seft 文件
存在三个不同的端点视图:/collectioninstrument,用于大多数端点,以及 /survey_responses 和 /info。
当为采集练习上传采集工具时,它会向 rm-collection-exercise 服务的 Seft.Instruments 队列写入一条消息。 当上传 SEFT 调查响应时,它会向 sdx-seft-consumer 服务的 Seft.Responses 队列写入一条消息。
这需要安装 pipenv:
pip install pipenv
要运行测试,需要 rabbitmq 和数据库服务器。tox 脚本会在 Docker 容器内创建并运行这些依赖项,单元测试运行后会销毁这些容器。
pipenv install --dev
pipenv run tox
使用所需依赖项运行服务:
docker-compose up -d db rabbitmq
pipenv run python run.py
测试服务是否已启动:
curl http://localhost:8082/info
启动应用程序时会自动创建数据库。
要在 Docker 容器中运行服务,包含一个 Compose 脚本:
docker-compose up -d
可用于配置的环境变量如下所列:
| 环境变量 | 描述 | 默认值 |
|---|---|---|
| MAX_UPLOAD_FILE_NAME_LENGTH | 文件名的最大长度 | 50 |
| LOGGING_LEVEL | 日志记录器级别 | INFO |
| JSON_SECRET_KEYS | 密钥的 Json 表示形式 | None |
| ONS_CRYPTOKEY | Cryptographer 使用的密钥 | None |
| SECURITY_USER_NAME | 客户端用于与其他 API 进行身份验证的用户名 | admin |
| SECURITY_USER_PASSWORD | 客户端用于与其他 API 进行身份验证的密码 | secret |
| COLLECTION_EXERCISE_SCHEMA | 采集工具 schema 的位置 | application/schemas/collection_instrument_schema.json |
| CASE_URL | case 服务的 URL | 'http://localhost:8171' |
| COLLECTION_EXERCISE_URL | 采集练习服务的 URL | 'http://localhost:8145' |
| SURVEY_SERVICE_URL | survey 服务的 URL | 'http://localhost:8080' |
| PARTY_URL | party 服务的 URL | 'http://localhost:8081' |
| RABBITMQ_AMQP_COLLECTION_INSTRUMENT | rabbitmq 的 URI | None |
| RABBITMQ_AMQP_SURVEY_RESPONSE | rabbitmq 的 URI | None |
这些在 config.py 中设置
导航到 /developer_scripts 并运行 import.py,在命令行中回答提示
collection_instrument_schema 有两个看似相同的属性字段:formType 和 formtype。entname1/2/3 和 runame1/2/3 等。应重新设计 schema,或提供更具体的文档。/collectioninstrument/count 端点所做的只是返回采集工具的数量。为什么服务需要做这件事?难道不能通过数据库查询来完成吗?