pam-approver

Los proyectos que siguen las mejores prácticas a continuación pueden autocertificarse voluntariamente y demostrar que han obtenido una insignia de mejores prácticas de Open Source Security Foundation (OpenSSF).

No existe un conjunto de prácticas que pueda garantizar que el software nunca tendrá defectos o vulnerabilidades; incluso los métodos formales pueden fallar si las especificaciones o suposiciones son incorrectas. Tampoco existe ningún conjunto de prácticas que pueda garantizar que un proyecto mantenga una comunidad de desarrollo saludable y que funcione bien. Sin embargo, seguir las mejores prácticas puede ayudar a mejorar los resultados de los proyectos. Por ejemplo, algunas prácticas permiten la revisión por parte de múltiples personas antes del lanzamiento, lo que puede ayudar a encontrar vulnerabilidades técnicas que de otro modo serían difíciles de encontrar y ayudar a generar confianza y un deseo repetido de interacción entre desarrolladores de diferentes compañías. Para obtener una insignia, se deben cumplir todos los criterios DEBE y NO DEBE, se deben cumplir, así como todos los criterios DEBERÍAN deben cumplirse o ser justificados, y todos los criterios SUGERIDOS se pueden cumplir o incumplir (queremos que se consideren al menos). Si desea añadir texto como justificación mediante un comentario genérico, en lugar de ser un razonamiento de que la situación es aceptable, comience el bloque de texto con '//' seguido de un espacio. Los comentarios son bienvenidos a través del sitio de GitHub mediante "issues" o "pull requests". También hay una lista de correo electrónico para el tema principal.

