Dans des périodes plus tôt, le modèle de sécurité standard des logiciels d'exploitation pour de GNU/Linux et d'Unix a donné aux utilisateurs généraux un ensemble minimal de privilèges, tout en accordant de pleins privilèges à un compte d'utilisateur simple, c.-à-d. la racine, qui a été employée pour administrer le système et les utilisateurs, installer des systèmes de fichiers de logiciel, de bâti et d'unmount, modules de chargement de grain, lient un processus à un port privilégié et dirigent beaucoup de services.
Cette dépendance sur le compte de racine pour effectuer toutes les actions exigeant le privilège a été identifiée pour être quelque peu dangereuse parce qu'elle était toute ou rien et n'a pas été adaptée au compartimentage des rôles. En outre, elle a augmenté le risque de vulnérabilités dans une application de setuid qui peut seulement exiger des privilèges de racine pour une fraction très petite de son activité telle qu'ouvrir un fichier système ou une attache à un port privilégié.
Ce risque a été bien compris au sein de la communauté de systèmes ouverts. En conséquence, IEEE Std.1003.1e (aka POSIX.1e ou POSIX.6) était un effet principal commencé en 1995 pour développer un ensemble normalisé d'interfaces de sécurité pour les systèmes de conformation qui les listes de contrôle d'accès incluses (ACL), l'audit, la séparation du privilège (possibilités), le contrôle d'accès obligatoire (MAC) et les étiquettes de l'information.
Le travail a été terminé par RevCon d'IEEE en 1998 à l'ébauche 17 du document dû au manque de consensus (la plupart du temps en raison de la pratique existante contradictoire.) Tandis que l'effort formel de normes échouait, depuis lors une grande partie du projet de norme a fait sa manière au grain de Linux comprenant les possibilités que ce poteau explore.
D'abord, que voulons-nous dire par des possibilités de Linux ? C'est fondamentalement un verion prolongé du modèle de possibilités décrit dans la norme de l'ébauche POSIX.1e. Les lecteurs au courant du VMS ou des versions d'Unix qui incluent fait confiance que la base informatique (TCB) l'identifieront en tant qu'étant quelque peu analogues à comme les privilèges. Ces possibilités divisent l'ensemble de privlileges de racine en jeu de privilèges logiques distincts qui peuvent être accordés ou assignés aux processus, utilisateurs, systèmes de fichiers et plus. Comme aparté, les possibilités de limite ont provenu d'un papier 1966 par Jack Dennis et Earl Van Horn (CACM vol. 9, #3, pp 143-155, mars 1966.) Les possibilités peuvent être de plusieurs manières l'inclusion mise en application par l'intermédiaire des étiquettes de matériel, cryptographie, dans un langage de programmation (par exemple. Java) ou employant l'espace d'adressage protégé. Pour une introduction aux mécanismes possibilité-basés allez ici. Le Linux emploie l'espace d'adressage protégé et les attributs de dossier prolongés aux possibilités d'instrument.
Un drapeau de possibilités est un attribut des possibilités. Il y a trois drapeaux de possibilités, appelés (p) autorisé, de (e) efficace et (i) hérité, lié à chacune des possibilités qui, d'ailleurs, sont documentées dans l'en-tête de <security/capability.h>.
Un ensemble de possibilités se compose d'une carte binaire 64-bit (avant le libcap 2.03 une carte binaire étaient 32 bits.) Un processus a un état de possibilités se composer de trois ensembles de possibilités, c.-à-d. (i) dont on peut hériter, (p) autorisé et (e) efficace, avec chaque drapeau de possibilités mis en application comme peu dans chacune des trois cartes binaires.
Toutes les fois qu'un processus essaye une opération privilégiée, le grain vérifie que le peu approprié dans l'ensemble efficace est placé. Par exemple, quand un processus essaye de régler l'horloge monotomic, de grain les contrôles d'abord que le peu de CAP_SYS_TIME est placé dans l'ensemble efficace de processus.
L'ensemble autorisé indique quelles possibilités un processus peut employer. Un processus peut avoir des possibilités réglées dans l'ensemble autorisé qui ne sont pas dans l'ensemble efficace. Ceci indique que le processus a temporairement désactivé ces possibilités. On permet à un un processus de placer son ensemble efficace mordu seulement s'il est disponible dans l'ensemble autorisé. La distinction entre laissé et l'efficace existe de sorte qu'un processus puisse les opérations de parenthèse qui ont besoin de privilège.
Les possibilités dont on peut hériter sont les possibilités du processus courant qui devrait être hérité par un programme exécuté par le processus courant. L'ensemble autorisé d'un processus est masqué contre l'ensemble dont on peut hériter pendant l'exec, alors que des processus fils et les fils sont donnés une copie exacte des possibilités du processus père.
Plutôt qu'entrant dans un explaination détaillé des ensembles et des calculs obligatoires de possibilités, je vous renvoie à l'excellente explication de Chris Friedhoff. Cependant, j'ai récapitulé les règles dans le diagramme suivant.
Pour notre premier exemple de modifier des possibilités considérez l'utilité de cinglement. Beaucoup de personnes ne se rendent pas compte que c'est un setuid exécutable sur la plupart des systèmes de GNU/Linux. Il doit être ainsi parce qu'il a besoin de privilège d'écrire le type de paquets qu'il emploie pour sonder le réseau.
$ LS - Al /bin/ping - 02:02 2008-09-26 /bin/ping de la racine 41784 de racine du rwsr-xr-x 1 Si vous copiez le cinglement, il perd son peu de setuid et ne travaille pas cp /bin/ping de $. $ LS - cinglement d'Al - cinglement du 20:26 2009-05-29 du fpm 41784 de fpm du rwxr-xr-x 1 $ de localhost de ./ping cinglement : douille ouverte d'ICMP : Opération non autorisée mais travaux si vous devenez racine # ./ping - localhost c1 PING localhost.localdomain (127.0.0.1) 56 (84) bytes de données. 64 bytes de localhost.localdomain (127.0.0.1) : Mme d'icmp_seq=1 ttl=64 time=0.026 --- statistiques de cinglement de localhost.localdomain --- 1 les paquets transmis, 1 ont reçu, perte de paquet de 0%, le temps 0ms minute/avg/maximum/mdev de RTT = 0.026/0.026/0.026/0.000 Mme comme la racine ajoutent CAP_NET_RAW aux possibilités autorisées et ont placé le peu efficace de legs # cap_net_raw=ep ./ping de /usr/sbin/setcap vérifiez ce que les possibilités cinglent ont maintenant # /usr/sbin/getcap ./ping ./ping = cap_net_raw+ep et travaux de ce cinglement de fois sans être setuid $ LS - Al ./ping - 20:26 2009-05-29 ./ping du fpm 41784 de fpm du rwxr-xr-x 1 $ ./ping - localhost c1 PING localhost.localdomain (127.0.0.1) 56 (84) bytes de données. 64 bytes de localhost.localdomain (127.0.0.1) : Mme d'icmp_seq=1 ttl=64 time=0.026 --- statistiques de cinglement de localhost.localdomain --- 1 les paquets transmis, 1 ont reçu, perte de paquet de 0%, le temps 0ms minute/avg/maximum/mdev de RTT = 0.026/0.026/0.026/0.000 Mme
Un autre scénario pourrait être que nous voulons enlever le peu de setuid du cinglement mais permettre à un utilisateur non-root de l'employer. Nous pouvons faire ceci utilisant le module de pam_cap de PAM qui est ce qui fait partie du paquet de libcap. Le fichier de configuration de défaut pour ce module de PAM est /etc/security/capability.conf mais cela peut être recouvert utilisant un argument de config=filename. Un autre argument que vous pouvez passer au module est corrigent. Toutes les erreurs sont écrites au dossier de registre d'erreurs pour ce module qui est pam_cap.
L'exemple suivant montre comment configurer le pam_cap pour permettre à l'essai d'utilisateur d'employer le cinglement
chat /security/capability.conf # # /etc/security/capability.conf # dernier éditez FPM 05/29/2009 # l'utilisateur « essai » de ## peut employer le cinglement par l'intermédiaire de la transmission essai de cap_net_raw le ## chacun n'obtient autrement aucune possibilité dont on peut hériter aucun * assurez-vous après que pam_cap.so est exigé par le su chat /etc/pam.d/su #%PAM-1.0 auth suffisamment pam_rootok.so # Uncomment la ligne suivante pour faire confiance implicitement à des utilisateurs dans le groupe de « roue ». #auth suffisamment use_uid de confiance de pam_wheel.so # Uncomment la ligne suivante pour exiger d'un utilisateur d'être dans le groupe de « roue ». #auth requis use_uid de pam_wheel.so # pam_cap.so supplémentaire par FPM 5/29/2009 auth requis pam_cap.so corrigent auth incluez système-auth compte suffisamment uid de pam_succeed_if.so = 0 tranquillités d'use_uid compte incluez système-auth mot de passe incluez système-auth session incluez système-auth session facultatif pam_xauth.so installez maintenant les possibilités pour le cinglement que nous allons employer aucun peu efficace de legs (e), aucun privilège permis # /usr/sbin/setcap - r ./ping # cap_net_raw=p ./ping de /usr/sbin/setcap # /usr/sbin/getcap ./ping ./ping = cap_net_raw+p est-ce que je peux cingler comme fpm ? numéro. identification de $ - l'ONU fpm ~test cd de $ $ ./ping - q - localhost c1 cinglement : douille ouverte d'ICMP : Opération non autorisée est-ce que je peux cingler comme essai ? oui. $ su - essai Mot de passe : identification de $ - l'ONU essai $ ./ping - q - localhost c1 PING localhost.localdomain (127.0.0.1) 56 (84) bytes de données. --- statistiques de cinglement de localhost.localdomain --- 1 les paquets transmis, 1 ont reçu, perte de paquet de 0%, le temps 0ms minute/avg/maximum/mdev de RTT = 0.024/0.024/0.024/0.000 Mme
L'utilité non documentée de /usr/sbin/capsh peut être employée pour contrôler des possibilités et pour réduire le potentiel pour des vulnérabilités en manuscrits de coquille. C'est un emballage simple autour de la coquille de coup qui peut être employée pour soulever et abaisser le bset et des possibilités de pi avant /bin/bash de invocation.
utilisant l'exemple précédent de cinglement qui a été donné CAP_NET_RAW identification de $ - NU racine $ /usr/sbin/getcap ./ping ./ping = cap_net_raw+ep employez maintenant le capsh pour laisser tomber CAP_NET_RAW et pour changer en l'uid 500 (le fpm) l'opération n'est plus autorisée $ /usr/sbin/capsh --drop=cap_net_raw --uid=500 -- identification de $ - NU fpm $ ./ping - q - localhost c1 coup : ./ping : Opération non autorisée de manière permanente baisse CAP_NET_RAW $ /usr/sbin/setcap - r ./ping et appelez le cinglement utilisant le capsh --chapeaux $ de capsh --caps= " cap_net_raw-ep " -- - c « . /ping - c1 - localhost de q » PING localhost.localdomain (127.0.0.1) 56 (84) bytes de données. --- statistiques de cinglement de localhost.localdomain --- 1 les paquets transmis, 1 ont reçu, perte de paquet de 0%, le temps 0ms minute/avg/maximum/mdev de RTT = 0.056/0.056/0.056/0.000 Mme employez le capsh pour imprimer des possibilités identification de $ - l'ONU fpm $ /usr/sbin/capsh --copie Courant : = =cap_chown réglé de bondissement, cap_dac_override, cap_dac_read_search, cap_fowner, cap_fsetid, cap_kill, cap_setgid, cap_setuid, cap_setpcap, cap_linux_immutable, cap_net_bind_service, cap_net_broadcast, cap_net_admin, cap_net_raw, cap_ipc_lock, cap_ipc_owner, cap_sys_module, cap_sys_rawio, cap_sys_chroot, cap_sys_ptrace, cap_sys_pacct, cap_sys_admin, cap_sys_boot, cap_sys_nice, cap_sys_resource, cap_sys_time, cap_sys_tty_config, cap_mknod, cap_lease, cap_audit_write, cap_audit_control, cap_setfcap, cap_mac_override, cap_mac_admin Securebits : 00/0x0 bloqué-noroot : no (débloqué) bloqué-aucun-suid-fixup : no (débloqué) bloqué-garder-chapeaux : no (débloqué) uid=500
Il y a beaucoup d'autres options au capsh et vous devriez passer probablement une certaine heure expérimentant avec eux. Appelez le capsh avec - l'option d'aide pour voir la pleine liste. Notez que les manuscrits de coquille de setuid ont des possibilités.
Tous les exemples montrés ci-dessus travaillent à Fedora 10 quel le libcap 2.10 d'utilisations. Si vous souhaitez expérimenter sur d'autres distributions de GNU/Linux, il doit avoir un >= 2.6.24 de grain établi avec CONFIG_FILE_CAPABILITIES=y, une version du libcap >=2.08 et un système de fichiers qui soutient les attributs prolongés par exemple ext3 ou ext4. Notez que CONFIG_CAPABILITIES=y devrait plus n'être exigé.
Pourquoi plus de personnes ne sont-elles pas averties de et employantes des possibilités ? Je crois que la documentation pauvre est la raison primaire. Par exemple, Fedora 10 manque les pages d'homme pour les getpcaps, le capsh et le pam_cap, et le guide de sécurité de Fedora ne mentionne pas même des possibilités (ou pour cette matière ACLs !) Je ne peux pas mais aide pensant que des possibilités sont traitées en tant que pauvre cousin à SELinux par le projet de Fedora.
Jaillissent ce poteau de blog obtient un peu long ainsi je vais m'arrêter. J'ai à peine rayé la surface des possibilités. Après que Fedora 11 se transporte, je couvrirai des possibilités d'une perspective de programmation. En attendant, si vous voulez garder le courant avec ce qui se produit avec des possibilités de Linux, Andrew Morgan entièrement capable est celui à bookmark.


























