Linux帐号与ACL权限管理

Linux帐号与群组

每个用户至少都有两个ID,分别是UID(User ID,存放在/etc/passwd中)和GID(Group ID,存放在/etc/group中),在Linux上每个文件都有文件拥有者ID和拥有群组ID,这个拥有者ID与UID对应,拥有群组ID与GID对应。

创建用户

使用 groupadd创建组,使用 useradd 命令创建用户,使用passwd命令创建或修改用户密码,使用gpasswd命令追加或删除用户所属的组。groups命令查看用户的组,

创建用户zebra,使用useradd命令,如果不加任何选项,这个命令将创建一个zebra组,创建zebra的家目录/home/zebra,以及设置该用户登录后的是shell环境。

useradd zebra

在/etc/passwd文件中查看用户信息

grep zebra /etc/passwd

zebra:x:1005:1005::/home/zebra:/bin/bash

可以看到zebra用户的输出信息用:号分隔为7栏

  • 第1栏为用户的名称
  • 第2栏在早期的UNIX中用来存放密码,后来因为安全等因素,将密码移到专门的密码文件/etc/shadow中,这里保留了就使用x占位。
  • 第3栏和第4栏表示的是用户的UID和GID
  • 第5栏是使用者说明栏,基本没用
  • 第6栏就是用户的家目录,及登录后进入的目录,使用-d选项设置家目录,-M选项表示不创建家目录。
  • 第7栏是用户登录后的shell环境,这里是/bin/bash,使用 -s 参数来设置,比如我们在安装mysql的时候,需要创建一个mysql的用户以及mysql的组,但是不希望系统为其创建家目录,以及不让这个用户登录我们的服务器,可以使用useradd -s /sbin/nologin -M -g mysql mysql

将用户追加到现有组中

创建两个组,developer和dba

groupadd developer
groupadd dba

使用gpasswd命令将zebra追加到developer和dba组中。

gpasswd -a zebra developer
gpasswd -a zebra dba

#或者使用usermod命令:usermod -a -G dba zebra

id zebra

uid=1005(zebra) gid=1005(zebra) 组=1005(zebra),1001(dba),1002(developer)

将zebra移除dba组,注意:添加组可以使用gpasswdusermod命令,删除组建议使用gpasswd命令

gpasswd -d zebra dba

id zebra
uid=1005(zebra) gid=1005(zebra) 组=1005(zebra),1002(developer)

ACL权限管理

在Linux中,简单的将一个用户与一个文件或目录之间的关系划分为3种类型,

  • owner 该用户是该文件或目录的拥有者
  • group 该用户所属组与文件或目录的所属组相同,注意:文件不像用户,用户可以属于多个组,而文件只能有一个所属组
  • others 其他

Linux再针对这3种关系设置不同的rwx权限。这种传统的权限设置有点一刀切的感觉,不能满足权限细分的需要。举例说明,假如有一个文件夹如下所示,创建者是root,目录所属组为developer,权限为770,只要是developer组里的用户都可以在dev文件夹下创建文件或目录。

drwxrwx---.  2 root   developer   6 12月 11 18:00 dev

问题:现在公司的测试组test需要读取该目录中文件的内容,

第一,不能使用chown把developer修改为test,要是这样的话,developer就不能开发了

第二,不能把other设置r-x权限,要是这样的话,相当于所有的用户都能看到dev目录的内容

上面的情况,传统的权限管理是不能满足的,这是就应该考虑ACL(Access Control List)权限。ACL可以对单个用户或组进行单个文件或目录的rwx权限控制,弥补了传统权限只能对文件目录分3类角色控制的不足。使用getfacl查看文件或目录的ACL权限,使用setfacl命令设置用户(组)对文件或目录的权限。

