From: fbothamy Date: Tue, 25 Oct 2005 23:24:17 +0000 (+0000) Subject: Sync to CVS 1.271 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=276712b47aa8fa22acc0fc291dd4535179b28f9a;p=developers-reference.git Sync to CVS 1.271 git-svn-id: svn://anonscm.debian.org/ddp/manuals/trunk/developers-reference@3572 313b444b-1b9f-4f58-a734-7bb04f332e8d --- diff --git a/developers-reference.fr.sgml b/developers-reference.fr.sgml index 7336a9f..783b355 100644 --- a/developers-reference.fr.sgml +++ b/developers-reference.fr.sgml @@ -7,10 +7,10 @@ %dynamicdata; - + - + FIXME: "> @@ -4458,6 +4458,300 @@ de l'utiliser dans les scripts qui sont ex problème. + + Les meilleures pratiques pour les revues et conception de sécurité + +

Si vous empaquetez un logiciel pour d'autres utilisateurs, vous devez +vous efforcer de garantir que l'installation du logiciel, ou son +utilisation, n'introduit pas de risques de sécurité soit pour le +système sur lequel il est installé, soit pour ses utilisateurs.

+ +

Vous devez vous efforcer de faire une revue du code source du paquet +et détecter les problèmes qui pourraient introduire des bogues de +sécurité. Les bogues de programmation entraînant des bogues de sécurité +incluent généralement : , , et (dans les programmes C/C++), temporaires (dans les scripts), et injection de commandes (dans les serveurs) et , et (dans le cas d'applications orientées web).

+ +

Certains de ces problèmes peuvent ne pas être évidents à détecter à +moins d'être un expert dans le langage de programmation utilisé par le +programme, mais certains problèmes de sécurité sont faciles à détecter et +à corriger. Par exemple, trouver des conditions de concurrence +temporaires dans un code source peut facilement être fait en exécutant +grep -r "/tmp/" . dans le code source et en remplaçant les noms +de fichier codés en dur utilisant des répertoires temporaires par des +appels soit à mktemp ou à tempfile dans les +scripts shell, à dans les +scripts Perl, et à pour du C/C++. +Vous pouvez également utiliser des pour assister la phase de revue du code de sécurité.

+ +

Quand vous empaquetez un logiciel, assurez-vous que : + + + +le logiciel fonctionne avec le minimum de privilèges dont il a besoin : + + +le paquet installe des binaires setuid ou setgid. +Lintian émettra un avertissement pour les binaires , et . + +les démons fournis par le paquet s'exécutent avec un utilisateur à +privilège réduit (voir ) + + + +Les tãches programmées (par exemple, cron) +fonctionnant dans le système ne s'exécutent PAS en tant que root ou si +elles le font, elles n'implémentent pas de tâches complexes. + + + +

Si vous avez l'un des cas ci-dessus, assurez-vous que les programmes +qui s'exécutent avec des privilèges plus élevés ont été audités pour les +bogues de sécurité. Si vous n'en êtes pas certain ou si vous avez besoin +d'aide, contactez l'. Dans le cas de binaires setuid/setgid, suivez la +charte Debian en ce qui concerne les +. +

+ +

Pour plus d'informations spécifiques à la programmation sécurisée, +assurez-vous de lire (ou de signaler au développeur amont) et le portail . Pour plus d'informations spécifiques à la sécurité Debian, vous +pouvez lire le +

+ + + + + Créer des groupes et des utilisateurs pour des démons + logiciels + +

Si votre logiciel exécute un démon qui n'a pas besoin des privilèges +du superadministrateur, vous devez lui créer un utilisateur. Il existe +deux types d'utilisateurs Debian pouvant être utilisés par des +paquets : les identifiants statiques (assignés par +base-passwd) et les identifiants dynamiques dans +l'intervalle assigné aux utilisateurs système. + +

Dans le premier cas, vous devez demander un identifiant d'utilisateur +ou de groupe à base-passwd et ajouter une dépendance +versionnée correctement sur le paquet base-passwd +fournissant cet utilisateur. + +

Dans le second cas, vous devez créer l'utilisateur système dans +le script preinst ou postinst et rendre le paquet +dépendant de adduser (>= 3.11). + +

Le code exemple suivant crée l'utilisateur et le groupe du démon avec +lequel le démon fonctionnera au moment de l'installation ou de la mise à +jour du paquet : + + +[...] +case "$1" in + install|upgrade) + + # Si le paquet a un fichier par défaut, il peut être sourcé afin + # que l'administrateur local puisse écraser les valeurs par défaut + + [ -f "/etc/default/packagename" ] && . + /etc/default/packagename + + + # Valeurs par défaut saines : + + [ -z "$SERVER_HOME" ] && SERVER_HOME=server_dir + [ -z "$SERVER_USER" ] && SERVER_USER=server_user + [ -z "$SERVER_NAME" ] && SERVER_NAME="Server description" + [ -z "$SERVER_GROUP" ] && SERVER_GROUP=server_group + + # Groupes auxquels l'utilisateur sera ajouté, si non défini, alors rien. + ADDGROUP="" + + + # Crée l'utilisateur pour éviter d'exécuter le serveur en tant que root + # 1. Création du groupe s'il n'existe pas + if ! getent group | grep -q "^$SERVER_GROUP:" ; then + echo -n "Adding group $SERVER_GROUP.." + addgroup --quiet --system $SERVER_GROUP 2>/dev/null ||true + echo "..done" + fi + # 2. Création du répertoire personnel s'il n'existe pas + test -d $SERVER_HOME || mkdir $SERVER_HOME + # 3. Création de l'utilisateur s'il n'existe pas + if ! getent passwd | grep -q "^$SERVER_USER:"; then + echo -n "Adding system user $SERVER_USER.." + adduser --quiet \ + --system \ + --ingroup $SERVER_GROUP \ + --no-create-home \ + --disabled-password \ + $SERVER_USER 2>/dev/null || true + echo "..done" + fi + # 4. Ajuste l'entrée du mot de passe + usermod -c "$SERVER_NAME" \ + -d $SERVER_HOME \ + -g $SERVER_GROUP \ + $SERVER_USER + # 5. Ajuste les permissions de fichiers et répertoires + if ! dpkg-statoverride --list $SERVER_HOME >/dev/null + then + chown -R $SERVER_USER:adm $SERVER_HOME + chmod u=rwx,g=rxs,o= $SERVER_HOME + fi + # 6. Ajoute l'utilisateurs au groupe ADDGROUP + if test -n $ADDGROUP + then + if ! groups $SERVER_USER | grep -q $ADDGROUP; then + adduser $SERVER_USER $ADDGROUP + fi + fi + ;; + configure) + +[...] + + +

