2016-04-20 3 views
5

Ich versuche, ein Programm zu machen, das Raw-Sockets korrekt als Nicht-Root mit Linux-Funktionen verwendet. Das Programm ist wie folgt:Wie verwende ich das PAM-Funktionsmodul, um einem bestimmten Benutzer und ausführbaren Programm Berechtigungen zu erteilen?

#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; 
} 

Wenn ich es kompilieren und es als nicht-root ausführen, ich erhalte eine Fehlermeldung, wie erwartet:

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

Wenn ich die cap_net_raw Fähigkeit, als wirksames hinzufügen und erlaubte Fähigkeit, es funktioniert.

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

Jetzt will ich pam_cap.so verwenden, um es zu machen, so dass nur ein bestimmte Benutzer dieses Programm mit cap_net_raw ausführen kann, statt alle. Mein /etc/security/capability.conf ist:

cap_net_raw user 

Mein /etc/pam.d/login ist (beachten Sie, dass ich auch versucht, /etc/pam.d/sshd aber das scheint nicht zu funktionieren):

#%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 

ich eine SSH-Sitzung hatte ich abgemeldet und wieder in danach und ausgeführt, um die folgenden Befehle:

[[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] ~]$ 

Meine Frage ist: Warum war ich die ‚Steckdose‘ Programm auszuführen, mit cap_net_raw nicht in der Lage? Ich dachte, dass mein Benutzer, wenn ich mich anmeldete, es als eine zulässige Fähigkeit erhalten würde, und es "Benutzer" erlauben würde, "socket" mit dem cap_net_raw auszuführen.

Dies ist, was ich laufen auf:

[[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) 

Antwort

1

ich, dass ich auf die Datei, die falschen Fähigkeiten herausgefunden hatte. Damit der Prozess über das Modul pam_cap effektive Funktionen erhalten kann, muss die Datei auch mit der Funktion "geerbt" konfiguriert werden. So, das Setzen von Kappen auf der Datei sollten sein:

sudo setcap cap_net_raw+ip socket 

aber ich konnte immer noch nur das Programm an der Arbeit erfolgreich von einer normalen tty Login und keine SSH-Login.

Verwandte Themen