Sécurisation des utilisateurs et des processus dans Oracle® Solaris 11.2

Quitter la vue de l'impression

Mis à jour : Juillet 2014
 
 

Verrouiller les ressources à l'aide de privilèges étendus

Une stratégie de sécurité restrictive peut limiter l'accès des pirates à un ordinateur en cas d'attaque réussie sur une application. Une stratégie étendue règle limite l'étendue de l'effet de l'affectation de privilèges seulement les étapes intra-opérations une ressource dans la règle. Stratégie étendue les règles sont exprimées en plaçant les privilèges entre accolades, suivi de deux points et la ressource associée. Pour plus d'informations, reportez-vous à la section Extension des privilèges d'un utilisateur ou d'un rôle. Pour des exemples de syntaxe, reportez-vous aux pages de manuel ppriv(1) et privileges(5).

Les utilisateurs standard peuvent aussi bien les administrateurs vers le bas et des ressources à l'aide de verrouillage des privilèges étendus. Les administrateurs peuvent créer de règles pour les utilisateurs de privilège étendue, les ports et d'applications. Les utilisateurs standard peuvent se servir de la ligne de commande ou de scripts utilisant la commande ppriv -r pour empêcher les applications d'écrire dans des fichiers situés hors des répertoires spécifiés par l'utilisateur.

Application d'une stratégie de privilège étendue à un port

Le service du protocole NTP (Network Time Protocol) utilise le port privilégié 123 pour le trafic udp. Il faut disposer des privilèges pour ce service à exécuter. Cet exemple de procédure modifie le manifeste du service afin d'empêcher l'accès à d'autres ports par un utilisateur malveillant susceptible d'obtenir les privilèges affectés aux ports en question.

Avant de commencer

Vous devez prendre le rôle root. Pour plus d'informations, voir A l'aide de vos droits administratifs attribués.

  1. Reportez-vous à l'entrée de manifeste de service par défaut pour le port.

    A partir de l'entrée de méthode /lib/svc/manifest/network/ntp.xml start, les privilèges net_privaddr, proc_lock_memory et sys_time pourraient être utilisés sur d'autres processus :

    privileges='basic,!file_link_any,!proc_info,!proc_session,net_privaddr,
    proc_lock_memory,sys_time'

    Les privilèges supprimés spécifiés par !file_link_any,!proc_info,!proc_session empêchent le service de signaler ou d'observer tout autre processus, ou de créer des liens physiques afin de renommer des fichiers. Par conséquent, le processus démarré par le service ne peut établir de liaison qu'avec le port NTP 123, c'est-à-dire avec aucun autre port privilégié.

    Si un pirate peut exploiter le service afin de démarrer un autre processus, celui-ci être la même façon limitée.

  2. Modifiez les méthodes start et restart afin de limiter le privilège net_privaddr à ce port uniquement.
    # svccfg -s ntp editprop
    1. Recherchez la chaîne net_privaddr.
    2. Supprimer la mise en commentaire des entrées qui contiennent net_privaddr.
    3. Dans les deux entrées, remplacez net_privaddr par {net_privaddr}:123/udp.

      La stratégie de privilège étendue service supprime tous les privilèges octroyés sauf les privilèges spécifiés et les privilièges de base qui ne sont pas spécifiés. Par conséquent, l'ensemble des quatre-vingt privilèges exploitables est réduit à moins de huit.

  3. Redémarrez le service pour utiliser la stratégie de privilège étendu.
    # svcadm restart ntp
  4. Assurez-vous que le service utilise le privilège étendu.
    # svccfg -s ntp listprop | grep privileges
    start/privileges    astring  basic,!file_link_any,!proc_info,!proc_session,
                        {net_privaddr}:123/udp,proc_lock_memory,sys_time
    restart/privileges  astring  basic,!file_link_any,!proc_info,!proc_session,
                        {net_privaddr}:123/udp,proc_lock_memory,sys_time
    

Procédure de verrouillage du service MySQL

Lors de l'installation, la base de données MySQL est configurée pour être exécutée avec les privilèges d'accès complet root sur un port non protégé. Dans cette tâche, vous affectez la stratégie de privilège étendu au service MySQL dans un profil de droits. Lorsque le profil de droits devient la méthode exec du service, MySQL s'exécute sur un port protégé en tant que l'utilisateur mysql, avec un accès limité à la base de données par les processus non MySQL.

Avant de commencer

