文件属性

Linux文件属性分为常规属性与扩展属性,其中扩展属性有两种:attr与xattr.

一般常规的文件属性由stat API 读取,一般是三种权限,ower, group,时间等。


Linux文件的扩展属性_API

扩展属性attr

用户态API

ioctl(fd, FS_IOC32_SETFLAGS or FS_IOC_SETFLAGS,...)

使用ioctl中扩展的命令字

内核中的处理

ext2对应的FS_IOC32_SETFLAGS的函数

long ext2_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)*/
struct ext2_inode_info {
__le32    i_data[15];
__u32    i_flags; //保存配置的位置在ext2自已的inode接口里的i_flags里。这些数据最后同步到文件系统的磁盘中。
__u32    i_faddr;
__u8    i_frag_no;
__u8    i_frag_size;
__u16    i_state;
__u32    i_file_acl;
__u32    i_dir_acl;
__u32    i_dtime;
......

命令

lsattr 与chattr

这两个命令的关键字是attr,不是xattr,但他们是文件的扩展属性的另一个基础版本

lsattr file.txt-----a---------- file.txt
[root@localhost ~]# chattr +i file.txt //为file.txt 增加i属性。不得任意更动文件或目录。
[root@localhost ~]# lsattr file.txt
----ia---------- file.txt
[root@localhost ~]#

扩展属性xattr

扩展属性是由Linux文件系统ext2(ext3)等为文件提供可配置扩展属性的空间。目前主要使用的是security.capability与security.selinux,用于可执行文件的能力控制和强制访问控制。

API

扩展属性有一组API,以xattr为关键字。

用户态API:

#include <sys/xattr.h>
ssize_t getxattr(const char *path, const char *name,  void *value, size_t size);       
ssize_t lgetxattr(const char *path, const char *name, void *value, size_t size);       
ssize_t fgetxattr(int fd, const char *name,void *value, size_t size);

内核对应的API入口:

见fs/xattr.c
sys_fsetxattr(int fd, char __user *name, void __user *value,size_t size, int flags);

特定文件系统的支持ops

inode_operations 是VFS调用具体文件系统的注册函数。

Linux文件的扩展属性_attr_02

其中以ext3文件系统为例,对xattr的支持。


Linux文件的扩展属性_attr_03


扩展属性分类

在Linux2.6.18为 5 类:分别为os2, security, system, trusted, user.

Linux文件的扩展属性_linux_04


4.19 的内核支持的类别有5 大类,security又细分了12个子属性

Linux文件的扩展属性_ext3_05

其中capability,selinux为常用项,capability 是linux内核对能力的的配置参数,selinux则是内部强访等使用的配置参数。

Linux系统中的使用扩展属性的命令


getcap ,setcap 可以修改security.capability,这些正是“能力”机制的配置命令


setcap  cap_sys_admin+ep /bin/mount
[root@localhost ~]# getcap /bin/mount
/bin/mount = cap_sys_admin+ep
[root@localhost ~]#


//配置的cap_xx与linux 中capability.h宏相一致。
setcap  cap_audit_control,cap_sys_admin+ep /bin/mount
[root@localhost ~]# getcap /bin/mount
/bin/mount = cap_sys_admin,cap_audit_control+ep
[root@localhost ~]#

attr:用于显示各类属性的名称,可以配置user.类中【属性和值 】对。


attr:

attr -l /bin/mount 显示了各类中的属性名,不单是user.
Attribute "selinux" has a 34 byte value for /bin/mount 是security类中属性
Attribute "capability" has a 20 byte value for /bin/mount// 是security类中属性
Attribute "NAME" has a 5 byte value for /bin/mount //其中NAME是user类中属性



close(4)                                = 0
llistxattr("/bin/mount", "security.selinux\0security.capabi"..., 65536) = 47
lgetxattr("/bin/mount", "security.selinux", 0x0, 0) = 34
lgetxattr("/bin/mount", "security.capability", 0x0, 0) = 20
lgetxattr("/bin/mount", "user.NAME", 0x0, 0) = 5
open("/usr/share/locale/locale.alias", O_RDONLY|O_CLOEXEC) = 4

 

//在user类中配置NAME=mount的属性
attr -s NAME -V mount /bin/mount
Attribute "NAME" set to a 5 byte value for /bin/mount:
mount
//attr -g从user类中取出attr -g NAME /bin/mount
Attribute "NAME" had a 5 byte value for /bin/mount:
mount

getfattr与setfattr 可配置各个大类的属性

getfattr mount
file: mount
user.NAME //与attr一样,可以取出所有类别的属性,但只显示user类别的属性。
  [root@localhost bin]#


[root@localhost bin]# setfattr  -x user.NAME -h ./mount //删除一
[root@localhost bin]# getfattr mount
[root@localhost bin]# setfattr  -n user.NAME -v mymount ./mount
[root@localhost bin]# getfattr mount
file: mount
user.NAME
[root@localhost bin]#


//可配置user trusted等。
[root@localhost ~]# setfattr -n trusted.md5sum -v d41d8cd98f00b204e00998ecf8427e file.txt
[root@localhost ~]# getfattr file.txt
[root@localhost ~]# attr -l file.txt
Attribute "selinux" has a 38 byte value for file.txt
Attribute "md5sum" has a 30 byte value for file.txt
[root@localhost ~]# getfattr -m trusted file.txt
file: file.txt
trusted.md5sum


[root@localhost ~]# setfattr -n security.md5sum -v d41d8cd98f00b204e00998ecf8427e file.txt

[root@localhost ~]# getfattr -m security file.txt
# file: file.txt
security.md5sum
security.selinux


内核中如何实现“能力”机制


当可执行程序加载过程中取“security.capability”中数据的过程。

Linux文件的扩展属性_ext3_06

使用的过程

在进程启动后,他每通过一个系统调用时,都会使用cap_capable 来检查它的cred中的cap_effective是否有效。

Linux文件的扩展属性_linux_07

capability机制

查看当前bash的cap的命令 capsh

当前centos用户当前可使用的权限为0。

Linux文件的扩展属性_attr_08

root用户的权限

Linux文件的扩展属性_API_09

Linux文件的扩展属性_文件系统_10

capsh --inh=cap_net_admin --user=centos --

启动一个bash,以centos的用户名,此用户名的capability为cap_net_admin

Linux文件的扩展属性_文件系统_11

进程的5种功能级别