setfacl语法 setfacl [-bkRd] [{-m | -x} acl参数] 目标文件(目录),其中-m和-x不可同时使用,

  • -m 表示modify当前的文件的acl权限,
  • -x 表示remove当前文件的acl权限
  • -b 表示remvoe-all,移除文件的所有acl权限
  • -k 表示移除默认的ACL参数
  • -R 递归
  • -d 表示默认的acl参数
  • acl参数即使指,表示某某用户(组)的权限,或某某用户(组)对该文件的最大权限(掩码规则),使用":"号分隔,用户用u表示,组用g表示,掩码用m表示,格式u:zebra:rx表示用户zebra,对目标文件有rx的权限,g:developer:rwx表示在组developer里面的用户对目标文件有rwx的权限,m::rw表示该文件的最大权限为rw权限,因为m参数是针对文件或目录的,所以中间为空字符串,没有用户或组。

getfacl语法getfacl 目标文件(目录),getfacl命令也支持很多选项,但是我一般都没有加这些选项,所以看到语法相对简单。

用户或组对单个文件的ACL权限

场景:root创建一个xx.json的配置文件,权限如下:

-rw-r--r--. 1 root root 20 12月 12 10:01 xx.json

可以看到除了root用户外,其他都是只读权限,这里需要将zebra用户授权为读写权限。命令如下:

setfacl -m u:zebra:rw xx.json

ll

-rw-rw-r--+ 1 root root 20 12月 12 10:59 xx.json

setfacl -m u:zebra:rw xx.json 命令使用-m选项表示修改acl权限,目标文件为xx.json,而u:zebra:rw是-m选项的参数,表示用户zebra有rw的权限。使用ll命令查看文件的属性,在-rw-rw-r--后面多了个+号,这个加号就是表示xx.json设置过ACL权限。具体ACL权限的内容,我们使用getfacl命令:

getfacl xx.json

# file: xx.json
# owner: root
# group: root
user::rw-
user:zebra:rw-
group::r--
mask::rw-
other::r--

使用getfacl命令查看xx.json文件的acl权限时,返回的结果如上所示,file,owner,group都好理解,user::rw-user:zebra:rw-表示具体用户的权限,使用":"号分隔,格式是user:用户名:权限,而第一行user::rw-没有指定用户名,默认表示文件的拥有者owner,group::r--表示文件的所属组的权限,这里也是表示的位默认的文件所属组的权限。如果我们使用:

setfacl -m g:developer:rw xx.json

则该ACL列表中将会出现group:developer:rw-这条数据,意思是组developer的成员对该文件有读写的权限。other::r--表示文件的other对象只有读的权限。mask::rw-表示对该文件的掩码规则,跟ip设置的子网掩码一样的道理,这里表示:不管你怎么设置,该文件最大可能的权限就是rw,不可能存在x的权限。我这里做一个实验,设置zebra用户拥有执行的权限,看看效果:

# 设置zebra有读写执行的权限
setfacl -m u:zebra:rwx xx.json

# 设置文件的掩码规则,最大权限为rw
setfacl -m m::rw xx.json

getfacl xx.json

# file: xx.json
# owner: root
# group: root
user::rw-
user:zebra:rwx #effective:rw-
group::r--
mask::rw-
other::r--

ll

-rw-rw-r--+ 1 root root 20 12月 12 10:59 xx.json

上面的列子首先设置了zebra的权限为rwx,然后设置了该文件的掩码权限(最大权限)为rw-,然后查看该文件的acl权限,可以看到mask::rw-如我们的预期,而user:zebra:rwx #effective:rw-,表示虽然你设置了zebra的acl权限为rwx,但是你的实际生效的(effective)权限为rw-。我们使用ll命令去查看,也没有x的显示。

注意:setfacl -m命令,表示修改ACL权限,及后面的设置可能会覆盖前面的设置,当我们先设置掩码规则,再设置zebra的权限为rwx,掩码就会失效。

用户或组对目录的ACL权限

目录和单个文件有所不同,在对目录授权的时候,需要考虑目录中原来有的文件是否需要设置ACL权限,对于新增加的文件或目录是否需要也需要ACL权限的问题。

案例:当前目录conf的权限为700,目录结构如下

ll -d conf/
drwx------. 3 root root 46 12月 13 16:02 conf/

tree -apug conf/