L'utilisateur initial peut installer le package. Les étapes restantes doivent être effectuées par le rôle root. Pour plus d'informations, voir A l'aide de vos droits administratifs attribués.

  1. Installation du package MySQL.
    # pkg search basename:mysql
    ...
    basename ... pkg:/database/mysql-51@version
    # pfexec pkg install mysql-51

    Remarque - Si vous mettez la base de données à niveau vers la version 5.5 de MySQL, modifiez toutes les étapes afin d'utiliser 5.5 et 55 au lieu de 5.1 et 51.
  2. Affichez FMRI et l'état du service MySQL.
    # svcs mysql
    STATE          STIME    FMRI
    disabled       May_15   svc:/application/database/mysql:version_51
  3. Créez un profil de droits qui modifie la méthode d'exécution du service.

    Le manifeste de ce service spécifie que la méthode d'execution est un wrapper de script shell, /lib/svc/method/mysql_51.

    # svccfg -s mysql listprop | grep manifest
    ... astring     /lib/svc/manifest/application/database/mysql_51.xml
    # grep exec= /lib/svc/manifest/application/database/mysql_51.xml
                    exec='/lib/svc/method/mysql_51 start'
                    exec='/lib/svc/method/mysql_51 stop'
    

    Utilisez le wrapper /lib/svc/method/mysql_51 pour la commande dans le profil.

    % su -
    Password: xxxxxxxx
    # profiles -p "MySQL Service"
    MySQL Service> set desc="Locking down the MySQL Service"
    MySQL Service> add cmd=/lib/svc/method/mysql_51
    MySQL Service:mysql_51> set privs=basic
    MySQL Service:mysql_51> add privs={net_privaddr}:3306/tcp
    MySQL Service:mysql_51> add privs={file_write}:/var/mysql/5.1/data/*
    MySQL Service:mysql_51> add privs={file_write}:/tmp/mysql.sock
    MySQL Service:mysql_51> add privs={file_write}:/var/tmp/ib*
    MySQL Service:mysql_51> end
    MySQL Service> set uid=mysql
    MySQL Service> set gid=mysql
    MySQL Service> exit

    Le privilège file_write est un privilège de base accordé par défaut à tous les processus. Lors de l'énumération explicite des chemins, l'accès en mode écriture est limité à ces chemins d'accès uniquement. Cette contrainte s'applique à l'exécutable et ses processus enfants.

  4. Définissez le port par défaut pour MySQL comme port privilégié.
    # ipadm set-prop -p extra_priv_ports+=3306 tcpipadm show-prop -p extra_priv_ports tcp
    PROTO PROPERTY            PERM CURRENT     PERSISTENT   DEFAULT    POSSIBLE
    tcp   extra_priv_ports    rw   2049,4045,  3306         2049,4045  1-65535
                                     3306

    Le privilègenet_privaddr est obligatoire pour établir la liaison avec un port privilégié. Pour MySQL, se connecter au numéro de port par défaut, 3306, ne nécessite normalement pas ce privilège.

  5. Affectez le profil de droits au service MySQL et dites au service de l'utiliser.
    # svccfg -s mysql:version_51
    ...version_51> setprop method_context/profile="MySQLService"
    ...version_51> setprop method_context/use_profile=true
    ...version_51> refresh
    ...version_51> exit
  6. Activez le service.

    Le dernier composant du FMRI, mysql:version_51, est suffisant pour spécifier le service de manière unique.

    svcadm enable mysql:version_5
  7. (Facultatif) Vérifiez que le service est en cours d'exécution avec les droits spécifiés dans le profil de droits MySQL Service.
    # ppriv $(pgrep mysql)
    103697:   /usr/mysql/5.1/bin/mysqld --basedir=/usr/mysql/5.1 
                                        --datadir=/var/mysql/5.1/data
    flags =   PRIV_XPOLICY
        Extended policies: 
                 {net_privaddr}:3306/tcp   
                 {file_write}:/var/mysql/5.1/data/*
                 {file_write}:/tmp/mysql.sock  
                 {file_write}:/var/tmp/ib*
            E: basic,!file_write
            I: basic,!file_write
            P: basic,!file_write
            L: all
    103609:  /bin/sh /usr/mysql/5.1/bin/mysqld_safe --user=mysql 
                                   --datadir=/var/mysql/5.1/data
    flags =  PRIV_XPOLICY
        Extended policies:
                 {net_privaddr}:3306/tcp
                 {file_write}:/var/mysql/5.1/data/*
                 {file_write}:/tmp/mysql.sock
                 {file_write}:/var/tmp/ib*
            E: basic,!file_write       
            I: basic,!file_write       
            P: basic,!file_write       
            L: all

Procédure d'assignation de privilèges propres au shell Apache du serveur Web

Cette procédure verrouille le démon de serveur Web par le biais d'une affectation à celle-ci est uniquement les privilèges dont il a besoin. Le serveur Web ne peut être lié qu'au port 80 et peut uniquement effectuer des opérations d'écriture dans des fichiers dont le démon webservd est propriétaire. Aucun processus du service apache22 ne s'exécute en tant que root.

Avant de commencer

Vous devez prendre le rôle root. Pour plus d'informations, voir A l'aide de vos droits administratifs attribués.

  1. Créez le profil de droits du serveur Web.
    # profiles -p "Apache2"
    profiles:Apache2> set desc="Apache Web Server Extended Privilege"
    profiles:Apache2> add cmd=/lib/svc/method/http-apache22
    profiles:Apache2:http-apache22> add privs={net_privaddr}:80/tcp
    ...http-apache22> add privs={zone}:/system/volatile/apache2
    ...http-apache22> add privs={zone}:/var/apache2/2.2/logs/*
    ...http-apache22> add privs={zone}:/var/user
    ...http-apache22> add privs={file_write}:/var/user/webserv*
    ...http-apache22> add privs={file_write}:/tmp/*
    ...http-apache22> add privs={file_write}:/system/volatile/apache*
    ...http-apache22> add privs={file_write}:/proc/*
    ...http-apache22> add privs=basic,proc_priocntl
    ...http-apache22> set uid=webservd
    ...http-apache22> set gid=webservd
    ...http-apache22> end
    ---Apache2> exit
  2. (Facultatif) Si vous utilisez le service proxy SSL au niveau du noyau avec Apache 2, vous devez ajouter les ports SSL à votre stratégie étendue webservd.
    # profiles -p "Apache2"
    profiles:Apache2> add privs={net_privaddr}:443/tcp
    profiles:Apache2> add privs={net_privaddr}:8443/tcp
    profiles:Apache2:http-apache22> end

    La procédure du proxy SSL au niveau du noyau est décrite dans la section Configuration d’un serveur Web Apache 2.2 afin qu’il utilise le proxy SSL au niveau du noyau du manuel Sécurisation du réseau dans Oracle Solaris 11.2 .

  3. Ajoutez le profil de droits à la méthode de démarrage du service apache22.
    # svccfg -s apache22
    svc:/network/http:Apache2> listprop start/exec
    start/exec	 astring	"/lib/svc/method/http-apache22 start"
    ...
    svc:/network/http:Apache2> setprop start/profile="Apache2"
    svc:/network/http:Apache2> setprop start/use_profile=true
    svc:/network/http:Apache2> refresh
    svc:/network/http:Apache2> exit

    Lorsque le service apache22 est activé, le profil Apache 2 est utilisé.

  4. Activez le service apache22.
    # svcadm enable apache22
  5. Vérifiez que le serveur Web fonctionne.

    Ouvrez Firefox et tapez localhost dans le champ d'adresse.

Etapes suivantes

Pour vérifier que ces privilèges s'appliquent correctement, reportez-vous à la section Procédure de détermination des privilèges que le serveur Web Apache utilise.

Procédure de détermination des privilèges que le serveur Web Apache utilise

Cette opération consiste à déterminer les privilèges par le serveur Web est de débogage à l'aide de la création d'un profil de droits version Apache 2.

Avant de commencer

Vous avez terminé la section Procédure d'assignation de privilèges propres au shell Apache du serveur Web. Le service apache22 est désactivé. Vous êtes dans le rôle root.

  1. Clonez le profil Apache 2 pour appeler une autre commande.

    Il est plus simple de déboguer une commande qu'un service SMF. La commande apachectldémarre le service Apache de façon interactive.

    # profiles -p "Apache2"
    profiles:Apache2> set name="Apache-debug"
    profiles:Apache-debug> sel <Tab><Tab>
    profiles:Apache-debug:http-apache22> set id=/usr/apache2/2.2/bin/apachectl
    profiles:Apache-debug:apachectl> end
    profiles:Apache-debug> exit

    Pour plus d'informations, reportez-vous à la page de manuel apachectl(8).

  2. Affectez le profil cloné au compte webservd.
    # usermod -K profiles+=Apache-debug webservd
  3. Prenez l'identitéwebservd.
    # su - webservd
  4. (Facultatif) Vérifiez l'identité.
    # id   
    uid=80(webservd) gid=80(webservd)
  5. Démarrez le service Web en mode de débogage dans un shell de profil.

    N'utilisez pas SMF directement. Utilisez la commande du profil de droitsApache-debug.

    % pfbash
    # ppriv -De /usr/apache2/2.2/bin/apachectl start
  6. Dans le rôle root, examinez les privilèges du premier démon http.
    # ppriv $(pgrep httpd|head -1)
    2999:   httpd
    flags = PRIV_DEBUG|PRIV_XPOLICY|PRIV_EXEC
      5         Extended policies:
      6                 {net_privaddr}:80/tcp
      7                 {zone}:/system/volatile/apache2
      8                 {zone}:/var/apache2/2.2/logs/*
      9                 {zone}:/var/user
     10                 {file_write}:/var/user/webserv*
     11                 {file_write}:/tmp/*
     12                 {file_write}:/system/volatile/apache*
     13                 {file_write}:/proc/*
     14         E: basic,!file_write,!proc_info,proc_priocntl
     15         I: basic,!file_write,!proc_info,proc_priocntl
     16         P: basic,!file_write,!proc_info,proc_priocntl
     17         L: all