,

Sécurité de vos partages Google Drive : Un nouveau script pour une meilleure maîtrise

Dans le monde professionnel actuel, la collaboration est clé, et Google Drive est un outil essentiel pour bon nombre d’entre nous. Cependant, la facilité de partage peut parfois masquer des risques de sécurité si elle n’est pas gérée avec attention. Un fichier partagé publiquement par inadvertance peut exposer des informations sensibles. C’est pourquoi un tout nouveau développement a été mis en place pour vous aider à mieux suivre et maîtriser la pertinence de vos partages dans Google Drive.

Qu’est-ce que ce nouveau script fait pour vous ?

Ce développement vise à renforcer la sécurité et la bonne gestion des données au sein de votre organisation. Concrètement, le script analyse en continu les activités de partage sur Google Drive des 24 dernières heures. Si un fichier ou un dossier dont un compte de votre console est propriétaire est partagé en mode « Public sur le Web » ou « Tous les utilisateurs avec le lien » (c’est-à-dire accessible à toute personne disposant du lien, même en dehors de l’organisation), le script le détecte.

Son rôle principal est de :

  • Identifier rapidement les documents partagés publiquement.
  • Vérifier leur statut actuel pour s’assurer que le partage est toujours effectif.
  • Notifier individuellement le propriétaire du fichier par e-mail, l’informant de la situation.

L’objectif n’est pas de restreindre votre capacité à collaborer, mais de vous donner une visibilité accrue sur la manière dont vos documents sont partagés et de vous permettre de réagir rapidement si un partage public n’est plus justifié.

Pourquoi est-ce important pour vous ?

La mise en place de ce script répond à plusieurs enjeux majeurs :

  • Sécurité des données : Protéger les informations sensibles de l’entreprise contre tout accès non autorisé. Un partage public involontaire peut avoir des conséquences importantes en termes de confidentialité et de conformité.
  • Maîtrise de l’information : Vous aider à garder le contrôle sur la diffusion de vos documents. Vous êtes le mieux placé pour savoir si un fichier doit rester public ou non.
  • Conformité et bonnes pratiques : Encourager l’adoption de pratiques de partage sécurisées et conformes aux politiques internes et réglementations en vigueur (comme le RGPD).
  • Sensibilisation continue : Rappeler régulièrement l’importance de vérifier les paramètres de partage de vos fichiers, transformant ainsi la sécurité en un réflexe quotidien.

Comment ça marche concrètement ?

Le processus est entièrement automatique et transparent pour vous. Le script tourne en arrière-plan et scanne les journaux d’activité de Drive.

  1. Détection : Lorsqu’un événement de partage public est enregistré, le script le capte.
  2. Confirmation : Il vérifie ensuite en temps réel l’état du fichier pour s’assurer qu’il est toujours partagé publiquement et qu’il n’appartient pas à un Drive partagé (où la gestion des permissions est collective).
  3. Notification : Si le partage public est confirmé, un e-mail détaillé est envoyé au propriétaire. Cet e-mail liste les fichiers concernés, leur type de partage, et inclut un lien direct vers chaque document pour que l’utilisateur puisse facilement vérifier et ajuster les permissions si nécessaire.

Le rôle de vos utilisateurs et les actions recommandées

Lorsque qu’un utilisateur reçoit une notification, c’est l’occasion pour lui de faire le point :

  1. Vérifiez : Accédez aux fichiers listés via les liens fournis dans l’e-mail.
  2. Décidez : Évaluez si le partage public est toujours nécessaire.
    • Si oui : Aucune action n’est requise. Le script vous aura juste informé d’un partage existant.
    • Si non : Restreignez l’accès du fichier. Vous pouvez changer le paramètre de partage pour le rendre interne à l’organisation, ou le rendre privé si personne d’autre n’a besoin d’y accéder.

Ce nouveau script est un outil précieux pour chacun d’entre nous. Il nous permet de travailler de manière plus sécurisée et de nous assurer que nos données restent entre de bonnes mains. En étant proactifs dans la gestion de nos partages Drive, nous contribuons tous à la sécurité globale de notre environnement de travail.

