Appliquer les meilleures pratiques au packaging de logiciels

Note

_benwa est un administrateur système et il a autorisé Tranquil IT à republier son excellente diatribe sur reddit Developers, you can make sysadmins happier.

Variables d’environnement

Répertoires des programmes

  • Tous les systèmes n’utilisent pas « C: » comme lecteur principal. Certaines entreprises utilisent la redirection de dossiers, et déplacent le dossier Documents. Certains endroits dans le monde ne parlent pas anglais et leurs noms de répertoires reflètent cela. Utilisez ces variables d’environnement pour que vos programmes « fonctionnent tout simplement «  :

    • %SystemDrive% est le lecteur où se trouve %SystemRoot%. Vous n’avez probablement pas besoin de le savoir ;

    • Le système d’exploitation Windows est situé dans le répertoire %SystemRoot%. Ne vous en souciez pas. Laissez le répertoire Windows tranquille ;

    • %ProgramFiles% est l’endroit où vous devez placer vos fichiers de programme, de préférence dans une structure Company\Program ;

    • %ProgramFiles(x86)% est l’endroit où vous devez placer vos fichiers de programme 32 bits. Veuillez les mettre à jour pour le 64 bits. Le 32-bit ne sera plus supporté dans l’avenir, et les entreprises attendront que vous vous organisiez pour bien plus longtemps que nécessaire ;

    • ProgramData% est l’endroit où vous devez stocker les données qui ne sont pas spécifiques à l’utilisateur, mais qui doivent quand même être écrites par les utilisateurs (les utilisateurs n’ont pas non plus d’accès en écriture à ce dossier).

      Votre programme ne devrait pas nécessiter de droits d’administrateur pour s’exécuter, car vous ne devriez pas nous faire écrire dans le répertoire %ProgramFiles%. Aussi, ne mettez pas d’exécutables dans ce répertoire.

    • %Temp% est l’endroit où vous pouvez traiter des données temporaires. Placez ces données dans un nom de dossier unique (peut-être un GUID généré) afin de ne pas provoquer d’incompatibilité avec un autre programme. Windows fera même le nettoyage à votre place. Ne placez pas de données temporaires dans les dossiers %ProgramData% ou %ProgramFiles% ;

    • %AppData% vous permet de sauvegarder les paramètres de l’utilisateur qui exécute votre programme. C’est un endroit fantastique qui peut être synchronisé avec un serveur et être utilisé pour migrer rapidement et facilement un utilisateur vers une nouvelle machine et conserver tous les paramètres de ses programmes. Ne mettez pas de fichiers géants ou éphémères ici.

      Vous pourriez être à l’origine d’une connexion très lente si vous mettez les mauvais éléments ici et qu’une machine doit les synchroniser. NE METTEZ PAS VOS FICHIERS DE PROGRAMMES ICI. C’est l’entreprise qui décide quels logiciels sont autorisés à fonctionner, ce n’est pas à vous de décider, ni aux utilisateurs qui ne savent peut-être pas comment l’environnement de leur entreprise est configuré ;

    • LocalAppData% permet de placer des fichiers plus volumineux spécifiques à un utilisateur ou à un ordinateur. Par exemple, personne n’a besoin de synchroniser un cache de vignettes. Elles ne seront pas transférées lorsqu’un utilisateur migrera vers une nouvelle machine, ou se connectera à une nouvelle station VDI, ou à un nouveau serveur de terminal. NE METTEZ PAS VOS FICHIERS DE PROGRAMME ICI NON PLUS ;

Note

De plus en plus d’éditeurs de logiciels proposent des versions portables de leurs logiciels qui s’installent et s’exécutent à partir de %AppData% ou de %LocalAppData%. Votre objectif est de permettre aux utilisateurs d’installer des logiciels même s’ils ne sont pas Administrateurs Locaux et vous commercialisez cela comme une fonctionnalité, bien qu’il s’agisse plutôt d’un NOGO de sécurité. Pire encore, vous avez tendance à rendre difficile de trouver le bon MSI qui permettrait à vos clients d’installer correctement votre logiciel dans %ProgramFiles%. Faites en sorte qu’il soit facile de trouver votre MSI qui s’installera dans les %ProgramFiles%, de cette façon vous ferez en sorte que les politiques de restriction des logiciels et de verrouillage des applications de vos clients fonctionnent bien et que leurs administrateurs système soient satisfaits.

Vous pouvez aussi bien obtenir ces chemins de répertoires par des appels API si vous n’utilisez pas ou ne pouvez pas utiliser de variables d’environnement.

Logs

  • Utilisez le Journal des événements Windows pour la journalisation. Il s’occupera de la rotation pour vous et un administrateur système peut transmettre ces journaux ou faire ce qu’il faut. Vous pouvez même créer votre propre petite zone juste pour votre programme.

Codes d’erreur

Impression

Distribution

  • Distribuez votre programme en MSI. C’est le standard pour les fichiers d’installation de Windows (même si Microsoft ne l’utilise pas toujours lui-même).

  • Signez vos fichiers d’installation et vos exécutables. C’est ainsi que nous savons que votre MSI est valide et que nous pouvons le mettre sur une liste blanche dans AppLocker ou équivalent.

