Outils pour utilisateurs

Outils du site


linux:rewinged

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
linux:rewinged [2026/09/12 08:46] – rootlinux:rewinged [2026/09/18 17:40] (Version actuelle) – [13.2 Règles personnalisées] root
Ligne 130: Ligne 130:
 Restart=on-failure Restart=on-failure
 RestartSec=5 RestartSec=5
 +
 +# Journalisation vers fichier, pour collecte Wazuh en JSON natif
 +StandardOutput=append:/var/log/rewinged/rewinged.log
 +StandardError=append:/var/log/rewinged/rewinged.log
  
 # Durcissement # Durcissement
Ligne 141: Ligne 145:
 MemoryDenyWriteExecute=true MemoryDenyWriteExecute=true
 ReadOnlyPaths=/srv/winget/manifests ReadOnlyPaths=/srv/winget/manifests
-ReadWritePaths=/srv/winget/installers+ReadWritePaths=/srv/winget/installers /var/log/rewinged
  
 [Install] [Install]
Ligne 148: Ligne 152:
  
 <code bash> <code bash>
 +mkdir -p /var/log/rewinged
 +chown rewinged:rewinged /var/log/rewinged
 +
 systemctl daemon-reload systemctl daemon-reload
 systemctl enable --now rewinged systemctl enable --now rewinged
 systemctl status rewinged systemctl status rewinged
 </code> </code>
 +
 +Rotation du journal :
 +
 +<file - /etc/logrotate.d/rewinged>
 +/var/log/rewinged/rewinged.log {
 +    daily
 +    rotate 30
 +    compress
 +    missingok
 +    notifempty
 +    copytruncate
 +    su rewinged rewinged
 +}
 +</file>
  
 ===== 4. Pare-feu de la VM ===== ===== 4. Pare-feu de la VM =====
Ligne 290: Ligne 311:
  
 if [ "$BEFORE" != "$AFTER" ]; then if [ "$BEFORE" != "$AFTER" ]; then
-    logger -t winget-sync "Publication: ${BEFORE:0:8} -> ${AFTER:0:8}"+    # Verification de signature : voir section 13.3 
 +    if ! git verify-commit HEAD >/dev/null 2>&1; then 
 +        logger -t winget-sync -p auth.crit \ 
 +            "SIGNATURE INVALIDE sur ${AFTER:0:8} - retour a ${BEFORE:0:8}" 
 +        git reset --hard "$BEFORE" 
 +        exit 1 
 +    fi 
 +    logger -t winget-sync "Publication verifiee: ${BEFORE:0:8} -> ${AFTER:0:8}"
 fi fi
  
 exit 0 exit 0
 </file> </file>
 +
 +Le bloc ''verify-commit'' suppose que les commits sont signés en GPG et que la
 +clé publique du signataire est présente dans le trousseau du compte
 +''rewinged''. Le retirer si la signature n'est pas en place — mais le conserver
 +est ce qui rend la détection Wazuh exploitable (13.3).
  
 <code bash> <code bash>
Ligne 686: Ligne 719:
 ===== 13. Surveillance Wazuh ===== ===== 13. Surveillance Wazuh =====
  
-==== 13.1 FIM ====+Trois sources distinctes : l'intégrité des fichiers, le journal applicatif de 
 +rewinged, et l'état des services.
  
