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组,注意:添加组可以使用gpasswd
和usermod
命令,删除组建议使用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的权限。