Le script

// --- Configuration Globale ---
const config = {
  EMAIL_ASSISTANCE: "support@domaine.com",
  NOM_EXPEDITEUR: "Google Workspace Alerts",
  IDS_A_EXCLURE: []
};

const anneeActuelle = new Date().getFullYear();

/**
 * Point d'entrée principal.
 */
function notifyOwnersOfAllPublicFiles() {
  Logger.log("Début du processus de notification pour tous les fichiers publics (avec lien ou web).");
  
  const events = fetchAllVisibilityEvents();
  if (events.length === 0) {
    Logger.log("Aucun événement de changement de visibilité trouvé.");
    return;
  }

  const confirmedPublicFiles = filterAndConfirmAllPublicFiles(events);
  if (confirmedPublicFiles.length === 0) {
    Logger.log("Aucun fichier actuellement public et appartenant à un utilisateur n'a été trouvé après filtrage.");
    return;
  }

  const filesByOwner = groupFilesByOwner(confirmedPublicFiles);
  sendEmailToEachOwner(filesByOwner);
  Logger.log("Processus de notification des propriétaires terminé.");
}


function fetchAllVisibilityEvents() {
  const startTime = new Date(new Date().getTime() - 24 * 60 * 60 * 1000).toISOString();
  const eventToMonitor = 'change_document_visibility';
  let allEvents = [];
  let pageToken;
  try {
    do {
      const response = AdminReports.Activities.list('all', 'drive', { eventName: eventToMonitor, startTime: startTime, maxResults: 500, pageToken: pageToken });
      if (response.items) { allEvents = allEvents.concat(response.items); }
      pageToken = response.nextPageToken;
    } while (pageToken);
    Logger.log(`Total de ${allEvents.length} événements de changement de visibilité récupérés.`);
    return allEvents;
  } catch (e) {
    Logger.log(`Erreur lors de la récupération des événements : ${e.message}`);
    MailApp.sendEmail(config.EMAIL_ASSISTANCE, "Erreur Critique - Script de Surveillance Drive", `Le script n'a pas pu récupérer les journaux d'audit de Drive. Erreur: ${e.message}`);
    return [];
  }
}

/**
 * Filtre les événements pour garder TOUS les types de partages publics confirmés.
 */
function filterAndConfirmAllPublicFiles(events) {
  const confirmedFiles = [];
  const processedItemIds = new Set();

  events.forEach(activity => {
    const event = activity.events[0];
    const params = event.parameters.reduce((acc, param) => {
      acc[param.name] = param.value || param.boolValue;
      return acc;
    }, {});

    const visibilityValue = params.visibility;
    const isPublic = visibilityValue === 'public_on_the_web' || visibilityValue === 'anyone_with_link' || visibilityValue === 'people_with_link';
    const isSharedDrive = params.owner_is_shared_drive === true;
    const owner = isSharedDrive ? null : params.owner;
    const docId = params.doc_id;
    const docTitle = params.doc_title;

    if (isPublic && !isSharedDrive && owner && docId && !processedItemIds.has(docId)) {
      processedItemIds.add(docId);
      if (config.IDS_A_EXCLURE.includes(docId)) return;

      const confirmedItem = getConfirmedItemIsPublic(docId);
      if (confirmedItem) {
        const shareTypeDescription = (confirmedItem.getSharingAccess() === DriveApp.Access.ANYONE) ? "Public sur le Web" : "Tous les utilisateurs avec le lien";
        Logger.log(`CONFIRMÉ: Le fichier "${docTitle}" de ${owner} est bien public (${shareTypeDescription}).`);
        confirmedFiles.push({
          docId: docId,
          docTitle: docTitle,
          owner: owner,
          fileUrl: confirmedItem.getUrl(),
          shareType: shareTypeDescription
        });
      } else {
        Logger.log(`IGNORÉ: L'événement pour "${docTitle}" (ID: ${docId}) est obsolète.`);
      }
    }
  });
  return confirmedFiles;
}

/**
 * Vérifie si un fichier est public (n'importe quel type).
 */