  • CapInh = Inherited capabilities //继承而来的
  • CapPrm – Permitted capabilities //允许的,是CapEff的超级。使用setcap可以修改。
  • CapEff = Effective capabilities //真实生效的
  • CapBnd = Bounding set //系统可以支持的范围。
  • CapAmb = Ambient capabilities set //环境中的。


Linux文件的扩展属性_ext3_12

Linux文件的扩展属性_ext3_13

查看一个进程的Cap集合

cat /proc/81772/status | grep Cap

CapInh: 0000000000001000

CapPrm: 0000000000000000

CapEff: 0000000000000000

CapBnd: 0000001fffffffff

CapAmb: 0000000000000000



Rock80中/etc/secuirty/*.conf 与pam_cap.so

在su netadmin等命令时,会读到此文件,并且cap_set给bash进程。这样netadmin启动的进程就有了相应的cap了。

Linux文件的扩展属性_linux_14

Linux文件的扩展属性_API_15

pam组件在认证过程中用pam_cap.so

附件

How to Configure Linux Capabilities Per User - ITCodar

Linux capabilities 101 - Linux Audit (linux-audit.com)

capabilities(7) - Linux manual page (man7.org) 对capabilities的全面说明

Linux Capabilities: Hardening Linux binaries by removing setuid (linux-audit.com) 为ping程序取消root s位,并为它配置net_raw的cap(setcap )