Objectif
En ce moment, c’est la cata, les cyberattaques et les exfiltration de données sont presque quotidiennes, j’ai besoin d’être rassuré sur les fuites de mes adresses mails.
J’ai donc créé cette carte HA:
Principe
Il existe plusieurs sites qui sont capables de tester si mon adresse mail est compromise ou pas.
La compromission d’une adresse e-mail se produit lorsque les informations associées à cette adresse (comme le mot de passe, les contacts, ou les données personnelles) sont exposées à des tiers non autorisés, généralement à la suite d’une violation de données. Cela peut se produire lorsque des bases de données de services en ligne sont piratées, et les informations des utilisateurs sont volées puis divulguées ou vendues sur des forums ou des sites du darknet. Une adresse e-mail compromise peut être utilisée pour envoyer des spams, des attaques de phishing, ou accéder à d’autres comptes liés à cette adresse, mettant en danger la sécurité et la confidentialité de l’utilisateur.
Le site le plus connu d’entre tous est :
Mais ce site ne fourni plus d’API sans abonnement, j’ai cherché une autre solution et j’ai trouvé le site :
Ce site propose une APIV2 payante mais a laissé son APIV1 en ligne, elle est plus légère mais elle me suffit pour savoir si mon courriel est compromis et s’il est compromis, combien y a t il de fuites. Cette api n’a en plus pas besoin de token d’authentification, c’est donc bien plus simple.
Voici le lien vers la doc de l’API :
Je crée des requêtes REST dans sensors.yaml
J’ai de manière très classique organisé mes fichiers de configurations dans des fichiers YAML qui sont appelés par configuration.yaml.
sensor: !include sensors.yaml
L’appel que je vais faire est au format :
https://leakcheck.io/api/public?check=monmail@mail.fr
Le résultat est au format json, par exemple :
{ "success": true, "found": 7, "fields": [ "last_name", "country", "first_name", "username", "dob", "password", "city" ], "sources": [ { "name": "Deezer.com", "date": "2019-09" }, { "name": "Badoo.com", "date": "2013-07" } ] }
- found donne le nombre de compromission ou plutôt le nombre de bases de données pirates qui contiennent le mail.
- fields est inutile à ce stade
- sources donne les noms et bases de données des compromissions mais dans la version gratuite, on n’a visiblement pas l’exhaustivité.
Voici le code que j’ajoute pour un mail d’exemple :
- platform: rest name: "demo46@mail.comr" unique_id: "sensor.fuite_demo46_mail_com" resource: https://leakcheck.io/api/public?check=demo46@mail.com scan_interval: 86400 # Intervalle de scan en secondes 86400s = 1 jour value_template: "{{ value_json.success }}" json_attributes: - found - sources
Je renomme le sensor créé
Je dois relancer HA ou au moins recharger la config Yaml, et le sensor arrive.
Je suis toujours surpris que l’unique_id ne soit pas pris en compte, rien de grave, je le corrige manuellement. J’utilise sensor.fuite* car c’est une carte auto-entities que j’utiliserai ensuite.
Je vais créer la carte
Le code est assez complexe, je suis parti du code de l’excellent herveaurel pour ses batteries.
Voici ce que j’ai ajouté dans l’éditeur de configuration pour configurer type: custom:button-card et template: leak_card
button_card_templates: leak_card: variables: entity: '[[[ return entity.entity_id ]]]' entity: '[[[ return variables.entity ]]]' icon: | [[[ return entity.state === "True" ? "mdi:car-brake-alert" : "mdi:shield-lock-outline" ]]] name: '[[[ return entity.attributes.friendly_name ]]]' label: | [[[ return entity.state === "True" ? `Compromis<br>${entity.attributes.found} fuites` : "Protégé" ]]] show_icon: true show_state: false show_label: true template: - no_style - police tap_action: action: more-info double_tap_action: action: toggle custom_fields: barre: card: type: custom:bar-card entities: - entity: '[[[ return variables.entity ]]]' color: | [[[ var state = entity.state; if (state === "True") { return "var(--card-red)"; } else { return "var(--card-green)"; } ]]] direction: right positions: name: 'off' indicator: 'off' value: 'off' height: 50px width: 100% icon: 'off' entity_row: true styles: card: - height: 40px - padding: 2px - animation: blink 0.8s ease infinite icon: - position: absolute - width: 25px - color: var(--orange) - left: calc((7%) - 5px) - margin-bottom: 2px name: - position: absolute - font-size: 13px - color: var(--orange) - font-weight: 500 - left: calc((20%) - 15px) label: - position: absolute - font-size: 13px - color: | [[[ var state = entity.state ; if (state === "True") return "var(--red)" else return "var(--green)" ]]] - font-weight: 600 - width: 100% - text-align: center - left: calc((10%) + 70px) custom_fields: barre: - top: '-19%' - left: '-50%' - width: 100% - position: absolute - z-index: 0 state: - value: 'False' styles: icon: - color: var(--green) name: - color: var(--green) card: - animation: none - value: unknown styles: name: - color: var(--grey) label: - color: var(--grey) card: - animation: blink 0.8s ease infinite - value: unavailable styles: name: - color: var(--grey) label: - color: var(--grey) card: - animation: blink 0.8s ease infinite
Et voici le code de la carte :
type: entities card_mod: style: | ha-card { background-color: var(--card-background-color); border-radius: var(--ha-card-border-radius) !important; } entities: - type: custom:decluttering-card template: header variables: - name: Fuites des courriels - icon: mdi:home-battery - type: custom:auto-entities card: type: entities show_header_toggle: true filter: include: - entity_id: sensor.fuite* options: type: custom:button-card template: leak_card sort: method: state numeric: true ignore_case: false ip: false show_empty: true
Et la carte terminée apparait