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)