-<file xml ossec.conf> +==== 13.1 Configuration de l'agent ==== 
-<syscheck> + 
-  <directories check_all="yes" realtime="yes" report_changes="yes"> +<file xml /var/ossec/etc/ossec.conf> 
-    /srv/winget/manifests +<ossec_config> 
-  </directories> + 
-  <directories check_all="yes" realtime="yes"> +  <!-- Integrite des fichiers --> 
-    /srv/winget/installers +  <syscheck> 
-  </directories> +    <disabled>no</disabled> 
-  <directories check_all="yes" realtime="yes"> +    <frequency>3600</frequency> 
-    /usr/local/bin + 
-  </directories> +    <!-- Manifests : decident de ce que le parc installe --> 
-</syscheck>+    <directories check_all="yes" realtime="yes" report_changes="yes" 
 +                 tags="winget,manifests">/srv/winget/manifests</directories> 
 + 
 +    <!-- Installeurs : les binaires servis aux postes --> 
 +    <directories check_all="yes" realtime="yes" 
 +                 tags="winget,installers">/srv/winget/installers</directories> 
 + 
 +    <!-- Binaire rewinged et script de synchronisation --> 
 +    <directories check_all="yes" realtime="yes" 
 +                 tags="winget,binaries">/usr/local/bin</directories> 
 + 
 +    <!-- Unites systemd du service --> 
 +    <directories check_all="yes" realtime="yes" 
 +                 tags="winget,systemd">/etc/systemd/system</directories> 
 + 
 +    <!-- Bruit git interne --> 
 +    <ignore type="sregex">^/srv/winget/\.git/</ignore> 
 +  </syscheck> 
 + 
 +  <!-- Journal applicatif rewinged, deja en JSON --> 
 +  <localfile> 
 +    <log_format>json</log_format> 
 +    <location>/var/log/rewinged/rewinged.log</location> 
 +  </localfile> 
 + 
 +  <!-- Etat des services, toutes les 5 minutes --> 
 +  <localfile> 
 +    <log_format>full_command</log_format> 
 +    <command>systemctl is-active rewinged winget-sync.timer | tr '\n' ' '</command> 
 +    <alias>winget-services</alias> 
 +    <frequency>300</frequency> 
 +  </localfile> 
 + 
 +</ossec_config>
 </file> </file>
  
-==== 13.2 Réduction du bruit ====+Le journal de ''winget-sync'' passe par ''logger'', donc par syslog, déjà 
 +collecté par la configuration Wazuh par défaut.
  
