2016-04-20 12 views
5

Tôi đang cố gắng tạo một chương trình sử dụng ổ cắm thô chạy chính xác như không phải root với các khả năng của Linux. Chương trình này là như sau:Làm cách nào để sử dụng mô-đun khả năng PAM để cấp khả năng cho một người dùng cụ thể và có thể thực thi được?

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

Nếu tôi biên dịch nó và chạy nó như không phải root, tôi nhận được một lỗi, như mong đợi:

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

Nếu tôi thêm khả năng cap_net_raw, như một cách hiệu quả và khả năng cho phép, nó hoạt động.

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

Bây giờ, tôi muốn sử dụng pam_cap.so để làm cho nó để chỉ một người dùng cụ thể có thể chạy chương trình này với cap_net_raw, thay vì tất cả mọi người. /etc/security/capability.conf của tôi là:

cap_net_raw user 

My /etc/pam.d/login được (lưu ý rằng tôi cũng đã cố gắng /etc/pam.d/sshd nhưng điều đó dường như không làm việc một trong hai):

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

Tôi đã có một phiên ssh, tôi đăng xuất khỏi và trở lại trong sau đó và thực hiện các lệnh sau:

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

Câu hỏi của tôi là: Tại sao tôi không thể thực hiện chương trình 'ổ cắm' với cap_net_raw? Tôi nghĩ rằng khi tôi đăng nhập, người dùng của tôi sẽ nhận được nó như là một khả năng cho phép, và nó sẽ cho phép 'người dùng' chạy 'socket' với cap_net_raw.

Đây là những gì tôi đang chạy trên:

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

Trả lời

1

tôi đã tìm ra rằng tôi đã có khả năng sai trên các tập tin. Để quy trình có thể có được các khả năng hiệu quả từ mô-đun pam_cap, tệp cũng cần phải được định cấu hình với khả năng "được kế thừa". Vì vậy, đặt mũ trên tệp phải là:

sudo setcap cap_net_raw+ip socket 

Tuy nhiên, tôi vẫn chỉ có thể làm cho chương trình hoạt động thành công từ thông tin đăng nhập thông thường và không đăng nhập ssh.

Các vấn đề liên quan