Symptôme : une clé privée de signature reste accessible sur un runner macOS réutilisé après la fin d’un travail.
Réponse rapide : séparez le stockage durable du secret de son usage dans le processus de construction ; si l’isolation du runner n’est pas démontrable, séparez d’abord les tâches de signature.
Apple décrit une identité de signature comme reposant sur un certificat et une clé privée (documentation sur les certificats de signature de code). Pour la gestion des clés de signature iOS sur un runner macOS de GitHub Actions, cette distinction a une conséquence opérationnelle : le coffre protège la source du secret, mais ne prouve pas qu’une tâche ultérieure ne pourra pas accéder à une clé importée sur une machine partagée.
Cet article s’adresse aux responsables IT et sécurité qui doivent examiner le stockage, l’autorisation et la révocation des identifiants de publication ; aux ingénieurs plateforme qui conçoivent leur injection et leur nettoyage dans GitHub Actions ; et aux responsables iOS qui évaluent si un runner partagé convient aux versions de production.
Distinguer stockage, autorisation et usage de la clé
Le choix ne se résume pas à « GitHub Secrets ou trousseau macOS ». Ces options interviennent à différents moments. Il faut cartographier l’emplacement durable du secret, le workflow autorisé à le demander et le mécanisme utilisé par macOS pendant la signature.
| Fonction | Emplacement ou mécanisme | Ce qu’il permet d’évaluer | Ce qu’il ne démontre pas à lui seul |
|---|---|---|---|
| Conservation durable | GitHub Secrets ou coffre externe | Qui peut administrer ou demander un secret, selon les contrôles documentés | Qu’une clé importée ne sera plus accessible après son utilisation |
| Autorisation dans le flux | Secret du dépôt, de l’environnement ou de l’organisation ; règles du workflow | Quel contexte peut recevoir une valeur et selon quelles conditions | Que le runner est isolé des autres tâches |
| Usage de la signature | Trousseau macOS utilisé par le processus de construction | Où le processus peut accéder à l’identité de signature | Que le trousseau est temporaire ou que toute copie a été effacée |
La documentation de GitHub Secrets décrit la gestion et les contextes d’accès aux secrets. Elle n’en fait pas un mécanisme d’isolation du système qui exécute un workflow. Un coffre externe peut répondre à des besoins d’administration ou d’audit propres à l’organisation, mais les capacités doivent être vérifiées dans la documentation du coffre réellement retenu ; il ne faut pas présumer d’une intégration, d’une rotation automatique ou d’une trace particulière.
Côté Apple, les ressources sur le partage des identités de signature d’équipe rappellent que la distribution d’une identité de signature implique la gestion de son matériel cryptographique associé. Pour l’équipe, la question utile n’est donc pas seulement où se trouve le fichier source, mais quels workflows peuvent le récupérer, à quel compte il est importé et quelles tâches peuvent ensuite accéder au trousseau.
Un secret chiffré au repos n’est pas automatiquement protégé contre un workflow auquel il est remis, ni contre une autre tâche exécutée dans un environnement insuffisamment séparé.
Évaluer la conservation selon les preuves disponibles
Les iOS CI credentials peuvent être conservés dans GitHub Secrets ou dans un coffre externe. L’option appropriée dépend des contrôles nécessaires et de ce que l’équipe peut effectivement vérifier : périmètre d’accès, responsabilité de rotation, audit disponible et lien entre une demande de secret et un workflow de publication.
| Critère de décision | GitHub Secrets | Coffre externe |
|---|---|---|
| Périmètre d’accès | À examiner selon le niveau de secret configuré et les autorisations du workflow | Dépend des fonctions documentées et de la configuration du coffre |
| Responsabilité de rotation | À attribuer explicitement dans les procédures de l’équipe | À attribuer entre propriétaires du coffre et responsables des identifiants |
| Audit | Vérifier quelles traces sont réellement disponibles pour la configuration retenue | Vérifier les événements, leur conservation et les rôles pouvant les consulter |
| Usage dans un workflow | Contrôler à quel contexte le secret est exposé | Vérifier comment le workflow obtient la valeur et quelles autorisations cette opération requiert |
| Limite commune | La valeur peut être utilisée par une tâche autorisée | Le coffre ne remplace pas l’isolation du runner où la valeur est utilisée |
La documentation GitHub relative à l’usage sécurisé de GitHub Actions recommande de traiter les workflows et les actions comme des éléments de la chaîne de confiance. Elle doit guider la revue des actions tierces, des événements déclencheurs et des secrets accessibles. Elle ne permet pas de conclure qu’un stockage chiffré rend inoffensive toute tâche exécutée sur un runner.
Une organisation peut également répartir les responsabilités : l’équipe sécurité administre la source du secret, l’équipe plateforme maintient le mécanisme d’injection et le responsable de publication autorise le workflow concerné. Cette séparation est une mesure de gouvernance à documenter, non une garantie automatique fournie par GitHub Actions ou par Apple.
Pour chaque solution, consignez les personnes responsables de l’administration, de l’approbation, de la révocation et de la vérification des journaux. Si une fonction d’audit est indispensable, vérifiez sa disponibilité et ses limites dans la documentation actuelle du produit utilisé, puis faites un essai dans le contexte réel de l’organisation. Une étiquette « coffre » ou « secret » ne suffit pas à établir le niveau de contrôle obtenu.
Le trousseau temporaire est un mécanisme d’exécution
Le trousseau macOS répond au besoin du processus de signature au moment de la construction ; il ne constitue pas, par défaut, un coffre durable pour les iOS CI credentials. Apple documente une interface de création de trousseau dans sa référence à SecKeychainCreate. L’existence de cette interface ne prouve pas que le trousseau créé sera supprimé automatiquement, ni que tous les fichiers ou processus associés auront disparu à la fin du workflow.
La décision opérationnelle porte donc sur l’ensemble du parcours : le compte système qui exécute la tâche, le répertoire de travail, les permissions du trousseau, les processus qui peuvent y accéder et le nettoyage effectué après la signature. Un trousseau nommé « temporaire » qui survit au travail, ou qui est accessible à d’autres tâches, ne répond pas au besoin d’isolation simplement parce que son nom le suggère.
Les runners autohébergés ajoutent une autre limite. La documentation GitHub sur les runners autohébergés décrit des considérations de sécurité liées à leur utilisation ; il faut notamment éviter de traiter une machine réutilisée comme un environnement propre pour chaque exécution sans le démontrer. Une tâche provenant d’un dépôt ou d’un workflow moins fiable peut changer l’évaluation du risque, même si les secrets de production sont affectés à un autre workflow.
Cette distinction est particulièrement importante quand plusieurs équipes partagent le même Mac. Des comptes de dépôt distincts n’établissent pas, à eux seuls, une séparation au niveau du système d’exploitation. Il faut démontrer quelles tâches peuvent s’exécuter, sous quel compte, avec quelles permissions et dans quels répertoires. Si les tâches de confiance différente peuvent se succéder sur un même environnement persistant, la stratégie de nettoyage doit être testée et les limites de cette preuve consignées.
Organiser l’accès avant de brancher les secrets
La protection des iOS CI credentials commence par l’admissibilité du workflow, avant l’import dans le trousseau. L’équipe doit identifier les déclencheurs autorisés, les branches ou références approuvées, les actions utilisées, les permissions du jeton et le moment où une validation humaine est nécessaire. Les règles d’environnement décrites dans la documentation des déploiements et environnements GitHub peuvent contribuer à contrôler un déploiement, selon la configuration choisie.
Ces contrôles ne transforment pas automatiquement un runner autohébergé en environnement isolé. Une approbation répond à la question « le travail peut-il continuer ? » ; elle ne démontre pas que les fichiers de construction ou le trousseau sont inaccessibles à une tâche ultérieure. Les deux contrôles doivent être examinés séparément.
Les permissions du jeton de workflow doivent également être explicites et limitées aux opérations nécessaires. La syntaxe des workflows GitHub Actions permet de déclarer des permissions ; l’équipe doit comparer ces permissions avec les besoins réels du travail de signature, plutôt que de conserver une configuration large par défaut.
Avant d’accorder l’accès à une clé de publication, examinez les actions tierces et les scripts appelés par le workflow. Le fait qu’un secret ne soit pas écrit intentionnellement dans un journal ne suffit pas à prouver qu’aucun script autorisé ne peut le lire ou le transmettre. Pour les tâches non fiables, le choix prudent consiste à ne pas leur fournir les identifiants de production, même si elles s’exécutent sur le même dépôt.
Construire une preuve de fermeture après chaque tâche
Un script de suppression qui termine sans erreur n’est pas une preuve complète que la clé a disparu de toutes les surfaces accessibles. L’équipe doit distinguer les contrôles pris en charge par la plateforme de ceux qu’elle définit elle-même. Les permissions d’un workflow ou les règles d’un environnement relèvent des mécanismes documentés ; le choix d’effacer un répertoire, de supprimer un trousseau ou de recycler un compte est une procédure d’exploitation à vérifier dans son environnement réel.
Une procédure vérifiable peut suivre les étapes suivantes :
- Délimiter le travail. Associez les identifiants de publication à un workflow approuvé et à un contexte de déploiement contrôlé. Refusez l’accès aux tâches de validation qui n’ont pas besoin de signer une version.
- Injecter au moment utile. Récupérez la valeur depuis la source autorisée uniquement pour la tâche de signature. Évitez de la copier dans des fichiers persistants ou de la faire apparaître dans les paramètres consignés.
- Créer ou sélectionner le trousseau d’exécution. Vérifiez le compte effectif, les permissions et l’emplacement utilisé par le processus. Ne déduisez pas le caractère temporaire du seul nom du trousseau.
- Exécuter la signature. Contrôlez le workflow, les scripts et les actions qui reçoivent les données sensibles. Le journal doit indiquer le résultat utile sans exposer la clé, son contenu ou un artefact permettant de la récupérer.
- Fermer et nettoyer. Déclenchez les opérations prévues même en cas d’échec du travail, puis vérifiez séparément le trousseau, le répertoire de travail et les fichiers temporaires ciblés par la procédure.
- Conserver des éléments de contrôle. Enregistrez l’identifiant de l’exécution, l’identité du workflow, le résultat des contrôles et les écarts constatés. Ces éléments ne doivent pas inclure le secret lui-même.
- Tester les échecs. Vérifiez ce qui se passe lorsqu’une étape de signature échoue ou qu’une tâche est interrompue. Si le nettoyage n’est pas exécuté ou si son résultat reste invérifiable, traitez le runner comme potentiellement porteur de résidus jusqu’à sa remise en état.
La valeur probante de ces contrôles dépend de ce qu’ils mesurent réellement. Un journal attestant qu’une commande de suppression a été lancée ne démontre pas que le fichier visé était le seul exemplaire, ni qu’aucun autre processus n’en a gardé une copie. Les critères d’acceptation doivent donc préciser le périmètre de nettoyage, les limites connues et l’action corrective à appliquer en cas de résultat incertain.
Pour les équipes qui examinent également les garanties de traitement des données, la politique de confidentialité d’ArmMacs peut servir de point de départ documentaire ; elle ne remplace pas la vérification de l’architecture, des comptes et du parcours de signature effectivement utilisés.
Choisir selon la confiance accordée aux tâches
Le tableau suivant compare des options selon le risque opérationnel. Les appréciations « favorable », « à vérifier » et « défavorable » sont des repères d’analyse, pas une certification de sécurité ni une fonction garantie par une plateforme.
| Option | Séparation des tâches | Contrôle de la clé en exécution | Charge de preuve | Appréciation |
|---|---|---|---|---|
| Runner partagé et persistant, avec clé conservée localement | Faible si plusieurs tâches ou dépôts peuvent se succéder | Longue durée ou difficile à circonscrire | Élevée : résidus, comptes et accès croisés à vérifier | Défavorable pour la signature de production si les frontières sont incertaines |
| Runner partagé, secret injecté au besoin et trousseau dédié à la tâche | Dépend toujours de la séparation réelle entre tâches | Mieux circonscrit si l’import et le nettoyage sont testés | Élevée : l’injection ne prouve pas l’isolation | À vérifier dans l’environnement réel |
| Environnement de signature réservé aux workflows approuvés | Plus lisible si l’accès et les tâches autorisées sont limités | Peut être borné à l’exécution par une procédure vérifiée | Modérée à élevée, selon les preuves de nettoyage et d’accès | Favorable sous réserve d’essais et de contrôles documentés |
| Tâches de confiance différente séparées sur des runners distincts | Plus simple à démontrer si les ressources ne sont pas partagées | Limité au contexte de signature prévu | Dépend de la maintenance et de la configuration des runners | Favorable lorsque la séparation est effectivement maintenue |
Pour comparer les choix, l’équipe peut noter les solutions selon quatre critères qualitatifs : contrôle d’accès aux secrets, séparation des tâches, vérifiabilité du nettoyage et facilité de révocation. Une solution qui obtient un bon résultat sur le stockage mais laisse les workflows partager un environnement persistant ne doit pas être considérée comme équivalente à une séparation d’exécution.
| Si la situation vérifiée est… | Alors retenir… | Sinon, repli recommandé |
|---|---|---|
| Un groupe de publication identifié utilise des workflows approuvés, et l’import puis le nettoyage du trousseau sont observables | Injection contrôlée dans un trousseau limité à la tâche, avec procédure de preuve | Reporter la signature de production et corriger les lacunes de contrôle |
| Plusieurs équipes ou dépôts exécutent des tâches de niveaux de confiance différents sur le même Mac | Séparer d’abord les runners ou les périmètres d’exécution et d’autorisation | Ne pas remettre les identifiants de production au nœud partagé |
| L’équipe ne peut pas établir ce qui reste sur le Mac après une tâche | Utiliser un environnement dont le périmètre peut être vérifié avant d’autoriser la signature | Suspendre les tâches de production sur le runner concerné |
| Le processus de révocation n’est pas attribué à un responsable | Définir le propriétaire et tester le retrait des autorisations ou du secret | Ne pas lancer le pilote en production avant cette clarification |
L’évaluation finale devrait réunir un inventaire des workflows autorisés, une liste des comptes et des tâches partageant le Mac, les étapes d’import et de nettoyage, ainsi que les traces d’un essai dans l’environnement réel. Un pilote n’est pas validé par le seul succès de la compilation : il doit aussi confirmer que l’accès est limité au contexte prévu et que les preuves de fermeture répondent aux critères définis.
Les responsabilités d’exploitation et d’accompagnement autour d’un environnement Mac doivent également être examinées séparément des garanties de sécurité du workflow. La documentation d’assistance Mac d’ArmMacs peut aider à cadrer les questions relatives à l’environnement, mais la décision de confier des identifiants de production doit reposer sur les preuves propres à la configuration testée.
FAQ sur la gestion des clés de signature iOS
Un runner macOS autohébergé peut-il conserver une clé privée ?
Il peut exécuter une tâche qui utilise une clé, mais cela ne justifie pas de la conserver durablement sur un runner réutilisé. La sécurité dépend aussi de l’isolation entre tâches, des comptes système, des dépôts autorisés et du nettoyage effectivement vérifié. Si ces frontières ne peuvent pas être démontrées, séparez les tâches de signature sur un runner dédié ou isolé.
GitHub Secrets ou trousseau macOS : lequel choisir ?
Ces emplacements ne remplissent pas le même rôle. Un coffre de secrets conserve et distribue une valeur selon les autorisations configurées ; le trousseau macOS sert au processus de signature qui s’exécute sur la machine. Injectez les données nécessaires au moment du travail, puis utilisez un trousseau adapté à cette exécution. Ne prenez pas le trousseau persistant du compte comme coffre à long terme.
Comment empêcher des dépôts d’utiliser la même clé sur un Mac partagé ?
Ne comptez pas uniquement sur le chiffrement du secret. Réduisez les dépôts et les workflows autorisés à demander les identifiants, séparez les tâches de production des tâches moins fiables et définissez une frontière d’exécution vérifiable sur le Mac. Contrôlez aussi le compte système, les répertoires de travail et le nettoyage ; une approbation de déploiement ne remplace pas l’isolation.
Que contrôler après l’import d’une clé dans GitHub Actions ?
Conservez des éléments de preuve pour l’import, l’usage de signature et la tentative de suppression du trousseau, sans enregistrer la clé ni son contenu dans les journaux. Vérifiez également les fichiers de travail, les sorties du workflow et les accès au compte de construction. Une commande de suppression réussie ne démontre pas, à elle seule, que toutes les copies ou traces ont disparu.
Préparer un essai avant de confier la signature au Mac
Une organisation qui conserve une clé sur un runner partagé doit pouvoir expliquer qui peut l’injecter, quelles tâches peuvent l’utiliser et comment les résidus sont recherchés après l’exécution. Si ces réponses manquent, acheter ou maintenir un Mac partagé ne corrige pas le problème : il faut d’abord isoler les travaux de confiance différente et vérifier le processus de nettoyage.
À l’inverse, l’achat d’un Mac dédié peut convenir aux équipes qui ont besoin d’un contrôle physique direct ou d’une charge soutenue et stable. Pour un essai, une montée en charge variable ou un environnement macOS séparé de l’infrastructure interne, la location d’un Mac peut éviter de mobiliser immédiatement du matériel interne ; elle ne dispense toutefois ni de configurer les accès ni de valider le traitement des secrets. Les offres de location Mac d’ArmMacs peuvent être examinées dans ce cadre, après avoir défini les preuves d’acceptation et les limites de l’environnement requis.
Avant de choisir, consignez les tâches de signature, les dépôts concernés, les frontières de partage du runner et les preuves attendues après nettoyage. Si un environnement Mac séparé est nécessaire pour réaliser ce pilote, comparez les options disponibles à ces critères et ne confiez les identifiants de production qu’une fois les contrôles observés dans la configuration réelle.
Questions fréquentes
Un runner macOS autohébergé peut-il conserver une clé privée de signature iOS en sécurité ?
Il peut exécuter une tâche qui utilise une clé, mais cela ne justifie pas de la conserver durablement sur un runner réutilisé. La sécurité dépend aussi de l’isolation entre tâches, des comptes système, des dépôts autorisés et du nettoyage effectivement vérifié. Si ces frontières ne peuvent pas être démontrées, séparez les tâches de signature sur un runner dédié ou isolé.
Faut-il stocker le certificat iOS dans GitHub Secrets ou dans le trousseau macOS ?
Ces emplacements ne remplissent pas le même rôle. Un coffre de secrets conserve et distribue une valeur selon les autorisations configurées ; le trousseau macOS sert au processus de signature qui s’exécute sur la machine. Injectez les données nécessaires au moment du travail, puis utilisez un trousseau adapté à cette exécution. Ne prenez pas le trousseau persistant du compte comme coffre à long terme.
Comment empêcher les dépôts d’utiliser les mêmes identifiants de signature sur un Mac partagé ?
Ne comptez pas uniquement sur le chiffrement du secret. Réduisez les dépôts et les workflows autorisés à demander les identifiants, séparez les tâches de production des tâches moins fiables et définissez une frontière d’exécution vérifiable sur le Mac. Contrôlez aussi le compte système, les répertoires de travail et les processus de nettoyage ; une approbation de déploiement ne remplace pas cette isolation.
Que faut-il vérifier après l’import d’une clé de signature dans un workflow ?
Conservez des éléments de preuve pour l’import, l’usage de signature et la tentative de suppression du trousseau, sans enregistrer la clé ni son contenu dans les journaux. Vérifiez également les fichiers de travail, les sorties du workflow et les accès au compte de construction. Une commande de suppression réussie ne démontre pas, à elle seule, que toutes les copies ou traces ont disparu.
ArmMacs Cloud Mac
Préparez vos builds iOS sur un Mac dédié avec ArmMacs
Louez un Mac physique dédié pour héberger votre runner macOS et adapter ses ressources à vos besoins de compilation.
