|
|
@@ -17,8 +17,50 @@ int_like!(Kgid, AtomicKgid, usize, AtomicUsize);
|
|
|
bitflags! {
|
|
|
pub struct CAPFlags:u64{
|
|
|
const CAP_EMPTY_SET = 0;
|
|
|
- const CAP_SETPCAP_BIT = 1 << 8;
|
|
|
const CAP_FULL_SET = (1 << 41) - 1;
|
|
|
+
|
|
|
+ // 具体的capability定义,与Linux保持一致
|
|
|
+ const CAP_CHOWN = 1 << 0;
|
|
|
+ const CAP_DAC_OVERRIDE = 1 << 1;
|
|
|
+ const CAP_DAC_READ_SEARCH = 1 << 2;
|
|
|
+ const CAP_FOWNER = 1 << 3;
|
|
|
+ const CAP_FSETID = 1 << 4;
|
|
|
+ const CAP_KILL = 1 << 5;
|
|
|
+ const CAP_SETGID = 1 << 6;
|
|
|
+ const CAP_SETUID = 1 << 7;
|
|
|
+ const CAP_SETPCAP = 1 << 8;
|
|
|
+ const CAP_LINUX_IMMUTABLE = 1 << 9;
|
|
|
+ const CAP_NET_BIND_SERVICE = 1 << 10;
|
|
|
+ const CAP_NET_BROADCAST = 1 << 11;
|
|
|
+ const CAP_NET_ADMIN = 1 << 12;
|
|
|
+ const CAP_NET_RAW = 1 << 13;
|
|
|
+ const CAP_IPC_LOCK = 1 << 14;
|
|
|
+ const CAP_IPC_OWNER = 1 << 15;
|
|
|
+ const CAP_SYS_MODULE = 1 << 16;
|
|
|
+ const CAP_SYS_RAWIO = 1 << 17;
|
|
|
+ const CAP_SYS_CHROOT = 1 << 18;
|
|
|
+ const CAP_SYS_PTRACE = 1 << 19;
|
|
|
+ const CAP_SYS_PACCT = 1 << 20;
|
|
|
+ const CAP_SYS_ADMIN = 1 << 21;
|
|
|
+ const CAP_SYS_BOOT = 1 << 22;
|
|
|
+ const CAP_SYS_NICE = 1 << 23;
|
|
|
+ const CAP_SYS_RESOURCE = 1 << 24;
|
|
|
+ const CAP_SYS_TIME = 1 << 25;
|
|
|
+ const CAP_SYS_TTY_CONFIG = 1 << 26;
|
|
|
+ const CAP_MKNOD = 1 << 27;
|
|
|
+ const CAP_LEASE = 1 << 28;
|
|
|
+ const CAP_AUDIT_WRITE = 1 << 29;
|
|
|
+ const CAP_AUDIT_CONTROL = 1 << 30;
|
|
|
+ const CAP_SETFCAP = 1 << 31;
|
|
|
+ const CAP_MAC_OVERRIDE = 1 << 32;
|
|
|
+ const CAP_MAC_ADMIN = 1 << 33;
|
|
|
+ const CAP_SYSLOG = 1 << 34;
|
|
|
+ const CAP_WAKE_ALARM = 1 << 35;
|
|
|
+ const CAP_BLOCK_SUSPEND = 1 << 36;
|
|
|
+ const CAP_AUDIT_READ = 1 << 37;
|
|
|
+ const CAP_PERFMON = 1 << 38;
|
|
|
+ const CAP_BPF = 1 << 39;
|
|
|
+ const CAP_CHECKPOINT_RESTORE = 1 << 40;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
@@ -193,6 +235,17 @@ impl Cred {
|
|
|
pub fn getgroups(&self) -> &Vec<Kgid> {
|
|
|
&self.groups
|
|
|
}
|
|
|
+
|
|
|
+ /// 检查当前进程是否具有指定的capability
|
|
|
+ pub fn has_capability(&self, cap: CAPFlags) -> bool {
|
|
|
+ // 检查effective capability set中是否包含指定的capability
|
|
|
+ self.cap_effective.contains(cap)
|
|
|
+ }
|
|
|
+
|
|
|
+ /// 检查当前进程是否具有CAP_SYS_ADMIN权限
|
|
|
+ pub fn has_cap_sys_admin(&self) -> bool {
|
|
|
+ self.has_capability(CAPFlags::CAP_SYS_ADMIN)
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq, Default)]
|