Linux 之旅 11:Linux 账号管理与 ACL 权限设置
Linux 的账号与用户组
使用者识别码:UID与GID
关于Linux的账号管理,有两个数字最为重要:
- UID:(User ID),即账号的唯一识别码
- GID:(Group ID),即用户组的唯一识别码
LInux通过这两个数字识别系统中的用户以及群组。
要查看当前账号的UID与GID,可以:
[icexmoon@xyz ~]$ id
uid=1000(icexmoon) gid=1000(icexmoon) 组=1000(icexmoon),10(wheel) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
查看指定行号的UID与GID:
[icexmoon@xyz ~]$ id root
uid=0(root) gid=0(root) 组=0(root)
事实上用户的UID和GID等信息都保存在几个账号和群组相关的配置文件中,其中最重要的是/etc/passwd
:
[icexmoon@xyz ~]$ cat /etc/passwd | grep icexmoon
icexmoon:x:1000:1000:icexmoon:/home/icexmoon:/bin/bash
其中第三个字段是用户的UID,第四个字段是用户的主要群组(初始化群组)的GID。
使用者账号
在用户登录Linux的时候,用户验证的大概流程如下:
- 检查登录的用户名是否存在于
/etc/passwd
文件中,如果有,则读取其对应的UID和GID,以及登录用的shell和账号的家目录等。 - 通过
/etc/shadow
文件比对用户输入的密码是否正确。 - 如果没问题就调用对应的登录用
shell
进行登录。
/etc/passwd
现在看/etc/passwd
的详细结构:
[icexmoon@xyz ~]$ head -n 5 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
该文件由:
分隔,每一个字段的含义为:
- 用户名
- 密码:早期的Linux使用此字段保存密码,目前已废弃,转移到了
/etc/shadow
中,所以当前该字段中会用x
字符填充。 - UID:0表示
root
用户,1~999
为系统账号,1000~60000
为可以设置的一般性用户账号。 - GID:用户所属的主用户组(初始化用户组)
- 用户信息说明:关于用户的描述性信息
- 家目录
- Shell:通过登录验证后会使用这里指定的Shell进行登录,部分系统账号会被设置为
/sbin/nologin
,所以无法登录。
/etc/shadow
用户的密码保存在/etc/shadow
中:
[root@xyz ~]# head -n 5 /etc/shadow
root:$6$h5eXZCiKw8ucXyB2$PxxRgKneIDs2TWIpg916ugAfGCfqNf/HJHiXjy0PTPtUmY.pR/e2cUMpjRBqbx5Y0AHNJtjxAf3aOUTek3DpO.::0:99999:7:::
bin:*:18353:0:99999:7:::
daemon:*:18353:0:99999:7:::
adm:*:18353:0:99999:7:::
lp:*:18353:0:99999:7:::
同样以:
分隔,字段对应的内容为:
- 用户名
- 密码:这里存放的是经过加密后的密码,老式的Linux会使用md5,新的Linux会使用SHA或者其它的加密算法。只要稍微修改这里的数据就会导致用户无法正常登录,所以如果需要临时禁止某个用户登录,但是保留其包括登录密码在内的用户信息,就可以在这个字段开始添加一个
!
字符,如果要恢复登录就取消,很方便。 - 最近一次修改密码的日期:格式为以天为单位的时间戳
- 可变更密码的间隔天数:刚修改完密码后,需要间隔指定天数才能再次修改密码,通过设置这个字段可以杜绝频繁修改密码的行为,默认为0,表示可以随时修改密码。
- 密码过期天数:距离上一次修改密码后超过该天数后会在用户登录时要求用户修改密码。默认为99999,可以看作是永不过期。
- 密码过期前多少天进行警告:会在临近过期时,用户登录后会收到密码将要到期的提醒。
- 密码过期后的宽限天数:在宽限天数内可以修改密码并登录,如果超过宽限天数,密码将失效,无法修改和登录系统。
- 账号失效日期:格式为天为单位的时间戳,到该时间后账户会无条件失效,此字段用于特殊用途,比如将账号作为收费项目提供。
- 保留字段
如果一般用户忘记了密码,很好解决,只要用root
或者其它管理员账号修改即可,如果root
账号的密码忘了,且没有其它的管理员账号可以使用,就比较麻烦了,要么通过单人维护模式之类的方式启动系统,此时会获得root
权限,进行密码重置,要么可以用启动U盘之类的启动系统,用挂载文件系统的方式挂载/etc/shadow
所在分区,然后清空其中的root
密码字段,然后重启系统后就会提示设置root
的密码。
如果要查看Linux对密码加密使用的是何种算法,可以:
[root@xyz ~]# authconfig --test | grep hashing
password hashing algorithm is sha512
关于用户组
/etc/group
用户组相关的信息保存在/etc/group
中:
[root@xyz ~]# head -n 5 /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:
这些字段的含义为:
- 用户组名称
- 用户组密码:此字段已废弃,相关信息移动到了
/etc/gshadow
- GID
- 包含在此用户组中的用户名:例如
root:x:0:user1,user2
就表明user1
和user2
两个用户包含在root
用户组中,一个用户可以加入多个用户组,此外,如果某个用户的主用户组是当前的用户组,则不需要写入这里。
初始化用户组
用户的主用户组,或者说初始化用户组(initial group)是创建用户时所关联的用户组,是不需要将用户名写入/etc/group
中的相关字段的:
[root@xyz ~]# grep icexmoon /etc/passwd /etc/shadow /etc/group
/etc/passwd:icexmoon:x:1000:1000:icexmoon:/home/icexmoon:/bin/bash
/etc/shadow:icexmoon:$6$vGNuDgQdXLIv4U19$mnkT6XkbUOAAO9jxxBfzXbRfS6ZA9LpR0fDwRJmfQ2cZ7PyMF18aGosW00KXjlcsv9GbzDpzSqgvqQr5E51aW/::0:99999:7:::
/etc/group:wheel:x:10:icexmoon
/etc/group:icexmoon:x:1000:icexmoon
不过事实上这里是有的:
/etc/group:icexmoon:x:1000:icexmoon
,是CentOS版本的问题?
有效用户组
使用groups
命令可以查看用户所有关联的用户组:
[icexmoon@xyz ~]$ groups
icexmoon wheel
其中第一个为用户的有效用户组(effective group),如果创建新文件,所用的用户组信息就会是这个有效用户组:
[icexmoon@xyz tmp]$ touch test_group
[icexmoon@xyz tmp]$ ll test_group
-rw-rw-r--. 1 icexmoon icexmoon 0 8月 19 21:43 test_group
使用newgrp
命令可以切换有效用户组:
[icexmoon@xyz tmp]$ newgrp wheel
[icexmoon@xyz tmp]$ groups
wheel icexmoon
[icexmoon@xyz tmp]$ touch test_grou2
[icexmoon@xyz tmp]$ ll test_grou*
-rw-r--r--. 1 icexmoon wheel 0 8月 19 21:45 test_grou2
-rw-rw-r--. 1 icexmoon icexmoon 0 8月 19 21:43 test_group
[icexmoon@xyz tmp]$ exit
exit
newgrp
会打开一个子shell
,并改变有效用户组,此时新建文件会使用新的有效用户组。需要注意的是因为是新的子shell
,所以在执行完相关操作后需要使用exit
退出,并返回之前所在的shell
中。
/etc/gshadow
/etc/gshadow
主要的用途是保存用户组的密码:
[root@xyz ~]# head -n 5 /etc/gshadow
root:::
bin:::
daemon:::
sys:::
adm:::
这些字段的含义是:
- 用户组名称
- 用户组密码:如果为用户组设置管理员,则会设置这个字段
- 用户组管理员账号
- 加入用户组的用户(与
/etc/group
相同)
所谓的用户组管理员,就是可以帮助root
管理对应的用户组,进行增加和删除用户,如果Linux主机上的用户很多,且频繁需要管理用户组,就可能需要设置用户组管理员来帮助管理,不过现在已经很少需要这么做了。
账号管理
添加和移除用户
useradd
使用useradd
就可以添加一个新用户:
[root@xyz ~]# useradd user1
[root@xyz ~]# ls -ald /home/user1
drwx------. 3 user1 user1 78 8月 20 18:26 /home/user1
[root@xyz ~]# grep user1 /etc/passwd /etc/shadow /etc/group
/etc/passwd:user1:x:1001:1001::/home/user1:/bin/bash
/etc/shadow:user1:!!:18859:0:99999:7:::
/etc/group:user1:x:1001:
可以看到新用户创建后,会自动创建相应的家目录(一般是/home/xxx
),此外还会在前边介绍的几个关键的用户和用户组相关的配置文件中添加相应的信息。
需要注意的是,/etc/shadow
中添加的新记录中的密码字段是!!
,意味着该用户的密码还未设置,所以需要设置密码后才能使用,可以用root
进行设置:
[root@xyz ~]# passwd user1
更改用户 user1 的密码 。
新的 密码:
无效的密码: 密码未通过字典检查 - 它基于字典单词
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
这里我使用的是一个常见的简单密码,所以被提示未通过字典检查,但是
root
依然可以通过重复两次的方式强行设置。
默认情况下useradd
会给新用户指定一个UID和GID,其中GID是为新用户单独创建的一个新的用户组。如果你有特殊需要,也可以为新用户指定一个UID和一个已存在的用户组作为其主用户组:
[root@xyz ~]# useradd -u 1500 -g users user2
[root@xyz ~]# ls -ald /home/user2
drwx------. 3 user2 users 78 8月 20 18:37 /home/user2
[root@xyz ~]# grep user2 /etc/passwd /etc/shadow /etc/group
/etc/passwd:user2:x:1500:100::/home/user2:/bin/bash
/etc/shadow:user2:!!:18859:0:99999:7:::
上面说的是用于普通用户登录和使用Linux主机的一般账号,此外还可以添加系统账号:
[root@xyz ~]# useradd -r user3
[root@xyz ~]# ls -ald /home/user3
ls: 无法访问/home/user3: 没有那个文件或目录
[root@xyz ~]# grep user3 /etc/passwd /etc/shadow /etc/group
/etc/passwd:user3:x:988:982::/home/user3:/bin/bash
/etc/shadow:user3:!!:18859::::::
/etc/group:user3:x:982:
使用useradd -r
可以添加系统账号,可以看到分配的UID是988
,小于1000,此外,因为系统账号一般用于运行程序等,并不会被用户登录和使用,所以没有创建对应的家目录。
useradd 参考文件
可以通过useradd -D
查看useradd
命令创建用户时的默认值:
[root@xyz ~]# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
其实这些内容是从
/etc/default/useradd
这个文件读取的。
这些默认值的含义为:
-
GROUP=100
新建用户时候分配的初始用户组是
100
。但是CentOS或Redhat系列发行版中,实际上并不会使用这个设置,而是会为新用户创建同名的一个新的用户组作为初始用户组,这种机制称为“私有用户组机制”,而使用这个设置并为新用户指定同一个用户组作为初始用户组的方式称为“公共用户组机制”。 -
HOME=/home
为新用户创建的家目录的位置,一般为
/home/xxx
。 -
INACTIVE=-1
这个默认值对应
/etc/shadow
中的第7个字段“密码过期后的宽限天数”,-1
表示永不失效,0
表示立即失效,其它值表示具体的宽限天数。 -
EXPIRE
对应
/etc/shadow
中的第8个字段,账号会在到达该天数后失效。 -
SHELL=/bin/bash
新用户默认使用的
shell
程序,如果为了安全考虑,希望新用户默认都不能登录,可以将这个值改为/sbin/nologin
。 -
SKEL=/etc/skel
新用户家目录的模板目录,在创建新用户的时候,会使用这里的模板目录为新用户创建家目录,比如,如果你希望新用户的家目录有一些基础的用户手册或者shell脚本,可以在
/etc/skel
中设置好对应的文件,这样新建的用户的家目录里也会有一份相关文件的拷贝。 -
CREATE_MAIL_SPOOL=yes
是否为新用户创建邮箱,也就是
/var/spool/mail/xxx
。
除了这些默认值以外,useradd
还需要参考其他的配置文件,比如/etc/login.defs
:
[root@xyz ~]# cat /etc/login.def