2016-04-20 11 views
5

İşlenmemiş soketleri kullanan bir programın Linux yetenekleriyle root olmayan bir şekilde doğru şekilde çalıştırılmaya çalışıyorum.Belirli bir kullanıcıya ve çalıştırılabilirliğe yetenekler vermek için PAM yetenek modülünü nasıl kullanırım?

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

bunu derlemek ve non-root olarak çalıştırmak, beklendiği gibi, ben bir hata alıyorum:

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

Ben cap_net_raw yeteneği eklerseniz, etkili olarak aşağıdaki gibi bir programdır ve izin verilen yetenek, çalışır.

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

Şimdi, sadece belirli bir kullanıcının yerine herkesin, cap_net_raw ile bu programı çalıştırmak böylece bunu yapmak için pam_cap.so kullanmak istiyorum. Benim /etc/security/capability.conf geçerli:

cap_net_raw user 

(Ben de /etc/pam.d/sshd çalıştı ama bu da işe görünmüyordu unutmayın) olduğu /etc/pam.d/login Benim: Ben bir ssh oturumu vardı

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

, ben geri çıkış yapmış ve o ve sonra aşağıdaki komutları yürütür:

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

sorum şu: Neden cap_net_raw ile 'yuva' programını çalıştırmak mümkün değildi? Giriş yaptığımda, kullanıcımın izin verilen bir yetenek olarak elde edeceğini ve 'kullanıcı' nın cap_net_raw ile 'soketi' çalıştırmasına izin vereceğini düşündüm.

Bu benim üzerinde çalışan ettiğim şey:

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

cevap

1

ben dosya üzerinde yanlış yetenekleri olduğunu anladım. İşlemin pam_cap modülünden etkin yetenekler elde edebilmesi için, dosyanın "devralınan" yetenekle de yapılandırılması gerekir. Yani, dosya üzerinde ayar kapakları olmalıdır:

sudo setcap cap_net_raw+ip socket 

Ancak, ben yine de yalnızca program normal tty giriş başarıyla çalışmak değil, bir ssh giriş için alabilir.

İlgili konular