热门关键字:  ubuntu  分区  Fedora  linux系统进程  函数

当前位置 :| 主页>Linux教程>内核研究>

基于Linux2.6内核ACL功能体验之旅

来源: 作者: 时间:2007-04-07 Tag: 点击:

在安全管理日益重要的今天,传统的 Unix 文件系统的 UGO 权限管理方式已经无法满足日常系统管理工作的需要。而 ACL 机制逐渐成为主流的权限管理方式。本文主要介绍了在基于 Linux2.6 内核的发行版 Fedora Core 上进行的一些 ACL 基本功能的实验。

ACL 简介

用户权限管理始终是 Unix 系统管理中最重要的环节。大家对 Linux/Unix 的 UGO 权限管理方式一定不陌生,还有最常用的 chmod 命令。为了实现一些比较复杂的权限管理,往往不得不创建很多的组,并加以详细的记录和区分(很多时候就是管理员的噩梦)。可以针对某一个用户对某一文件指定一个权限,恐怕管理员都期待的功能。比如对某一个特定的文件,用户A可以读取,用户B所在的组可以修改,惟独用户B不可以……。于是就有了IEEE POSIX 1003.1e这个ACL的标准。所谓ACL,就是Access Control List,一个文件/目录的访问控制列表,可以针对任意指定的用户/组分配RWX权限。现在主流的商业Unix系统都支持ACL。FreeBSD也提供了对ACL的支持。Linux在这个方面也不会落后,从2.6版内核开始支持ACL。

准备工作

支持ACL需要内核和文件系统的支持。现在2.6内核配合EXT2/EXT3, JFS, XFS, ReiserFS等文件系统都是可以支持ACL的。用自己工作用的物理分区体验ACL,总是不明智的行为。万一误操作导致分区的损坏,造成数据的丢失,损失就大了。作一个loop设备是个安全的替代方法。这样不需要一个单独的分区,也不需要很大的硬盘空间,大约有个几百KB就足够进行我们的体验了。OK,下面我使用Fedora Core 5和Ext3文件开始对Linux的ACL的体验。

首先创建一个512KB的空白文件:

[root@FC3-vm opt]#  dd if=/dev/zero of=/opt/testptn count=512
512+0 records in
512+0 records out

和一个loop设备联系在一起:

[root@FC3-vm opt]#  losetup /dev/loop0 /opt/testptn

创建一个EXT2的文件系统:

[root@FC3-vm opt]#  mke2fs /dev/loop0
mke2fs 1.35 (28-Feb-2004)
max_blocks 262144, rsv_groups = 32, rsv_gdb = 0
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
32 inodes, 256 blocks
12 blocks (4.69%) reserved for the super user
First data block=1
1 block group
8192 blocks per group, 8192 fragments per group
32 inodes per group

Writing inode tables: done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 30 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.

挂载新建的文件系统(注意mount选项里的acl标志,我们靠它来通知内核我们需要在这个文件系统中使用ACL):

[root@FC3-vm opt]#  mount -o rw,acl /dev/loop0 /mnt
[root@FC3-vm opt]#  cd /mnt
[root@FC3-vm mnt]#  ls
lost+found

现在我已经得到了一个小型的文件系统。而且是支持ACL的。并且即使彻底损坏也不会影响硬盘上其他有价值的数据。可以开始我们的ACL体验之旅了。

体验1 - ACL的基本操作:添加和修改

我首先新建一个文件作为实施ACL的对象:

[root@FC3-vm mnt]#  touch file1
[root@FC3-vm mnt]#  ls -l file1
-rw-r--r-- 1 root root     7 Dec 11 00:28 file1

然后看一下这个文件缺省的ACL,这时这个文件除了通常的UGO的权限之外,并没有ACL:

[root@FC3-vm mnt]#  getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
group::r--
other::r-

*注意:即使是不支持ACL的情况下,getfacl仍然能返回一个这样的结果。不过setfacl是不能工作的。

下面添加几个用户和组,一会我将使用ACL赋予他们不同的权限:

[root@FC3-vm mnt]#  groupadd testg1
[root@FC3-vm mnt]#  useradd testu1
[root@FC3-vm mnt]#  useradd testu2
[root@FC3-vm mnt]#  usermod -G testg1 testu1

现在我们看看testu1能做什么:

[root@FC3-vm mnt]# su testu1
[testu1@FC3-vm mnt]$ echo "testu1" >> file1
bash: file1: Permission denied

失败了。因为file1并不允许除了root以外的用户写。我们现在就通过修改file1的ACL赋予testu1足够的权限:

[root@FC3-vm mnt]# setfacl -m u:testu1:rw file1
[root@FC3-vm mnt]# su testu1
[testu1@FC3-vm mnt]$ echo "testu1" >> file1
[testu1@FC3-vm mnt]$ cat file1
testu1

修改成功了,用户testu1可以对file1做读写操作了。我们来看一下file1的ACL:

[testu1@FC3-vm mnt]$ getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
user:testu1:rw-
group::r--
mask::rw-
other::r-

我们ls看一下:

[root@FC3-vm mnt]# ls -l file1
-rw-rw-r--+ 1 root root     7 Dec 11 00:28 file1

可以看到那个"+"了么?就在通常我们看到的权限位的旁边。这个说明file1设置了ACL, 接下来我们修改一下testu1的权限,同时给testg1这个组以读的权限:

[root@FC3-vm mnt]# setfacl -m u:testu1:rwx,g:testg1:r file1
[root@FC3-vm mnt]# getfacl file1
# file: file1
# owner: root
# group: root
user::rw-
user:testu1:rwx
group::r--
group:testg1:r--
mask::rwx
other::r-




相关文章:
精通initramfs构建step by step
Linux利用kexec迅速切换内核
进程上下文VS中断上下文
内核通知链 学习笔记
linux spi子系统驱动分析
menuconfig 配置选项
《Linux操作系统内核实习》之练习一
udev详解
什么叫微内核,宏内核?
Linux 信号signal处理机制
开发简单的 Linux2.6 内核模块
删除内核的perl脚本
Linux2.6内核usb gadget驱动移植
GCC hacks in the Linux kernel
iomem
kernel学习的想法
让自己的驱动支持udev
linux内核编译步骤
内核的等待队列
Linux内核wait_queue深入分析
升级和删除内核
SD卡驱动分析2
Linux Kernel VDSO本地权限提升漏洞
内核中的TCP的追踪分析-15-TCP(IPV4)的客户端与
linux 2.6内核可加载模块的编译
内核模块HelloWorld
在环回接口上发送一个数据报
ARP初始化
1分钟编译FreeBSD内核
linux设备模型之uart驱动架构分析