请选择 进入手机版 | 继续访问电脑版

登录  | 立即注册

游客您好!登录后享受更多精彩

查看: 9106|回复: 7

实现一个Linux文件系统ACL防火墙-FS_HOOK简介

[复制链接]

20

主题

36

帖子

406

积分

中级会员

Rank: 3Rank: 3

积分
406
发表于 2020-1-22 19:20:13 | 显示全部楼层 |阅读模式
近日,我将一个基于eBPF实现的SandFS中的eBPF部分摘除了,形成了一个单纯的SandFS框架:
https://github.com/marywangran/sandfs_with_no_ebpf
纳尼?eBPF大红大紫之时,我竟然反其道而行之,这不犯了形而上学的错误了吗?
没错,事实上我摘除它的原因是因为这个原生的eBPF-based-SandFS在我的两个开发环境中均没有编译通过:

  • CentOS 7-3.10内核:llvm 8.0.1未安装成功,因为glibc版本太低。
  • Ubuntu 19.10-5.3内核,SandFS-Kernel编译失败,没时间折腾。
然而我又非常喜欢SandFS这个框架:

  • 没有修改VFS本身的代码,而是通过实现一个wrap fs来嫁接eBPF字节码。
    我想让它运行起来,我在去深圳的火车上就想让它运行起来。
同时,我又特别特别喜欢Netfilter,于是我就想让为SandFS嫁接一个类似的Filter,来完成我无能为力的eBPF Program的功能,就这样。
完成代码后,暂时没有时间写类似iptables的用户态程序用来灌入策略,那就写了几个内核态的测试case,完成下面的小功能:

  • 用户zhaoya的uid为1000,以zhaoya登录一次不能读取超过10字节的文件内容,一次只能读取最多10字节。
  • 不能往任何文件里写skinshoe这个单词。
  • 不能读取根目录下名称为key的文件。
效果如下:

其中testread的代码如下:
  1. // gcc testread.c -o testread#include#include #include #include int main(int argc, char **argv){        int fd;        int len, ret;        char buf[1024] = {0};        len = atoi(argv[2]);        fd = open(argv[1], O_RDONLY);        ret = read(fd, buf, len);        perror("read");        printf("%s\n", buf);        return 0;}
复制代码
我的三个测试case代码如下:
  1. #define TEST#ifdef TESTstatic int test_read_func(unsigned int hook, struct sandfs_args *args, void *priv, int *handled){        int ret = FS_ACCEPT;        struct sandfs_args *largs = args;        kuid_t id;        size_t count;        struct cred *cred;        cred = (struct cred *)largs->args[SANDFS_IDX_CRED].value;        id = cred->uid;        count = *((size_t *)largs->args[SANDFS_IDX_COUNT].value);        if (id.val == 1000 && count > 10) {                printk("#### test read deny request\n");                ret = FS_DROP;        }        *handled = 1;        return ret;}static int test_write_func(unsigned int hook, struct sandfs_args *args, void *priv, int *handled){        int ret = FS_ACCEPT;        struct sandfs_args *largs = args;        size_t count;        char *buf;        count = largs->args[SANDFS_IDX_BUF].size;        buf = (char *)largs->args[SANDFS_IDX_BUF].value;        if (strnstr(buf, "skinshoe", count)) {                printk("#### test write deny request\n");                ret = FS_DROP;        }        *handled = 1;        return ret;}static int test_lookup_func(unsigned int hook, struct sandfs_args *args, void *priv, int *handled){        int ret = FS_ACCEPT;        struct sandfs_args *largs = args;        size_t len;        char *path;        len = largs->args[SANDFS_IDX_PATH].size;        path = (char *)largs->args[SANDFS_IDX_PATH].value;        if (!strncmp(path, "/key", len)) {                printk("#### test lookup deny request\n");                ret = FS_DROP;        }        *handled = 1;        return ret;}static struct vfs_rule test_read_rule = {        .name = "test read",        .func = test_read_func,        .hooknum = SANDFS_READ,};static struct vfs_rule test_write_rule = {        .name = "test write",        .func = test_write_func,        .hooknum = SANDFS_WRITE,};static struct vfs_rule test_lookup_rule = {        .name = "test lookup",        .func = test_lookup_func,        .hooknum = SANDFS_LOOKUP,};#endif
复制代码
完成的代码在sandfs_with_no_ebpf的devel分支,等待实现了用户态配置程序之后再进行一次merge:
https://github.com/marywangran/sandfs_with_no_ebpf
当然,很多人会觉得这个东西没有意义,没有技术含量,太简单,这些都无所谓,它的意义是特定于我自己的:

  • 可以精细化特定mount namespace中的文件系统访问控制。
  • 过年回家前治愈无聊缓解乏力。
  • 有时间还能写写用户态配置程序,学学怎么编程。
对于不会编程的我来讲,这就是小惊喜,小收获了。
PS:我依然喜欢用####来做打印前缀,因为它一目了然,容易在日志文件中快速匹配。可能是我不懂更正规的做法吧,希望有人能教我。
浙江温州皮鞋湿,下雨进水不会胖!
                                                                                                                                       
                                                    
  • 点赞                        1                        
  • 收藏                        
  • 分享                                                                                                                        
  •                                                         
                                      
    • 文章举报                           
                                                
                                                                        
                                            
                                                        dog250                                                                                    博客专家                                                                                            发布了1551 篇原创文章 · 获赞 4787 · 访问量 1065万+                                                                                            他的留言板                                                            关注
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x




上一篇:网线水晶头制作操作
下一篇:深度解析FUTABA的SBUS协议(/天地飞遥控器的WBUS协议/Robomaster接收机的DBU
回复

使用道具 举报

0

主题

28

帖子

598

积分

高级会员

Rank: 4

积分
598
发表于 2020-1-25 04:36:32 | 显示全部楼层
感谢楼主的无私分享![www.12360.co]
回复

使用道具 举报

0

主题

24

帖子

514

积分

高级会员

Rank: 4

积分
514
发表于 2020-1-25 13:27:01 | 显示全部楼层
其实我一直觉得楼主的品味不错!呵呵![www.12360.co]
回复

使用道具 举报

15

主题

31

帖子

391

积分

中级会员

Rank: 3Rank: 3

积分
391
发表于 2020-1-26 19:06:10 | 显示全部楼层
这个帖子不回对不起自己![www.12360.co]
回复

使用道具 举报

0

主题

24

帖子

514

积分

高级会员

Rank: 4

积分
514
发表于 2020-2-21 10:46:38 | 显示全部楼层
楼主,我太崇拜你了![www.12360.co]
社区不能没有像楼主这样的人才啊!
回复

使用道具 举报

0

主题

21

帖子

451

积分

中级会员

Rank: 3Rank: 3

积分
451
发表于 2020-3-20 18:20:57 | 显示全部楼层
楼主,大恩不言谢了![www.12360.co]
回复

使用道具 举报

0

主题

40

帖子

850

积分

高级会员

Rank: 4

积分
850
发表于 2020-3-20 20:11:54 | 显示全部楼层
楼主发贴辛苦了,谢谢楼主分享![www.12360.co]
回复

使用道具 举报

0

主题

38

帖子

808

积分

高级会员

Rank: 4

积分
808
发表于 2020-3-26 12:28:16 | 显示全部楼层
楼主太厉害了!楼主,I*老*虎*U![www.12360.co]
回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

动物之森

GMT+8, 2020-4-6 01:16 , Processed in 0.084163 second(s), 26 queries .

www.12360.co 集合吧!动物之森

Copyright © 2019-2020.

快速回复 返回顶部 返回列表