Note

Applocker et Software Restriction Policies peuvent être très efficaces et la gestion de ces stratégies peut être rendue plus simple avec WAPT.

Mises à jour

  • Vous souhaitez que votre programme se mette à jour ? C’est possible si l’entreprise est d’accord. Vous pouvez créer une tâche ou un service programmé qui s’exécute en mode élevé pour permettre cela sans accorder de droits d’administrateur à l’utilisateur. J’aime la façon dont Chrome Enterprise le fait : il donne une GPO pour définir les paramètres de mise à jour, la version maximale à laquelle elle va se mettre à jour (disons 81.* pour permettre toutes les mises à jour mineures automatiquement et les versions majeures sont manuelles), et un service. Ils ont également une GPO pour empêcher les installations lancées par les utilisateurs ;

Note

WAPT est conçu pour les entreprises qui ne permettent pas à leurs utilisateurs d’exécuter des mises à jour logicielles, c’est la politique souvent choisie par les grandes entreprises consciencieuses vis à vis de la sécurité.

Numéros de version

  • Utilisez le versionnage semantique (doit aller dans la propriété de version dans le fichier d’installation et dans la liste Ajout/Suppression de programmes, pas dans le titre de l’application) et ayez un changelog. Vous pouvez également mettre à disposition en téléchargement votre installateur à un endroit prévisible pour permettre l’automatisation. Un chemin de mise à jour publié est également utile ;

Note

Si vous appliquez cette pratique, alors vous rendrez les administrateurs système qui déploient vos mises à jour logicielles en utilisant la fonction WAPT def_update() très heureux !

GPO

  • Les modèles ADMX sont des trucs très moches ;

Note

Nous sommes tout à fait d’accord avec vous _benwa sur ce point chez Tranquil IT. Si les développeurs conseillent à leurs clients d’utiliser des GPO pour déployer leur logiciel ou leur système ou les paramètres des utilisateurs, alors, ils doivent apprendre que les GPO ne sont pas fiables.

Au lieu de cela, packagez vos logiciels, votre système et vos configurations utilisateur en utilisant WAPT. Un fichier setup.py est beaucoup plus facile qu’un fichier xml pour les administrateurs système qui doivent le vérifier avant de le déployer.

Les paquets WAPT peuvent être appliqués récursivement à des arbres d’Unités Organisationnelles, de sorte que votre paquet WAPT se comportera en production exactement comme le ferait une GPO, juste beaucoup plus facilement.

Dongles de licences

  • Les dongles de licence USB sont un péché. Utilisez une licence de logiciel ordinaire ou une licence activée par réseau. Je suis sûr qu’il y plein de systèmes de gestion des licences sur le marché pour que vous n’ayez pas à réinventer la roue ;

Note

Vous pouvez faire en sorte que votre logiciel accepte une clé de licence comme paramètre dans votre exécutable msi.

WAPT peut être utilisé pour attribuer des clés de licence à des postes de travail individuels lors de l’installation en utilisant une méthode qui garantit que la clé de licence ne peut pas être lue pendant le transport.

Ensuite, si vous voulez que votre logiciel appelle chez vous pour vérifier la validité de la licence, faites en sorte que votre méthode fonctionne avec des serveur mandataires.

Fonctionnement en réseau

  • N’utilisez pas ce fichu champ de saisie IPv4 personnalisé. Utilisez des FDQN. L’IPv6 existe depuis 1998 et fonctionnera avec votre logiciel si vous lui donnez une chance ;

  • Le pare-feu Windows (je ne peux pas vraiment en dire plus sur les pare-feu tiers) va rester en place. Connaissez la différence entre une règle entrante et une règle sortante. Il est probable que votre serveur aura besoin d’une règle entrante. Vos clients n’auront probablement même pas besoin d’une règle sortante. Configurez-les au moment de l’installation, et non au moment du lancement. Utilisez les groupes de pare-feu pour faciliter le filtrage. N’utilisez aucune règle si vous pouvez. Le but n’est pas de faire fonctionner le système, mais de le faire fonctionner en toute sécurité. Si vous n’utilisez pas les numéros de version dans vos chemins d’installation, vous n’aurez peut-être même pas à refaire ces règles après chaque mise à jour ;

  • Les serveurs mandataires sont bons pour l’hygiène et les serveurs mandataires sont maintenant une caractéristique de sécurité par défaut non seulement dans les environnements informatiques des entreprises, mais aussi sur les petits réseaux. En rendant votre logiciel non compatible avec les proxies, les administrateurs réseau de vos clients devront établir et maintenir des règles spéciales pour leurs pares-feu, et cela rien que pour vos beaux yeux. Il est facile de coder votre logiciel pour qu’il fonctionne avec des serveurs mandataires, alors faites-le !

PDFs

  • Ne livrez pas un logiciel qui nécessite d’autoriser le fonctionnement de javascript dans les lecteurs de PDF. La logique métier doit être exécutée avant la sortie au format PDF, pas après.

Note

Le PDF est le format de fichier que les gens utilisent par défaut pour échanger des documents. Les lecteurs PDF sont destinés à afficher des documents, et non à exécuter des programmes non signés.