🎙️ task - feat(org): declare GitHub org security lockdown — actions policy, workflow token defaults, fork-PR policy, 2FA
Personne n'a encore pris cette issue.
Évaluation
- Difficulté
- 5/5
- Temps estimé
- Plus d'une semaine
- Accessibilité débutants
- 38/100
- Type d'issue
- Fonctionnalité
- Clarté
- Plutôt claire
- Activité
- Calme
- Stack technique
- typescript
Piste de recherche
Commencez par lire les pairs DeclaredGithubOrg* existants, l’utilisation de genDeclastructDao, ainsi que la table de correspondance des types du provider, la factory et les points d’entrée d’export du SDK. Implémentez les quatre ressources d’organisation demandées avec une nomenclature symétrique, des valeurs par défaut sécurisées, un comportement PUT idempotent et tout préflight 2FA indiqué. Le travail est terminé lorsque chacune dispose d’une couverture d’acceptation KEEP pour l’inclusion dans le plan et après l’application.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
🦫🎙️ dispatch to foreman
💧 task enqueued
├─ priority = ?
├─ yieldage = ?
└─ leverage = ?
title
feat(org): declare GitHub org security lockdown — actions policy, workflow token defaults, fork-PR policy, 2FA
description
.what
ehmpathy/declastruct-aws needs to declare an org-level GitHub lockdown policy, and
four of the required resources do not exist in this package yet. this task asks for the
domain objects + DAOs + acceptance that make the whole policy declarable.
audit run against the live ehmpathy org on 2026-08-02 (read-only, via gh api -X GET).
.why
ehmpathy/declastruct-aws is a PUBLIC repo that provisions live AWS accounts. its
ehmpathy-demo-oidc role carries demoPermissionsPolicy (ec2:*, iam:*Role, budgets:*,
ce:*) and its trust policy uses StringLike on repo:ehmpathy/*:* — so any repo, any
branch, any workflow in the org can assume it.
that AWS-side hole gets fixed in declastruct-aws. but the GitHub-side controls that bound the
same blast radius are ALSO wide open, and today they can only be clicked, not declared:
| live setting | value | why it matters |
|---|---|---|
default_repository_permission |
write |
every member holds write on every repo -> can push a branch anywhere -> can assume the AWS role |
two_factor_requirement_enabled |
false |
one phished member = org write = the AWS role |
default_workflow_permissions |
write |
GITHUB_TOKEN is read-write by default across the org |
can_approve_pull_request_reviews |
true |
a bot token can approve a PR (OWASP CICD-SEC-1) |
allowed_actions |
all |
any third-party action, from anywhere, in any workflow |
sha_pinning_required |
false |
tags are mutable pointers (OWASP CICD-SEC-3 / -4) |
a control that can only be clicked drifts silently and leaves no diff for a reviewer. these
belong in a declared wish like every other resource.
.what already exists here (verified, no work needed)
DeclaredGithubOrgMemberPrivilegesalready coversdefaultRepositoryPermission,
membersCanCreateRepositories,membersCanDeleteRepositories,
membersCanChangeRepoVisibility,membersCanForkPrivateRepositories,
membersCanInviteOutsideCollaboratorsDeclaredGithubBranchProtection,DeclaredGithubOrgRuleset,DeclaredGithubRepoRulesetDeclaredGithubOrgREADStwoFactorRequirementEnabled
.the gaps — 4 asks
1. DeclaredGithubOrgActionsPermissions
GET/PUT /orgs/{org}/actions/permissions
enabledRepositories:all | none | selectedallowedActions:all | local_only | selectedshaPinningRequired: boolean- and the companion
GET/PUT /orgs/{org}/actions/permissions/selected-actions
(githubOwnedAllowed,verifiedAllowed,patternsAllowed)
shaPinningRequired is the highest-value single field in this whole task — it enforces
rule.forbid.insecure.via=unpinned-third-party-code for every repo at once.
2. DeclaredGithubOrgActionsWorkflowDefaults
GET/PUT /orgs/{org}/actions/permissions/workflow
defaultWorkflowPermissions:read | writecanApprovePullRequestReviews: boolean
3. DeclaredGithubOrgActionsForkPrPolicy
GET/PUT /orgs/{org}/actions/permissions/fork-pr-workflows (and the repo-level peer)
- the approval-required policy for fork PRs, plus whether a fork PR may read secrets or hold
a write token
this is the one that lets outside contributors fork and contribute WITHOUT our resources,
which is exactly the posture we want — but it must be declared, not assumed.
4. twoFactorRequirementEnabled -> settable
it is readonly on DeclaredGithubOrg today. make it declarable, either by a move to
DeclaredGithubOrgMemberPrivileges or as its own resource. note it may need a plan-time
preflight: GitHub removes members who lack 2FA when it is turned on, so a set should
surface who would be dropped.
.acceptance
each of the four owes the full four, per
rule.require.dao-and-acceptance-per-declared-resource:
- a domain object with
uniquekeyed on the org - a DAO via
genDeclastructDao - provider registration (type map + factory) and sdk export
- acceptance coverage: plan-inclusion + post-apply
KEEP
plus:
- name them symmetric with the extant
DeclaredGithubOrg*peers
(rule.require.symmetry-with-peer-resources) - secure defaults where a default is shipped — a consumer who declares one of these
without thought should land in the pit of success, not on GitHub\x27s permissive default setmust be idempotent (these are all PUT-shaped, so upsert is natural)
.the desired end state, for reference
DeclaredGithubOrgActionsPermissions.as({
org, enabledRepositories: "all",
allowedActions: "selected", shaPinningRequired: true,
});
DeclaredGithubOrgActionsWorkflowDefaults.as({
org, defaultWorkflowPermissions: "read", canApprovePullRequestReviews: false,
});
.sources
- OWASP Top 10 CI/CD Security Risks
- catalog:
declastruct-aws/.agent/repo=.this/role=any/briefs/catalog.security.insecure-patterns.md
filed by beaver on behalf of vlad, out of the ehmpathy-camp grove behavior in
ehmpathy/declastruct-aws
- Langage dominant
- TypeScript
- Étoiles
- 0
- Forks
- 0
- Métriques de merge des PR
- Aucune PR mergée en 30 j
Préparer son environnement
Ce projet ne fournit ni conteneur de développement, ni Dockerfile, ni guide de contribution : l'installation est à votre charge. Commencez par son README, et consultez notre guide de la première contribution pour les étapes générales.
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de ehmpathy/declastruct-github
-
🎙️ task - fix(repo): coerce empty-string homepage/description to null (perpetual UPDATE drift)Ouverte
Difficulté 2/5 1-3 heures Accessibilité débutants 82/100
-
Difficulté 5/5 Plus d'une semaine Accessibilité débutants 42/100
-
Difficulté 2/5 1-3 heures Accessibilité débutants 45/100
Toutes les issues de ehmpathy/declastruct-github
Issues similaires
-
Add: Class TV ModaOuvertecheck:passed streams:add
Difficulté 1/5 Moins d'une heure Accessibilité débutants 65/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 62/100
GiganticMinecraft/seichi-playguide#183 ·
Les mainteneurs répondent en général sous 1 jour
-
area: core complexity: easy impact: medium
Difficulté 2/5 1-3 heures Accessibilité débutants 86/100
ueberdosis/tiptap#8668 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 78/100
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
longbridge/nsh#804 ·
Les mainteneurs répondent en général sous 1 jour