Con mucho gusto proporcionaríamos la información en varios idiomas, sin embargo, si hay algún conflicto o inconsistencia entre las traducciones, la versión en inglés es la versión autorizada.
Si este es su proyecto, por favor muestre el estado de su insignia base en la página de su proyecto. El estado de la insignia base se ve así: El nivel de insignia base para el proyecto 13345 es baseline-1 Aquí se explica cómo insertar la insignia base:
Puede mostrar el estado de su insignia base insertando esto en su archivo markdown:
[![OpenSSF Baseline](https://www.bestpractices.dev/projects/13345/baseline)](https://www.bestpractices.dev/projects/13345)
o insertando esto en su HTML:
<a href="https://www.bestpractices.dev/projects/13345"><img src="https://www.bestpractices.dev/projects/13345/baseline"></a>


Estos son los criterios de Nivel Base 2. Estos son los criterios de la versión v2026.02.19.

Baseline Series: Nivel Base 1 Nivel Base 2 Nivel Base 3

        

 Fundamentos

  • General

    Tenga en cuenta que otros proyectos pueden usar el mismo nombre.

    Mobile-friendly approver UI for Google Cloud Privileged Access Manager (PAM).

    Por favor use formato de expresión de licencia SPDX; los ejemplos incluyen "Apache-2.0", "BSD-2-Clause", "BSD-3-Clause", "GPL-2.0+", "LGPL-3.0+", "MIT" y "(BSD-2-Clause OR Ruby)". No incluya comillas simples o comillas dobles.
    Si hay más de un lenguaje, enumérelos como valores separados por comas (los espacios son opcionales) y ordénelos de más a menos usado. Si hay una lista larga, por favor enumere al menos los tres primeros más comunes. Si no hay lenguaje (por ejemplo, este es un proyecto solo de documentación o solo de pruebas), use el carácter único "-". Por favor use una capitalización convencional para cada lenguaje, por ejemplo, "JavaScript".
    La Common Platform Enumeration (CPE) es un esquema de nomenclatura estructurado para sistemas de tecnología de la información, software y paquetes. Se utiliza en varios sistemas y bases de datos al reportar vulnerabilidades.

    Mobile-friendly, backend-less approver UI for Google Cloud Privileged Access Manager (PAM); a static SPA that calls the PAM API directly from the browser.

 Controles 18/19

  • Controles


    Cuando una tarea de CI/CD se ejecuta sin permisos especificados, el sistema de CI/CD DEBE establecer por defecto los permisos de la tarea a los permisos más bajos otorgados en el pipeline. [OSPS-AC-04.01]
    Configure las configuraciones del proyecto para asignar los permisos más bajos disponibles a nuevos pipelines por defecto, otorgando permisos adicionales solo cuando sea necesario para tareas específicas.

    The repository's default GitHub Actions token permission is set to read-only (default_workflow_permissions: read, with can_approve_pull_request_reviews: false), so any task executed without explicit permissions defaults to the lowest level rather than write. In addition, every workflow declares least privilege explicitly: cd.yml, release-drafter.yml, and scorecard.yml set top-level permissions: {} (deny-all) and grant only the specific scopes each job needs, and tailwind-update.yml defaults to contents: read. See https://github.com/schack/pam-approver/blob/main/.github/workflows/cd.yml



    Cuando se crea un lanzamiento oficial, ese lanzamiento DEBE ser asignado un identificador de versión único. [OSPS-BR-02.01]
    Asigne un identificador de versión único a cada lanzamiento producido por el proyecto, siguiendo una convención de nomenclatura o esquema de numeración consistente. Los ejemplos incluyen SemVer, CalVer o ID de commit de git.


    Cuando se crea un lanzamiento oficial, ese lanzamiento DEBE contener un registro descriptivo de modificaciones funcionales y de seguridad. [OSPS-BR-04.01]
    Asegúrese de que todos los lanzamientos incluyan un registro de cambios descriptivo. Se recomienda asegurar que el registro de cambios sea legible por humanos e incluya detalles más allá de los mensajes de commit, como descripciones del impacto de seguridad o relevancia para diferentes casos de uso. Para asegurar la legibilidad automática, coloque el contenido bajo un encabezado markdown como "## Changelog".

    Every official release is assigned a unique CalVer identifier of the form YEAR.MONTH.SEQUENCE (e.g. 2026.6.0). The version is computed automatically from existing tags so each release gets a distinct, non-reused number, and the scheme is documented in CONTRIBUTING.md "Releases". Released git tags and container image tags carry that identifier. See https://github.com/schack/pam-approver/releases



    Cuando un pipeline de construcción y lanzamiento ingiere dependencias, DEBE usar herramientas estandarizadas donde estén disponibles. [OSPS-BR-05.01]
    Use herramientas comunes para su ecosistema, como gestores de paquetes o herramientas de gestión de dependencias para ingerir dependencias en tiempo de construcción. Esto puede incluir usar un archivo de dependencias, archivo de bloqueo o manifiesto para especificar las dependencias requeridas, que luego son incorporadas por el sistema de construcción.

    The pipeline ingests dependencies with standardized tooling where available: ▎ - Container base images (nginx, Debian) are pulled via standard Docker/BuildKit (FROM + multi-arch buildx), pinned by tag and digest. ▎ - GitHub Actions are consumed via the native uses: mechanism, pinned by commit SHA, and tracked for updates by Dependabot (.github/dependabot.yml). ▎ - There are no language-package runtime dependencies to ingest (the app ships zero npm dependencies by design), so no package-manager install step is needed. ▎ - The single standalone tool, the Tailwind CSS CLI, has no suitable package-manager distribution for this use, so it is fetched over HTTPS from its official GitHub release and verified against the publisher's sha256sums.txt (and re-verified in the Dockerfile with sha256sum -c) before use.



    Cuando se crea un lanzamiento oficial, ese lanzamiento DEBE estar firmado o registrado en un manifiesto firmado que incluya los hashes criptográficos de cada activo. [OSPS-BR-06.01]
    Firme todos los activos de software lanzados en tiempo de construcción con una firma criptográfica o atestaciones, como firma GPG o PGP, firmas Sigstore, proveniencia SLSA, o VSAs SLSA. Incluya los hashes criptográficos de cada activo en un manifiesto firmado o archivo de metadatos.

    Every official release's container image is signed with Sigstore cosign (keyless, via GitHub OIDC). The signature is applied to the multi-arch image index digest, and that OCI manifest accounts for each asset (per-architecture manifests and layers) by its SHA-256 digest, so the signed object cryptographically covers every component. Releases also ship SLSA provenance and an SBOM attestation. Verification steps are documented in SECURITY.md (https://github.com/schack/pam-approver/blob/main/SECURITY.md):



    Cuando el proyecto ha realizado un lanzamiento, la documentación del proyecto DEBE incluir una descripción de cómo el proyecto selecciona, obtiene y rastrea sus dependencias. [OSPS-DO-06.01]
    Se recomienda publicar esta información junto con la documentación técnica y de diseño del proyecto en un recurso públicamente visible como el repositorio de código fuente, sitio web del proyecto u otro canal.

    The primary branch (main) is protected by a GitHub repository ruleset that requires a pull request and requires the test and build status checks (from .github/workflows/cd.yml) to pass before merging, with strict up-to-date enforcement and no bypass actors. Changes therefore cannot land on main unless the automated checks pass.



    La documentación del proyecto DEBE incluir instrucciones sobre cómo compilar el software, incluyendo las bibliotecas, marcos, SDK y dependencias necesarias. [OSPS-DO-07.01]
    Se recomienda publicar esta información junto con la documentación para colaboradores del proyecto, por ejemplo en CONTRIBUTING.md u otra documentación de tareas para desarrolladores. También puede documentarse utilizando objetivos de Makefile u otros scripts de automatización.

    The software builds with a single command using Docker, which is the only required tool. docker build . (or docker compose up --build, README "Run locally": https://github.com/schack/pam-approver#run-locally) builds the image. All libraries, frameworks, and SDKs are fetched and version-pinned inside the multi-stage Dockerfile (https://github.com/schack/pam-approver/blob/main/Dockerfile) — the Tailwind CSS standalone CLI (downloaded and SHA-256 verified) and the nginx base image — so nothing needs manual installation. The build runs in CI on every PR (.github/workflows/cd.yml) and the Dockerfile is hadolint-linted.



    Mientras esté activo, la documentación del proyecto DEBE incluir una lista de miembros del proyecto con acceso a recursos sensibles. [OSPS-GV-01.01]
    Documente los participantes del proyecto y sus roles a través de artefactos tales como members.md, governance.md, maintainers.md, o archivo similar dentro del repositorio de código fuente del proyecto. Esto puede ser tan simple como incluir nombres o identificadores de cuenta en una lista de mantenedores, o más complejo dependiendo de la gobernanza del proyecto.

    pam-approver is a single-maintainer project. SECURITY.md lists the sole member with access to sensitive resources (Henrik Schack, @schack), who holds GitHub repository admin and GHCR package publish access, and documents that there are no long-lived secrets or signing keys to manage (keyless OIDC signing via cosign, a public OAuth client ID, and no stored client secret or deployment credential). See https://github.com/schack/pam-approver/blob/main/SECURITY.md#maintainers-and-access-to-sensitive-resources



    Mientras esté activo, la documentación del proyecto DEBE incluir descripciones de los roles y responsabilidades para los miembros del proyecto. [OSPS-GV-01.02]
    Documente los participantes del proyecto y sus roles a través de artefactos tales como members.md, governance.md, maintainers.md, o archivo similar dentro del repositorio de código fuente del proyecto.

    SECURITY.md documents the roles and responsibilities. As the sole maintainer, Henrik Schack (@schack) is responsible for reviewing and merging pull requests, cutting and signing releases, keeping dependencies current, and triaging and resolving bug and security reports, with no other members or delegated roles at this time. See https://github.com/schack/pam-approver/blob/main/SECURITY.md#maintainers-and-access-to-sensitive-resources



    Mientras esté activo, la documentación del proyecto DEBE incluir una guía para contribuidores de código que incluya requisitos para contribuciones aceptables. [OSPS-GV-03.02]
    Extienda el CONTRIBUTING.md o los contenidos de CONTRIBUTING/ en la documentación del proyecto para delinear los requisitos para contribuciones aceptables, incluyendo estándares de codificación, requisitos de pruebas y pautas de envío para contribuidores de código. Se recomienda que esta guía sea la fuente de verdad tanto para contribuidores como para aprobadores.

    Mientras esté activo, el sistema de control de versiones DEBE requerir que todos los contribuidores de código afirmen que están legalmente autorizados para hacer las contribuciones asociadas en cada commit. [OSPS-LE-01.01]
    Incluya un DCO en el repositorio del proyecto, requiriendo que los contribuidores de código afirmen que están legalmente autorizados para confirmar las contribuciones asociadas en cada commit. Use una verificación de estado para asegurar que se haga la afirmación. Un CLA también satisface este requisito. Algunos sistemas de control de versiones, como GitHub, pueden incluir esto en los términos de servicio de la plataforma.

    Not currently enforced. pam-approver is a single-maintainer project: every human commit is authored by the maintainer, who is the copyright holder, so there is no third-party contribution whose legal provenance is in question. The remaining commits on the branch are automated (Dependabot, the Tailwind-update workflow, and release-drafter), which cannot meaningfully assert a DCO. No DCO or CLA sign-off requirement is in place today; one would be added before accepting external code contributions.



    Cuando se realiza un commit a la rama principal, cualquier verificación de estado automatizada para commits DEBE pasar o ser omitida manualmente. [OSPS-QA-03.01]
    Configure el sistema de control de versiones del proyecto para requerir que todas las verificaciones de estado automatizadas pasen o requieran reconocimiento manual antes de que un commit pueda fusionarse en la rama principal. Se recomienda que cualquier verificación de estado opcional NO esté configurada como un requisito de pasar o fallar que los aprobadores puedan estar tentados a omitir.

    The primary branch (main) is protected by a GitHub repository ruleset that requires a pull request plus passing test and build status checks (from .github/workflows/cd.yml) before any change can merge, with strict up-to-date enforcement and no bypass actors. Status checks must pass for a change to land on main.



    Antes de que se acepte un commit, los pipelines de CI/CD del proyecto DEBEN ejecutar al menos un conjunto de pruebas automatizado para asegurar que los cambios cumplan las expectativas. [OSPS-QA-06.01]
    Las pruebas automatizadas deben ejecutarse antes de cada fusión en la rama principal. El conjunto de pruebas debe ejecutarse en un pipeline de CI/CD y los resultados deben ser visibles para todos los contribuidores. El conjunto de pruebas debe ejecutarse en un entorno consistente y debe ejecutarse de manera que permita a los contribuidores ejecutar las pruebas localmente. Ejemplos de conjuntos de pruebas incluyen pruebas unitarias, pruebas de integración y pruebas de extremo a extremo.

    Every pull request runs the test job in .github/workflows/cd.yml before it can be merged: it runs the shell test suite (tests/entrypoint_test.sh), the JS unit tests (node --test over tests/app.test.js), and the container header tests (tests/nginx_headers_test.sh), plus hadolint and shellcheck. The build job depends on test, and both are required status checks in the main branch ruleset, so no change is accepted to the primary branch unless the automated test suite passes.



    Cuando el proyecto ha realizado un lanzamiento, la documentación del proyecto DEBE incluir documentación de diseño que demuestre todas las acciones y actores dentro del sistema. [OSPS-SA-01.01]
    Incluya diseños en la documentación del proyecto que expliquen las acciones y los actores. Los actores incluyen cualquier subsistema o entidad que pueda influir en otro segmento del sistema. Asegúrese de que esto se actualice para nuevas características o cambios importantes.

    The README "How it fits together" section (https://github.com/schack/pam-approver#how-it-fits-together) documents the design with an architecture diagram and describes all actors and data flows: the approver (browser), IAP (gateway in front of the static nginx pod), Google Identity Services (browser-based OAuth), the Google PAM REST API (called directly from the browser with a Bearer token), and Google IAM (which enforces per-user authorization). The actions are documented too: sign in, list entitlements/pending grants, and approve or deny with a reason ("Approving grants" section). SECURITY.md "Security model" further documents the actors, the token flow, and the trust boundaries. Given there is no backend and no server-side state, these cover the full set of actors and actions in the system.



    Cuando el proyecto haya realizado un lanzamiento, la documentación del proyecto DEBE incluir descripciones de todas las interfaces de software externas de los activos de software liberados. [OSPS-SA-02.01]
    Documente todas las interfaces de software (APIs) de los activos de software liberados, explicando cómo los usuarios pueden interactuar con el software y qué datos se esperan o se producen. Asegúrese de que esto se actualice para nuevas funcionalidades o cambios incompatibles.

    Cuando el proyecto haya realizado un lanzamiento, el proyecto DEBE realizar una evaluación de seguridad para comprender los problemas de seguridad potenciales más probables e impactantes que podrían ocurrir dentro del software. [OSPS-SA-03.01]
    Realizar una evaluación de seguridad informa tanto a los miembros del proyecto como a los consumidores posteriores que el proyecto comprende qué problemas podrían surgir dentro del software. Comprender qué amenazas podrían materializarse ayuda al proyecto a gestionar y abordar el riesgo. Esta información es útil para los consumidores posteriores para demostrar la competencia y prácticas de seguridad del proyecto. Asegúrese de que esto se actualice para nuevas funcionalidades o cambios incompatibles.

    A security assessment of the system is documented across SECURITY.md "Security model" (https://github.com/schack/pam-approver/blob/main/SECURITY.md) and the README "Security posture" section (https://github.com/schack/pam-approver#security-posture). Because the app is a static single-page app with no backend, the most likely and impactful risks are identified and mitigated: client-side XSS (strict CSP with no unsafe-inline, output via textContent), credential exposure (no client secret or refresh tokens, public OAuth client ID, access token kept only in the browser and never written to the image), clickjacking (frame-ancestors none, X-Frame-Options DENY), authorization bypass (enforced by Google IAM on the PAM API, not the app, plus OAuth hd domain checks), injection into the rendered config.js (entrypoint.sh validates env values), and supply-chain risk (pinned/digest-locked dependencies, SBOM, cosign-signed images, Dependabot, Trivy/Scorecard scanning).



    Mientras esté activo, la documentación del proyecto DEBE incluir una política para la divulgación coordinada de vulnerabilidades (CVD), con un plazo de tiempo claro para la respuesta. [OSPS-VM-01.01]
    Cree un archivo SECURITY.md en la raíz del directorio, describiendo la política del proyecto para la divulgación coordinada de vulnerabilidades. Incluya un método para reportar vulnerabilidades. Establezca expectativas sobre cómo el proyecto responderá y abordará los problemas reportados.

    SECURITY.md documents a coordinated vulnerability disclosure policy (https://github.com/schack/pam-approver/blob/main/SECURITY.md#reporting-a-vulnerability): vulnerabilities are reported privately via GitHub private vulnerability reporting or email (not public issues); the maintainer acknowledges within a few days; and once a fix is available a new image is published and the advisory is disclosed. This is coordinated (private until a fix ships) with a stated response timeframe.



    Mientras esté activo, la documentación del proyecto DEBE proporcionar un medio para el reporte privado de vulnerabilidades directamente a los contactos de seguridad dentro del proyecto. [OSPS-VM-03.01]
    Proporcione un medio para que los investigadores de seguridad reporten vulnerabilidades de forma privada al proyecto. Esto puede ser una dirección de correo electrónico dedicada, un formulario web, herramientas especializadas del VCS, direcciones de correo electrónico para contactos de seguridad, u otros métodos.

    SECURITY.md provides two private reporting channels directly to the security contact (https://github.com/schack/pam-approver/blob/main/SECURITY.md#reporting-a-vulnerability): GitHub private vulnerability reporting via the repository Security tab (enabled on the repo, so "Report a vulnerability" → https://github.com/schack/pam-approver/security/advisories/new works), and email to the maintainer at henrik@schack.dk. Reporters are explicitly asked not to open public issues.



    Mientras esté activo, la documentación del proyecto DEBE publicar públicamente datos sobre las vulnerabilidades descubiertas. [OSPS-VM-04.01]
    Proporcione información sobre vulnerabilidades conocidas en un canal público predecible, como una entrada CVE, publicación de blog u otro medio. En la medida de lo posible, esta información debe incluir la(s) versión(es) afectada(s), cómo un consumidor puede determinar si es vulnerable, e instrucciones para la mitigación o remediación.

    SECURITY.md states that once a fix is available, a new image is published and the advisory is disclosed (https://github.com/schack/pam-approver/blob/main/SECURITY.md#reporting-a-vulnerability). Disclosure uses GitHub Security Advisories on the repository, which are public, receive a GHSA identifier, and are syndicated to the GitHub Advisory Database. No vulnerabilities have been discovered to date, so none have needed publishing yet, but the channel (GitHub Security Advisories) and the documented practice to disclose after a fix are in place.



Estos datos están disponibles bajo el Acuerdo de Licencia de Datos de la Comunidad – Permisivo, Versión 2.0 (CDLA-Permissive-2.0). Esto significa que un Destinatario de Datos puede compartir los Datos, con o sin modificaciones, siempre que el Destinatario de Datos ponga a disposición el texto de este acuerdo con los Datos compartidos. Por favor, acredite a Henrik Schack y a los colaboradores de la insignia de Mejores Prácticas de OpenSSF.

Entrada de insignia del proyecto propiedad de: Henrik Schack.
Entrada creada el 2026-06-23 19:20:33 UTC, última actualización el 2026-06-27 03:40:02 UTC. Última obtención de la insignia de nivel básico el 2026-06-27 03:40:02 UTC.