diff --git a/.github/workflows/report.yml b/.github/workflows/report.yml index bca010fa39b..31d3c7cb858 100644 --- a/.github/workflows/report.yml +++ b/.github/workflows/report.yml @@ -3,10 +3,10 @@ name: DashLord report on: workflow_dispatch: workflow_run: - workflows: ["DashLord scans"] - branches: [main] - types: - - completed + workflows: ["DashLord scans"] + branches: [main] + types: + - completed # allow only one concurrent report action concurrency: @@ -24,27 +24,20 @@ jobs: - uses: actions/cache@v2 with: - path: '**/node_modules' + path: "**/node_modules" key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }} # build the report - id: dashlord-report - uses: SocialGouv/dashlord-actions/report@main + uses: SocialGouv/dashlord-actions/report@v1 with: - base-path: /dashlord - - # to save the generated report.json as artifact - #- uses: actions/upload-artifact@v2 - # with: - # path: report.json - # name: report - # if-no-files-found: error + base-path: /dashlord # adapt to your repo name # save full report for history - uses: EndBug/add-and-commit@v7 with: add: '["report.json"]' - default_author: github_actions + default_author: "github_actions" message: "chore: report update" # deploy build to gh-pages @@ -53,4 +46,3 @@ jobs: with: branch: gh-pages folder: build - diff --git a/.github/workflows/scans.yml b/.github/workflows/scans.yml index dc852ae705c..2e57ee75739 100644 --- a/.github/workflows/scans.yml +++ b/.github/workflows/scans.yml @@ -7,22 +7,35 @@ on: description: "Single url to scan or scan all urls" required: false default: "" - schedule: - - cron: "0 0 * * 0" # see https://crontab.guru + tool: + description: "Single tool to run or use all tools" + type: choice + default: all + options: + - all + - codescan + - dependabot + - ecoindex + - lighthouse + - sonarcloud + - trivy + - zap push: branches: - master - main paths: - - 'dashlord.yaml' - - 'dashlord.yml' - - 'urls.txt' + - "dashlord.yaml" + - "dashlord.yml" + - "urls.txt" + schedule: + - cron: "0 0 * * 0" # see https://crontab.guru # allow only one concurrent scan action concurrency: cancel-in-progress: true group: scans - + jobs: init: runs-on: ubuntu-latest @@ -31,11 +44,12 @@ jobs: sites: ${{ steps.init.outputs.sites }} config: ${{ steps.init.outputs.config }} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - id: init - uses: "SocialGouv/dashlord-actions/init@main" + uses: "SocialGouv/dashlord-actions/init@v1" with: url: ${{ github.event.inputs.url }} + tool: ${{ github.event.inputs.tool }} scans: runs-on: ubuntu-latest @@ -48,7 +62,9 @@ jobs: matrix: sites: ${{ fromJson(needs.init.outputs.sites) }} steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 + with: + ref: ${{ github.ref }} - run: | mkdir scans @@ -58,8 +74,28 @@ jobs: path: "**/node_modules" key: ${{ runner.os }}-modules-${{ hashFiles('**/yarn.lock') }} - - name: Déclaration a11y + - name: sonarcloud scan + if: ${{ matrix.sites.tools.sonarcloud }} + id: sonarcloud + continue-on-error: true + timeout-minutes: 10 + uses: SocialGouv/dashlord-actions/sonarcloud@v1 + with: + repos: ${{ join(matrix.sites.repositories) }} + output: "scans/sonarcloud.json" + + - name: Third-party scripts scan + if: ${{ matrix.sites.tools.thirdparties }} + id: thirdparties continue-on-error: true + timeout-minutes: 10 + uses: SocialGouv/thirdparties-action@master + with: + url: "${{ matrix.sites.url }}" + output: "scans/thirdparties.json" + + - name: Déclaration a11y + timeout-minutes: 10 uses: "socialgouv/dashlord-actions/declaration-a11y@v1" if: ${{ matrix.sites.tools['declaration-a11y'] }} with: @@ -68,91 +104,119 @@ jobs: - name: eco-index continue-on-error: true + timeout-minutes: 10 uses: "socialgouv/dashlord-actions/ecoindex@v1" if: ${{ matrix.sites.tools.ecoindex }} with: url: ${{ matrix.sites.url }} output: scans/ecoindex.json - - - name: Detect 404s - continue-on-error: true - uses: "socialgouv/detect-404-action@master" - if: ${{ matrix.sites.tools['404'] }} - with: - url: ${{ matrix.sites.url }} - output: scans/404.json - - name: Screenshot Website - uses: swinton/screenshot-website@v1.x - if: ${{ matrix.sites.tools.screenshot }} + - name: Déclaration RGPD timeout-minutes: 10 + uses: SocialGouv/dashlord-actions/declaration-rgpd@v1 + if: ${{ matrix.sites.tools['declaration-rgpd'] }} with: - source: "${{ matrix.sites.url }}" - destination: screenshot.jpeg + thirdparties: ${{ steps.thirdparties.outputs.json }} + url: ${{ matrix.sites.url }} + output: scans/declaration-rgpd.json - name: Trivy continue-on-error: true + timeout-minutes: 20 if: ${{ matrix.sites.tools.trivy && matrix.sites.docker }} uses: "socialgouv/dashlord-actions/trivy@v1" with: images: ${{ join(matrix.sites.docker) }} output: scans/trivy.json - - name: Stats page + - name: Detect 404s continue-on-error: true - uses: "MTES-MCT/stats-action@main" - if: ${{ matrix.sites.tools.stats }} + timeout-minutes: 10 + uses: "socialgouv/detect-404-action@master" + if: ${{ matrix.sites.tools['404'] }} with: url: ${{ matrix.sites.url }} - uri: 'stats' + output: scans/404.json + + - name: Betagouv API scan + if: ${{ matrix.sites.tools.betagouv }} + continue-on-error: true + timeout-minutes: 10 + id: betagouv + uses: betagouv/dashlord-startup-action@main + with: + id: "${{ matrix.sites.betaId }}" + output: "scans/betagouv.json" + + - name: Stats page + timeout-minutes: 10 + uses: "betagouv/check-url-action@main" + if: ${{ matrix.sites.tools.stats }} + with: + url: ${{ steps.betagouv.outputs.stats_url || format('{0}/stats', matrix.sites.url) }} output: scans/stats.json + minExpectedRegex: ^stat + exactExpectedRegex: ^stats$ + + - name: Screenshot Website + uses: swinton/screenshot-website@v1.x + if: ${{ matrix.sites.tools.screenshot }} + timeout-minutes: 5 + continue-on-error: true + with: + source: "${{ matrix.sites.url }}" + type: jpeg + destination: screenshot.jpeg + width: 1280 + scaleFactor: 0.5 - name: Wappalyzer scan + if: ${{ matrix.sites.tools.wappalyzer }} uses: "socialgouv/wappalyzer-action@master" timeout-minutes: 10 - if: ${{ matrix.sites.tools.wappalyzer }} continue-on-error: true with: url: "${{ matrix.sites.url }}" output: scans/wappalyzer.json - name: ZAP Scan - uses: zaproxy/action-baseline@v0.4.0 - timeout-minutes: 10 if: ${{ matrix.sites.tools.zap }} - continue-on-error: true + uses: zaproxy/action-baseline@v0.6.1 + timeout-minutes: 10 with: token: "" # disable issue creation rules_file_name: "zap-rules.tsv" docker_name: "owasp/zap2docker-stable" target: "${{ matrix.sites.url }}" cmd_options: "-a" + allow_issue_writing: false + # https://github.com/treosh/lighthouse-ci-action#inputs - name: Lighthouse scan - continue-on-error: true - timeout-minutes: 10 - uses: SocialGouv/dashlord-actions/lhci@v1 if: ${{ matrix.sites.tools.lighthouse }} + timeout-minutes: 10 + uses: socialgouv/dashlord-actions/lhci@v1 with: url: "${{ join(matrix.sites.subpages, ',') }}" - name: Mozilla HTTP Observatory - timeout-minutes: 10 if: ${{ matrix.sites.tools.http }} + timeout-minutes: 10 + id: http continue-on-error: true uses: SocialGouv/httpobs-action@master with: url: "${{ matrix.sites.url }}" output: "scans/http.json" - - name: Third-party scripts scan - timeout-minutes: 10 - if: ${{ matrix.sites.tools.thirdparties }} + - name: Mozilla HTTP Observatory retry + if: steps.http.outcome=='failure' continue-on-error: true - uses: SocialGouv/thirdparties-action@master + timeout-minutes: 10 + uses: SocialGouv/httpobs-action@master with: url: "${{ matrix.sites.url }}" - output: "scans/thirdparties.json" + output: "scans/http.json" # testssl.sh action needs an hostname to save its output so we build it here - name: Extract hostname @@ -162,74 +226,87 @@ jobs: echo "::set-output name=value::$HOSTNAME" - name: testssl.sh scan + if: ${{ matrix.sites.tools.testssl }} timeout-minutes: 10 continue-on-error: true uses: "mbogh/test-ssl-action@v1.1" - if: ${{ matrix.sites.tools.testssl }} with: host: ${{ steps.hostname.outputs.value }} output: scans grade: "F" options: "--fast" - - - name: nmap vulnerabilities scan - if: ${{ matrix.sites.tools.nmap }} - continue-on-error: true - timeout-minutes: 10 - uses: "MTES-MCT/nmap-action@main" - with: - host: ${{ steps.hostname.outputs.value }} - outputDir: "scans" - outputFile: "nmapvuln.json" - withVulnerabilities: true - raw: false - name: Nuclei scan + if: ${{ matrix.sites.tools.nuclei }} timeout-minutes: 10 continue-on-error: true uses: "SocialGouv/dashlord-nuclei-action@master" - if: ${{ matrix.sites.tools.nuclei }} with: url: ${{ matrix.sites.url }} output: "scans/nuclei.log" - name: Updown.io checks + if: ${{ matrix.sites.tools.updownio }} continue-on-error: true - timeout-minutes: 10 uses: "MTES-MCT/updownio-action@main" - if: ${{ matrix.sites.tools.updownio }} with: apiKey: ${{ secrets.UPDOWNIO_API_KEY }} url: ${{ matrix.sites.url }} output: scans/updownio.json - name: Dependabot vulnerabilities alerts + if: ${{ matrix.sites.tools.dependabot && matrix.sites.repositories }} continue-on-error: true - timeout-minutes: 10 uses: "MTES-MCT/dependabotalerts-action@main" - if: ${{ matrix.sites.tools.dependabot && matrix.sites.repositories }} with: token: ${{ secrets.DEPENDABOTALERTS_TOKEN }} repositories: ${{ join(matrix.sites.repositories) }} output: scans/dependabotalerts.json - + - name: Code quality alerts + if: ${{ matrix.sites.tools.codescan && matrix.sites.repositories }} continue-on-error: true - timeout-minutes: 10 uses: "MTES-MCT/codescanalerts-action@main" - if: ${{ matrix.sites.tools.codescan && matrix.sites.repositories }} with: token: ${{ secrets.CODESCANALERTS_TOKEN }} repositories: ${{ join(matrix.sites.repositories) }} output: scans/codescanalerts.json - - uses: SocialGouv/dashlord-actions/save@main + - uses: SocialGouv/dashlord-actions/save@v1 with: url: ${{ matrix.sites.url }} + # only clean up previous stats when all tools runned + cleanup: ${{ github.event.inputs.tool == 'all' && true || false }} - - uses: EndBug/add-and-commit@v7 - with: - add: '["results"]' - author_name: ${{ secrets.SOCIALGROOVYBOT_NAME }} - author_email: ${{ secrets.SOCIALGROOVYBOT_EMAIL }} - message: "update: ${{ matrix.sites.url }}" + - name: "Commit" + id: commit1 + continue-on-error: true + run: | + git config --global user.email 41898282+github-actions[bot]@users.noreply.github.com + git config --global user.name GitHub + git add "results" + git commit -m "update: ${{ matrix.sites.url }}" + git pull --rebase --no-ff origin ${{ github.ref }} + git push + + - name: "Commit retry" + if: steps.commit1.outcome=='failure' + id: commit2 + continue-on-error: true + run: | + git config --global user.email 41898282+github-actions[bot]@users.noreply.github.com + git config --global user.name GitHub + git add "results" + git commit -m "update: ${{ matrix.sites.url }}" + git pull --rebase --no-ff origin ${{ github.ref }} + git push + + - name: "Commit retry 2" + if: steps.commit2.outcome=='failure' + run: | + git config --global user.email 41898282+github-actions[bot]@users.noreply.github.com + git config --global user.name GitHub + git add "results" + git commit -m "update: ${{ matrix.sites.url }}" + git pull --rebase --no-ff origin ${{ github.ref }} + git push diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b5e55200984..2c09f6b92ef 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -4,32 +4,31 @@ Les contributions sont bienvenues. ## Comment modifier le rendu du rapport ? -Le rapport est généré avec l'[action report](https://github.com/SocialGouv/dashlord-actions). +Le rapport est généré avec l'[action report](https://github.com/SocialGouv/dashlord-actions/tree/main/report). Pour développer en local, récupérer le code ici : https://github.com/SocialGouv/dashlord-actions/tree/main/report/www -Vous pouvez modifier la source de cette action dans votre workflow `report.yml` pour pointer vers votre version. +Pour l'utiliser dans votre dashlord hebergé sur GitHub, modifiez la source de cette action dans votre workflow `report.yml` pour pointer vers votre version (ex: `uses: "my-gh-org/dashlord-actions/report@master"`). ## Ajouter un scanner #### Etape 1 : Acquisition des données - - créer un repo dédié à l'action et ses tests - - Dans une branche d'un dashlord: - - référencer l'action dans `.github/workflows/scan.yml` - - activer le scan dans `dashlord.yml` - - Faire tourner un scan d'URL sur cette branche. - - Un fichier JSON produit par l'action doit se trouver dans `results/xxxxx/xxxx.json` à la fin du scan. +- créer un repo dédié à l'action et ses tests +- Dans une branche d'un dashlord: + - référencer l'action dans `.github/workflows/scan.yml` + - activer le scan dans `dashlord.yml` +- Faire tourner un scan d'URL sur cette branche. +- Un fichier JSON produit par l'action doit se trouver dans `results/xxxxx/xxxx.json` à la fin du scan. :warning: L'action doit déposer son JSON dans le dossier `scans` pour qu'il soit automatiquement versionné dans GIT. - #### Etape 2 : Ajout des données dans le rapport DashLord - - cloner le repo `socialgouv/dashlord-actions` localement et créer une branche - - dans `report/src/generateUrlReport` inclure le fichier JSON de l'action dans le rapport JSON généré pour l'URL : https://github.com/SocialGouv/dashlord-actions/blob/main/report/src/generateUrlReport.js#L117 - - si besoin, minimiser les données importées (elle seront servies au front) - - si besoin de calculer une "note" pour ce scanner, ajouter une fonction dans `report/src/summary`. +- cloner le repo `socialgouv/dashlord-actions` localement et créer une branche +- dans `report/src/generateUrlReport` inclure le fichier JSON de l'action dans le rapport JSON généré pour l'URL : https://github.com/SocialGouv/dashlord-actions/blob/main/report/src/generateUrlReport.js#L117 +- si besoin, minimiser les données importées (elle seront servies au front) +- si besoin de calculer une "note" pour ce scanner, ajouter une fonction dans `report/src/summary`. ##### Tester la generation du report.json : @@ -44,7 +43,7 @@ Ceci produira un fichier général `report.json` qui contient les resultats de t #### Etape 3 : Affichage des données dans l'UI DashLord - Lancer le site localement : +Lancer le site localement : ```sh cd report/www @@ -55,4 +54,4 @@ NB : Les fichiers `report/www/src/report.json` et `report/www/src/config.json` d Dans le fichier `report/www/src/components/Url.tsx`, logger les données de `report` qui doivent contenir toutes les données pour une URL donnée pour verifier que vous avez bien récupéré les données de votre action. -Ajoutez vos composants qui consomment ces données and have a break :coffee: :v: +Ajoutez vos composants qui consomment ces données and have a break :coffee: :v: diff --git a/README.md b/README.md index 97f2b705962..36e1be5bb46 100644 --- a/README.md +++ b/README.md @@ -5,11 +5,12 @@ Tableau de bord des bonnes pratiques techniques L'acquisition des données ainsi que la génération du rapport sont automatisés par des [GitHub actions](https://github.com/features/actions) Exemples : - - https://dashlord.incubateur.net - - https://socialgouv.github.io/dashlord-fabrique - - https://mtes-mct.github.io/dashlord - - https://socialgouv.github.io/dnum-dashboard - + +- https://dashlord.incubateur.net +- https://socialgouv.github.io/dashlord-fabrique +- https://mtes-mct.github.io/dashlord +- https://socialgouv.github.io/dnum-dashboard + ## Usage Pour déployer votre version de DashLord : @@ -63,6 +64,7 @@ tools: declaration-a11y: true trivy: true ecoindex: true + sonarcloud: true urls: - url: https://www.free.fr title: Homepage free.fr @@ -86,37 +88,37 @@ urls: - presse ``` -### Mesures de disponibilité +### Mesures de disponibilité DashLord peut monitorer le niveau de performance et de disponibilité de vos applications. (mise en place = 10mins) - - Créez un compte sur [updown.io](https://updown.io) - - Ajoutez-y les urls à monitorer (telles que définies dans dashlord.yml) - - Activez l'outil avec `updownio: true` dans le fichier dashlord.yml - - Ajouter votre clé d'API updown.io "readonly" dans un secret GitHub nommé `UPDOWNIO_API_KEY` (onglet settings/secrets) +- Créez un compte sur [updown.io](https://updown.io) +- Ajoutez-y les urls à monitorer (telles que définies dans dashlord.yml) +- Activez l'outil avec `updownio: true` dans le fichier dashlord.yml +- Ajouter votre clé d'API updown.io "readonly" dans un secret GitHub nommé `UPDOWNIO_API_KEY` (onglet settings/secrets) ▶ Au prochain scan, les informations updown.io seront remontées dans DashLord ## Outils -Chaque outil peut être activé/désactivé dans le rapport avec la clé `tools` de dashlord.yml. - -| Repo | desc | -| ------------------------------------------------------------------------------------------- | ---------------------------------------------------------- | -| [SocialGouv/dashlord-actions](https://github.com/SocialGouv/dashlord-actions) | Dashlord specific actions | -| [SocialGouv/dashlord-nuclei-action](https://github.com/SocialGouv/dashlord-nuclei-action) | Dump nuclei result | -| [SocialGouv/httpobs-action](https://github.com/SocialGouv/httpobs-action) | Dump Mozilla HTTP Observatory result | -| [SocialGouv/thirdparties-action](https://github.com/SocialGouv/thirdparties-action) | Dump third party scripts scan result | -| [SocialGouv/wappalyzer-action](https://github.com/SocialGouv/wappalyzer-action) | Dump Wappalyzer scan result | -| [MTES-MCT/dependabotalerts-action](https://github.com/MTES-MCT/dependabotalerts-action) | Dump Github dependabot security alerts | -| [MTES-MCT/codescanalerts-action](https://github.com/MTES-MCT/codescanalerts-action) | Dump Github CodeQL security alerts | -| [MTES-MCT/updownio-action](https://github.com/MTES-MCT/updownio-action) | Dump updown.io stats | -| [MTES-MCT/nmap-action](https://github.com/MTES-MCT/nmap-action) | Dump nmap port scan stats | -| [MTES-MCT/stats-action](https://github.com/MTES-MCT/stats-action) | Detect /stats page. | -| [SocialGouv/thirdparties](https://github.com/SocialGouv/thirdparties) | thirdparty scripts database | -| [swinton/screenshot-website](https://github.com/swinton/screenshot-website) | grab website screenshot | -| [SocialGouv/detect-404-action](https://github.com/SocialGouv/detect-404-action) | detect 404 errors | -| [aquasecurity/trivy-action](https://github.com/aquasecurity/trivy-action) | Scan docker images vulnerabilities | +Chaque outil peut être activé/désactivé dans le rapport avec la clé `tools` de dashlord.yml. + +| Repo | desc | +| ----------------------------------------------------------------------------------------- | -------------------------------------- | +| [SocialGouv/dashlord-actions](https://github.com/SocialGouv/dashlord-actions) | Dashlord specific actions | +| [SocialGouv/dashlord-nuclei-action](https://github.com/SocialGouv/dashlord-nuclei-action) | Dump nuclei result | +| [SocialGouv/httpobs-action](https://github.com/SocialGouv/httpobs-action) | Dump Mozilla HTTP Observatory result | +| [SocialGouv/thirdparties-action](https://github.com/SocialGouv/thirdparties-action) | Dump third party scripts scan result | +| [SocialGouv/wappalyzer-action](https://github.com/SocialGouv/wappalyzer-action) | Dump Wappalyzer scan result | +| [MTES-MCT/dependabotalerts-action](https://github.com/MTES-MCT/dependabotalerts-action) | Dump Github dependabot security alerts | +| [MTES-MCT/codescanalerts-action](https://github.com/MTES-MCT/codescanalerts-action) | Dump Github CodeQL security alerts | +| [MTES-MCT/updownio-action](https://github.com/MTES-MCT/updownio-action) | Dump updown.io stats | +| [MTES-MCT/nmap-action](https://github.com/MTES-MCT/nmap-action) | Dump nmap port scan stats | +| [MTES-MCT/stats-action](https://github.com/MTES-MCT/stats-action) | Detect /stats page. | +| [SocialGouv/thirdparties](https://github.com/SocialGouv/thirdparties) | thirdparty scripts database | +| [swinton/screenshot-website](https://github.com/swinton/screenshot-website) | grab website screenshot | +| [SocialGouv/detect-404-action](https://github.com/SocialGouv/detect-404-action) | detect 404 errors | +| [aquasecurity/trivy-action](https://github.com/aquasecurity/trivy-action) | Scan docker images vulnerabilities | ## Contribute @@ -134,4 +136,3 @@ DashLord fonctionne en deux étapes : 2. **Génération du rapport** : À partir des données existantes, l'action [report](https://github.com/SocialGouv/dashlord-actions) aggrège, compresse les résultats et produit un rapport web statique. Voir aussi : [SocialGouv/dashlord-actions](https://github.com/SocialGouv/dashlord-actions) - diff --git a/schema.json b/schema.json index cbfb33206e5..322f0d43c64 100644 --- a/schema.json +++ b/schema.json @@ -79,6 +79,14 @@ "betagouv": { "type": "boolean", "description": "Enable betagouv API data" + }, + "ecoindex": { + "type": "boolean", + "description": "Enable ecoindex scan" + }, + "sonarcloud": { + "type": "boolean", + "description": "Enable sonarcloud API results" } }, "required": [] @@ -163,17 +171,9 @@ }, "tools": { "$ref": "#/definitions/tools" } }, - "required": [ - "url" - ] + "required": ["url"] } } }, - "required": [ - "title", - "description", - "entity", - "tools", - "urls" - ] + "required": ["title", "description", "entity", "tools", "urls"] }