function getConfirmedItemIsPublic(docId) {
  try {
    let item;
    try { item = DriveApp.getFileById(docId); } catch (e) { item = DriveApp.getFolderById(docId); }
    const access = item.getSharingAccess();
    return (access === DriveApp.Access.ANYONE || access === DriveApp.Access.ANYONE_WITH_LINK) ? item : null;
  } catch (e) {
    return null;
  }
}

function groupFilesByOwner(files) {
  const byOwner = {};
  files.forEach(file => {
    if (!byOwner[file.owner]) { byOwner[file.owner] = []; }
    byOwner[file.owner].push(file);
  });
  return byOwner;
}

function sendEmailToEachOwner(filesByOwner) {
  for (const ownerEmail in filesByOwner) {
    const files = filesByOwner[ownerEmail];
    const subject = `Action requise : Fichiers partagés publiquement sur votre Drive`;

    let tableRows = '';
    files.forEach(file => {
      tableRows += `<tr><td><a href="${file.fileUrl}" target="_blank">${file.docTitle}</a></td><td>${file.shareType}</td></tr>`;
    });

    const emailContent = `
      <p>Bonjour,</p>
      <p>Une analyse de sécurité automatique a détecté que le(s) fichier(s) ou dossier(s) suivants, dont vous êtes propriétaire, sont actuellement accessibles publiquement sur Internet.</p>
      <p>Cela signifie que toute personne, même extérieure à notre organisation, peut potentiellement accéder à ces documents via leur lien.</p>
      <h2>Fichiers concernés :</h2>
      <table>
        <thead><tr><th>Nom du Fichier / Dossier</th><th>Type de Partage</th></tr></thead>
        <tbody>${tableRows}</tbody>
      </table>
      <h2>Action recommandée</h2>
      <p>Nous vous demandons de bien vouloir vérifier ces partages. Si un accès externe n'est plus nécessaire, veuillez restreindre l'accès ou supprimer le lien de partage.</p>
      <p>Pour toute question ou si vous avez besoin d'assistance, n'hésitez pas à contacter cet e-mail <a href="mailto:${config.EMAIL_ASSISTANCE}">${config.EMAIL_ASSISTANCE}</a>.</p>
    `;

    const finalHtmlBody = buildEmailTemplate(subject, emailContent);
    MailApp.sendEmail({ to: ownerEmail, subject: subject, htmlBody: finalHtmlBody, replyTo: config.EMAIL_ASSISTANCE, name: config.NOM_EXPEDITEUR });
    Logger.log(`E-mail de notification envoyé à ${ownerEmail} pour ${files.length} fichier(s).`);
  }
}

function buildEmailTemplate(title, contentHtml) {
  return `
    <!DOCTYPE html><html lang="fr"><head><meta charset="UTF-8"><title>${title}</title>
    <style>body{font-family:Arial,sans-serif;margin:0;padding:0;background-color:#f4f5f7;color:#3c4043;}.container{background-color:#ffffff;border:1px solid #dadce0;padding:32px;border-radius:8px;max-width:650px;margin:20px auto;}.header h1{font-size:20px;color:#202124;margin:0;}.content{margin-top:24px;line-height:1.6;font-size:14px;}.content p,.content ul{margin:16px 0;}.content table{width:100%;border-collapse:collapse;font-size:14px;}.content th,.content td{text-align:left;padding:10px 12px;border-bottom:1px solid #e0e0e0;}.content th{font-weight:bold;color:#202124;background-color:#f8f9fa;}.content a{color:#1a73e8;text-decoration:none;}.content a:hover{text-decoration:underline;}.footer{margin-top:32px;padding-top:16px;border-top:1px solid #e0e0e0;font-size:12px;color:#5f6368;text-align:center;}</style>
    </head><body><div class="container"><div class="header"><h1>${title}</h1></div><div class="content">${contentHtml}</div><div class="footer"><p>Cet e-mail a été envoyé automatiquement par le système de surveillance.</p><p>&copy; ${anneeActuelle} Service informatique.</p></div></div></body></html>
  `;
}

N’hésitez pas à laisser un commentaire ci-dessous si vous avez des questions ou des retours sur ce nouveau système !