rivassec/devsecops-notes
GitHub: rivassec/devsecops-notes
基于 Pelican 的 DevSecOps 个人博客源码,涵盖基础设施安全、Kubernetes、IAM 和云加固等主题,配套完整的 CI/CD 流水线与严格的依赖管理。
Stars: 0 | Forks: 0
# DevSecOps 笔记
[rivassec.com](https://rivassec.com) 的源码,这是由 RivasSec 撰写的关于基础设施安全、Kubernetes、IAM、云加固和 OSINT 的博客。
## 技术栈
- [Pelican](https://getpelican.com/) 静态站点生成器(配置在 `pelicanconf.py` 和 `publishconf.py` 中)
- [Flex](https://github.com/alexandrevicenzi/Flex) 主题,内联在 `themes/Flex/` 目录下并进行了本地修改
- Pelican 插件内联在 `plugins/` 目录下(sitemap、neighbors、post_stats、related_posts、extract_toc)
- Markdown 文章位于 `content/` 目录
- 自托管字体(Source Sans 3、Source Code Pro)位于 `content/static/fonts/` 目录下
- 通过 GitHub Actions 进行 CI 和部署到 `gh-pages` 分支(`.github/workflows/deploy.yml`)
## 本地开发
```
python3 -m venv .venv
.venv/bin/pip install --require-hashes -r requirements.txt
.venv/bin/pelican content -s pelicanconf.py -o output # dev build (relative URLs)
.venv/bin/pelican content -s publishconf.py -o output # prod build (absolute URLs)
make serve # serves output/ on :8000
```
`pelicanconf.py` 是开发配置,`publishconf.py` 是针对生产环境对其进行的扩展。
## 依赖管理
`requirements.in` 是事实来源(手动编辑)。`requirements.txt` 是使用 `pip-compile --generate-hashes` 生成的,并在 CI 中通过 `pip install --require-hashes` 强制执行。编辑 `.in` 文件后重新生成:
```
python3.13 -m venv .venv-compile
PIP_CONFIG_FILE=/dev/null .venv-compile/bin/pip install pip-tools
PIP_CONFIG_FILE=/dev/null .venv-compile/bin/pip-compile \
--generate-hashes --output-file=requirements.txt requirements.in
```
Dependabot 每周提交升级 `requirements.in` 的 PR;每个 PR 在合并前都需要进行一次本地 pip-compile。
CI 使用 `pip install --require-hashes --no-deps -r requirements.txt` 进行安装。`--no-deps` 标志是有意为之:当像 Pelican 这样的上游硬性固定了某个传递依赖(例如 `Pygments<2.20.0`)时,我们有时需要覆盖该固定版本以修补安全公告。每个传递依赖都已经在 `requirements.txt` 中固定了哈希值,因此使用 `--no-deps` 是安全的,并且锁定文件保持权威性。
## 匿名化(发布前必读)
每篇文章在合并前都必须清除可识别工作的细节。本博客是一个个人产物;其中不应包含任何能让读者推断出现任或前任雇主环境的信息。
**必须剥离或涂黑:**
- 雇主名称、产品名称、内部团队名称、真实的同事姓名
- Jira 项目前缀、工单 ID、内部工单 URL
- AWS 账户 ID、实例 ID、VPC/子网 ID、包含账号的 ARN
- 内部主机名、IP、DNS 名称
- 内部 Git/GitHub 组织和仓库名称
- Slack 频道名称、邮件分发列表、内部 Confluence/wiki 路径
- 客户名称、合同标识符、监管机构/评估机构身份
- 命名内部服务的真实配置(如果工具/路径名称会泄露结构,请进行清理)
- 任何可能出现在生产环境违规披露中的信息:账户 ID、角色 ARN、OIDC 主体、密钥 ID
**必须清理但可以保留:**
- 通用的 AWS 服务名称、错误字符串、MITRE 技术 ID、已存在于威胁情报源中的公开 IOC
- 开源项目名称和公开的 CVE ID
- 公开的矿池、恶意软件家族名称、已在供应商报告中命名的公开 C2 基础设施
**合并草稿前的流程:**
1. `grep -iE '|||||i-[0-9a-f]|vpc-[0-9a-f]|arn:aws:[^:]+:[^:]*:[0-9]{12}'` 匹配新文章;将占位符替换为你真实的雇主、产品、团队和 Jira 项目前缀,并检查每一个匹配项
2. 假设一位在被涂黑的雇主处工作的读者,重新阅读文章;他们能认出这个系统吗?
3. 对于事件相关的文章,在合并前必须获得相关工单所有者的明确发布批准;并将该批准保存在持久可靠的地方
4. 如果文章依赖于真实的数字(主机数量、警报量、金额),请确认其已经公开披露,或将其四舍五入到一个数量级
如有疑问,请涂黑。以后重新发布匿名化版本的成本很低;但撤回一次泄露却并非如此。
## 封面图生成
每篇文章的 1200x630 社交媒体卡片是根据标题 + 分类渲染的:
```
.venv/bin/python scripts/generate_covers.py # generate missing
.venv/bin/python scripts/generate_covers.py --force # regenerate all
.venv/bin/python scripts/generate_covers.py --only # single post
.venv/bin/python scripts/generate_covers.py --write-frontmatter # insert Cover: line
```
Inter v4.1 字体内联在 `scripts/cover_fonts/` 目录下。需要 PATH 中存在 `pngquant` 以进行压缩;否则将发出警告。
## 部署
CI 会在每个指向 `main` 的 PR 上进行构建(lychee 链接检查、Pelican 构建),并在推送到 `main` 时部署到 `gh-pages`。无需手动部署。
## 许可证
内容 (c) RivasSec。代码片段和配置采用宽松许可;详见 `LICENSE`。内联字体基于 SIL Open Font License 发布 - 详见 `scripts/fonts/LICENSE.txt` 和 `content/static/fonts/LICENSE-*.txt`。
标签:DevSecOps, Pelican, 上游代理, 博客, 安全意识, 逆向工具, 静态网站