2016-04-20 1 views
5

Je tente de faire fonctionner correctement un programme qui utilise des sockets raw comme non-root avec les capacités Linux. Le programme est le suivant:Comment utiliser le module de fonctionnalités PAM pour accorder des fonctionnalités à un utilisateur et à un exécutable particuliers?

#include <netinet/ip.h> 

int main() 
{ 
    int sd = socket(PF_INET, SOCK_RAW, IPPROTO_TCP); 
    if(sd < 0) 
    { 
    perror("socket() error"); 
    return 1; 
    } 
    return 0; 
} 

Si je le compiler et l'exécuter comme non-root, je reçois une erreur, comme prévu:

[[email protected] ~]$ make socket 
cc  socket.c -o socket 
[[email protected] ~]$ ./socket 
socket() error: Operation not permitted 

Si j'ajoute la capacité cap_net_raw, comme un moyen efficace et la capacité autorisée, cela fonctionne.

[[email protected] ~]$ sudo setcap cap_net_raw+ep socket 
[sudo] password for user: 
[[email protected] ~]$ ./socket 
[[email protected] ~]$ 

Maintenant, je veux utiliser pam_cap.so de faire en sorte que seul un utilisateur particulier peut exécuter ce programme avec cap_net_raw, au lieu de tout le monde. Mon /etc/security/capability.conf est:

cap_net_raw user 

Mon /etc/pam.d/login est (note que j'ai aussi essayé /etc/pam.d/sshd mais cela ne semble pas fonctionner non plus):

#%PAM-1.0 
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so 
auth  substack  system-auth 
auth  include  postlogin 
#Added this line to use pam_cap 
auth  required  pam_cap.so 
account required  pam_nologin.so 
account include  system-auth 
password include  system-auth 
# pam_selinux.so close should be the first session rule 
session required  pam_selinux.so close 
session required  pam_loginuid.so 
session optional  pam_console.so 
# pam_selinux.so open should only be followed by sessions to be executed in the user context 
session required  pam_selinux.so open 
session required  pam_namespace.so 
session optional  pam_keyinit.so force revoke 
session include  system-auth 
session include  postlogin 
-session optional  pam_ck_connector.so 

J'ai eu une session ssh, je DÉCONNECTÉ et retour dans après et exécuté les commandes suivantes:

[[email protected] ~]$ sudo setcap cap_net_raw+p socket 
[sudo] password for user: 
[[email protected] ~]$ getcap socket 
socket = cap_net_raw+p 
[[email protected] ~]$ ./socket 
socket() error: Operation not permitted 
[[email protected] ~]$ 

Ma question est: Pourquoi ai-je pas en mesure d'exécuter le programme « socket » avec cap_net_raw? Je pensais que lorsque je me connecterais, mon utilisateur l'obtiendrait comme une fonctionnalité autorisée, et cela permettrait à 'user' d'exécuter 'socket' avec le cap_net_raw.

C'est ce que je suis en cours d'exécution sur:

[[email protected] ~]$ uname -a 
Linux localhost.localdomain 3.10.0-123.el7.x86_64 #1 SMP Mon Jun 30 12:09:22 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux 
[[email protected] ~]$ cat /etc/redhat-release 
CentOS Linux release 7.0.1406 (Core) 

Répondre

1

je me suis dit que j'avais les mauvaises capacités sur le fichier. Pour que le processus puisse obtenir des capacités efficaces du module pam_cap, le fichier doit également être configuré avec la capacité "héritée". Ainsi, plafonnant sur le fichier doit être:

sudo setcap cap_net_raw+ip socket 

Cependant, je pouvais encore seulement obtenir que le programme fonctionne avec succès à partir d'une connexion tty normale, et non une connexion ssh.