-La FIM se déclenche à chaque synchronisation légitime. Pour distinguer le +==== 13.2 Règles personnalisées ==== 
-légitime de l'anormal :+ 
 +<file xml /var/ossec/etc/rules/local_rules.xml> 
 +<group name="winget,rewinged,"> 
 + 
 +  <rule id="100600" level="0"> 
 +    <decoded_as>json</decoded_as> 
 +    <location>/var/log/rewinged/rewinged.log</location> 
 +    <description>rewinged: evenement applicatif</description> 
 +  </rule> 
 + 
 +  <rule id="100601" level="7"> 
 +    <if_sid>100600</if_sid> 
 +    <field name="level">error</field> 
 +    <description>rewinged: erreur applicative</description> 
 +  </rule> 
 + 
 +  <rule id="100602" level="10"> 
 +    <if_sid>100601</if_sid> 
 +    <field name="message">ingestManifests</field> 
 +    <description>rewinged: echec ingestion des manifests - $(message)</description> 
 +  </rule> 
 + 
 +  <rule id="100610" level="3"> 
 +    <program_name>winget-sync</program_name> 
 +    <match>Publication verifiee</match> 
 +    <description>winget: publication synchronisee et verifiee</description> 
 +  </rule> 
 + 
 +  <rule id="100611" level="14"> 
 +    <program_name>winget-sync</program_name> 
 +    <match>SIGNATURE INVALIDE</match> 
 +    <description>winget: signature invalide - synchronisation annulee</description> 
 +    <group>attack,</group> 
 +  </rule> 
 + 
 +  <rule id="100612" level="10" frequency="5" timeframe="1800"> 
 +    <if_matched_sid>100601</if_matched_sid> 
 +    <description>winget: erreurs applicatives repetees</description> 
 +  </rule> 
 + 
 +  <rule id="100620" level="3"> 
 +    <if_group>syscheck</if_group> 
 +    <field name="file">/srv/winget/manifests/</field> 
 +    <description>winget: manifest modifie - $(file)</description> 
 +  </rule> 
 + 
 +  <rule id="100621" level="12"> 
 +    <if_group>syscheck</if_group> 
 +    <field name="file">/srv/winget/installers/</field> 
 +    <description>winget: installeur modifie - $(file)</description> 
 +    <group>attack,</group> 
 +  </rule> 
 + 
 +  <rule id="100622" level="14"> 
 +    <if_group>syscheck</if_group> 
 +    <field name="file">/usr/local/bin/rewinged</field> 
 +    <description>winget: binaire rewinged modifie - $(file)</description> 
 +    <group>attack,</group> 
 +  </rule> 
 + 
 +  <rule id="100630" level="0"> 
 +    <location>winget-services</location> 
 +    <description>winget: releve d'etat des services</description> 
 +  </rule> 
 + 
 +  <rule id="100631" level="10"> 
 +    <if_sid>100630</if_sid> 
 +    <regex>inactive|failed|unknown</regex> 
 +    <description>winget: service rewinged ou timer arrete</description> 
 +  </rule> 
 + 
 +</group> 
 +</file> 
 + 
 +<WRAP center round important> 
 +Les identifiants 100600–100631 sont donnés à titre indicatif. Les adapter à 
 +la numérotation des règles personnalisées déjà en place. 
 +</WRAP> 
 + 
 +==== 13.3 Traiter le bruit FIM ==== 
 + 
 +La FIM se déclenche à chaque publication légitime. Wazuh ne sait pas exprimer 
 +nativement « alerter sauf si précédé de tel événement », il faut donc déplacer 
 +le contrôle plutôt que tenter de corréler. 
 + 
 +**Approche retenue** : la signature GPG des commits est le contrôle réel. 
 + 
 +  - Les commits de publication sont signés ; la clé publique du signataire est 
 +    dans le trousseau du compte ''rewinged'' 
 +  - ''winget-sync.sh'' vérifie la signature et annule la synchronisation en cas 
 +    d'échec (section 7.2) 
 +  - La FIM sur ''manifests'' reste **informative** (niveau 3) : elle documente, 
 +    elle n'alerte pas 
 +  - L'alerte forte porte sur la signature invalide (100611, niveau 14) 
 + 
 +Une modification de manifest effectuée directement sur le serveur ne passe pas 
 +par un commit, donc ne déclenche pas 100611 — mais elle sera écrasée au 
 +prochain ''merge --ff-only'', et la FIM en garde la trace. 
 + 
 +Les installeurs et les binaires, eux, ne changent pas hors publication : leurs 
 +règles restent à niveau élevé. 
 + 
 +==== 13.4 Mise en place de la signature ==== 
 + 
 +Côté poste de publication : 
 + 
 +<code bash> 
 +git config --global user.signingkey <ID_CLE> 
 +git config --global commit.gpgsign true 
 +gpg --export --armor <ID_CLE> > mis-publication.pub 
 +</code> 
 + 
 +Côté serveur rewinged : 
 + 
 +<code bash> 
 +sudo -u rewinged gpg --import mis-publication.pub 
 +sudo -u rewinged gpg --edit-key <ID_CLE> trust   # niveau ultimate 
 +sudo -u rewinged git -C /srv/winget verify-commit HEAD 
 +</code>
  
-  * signer les commits en GPG et vérifier la signature dans ''winget-sync'' +Idéalement la clé de signature réside sur une YubiKey, cohérent avec 
-    avant application — un fichier modifié sans commit signé devient alors une +l'autorité de certification SSH déjà en place.
-    alerte non ambiguë +
-  * à défaut, corréler avec les logs de ''winget-sync.service''+
  
-==== 13.3 Alertes complémentaires ====+==== 13.5 Ce qui reste non couvert ====
  
-  * arrêt du service ''rewinged'' +  * **Publication légitime mais erronée** — un mauvais ''PackageIdentifier'' 
-  * échecs répétés de ''winget-sync.timer'' — un dépôt figé est un mode de +    ou un SHA256 incorrect signé de bonne foi passe toutes les vérifications. 
-    panne silencieux +    Le garde-fou est la revue de la PR, pas la détection. 
-  * volumétrie anormale de téléchargements sur ''/installers/'' +  * **Compromission du poste de publication** — si la clé de signature est 
-  * saturation disque de la VM (croissance LFS)+    utilisable par un attaquant, la chaîne entière est valide de son point de 
 +    vue. D'où la YubiKey. 
 +  * **Saturation disque** — à surveiller côté Zabbix plutôt que Wazuh, la 
 +    croissance LFS étant progressive et prévisible.
  
 ===== 14. Points ouverts ===== ===== 14. Points ouverts =====
linux/rewinged.1789202818.txt.gz · Dernière modification : de root