Vous devez vous assurer que le fichier script d'init.d : + + +lance le démon en abandonnant les privilèges, si le logiciel ne +fait pas les appels ou lui-même, vous pouvez utiliser l'option +--chuid de start-stop-daemon. + +arrête le démon seulement si l'identifiant utilisateur correspond, +vous pouvez utiliser l'option --user de +start-stop-daemon pour cela. + +ne s'exécute pas si l'utilisateur ou le groupe n'existe pas : + + if getent passwd | grep -q "^server_user:"; then + echo "Server user does not exist. Aborting" >&2 + exit 1 + fi + if getent group | grep -q "^server_group:" ; then + echo "Server group does not exist. Aborting" >&2 + exit 1 + fi + + + + +

Si le paquet crée l'utilisateur système, il peut l'enlever quand il +est purgé dans son script postrm, cela a certains inconvénients +Par exemple, les fichiers créés par celui-ci seront sans +propriétaire et peuvent être récupérés par un nouvel utilisateur système +dans le futur si celui-ci reçoit le même identifiant utilisateur. +Voir les fils de discussion suivants qui traitant de ces +inconvénients : +et + +, +ce n'est donc pas obligatoire et cela dépend des besoins du paquet. En +cas de doute, cela peut être géré en demandant à l'administrateur son +choix lors de l'installation du paquet (voir ). Le code exemple suivant supprime l'utilisateur et le +groupe créés auparavant si et seulement si l'identifiant utilisateur est +dans l'intervalle des identifiants d'utilisateur système assignés +dynamiquement et si l'identifiant de groupe appartient à un groupe +système : + + +case "$1" in + purge) +[...] + # Trouve les premier et dernier numéros SYSTEM_UID + for LINE in `grep SYSTEM_UID /etc/adduser.conf | grep -v "^#"`; do + case $LINE in + FIRST_SYSTEM_UID*) + FIST_SYSTEM_UID=`echo $LINE | cut -f2 -d '='` + ;; + LAST_SYSTEM_UID*) + LAST_SYSTEM_UID=`echo $LINE | cut -f2 -d '='` + ;; + *) + ;; + esac + done + # Supprime le compte système si nécessaire + CREATEDUSER="server_user" + if [ -n "$FIST_SYSTEM_UID" ] && [ -n "$LAST_SYSTEM_UID" ]; then + if USERID=`getent passwd $CREATEDUSER | cut -f 3 -d ':'`; then + if [ -n "$USERID" ]; then + if [ "$FIST_SYSTEM_UID" -le "$USERID" ] && \ + [ "$USERID" -le "$LAST_SYSTEM_UID" ]; then + echo -n "Removing $CREATEDUSER system user.." + deluser --quiet $CREATEDUSER || true + echo "..done" + fi + fi + fi + fi + # Supprime le groupe système si nécessaire + CREATEDGROUP=server_group + FIRST_USER_GID=`grep ^USERS_GID /etc/adduser.conf | cut -f2 -d '='` + if [ -n "$FIST_USER_GID" ] then + if GROUPGID=`getent group $CREATEDGROUP | cut -f 3 -d ':'`; then + if [ -n "$GROUPGID" ]; then + if [ "$FIST_USER_GID" -gt "$GROUPGID" ]; then + echo -n "Removing $CREATEDGROUP group.." + delgroup --only-if-empty $CREATEDGROUP || true + echo "..done" + fi + fi + fi + fi +[...] + + +

