Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions .editorconfig
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
root = true

[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

[*.md]
trim_trailing_whitespace = false

[Makefile]
indent_style = tab

[*.{json,md,yaml,yml}]
indent_style = space
indent_size = 2
12 changes: 12 additions & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
* text=auto eol=lf

*.bat text eol=crlf
*.cmd text eol=crlf
*.ps1 text eol=crlf

*.gif binary
*.ico binary
*.jpg binary
*.jpeg binary
*.png binary
*.pdf binary
34 changes: 34 additions & 0 deletions .github/dependabot.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
version: 2
updates:
- package-ecosystem: github-actions
directory: /
schedule:
interval: weekly
cooldown:
default-days: 7
groups:
github-actions:
patterns:
- "*"

- package-ecosystem: pre-commit
directory: /
schedule:
interval: weekly
cooldown:
default-days: 7
groups:
pre-commit-hooks:
patterns:
- "*"

- package-ecosystem: pip
directory: /.github/requirements
schedule:
interval: weekly
cooldown:
default-days: 7
groups:
ci-python-tools:
patterns:
- "*"
20 changes: 20 additions & 0 deletions .github/requirements/pre-commit.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
cfgv==3.5.0 \
--hash=sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0
distlib==0.4.3 \
--hash=sha256:4b0ce306c966eb73bc3a7b6abad017c556dadd92c44701562cd528ac7fde4d5b
filelock==3.32.5 \
--hash=sha256:142cd9fa77a872c5e78c62329a0d15278fadc686eb89e760017968961a4fd6b2
identify==2.6.19 \
--hash=sha256:20e6a87f786f768c092a721ad107fc9df0eb89347be9396cadf3f4abbd1fb78a
nodeenv==1.10.0 \
--hash=sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827
platformdirs==4.11.7 \
--hash=sha256:8a02cb259042c79d1cd0450facc2fe6dc9d303ae7901afbe33bf8ea0b188cef6
pre-commit==4.6.2 \
--hash=sha256:e2dde9a75d3bce11bd3831c26d134df00a2803c1d818be6a0383c3dcda25dc4e
python-discovery==1.6.0 \
--hash=sha256:d4e244cf17b8b29819ed78003d55fbacf86eda23425b075454fff9271b79377a
PyYAML==6.0.3 \
--hash=sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6
virtualenv==21.7.8 \
--hash=sha256:3040eb3cbf5d32b10ffd57d167e6a162237ad82ba7d8cf1400a1efed593d85ac
68 changes: 68 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
name: CI

on:
pull_request:
push:
branches:
- main
schedule:
- cron: "23 7 * * 1"
workflow_dispatch:

permissions:
contents: read

concurrency:
group: ci-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
lint:
name: lint
runs-on: ubuntu-24.04
timeout-minutes: 15
steps:
- name: Check out repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false

- name: Set up Python
uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0
with:
python-version: "3.13"

- name: Install pre-commit
run: >-
python -m pip install --require-hashes --only-binary=:all:
--disable-pip-version-check
--requirement .github/requirements/pre-commit.txt

- name: Run repository checks
run: pre-commit run --all-files --show-diff-on-failure

- name: Audit GitHub Actions security
uses: zizmorcore/zizmor-action@70fb788f84895a7701f5643d103d587e460b5c99 # v0.6.3
with:
advanced-security: false
annotations: true
min-severity: medium

configuration-security:
name: configuration security
runs-on: ubuntu-24.04
timeout-minutes: 15
steps:
- name: Check out repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false

- name: Scan repository configuration
uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0
with:
scan-type: config
scan-ref: .
format: table
exit-code: "1"
severity: CRITICAL,HIGH
47 changes: 47 additions & 0 deletions .github/workflows/codeql.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
name: CodeQL

on:
pull_request:
paths:
- ".github/workflows/**"
push:
branches:
- main
paths:
- ".github/workflows/**"
schedule:
- cron: "11 6 * * 3"
workflow_dispatch:

permissions: read-all

concurrency:
group: codeql-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
analyze-actions:
name: Analyze GitHub Actions
runs-on: ubuntu-24.04
timeout-minutes: 15
permissions:
actions: read
contents: read
security-events: write
steps:
- name: Check out repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false

- name: Initialize CodeQL
uses: github/codeql-action/init@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4.37.9
with:
languages: actions
build-mode: none
queries: security-extended

- name: Analyze GitHub Actions
uses: github/codeql-action/analyze@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4.37.9
with:
category: /language:actions
51 changes: 51 additions & 0 deletions .github/workflows/scorecard.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
name: OpenSSF Scorecard

on:
branch_protection_rule:
push:
branches:
- main
schedule:
- cron: "37 8 * * 6"
workflow_dispatch:

permissions: read-all

concurrency:
group: scorecard-${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true

jobs:
analysis:
name: Scorecard analysis
runs-on: ubuntu-24.04
timeout-minutes: 15
permissions:
contents: read
security-events: write
id-token: write
steps:
- name: Check out repository
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
persist-credentials: false

- name: Run Scorecard analysis
uses: ossf/scorecard-action@2d1146689b8cda280b9bc96326124645441f03bc # v2.4.4
with:
results_file: results.sarif
results_format: sarif
publish_results: true
file_mode: git

- name: Upload SARIF artifact
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: openssf-scorecard-sarif
path: results.sarif
retention-days: 5

- name: Upload results to code scanning
uses: github/codeql-action/upload-sarif@cdf488f595d80d6e07e03d4674febd5ab45fa938 # v4.37.9
with:
sarif_file: results.sarif
34 changes: 34 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Local environments and tool caches
.env
.venv/
venv/
__pycache__/
.pytest_cache/
.mypy_cache/
.pre-commit-cache/
.ruff_cache/

# Editors and operating systems
.idea/
.vscode/
.DS_Store
Thumbs.db

# Local security and qualification evidence
*.sarif
*.spdx.json
grype*.json
scap-results*/
security-results/

# Certificates and private keys generated by rehearsals
*.csr
*.key
*.p12
*.pfx
*.pem
*.srl

# Local container build output
build/
dist/
55 changes: 55 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
minimum_pre_commit_version: "4.0.0"
default_install_hook_types:
- pre-commit
- commit-msg

repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: 3e8a8703264a2f4a69428a0aa4dcb512790b2c8c # v6.0.0
hooks:
- id: check-added-large-files
args:
- --maxkb=1024
- id: check-case-conflict
- id: check-json
- id: check-merge-conflict
- id: check-symlinks
- id: check-yaml
- id: destroyed-symlinks
- id: detect-private-key
- id: end-of-file-fixer
- id: fix-byte-order-marker
- id: mixed-line-ending
args:
- --fix=lf
- id: trailing-whitespace
args:
- --markdown-linebreak-ext=md

- repo: https://github.com/shellcheck-py/shellcheck-py
rev: 745eface02aef23e168a8afb6b5737818efbea95 # v0.11.0.1
hooks:
- id: shellcheck

- repo: https://github.com/shenxianpeng/hadolint-pre-commit
rev: 6b998985ab8b766ed8104e4fcfeb0a4765f4c364 # v2.15.1.2
hooks:
- id: hadolint
files: (^|/)(Containerfile|Dockerfile[^/]*)$
args:
- --failure-threshold
- warning

- repo: https://github.com/rhysd/actionlint
rev: 914e7df21a07ef503a81201c76d2b11c789d3fca # v1.7.12
hooks:
- id: actionlint

- repo: local
hooks:
- id: forbid-coauthor-trailers
name: forbid co-author attribution trailers
language: pygrep
entry: "(?im)^Co-Authored-By:"
stages:
- commit-msg
8 changes: 8 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,11 @@ but container releases use the upstream-derived format documented in
revisions.
- Added the project overview, intended use cases, security design, rootless
runtime model, and release status.
- Added pinned local pre-commit checks for repository hygiene, shell code,
container build files, GitHub Actions, private keys, and attribution trailers.
- Added least-privilege CI, CodeQL Actions, Trivy configuration, Zizmor, and
OpenSSF Scorecard workflows with immutable third-party Action references.
- Added grouped Dependabot updates for Actions, pre-commit hooks, and the
hash-locked CI Python environment.
- Documented local checks, GitHub automation, planned image assurance, and the
evidence boundary of Podman Desktop or a remote Podman machine.
18 changes: 15 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,8 @@ root filesystem, explicit `tmpfs` mounts, dropped capabilities, and
- [Changelog](CHANGELOG.md) records notable completed changes.
- [Agent guidance](CLAUDE.md) defines repository implementation and security
conventions.
- [Continuous integration](docs/CI.md) documents current automation, local
pre-commit checks, and the planned image assurance pipeline.

Operational, TLS, configuration, architecture, threat-model, control-matrix,
SCAP, vulnerability-management, support, and disconnected-network guides will
Expand Down Expand Up @@ -110,9 +112,19 @@ tags.
## Development status

The current work is governed by the dependency-ordered roadmap. Build and test
commands will be added here only when they exist and have been exercised. Until
the first signed release is published, this repository should be treated as
development material rather than a supported production image.
commands will be added here only when they exist and have been exercised.
Repository checks can be run now with:

```console
python -m pip install --require-hashes --only-binary=:all: \
--requirement .github/requirements/pre-commit.txt
pre-commit run --all-files --show-diff-on-failure
```

See the [continuous integration guide](docs/CI.md) for hook installation and
Podman evidence boundaries. Until the first signed release is published, this
repository should be treated as development material rather than a supported
production image.

Security concerns should not be disclosed in a public issue. A private
reporting process and supported-version policy will be published in
Expand Down
Loading