start the security application (#85759) #104
Open
bdauvergne
wants to merge 2 commits from
wip/85759-Avoir-une-section-Securite-pour
into main
pull from: wip/85759-Avoir-une-section-Securite-pour
merge into: entrouvert:main
entrouvert:main
entrouvert:wip/90441-requests-wrapper-ne-conserve-pas
entrouvert:wip/90385-applification
entrouvert:wip/90324-limit-application-filter-types
entrouvert:wip/89124-application-job-waiting
entrouvert:wip/tmp-paul-check-ci-against-a2-migrations-squash
entrouvert:wip/88093-timezone-per-tenant
entrouvert:wip/86701-profile-attribute-form-full-page
entrouvert:wip/86672-profile-multivalued-attributes
entrouvert:wip/86346-Le-cache-de-RemoteTemplate-leve
entrouvert:wip/64924-delete-services-page
entrouvert:wip/65553-saml-TypeError-Model-instances-w
entrouvert:wip/59135-synchronous-provisionning
entrouvert:wip/76423-uwsgidecorators-corriger-le-pass
entrouvert:wip/84884-remove-admin-interface-exposure
entrouvert:wip/84514-create-schema-if-not-exists
entrouvert:wip/81814-speedup-migrations
entrouvert:wip/80246-requests-wrapper-cached-results
entrouvert:wip/78555-technical-role-naming-revamp
entrouvert:wip/72760-sms-default-country-code-selection
entrouvert:wip/43968-IntegrityError-duplicate-key-val
entrouvert:wip/75139-default-sso-appearance-screen
entrouvert:wip/72173-restrict-email-accepted-domains
entrouvert:wip/74112-tox-dj32-only
entrouvert:wip/dynamic-context
entrouvert:wip/72264-hobo-secret-keys
entrouvert:wip/72478-sortir-le-provisionning-de-l-ope
entrouvert:wip/68034-show-eta-on-migrate-schemas
entrouvert:wip/72070-app-test-scenarios
entrouvert:wip/71967-delete-app-menu
entrouvert:wip/71961-app-404
entrouvert:wip/70897-app-non-editable-app-element-def
entrouvert:wip/70989-application-edit-marker
entrouvert:wip/71697-home-applications
entrouvert:wip/69604-allow-very-big-DATA_UPLOAD_MAX_MEMORY_SIZE
entrouvert:wip/71452-app-move-element-error-fields
entrouvert:wip/71398-app-deploy-update
entrouvert:wip/70942-app-progress-bar
entrouvert:wip/71251-app-element-renamed
entrouvert:wip/63882-app-sort-elements
entrouvert:wip/63883-app-sort-elements-by-category
entrouvert:wip/71283-add-support-for-language-attribute
entrouvert:wip/70981-app-element-error
entrouvert:wip/68017-fix-scandeps-unknown-object
entrouvert:wip/69655-application-deploy-error
entrouvert:wip/70891-app-manifest-non-editable
entrouvert:wip/70501-async-applification
entrouvert:wip/69662-app-doc-url
entrouvert:wip/69654-version-num
entrouvert:wip/69651-app-scandeps
entrouvert:wip/70442-app-goto-object-def
entrouvert:wip/69652-app-icon
entrouvert:wip/67588-uwsgi-conf
entrouvert:wip/django-upgrade
entrouvert:wip/djhtml
entrouvert:wip/69296-api-client-trace
entrouvert:wip/68985-app-sign-once
entrouvert:wip/68783-applications-ignore-lateral-services
entrouvert:wip/67085-api-client-clean
entrouvert:wip/68061-app-roles
entrouvert:wip/68059-default-dbname-no-tox
entrouvert:wip/noop
entrouvert:wip/67377-moteurs-d-indexation-qui-tournen
entrouvert:wip/67666-matomo-dict-string-format
entrouvert:wip/67665-matomo-pass-public-params-into-qs
entrouvert:wip/67547-template-dirs-portal-agent
entrouvert:wip/64289-drf312
entrouvert:wip/66833-matomo-use-qs-to-pass-args-for-ws-call
entrouvert:wip/63523-api-access
entrouvert:wip/66662-apiaccess-round2
entrouvert:wip/api-access-management
entrouvert:wip/66583-env-allow-long-slugs
entrouvert:wip/32147-deleted-flag-on-hobo-variables
entrouvert:wip/66356-redo-fc-redirect
entrouvert:wip/66011_index_role_uuid
entrouvert:wip/41964-remove-VARIABLE_SETTINGS_DEFAULTS
entrouvert:wip/65372-lingo
entrouvert:wip/64495-has-role-uuid
entrouvert:wip/63684-remove-six-usage
entrouvert:wip/63725-storage-tenant-location-property
entrouvert:wip/63725-storage-save-own-check
entrouvert:wip/63273-possibilite-de-supprimer-une-app
entrouvert:hotfix/v2.26
entrouvert:wip/62723-fix-wcs-logout-url
entrouvert:wip/61950-test-bullseye-num2words-0.5.10
entrouvert:hotfix/v2.25
entrouvert:wip/62017-unpopulate-local-hobo
entrouvert:wip/62017-remove-local-hobo
entrouvert:wip/61944-revert-60572
entrouvert:wip/60699-applification
entrouvert:wip/60572-hobo-in-bobo
entrouvert:wip/26911-authentic-empecher-celery-kombu-de-manipuler-le-timeout-par-defaut-des-sockets
entrouvert:wip/61029-a2-service-base-url
entrouvert:wip/15579-Ajouter-un-session-id-aux-requet
entrouvert:wip/59815-check-theme
entrouvert:wip/57528-verbosity
entrouvert:wip/57526-cron-message
entrouvert:wip/45276-users-resync-cmd
entrouvert:wip/55043-provision-role
entrouvert:wip/56991-manu
entrouvert:wip/56991-UnpicklingError-pickle-data-was-
entrouvert:wip/55092-uwsgi-roles-clean
entrouvert:wip/56595-disable-cron-by-tenant
entrouvert:wip/55567-spooler
entrouvert:wip/55092-uwsgi-roles
entrouvert:wip/55824-Permettre-un-AdminEmailHandler-c
entrouvert:wip/54852-fc-form-id-secret-length-validation
entrouvert:wip/54856-add-missing-padding-form-style
entrouvert:wip/54637-provisionning-debug
entrouvert:hotfix/v1.96
entrouvert:wip/54614-wcs-tenants-dirs
entrouvert:wip/black-isort
entrouvert:wip/53228-button-links-in-sidebar
entrouvert:wip/53059-provisionning-api
entrouvert:wip/50014-trace
entrouvert:wip/52482-trace
entrouvert:wip/51513-remove-corbo-and-mandaye
entrouvert:wip/50451-display-netloc-on-error
entrouvert:wip/49283-dj22
entrouvert:hotfix/v1.82
entrouvert:wip/49685-Declarer-authentic-comme-source-
entrouvert:wip/47790-address-auto
entrouvert:wip/45671-settings-middleware
entrouvert:wip/47559-update-celecy-command
entrouvert:wip/42751-vue-generique-pour-voir-les-logs
entrouvert:wip/45561-remove-py2-tests
entrouvert:wip/44973-py-junit
entrouvert:wip/django-appconf-limit
entrouvert:wip/latest-pytest
entrouvert:wip/test-csv-provisionning
entrouvert:wip/33875-do-not-reapply-successfull-import-template
entrouvert:wip/33874-import-template-may-first-fails-on-hobo-deploy
entrouvert:wip/32381-Envoyer-les-niveaux-d-authentifi
entrouvert:provision_auth_levels
entrouvert:wip/23045-migrate-schemas-in-parallel
entrouvert:wip/jenkins
entrouvert:wip/django-1.11-tox
entrouvert:wip/python3
entrouvert:wip/django-1.11-tox-temp
No reviewers
Labels
Clear labels
No items
No Label
Milestone
Clear milestone
No items
No Milestone
Assignees
Clear assignees
No Assignees
3 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.
No due date set.
Dependencies
No dependencies set.
Reference: entrouvert/hobo#104
Reference in New Issue
No description provided.
Delete Branch "wip/85759-Avoir-une-section-Securite-pour"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Nouvelle page dans /security/ on peut y poser une politique CSP ou CSP uniquement pour rapport, on peut y voir les derniers rapports reçus classé par ordre anti-chronologique du dernier rapport reçu. Un bouton permet de nettoyer les rapports enregistrés, par ailleurs les rapports pas vu depuis plus d'1j sont supprimés.
Le middleware pose automatiquement les politiques dans les réponses, sauf si l'entête est déjà présent par ailleurs, il ajoute l'URL de rapport si celle-ci est manquante. L'URL du endpoint de rapport accepte un paramètre ?error qui lèvera une erreur dans sentry si nécessaire. L'erreur est unique par tenant hobo (le template de log contient le hostname en dur).
L'API est ouverte à tous (on ne peut pas vraiment faire autrement) mais après 1000 rapports/jour ça n'en accepte plus, sait-on jamais si quelqu'un veut nous pourrir la vie.
beee0c221d
toff5c43b460
ff5c43b460
to4f050e211c
4f050e211c
to23c2f650fe
WIP: start the security application (#85759)to start the security application (#85759)23c2f650fe
to57a917d02b
57a917d02b
tob28ec05a84
(jenkins en erreur)
(je notais juste)
b28ec05a84
toace70e2fef
ace70e2fef
tofb8a50b4a8
Première passe, rien de très méchant.
Je me pose quand même la question de l'utilité d'avoir /api/csp-report/, je me dis que les gens qui connaissent ça ont déjà des outils...? Comme ça me semble un domaine "mouvant", je me demande si on gagne à avoir un lecteur de rapports. Mais ne connaissant rien à ces affaires, je te laisse me dire ce que tu en penses, Benjamin.
@ -0,0 +28,4 @@
content_security_policy_report_uri = getattr(settings, 'CONTENT_SECURITY_POLICY_REPORT_URI', None)
if content_security_policy and CSP_HEADER_NAME not in response.headers:
response[CSP_HEADER_NAME] = content_security_policy
Comme on joue en Django 3.2 on peut maintenant utiliser
response.headers[CSP_HEADER_NAME] = content_security_policy
qui est moins perturbant que
response[CSR_HEADER_NAME]
(enfin, pour moi).Idem sur les lignes suivantes.
@ -0,0 +35,4 @@
if content_security_policy_report_uri:
if policy := response.headers.get(CSP_HEADER_NAME):
if 'report-uri' not in policy:
Je vois que report-uri est un vieux truc (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/report-uri) et qu'il faut maintenant utiliser le système report-to (https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/report-to).
Mais cette affaire de report semble un profond puits dont le fond est plein de vase, est-ce qu'on a vraiment besoin d'implémenter quelque chose (je pense surtout à /api/csp-report/) ? N'y a-t-il pas des outils existants qui savent déjà consommer ces rapports et que les experts connaissent déjà ? (j'ai rien vu mais je ne sais pas vraiment comment chercher). En d'autre termes, est-ce que si on n'a pas cet analyseur de rapports, on a vraiment une solution inacceptable ?
Il n'y a rien à analyser dans ces rapports c'est juste une liste des URLs bloquées et la raison (la partie de la règle csp qui a bloqué), c'est vraiment tout l'utilité du ticket je trouve.
Le fait est que report-uri est géré partout et pas report-to (voir les matrices de compat en bas de chaque page), donc à tout prendre j'ai implémenté le plus courant, on pourra toujours changer ça facilement dans le futur. J'ai pas implémenté les deux parce que rien n'indique que report-uri sera déprécié bientôt.
@ -0,0 +1,98 @@
# hobo - portal to configure and deploy applications
# Copyright (C) 2015-2022 Entr'ouvert
(pour bien montrer que je relis, tu peux poser 2024 ou retirer les mentions d'années)
Ok.
@ -0,0 +61,4 @@
for directive in directives:
head, rest = directive.split(' ', 1)
if head not in HEADS:
raise ValidationError(_('Invalid CSP directive "%s"') % head)
(pas de couverture par les tests de ce raise)
@ -0,0 +72,4 @@
if needle == source:
break
else:
raise ValidationError(_('Invalid CSP source "%s" in directive "%s"') % (source, head))
(ici non plus, pas de couverture par les tests de ce raise)
@ -0,0 +25,4 @@
UPDATE_LAST_SEEN_PERIOD = datetime.timedelta(minutes=10)
def get_content(self):
return {key.replace('-', '_'): value for key, value in self.content.items()}
Ici et sur d'autres parties de ce fichier, pépins de couverture par les tests.
@ -0,0 +7,4 @@
def common_domains(urls):
'''Compute fewest common domains between urls'''
common = None
for url in urls:
Le résultat des tests indique un manque de couverture de cette fonction.
Je n'ai pas l'impression que les gens aient des outils, ni que quiconque y connaissent quoi que ce soit; mais le but vraiment de pouvoir tester une politique et de voir les URLs qui sont bloquées en vrai quand un rapport de pentest nous dit de poser telle ou telle politique; pas plus pas moins. Normalement les rapports devraient être vides, sinon ça veut dire que la politique n'est pas la bonne, on reçoit des rapports même sur une politique en mode content-security-policy-report-only (ça rapporte les blocages mais en vrai ça ne bloque rien).
Step 1:
From your project repository, check out a new branch and test the changes.Step 2:
Merge the changes and update on Gitea.