Exécuter des programmes avec un utilisateur ayant des privilèges +limités garantit que tout problème de sécurité du programme n'entraînera +que des dommages limités au système et cela suit le principe du moindre +privilège, vous pouvez limiter les privilèges dans les programmes +par d'autres mécanismes en plus de le faire s'exécuter en tant que +non-superutilisateur. Pour plus d'informations, lisez le chapitre du livre Secure Programming for Linux +and Unix HOWTO. + + + + + + Gestion de la configuration avec debconf @@ -5393,7 +5687,7 @@ Quand vous envoyez un grand nombre de rapports sur le m Travail journalier

-Bien qu'il y ait un groupe de personnes dédiées à l'assurance qualité, les +Bien qu'il y ait un groupe de personnes dédié à l'assurance qualité, les devoirs de QA ne leur sont pas exclusivement réservés. Vous pouvez participer à cet effort en conservant vos paquets aussi exempts de bogues que possible et aussi corrects que possible selon lintian (reportez-vous à Un gros problème est représenté par les paquets parrainés — le responsable n'est pas un développeur Debian officiel. Les informations « echelon » -ne sont pas disponibles pour les personnes parrainés, par exemple, vous devez +ne sont pas disponibles pour les personnes parrainées, par exemple, vous devez donc trouver et contacter le responsable Debian qui a réellement envoyé le paquet. Étant donné qu'il a signé le paquet, il est responsable de l'envoi de toute façon et il devrait savoir ce qui s'est passé avec la personne qu'il @@ -5540,7 +5834,7 @@ Vous n' Elle est peut-être sérieusement malade ou pourrait même nous avoir quitté — vous ne savez pas qui recevra vos courriers. Imaginez comme un proche se sentira s'il lit un courrier pour la personne décédée et trouve un -message très impoli, en colère et accusateur !) +message très impoli, en colère et accusateur !

D'un autre côté, bien que nous soyons tous volontaires, nous avons une responsabilité. Vous pouvez donc insister sur l'importance du plus grand intérêt