conf/
├── [-rw------- root root ]  app.json
└── [drwxr-xr-x root root ]  base
    └── [-rw------- root root ]  base.json

conf目录下有文件app.json,目录base,在目录base下有一个base.json文件,权限如上


仅设置zebra用户对conf目录的ACL权限,因为当前目录conf的权限是700,所以zebra是不能进入该目录

su zebra
cd conf/
bash: cd: conf/: 权限不够

现在仅设置zebra对conf目录的ACL权限,权限为rwx,注意:这里仅仅是对该目录设置了ACL权限,而没有对目录下的文件设置ACL权限。

setfacl -m u:zebra:rwx conf/

su zebra
cd conf/

# 能够创建目录
mkdir tmp

ll
-rw-------. 1 root  root  20 12月 13 15:42 app.json
drwxr-xr-x. 2 root  root  31 12月 13 16:01 base
drwxrwxr-x. 2 zebra zebra 10 12月 13 16:19 tmp

# 不能查看原有文件
cat app.json
cat: app.json: 权限不够

可以看到,在设置了zebra对conf/目录的ACL权限后,zebra能进入该目录,并创建文件,但ACL权限没有传递到原有的文件,所以zebra用户是对原来的文件没有查看的权利。


设置zebra用户对conf/目录的ACL权限,并递归到conf/目录的文件及子目录中。使用-R选项表示递归

setfacl -R -m u:zebra:rwx conf/

ll conf/
-rw-rwx---+ 1 root root 20 12月 13 15:42 app.json
drwxrwxr-x+ 2 root root 31 12月 13 16:01 base

su zebra

# 能够查看app.json的内容,同理,也能查看conf/base/base.json的内容,这里不再演示
cat conf/app.json
{
  "name":"root"
}

可以看到conf/app.json和conf/base都了有“+”号,表示在设置conf/目录的时候,已经将ACL权限递归设置到了其下的子目录中。

但是,-R递归参数仅仅是对已存在的文件或目录递归设置ACL权限,如果我们在设置了ACL权限的目录(conf/)下新建一个文件,这个文件时不受原来ACL权限控制的。

exit
#使用root用户在创建一个文件tmp.json,并添加权限600
touch conf/tmp.json
chmod 600 conf/tmp.json

ll conf/
-rw-rwx---+ 1 root root 20 12月 13 15:42 app.json
drwxrwxr-x+ 2 root root 31 12月 13 16:01 base
-rw-------. 1 root root  0 12月 13 16:32 tmp.json

# 新创建的文件不受ACL权限控制
su zebra
cat conf/tmp.json
cat: conf/tmp.json: 权限不够

新创建的文件不受ACL权限控制


使用-d(default)选项,为新增的文件设置默认的ACL权限,解决上面“新创建的文件不受ACL权限控制”的问题,使用root设置zebra对conf/目录的默认acl权限,在创建一个tmp1.json文件,并赋予600权限,当查看该文件的权限时,可以看到默认的acl全下是起了作用的。

setfacl -d -m u:zebra:rwx conf/
touch conf/tmp1.json

ll conf/
总用量 4
-rw-rwx---+ 1 root root 20 12月 13 15:42 app.json
drwxrwxr-x+ 2 root root 31 12月 13 16:01 base
-rw-rw----+ 1 root root  0 12月 13 16:50 tmp1.json
-rw-------. 1 root root  0 12月 13 16:32 tmp.json

需要注意的是,使用-d默认选项是,只会对后面新增的文件产生影响,而对已存在的文件没有影响,比如这里的tmp.json是以前存在的文件,所以没有ACL权限。如果要同时对已有的文件和以后新增的文件都添加ACL权限,需要同时使用-R-d参数,如setfacl -R -d u:zebra:rwx conf/

注意:ACL的权限和文件以及目录的group组的权限相关,如果你设置了用户对一个文件的ACL权限是rwx,然后设置该文件的group组的使用权限为r,那么该用户实际对该文件自由r的权限。

你可能感兴趣的:(Linux帐号与ACL权限管理)