Linux 是一个多用户的操作系统,在日常的使用中,从安全角度考虑,应该尽量避免直接使用 root 用户登录,而使用普通用户。
1. 关于用户 user 的两个重要的文件: /etc/passwd(存储用户信息) 和 /etc/shadow(存储用户对应的密码信息)
[root@ryan ~]# cat /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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
……
/etc/passwd 由 ":" 分割成7个字段:
第一个字段是用户名。
第二个字段是密码的占位符"x"。
第三个字段是用户标识号,也被称为 uid,系统通过这个数字来识别用户身份,此处的"0"就是root,是超级用户的标识号,1~499由系统保留,作为管理账号,普通用户的标识号从500开始,自己定义的普通用户,标识号都是大于或等于500的。
第四个字段是组标识号,也被称为 gid,对应着 /etc/passwd 中的一条记录。
第五个字段是注释说明,没有实际意义。
第六个字段是用户的家目录,root 的家目录是 /root,普通用户的家目录是 /home/[username],也可以自定义用户家目录。
第七个字段是用户的 shell,用户登录后需要启动一个进程,用来将用户输入的命令传送给系统内核,这就是 shell,RedHad/CentOS 的 shell 默认是bash。若想要更改系统创建用户时的默认shell,可以在修改此文件中 /etc/default/useradd 中 SHELL 一行,比如:SHELL=/bin/bash,修改此处。
/etc/shadow 由 ":" 分割成9个字段:
root:$6$zmDSSdDBtTzEFjX1$U65Mlsw17RNnZ06UTtySSvOk725oFk7JEnWj3PjPZdnnVVKlDTYSD34ggqwFp.53E9MoAvfZlsr6DahX6jPsN0:17481:0:99999:7:::
bin:*:15980:0:99999:7:::
daemon:*:15980:0:99999:7:::
adm:*:15980:0:99999:7:::
lp:*:15980:0:99999:7:::
sync:*:15980:0:99999:7:::
shutdown:*:15980:0:99999:7:::
……
第一个字段是用户名,与 /etc/passwd 对应。
第二个字段是用户密码,并且已经加密,如果该用户没有设置密码时,此处将显示两个感叹号"!!"。
第三个字段是上次更改密码的日期,单位为天,从1970年1月1日起到上次更改密码的日期之差,计算天数得到。
第四个字段是要过多少天才可以更改密码,默认是 0,表示不受限制。
第五个字段是密码多少天后到期,即在多少天内必须更改密码,默认是99999,可以理解为不受限制。
第六个字段是密码到期前的警告期限。
第七个字段是账号失效期限,失效后账号会被锁定。
第八个字段是账号的生命周期,到期后账号会作废。
第九个字段是保留字段,目前还没有具体意义。
2. 关于组 group 的两个重要的文件: /etc/group(存储组信息) 和 /etc/gshadow(存储组对应的密码信息,一般组很少设置密码,故很少用)
[root@ryan ~]# cat /etc/group
root:x:0:
bin:x:1:bin,daemon
daemon:x:2:bin,daemon
sys:x:3:bin,adm
adm:x:4:adm,daemon
tty:x:5:
disk:x:6:
lp:x:7:daemon
……
以上格式为:组名:口令:组标识号:组内用户列表。
具体解释:
组名:组名是用户组的名称,由字母或数字构成。与 /etc/passwd 中的登录名一样,组名不应重复。
口令:口令字段存放的是用户组加密后的口令字。一般 Linux 系统的用户组都没有口令,即这个字段一般为空,或者是*。
组标识号:组标识号与用户标识号类似,也是一个整数,被系统内部用来标识组,即 GID。
组内用户列表:是属于这个组的所有用户的列表,不同用户之间用逗号(,)分隔。这个用户组可能是用户的主组,也可能是附加组。
[root@ryan ~]# cat /etc/gshadow
root:::
bin:::bin,daemon
daemon:::bin,daemon
sys:::bin,adm
adm:::adm,daemon
tty:::
disk:::
lp:::daemon
……
3. 命令 id
id - print real and effective user and group IDs,打印用户和组信息,包括 uid,gid 和所属 groups。
[root@ryan ~]# id root
uid=0(root) gid=0(root) groups=0(root)
注意:
Linux 系统以组 Group 方式管理用户,用户和组的对应关系为多对多,即某个用户可加入/属于一个或多个组,某个组可以有0个、1个或多个用户。从用户的角度,组可以分为主组和附属组。
主组:也被称为 Primary group、first group 或 initial login group,用户的默认组,用户的 gid 所标识的组。
附属组:也被称为 Secondary group或 supplementary group,用户的附加组。
可以通过 id 命令可查看当前用户的主组和附属组,比如:
[root@ryan ~]# id root
uid=0(root) gid=0(root) groups=0(root),1(bin),2(daemon),3(sys),4(adm),6(disk),10(wheel)
[root@ryan ~]# id gg
uid=503(gg) gid=503(gg) groups=503(gg)
[root@ryan ~]# id mm
uid=502(mm) gid=500(jww) groups=500(jww)
其中,gid 标识主组,groups 表示用户所属的全部组(主组和附属组),用户必须有且只能有一个主组,可以有0个、1个或多个附属组。
用户和用户组管理
4. 命令 groupadd
groupadd - create a new group,新增用户组,格式为"groupadd [-g GID] groupname",不加参数 -g 选项,则系统会按照默认的 gid 创建组,和 uid 一样,gid 也是从500开始的。
[root@ryan ~]# groupadd pbwm
[root@ryan ~]# cat /etc/group
root:x:0:
bin:x:1:bin,daemon
daemon:x:2:bin,daemon
sys:x:3:bin,adm
adm:x:4:adm,daemon
slocate:x:21:
pbwm:x:500:
……
5. 命令 groupdel
groupdel - delete a group,用于删除用户组,只有当用户组中不再包含具体的用户时,才可以删除此空组,否则会提示由于包含某个用户而无法删除。
[root@ryan ~]# groupdel pbwm
groupdel: cannot remove the primary group of user 'adam'
6. 命令 groupmod
groupmod - modify a group definition on the system,用于修改用户组,格式为:"groupmod [-g GID] [-o] [-n] groupname"。
7. 命令 useradd
useradd - create a new user or update default new user information,用于新增一个用户,也可使用 adduser,功能相同,命令的格式为:"useradd [-u UID] [-g GID] [-d HOME] [-M] [-s]",其中:
-u:表示自定义UID。
-g:表示新增用户时指定用户属于哪个组,后面可以跟组 id,也可以跟组名,-G 表示添加附属组。
-d:表示自定义用户的家目录。
-M:表示不建立家目录。
-s:表示自定义 shell 。
[root@ryan ~]# useradd -g pbwm adam
[root@ryan ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
……
adam:x:500:500::/home/adam:/bin/bash
如果 useradd 不加任何选项,直接跟用户名,则会创建一个跟用户名同名的用户组。
[root@ryan ~]# useradd bob
[root@ryan ~]# cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
……
adam:x:500:500::/home/adam:/bin/bash
bob:x:501:501::/home/bob:/bin/bash
[root@ryan ~]# cat /etc/group
root:x:0:
bin:x:1:bin,daemon
……
pbwm:x:500:
bob:x:501:
8. 命令 userdel
userdel - delete a user account and related files,用于删除一个用户,命令格式为:"userdel [-r] username",其中 -r 选项表示,当删除用户时一并删除该用户的家目录。
[root@ryan ~]# userdel -r bob
[root@ryan ~]# ll /home
total 4
drwx------. 4 adam pbwm 4096 Dec 17 20:51 adam
9. 命令 usermod
usermod - modify a user account,用于修改一个用户账户信息。
比如修改一个用户的所属组:
# usermod -g 513 user3
比如修改一个用户的附属组,将 username 添加到名称为 secondarygroup 的附属组中:
# usermod -G secondarygroup username
比如修改一个用户的 shell:
# usermod -s /bin/bash user3
10. 命令 chfn
chfn - change your finger information,修改用户的基本信息 finger,finger 其实就是在 /etc/passwd 文件第5个字段中所显示的信息。
[root@ryan ~]# chfn bob
Changing finger information for bob.
Name []: bob-xu
Office []: hsbc
Office Phone []: 1008611
Home Phone []: 1008612
Finger information changed.
[root@ryan ~]# grep bob /etc/passwd
bob:x:501:501:bob-xu,hsbc,1008611,1008612:/home/bob:/bin/bash
用户密码管理
11. 命令 passwd
passwd - update user’s authentication tokens,修改用户的登录密码,格式为 "passwd [username]"。该命令后面若不加用户名字,则是为自己设定密码。如果登录的是 root 账户,后面可以跟普通账户的名字,意思是修改指定账户的密码,只有 root 才可以修改其他账户的密码,普通用户只能修改自己的密码。双敲复合之后令牌被成功更新。
[root@ryan ~]# passwd bob
Changing password for user bob.
New password:
BAD PASSWORD: it is too simplistic/systematic
BAD PASSWORD: is too simple
Retype new password:
passwd: all authentication tokens updated successfully.
12. 命令 mkpasswd
mkpasswd - generate new password, optionally apply it to a user,用于生成密码,包含大小写字母,数字和特殊符。
[root@ryan ~]# mkpasswd
aMg09i(fY
[root@ryan ~]# mkpasswd
j0xRJn5a=
用户身份切换
root 账户提示符是"#",普通用户是"$"。
13. 命令 su
su - run a shell with substitute user and group IDs,命令格式为:"su [-] username",普通用户的 su 命令不加 username 时就是切换到 root 用户,需要输入 root 的密码,root 用户同样可以使用 su 命令切换到普通用户,但不需要输入密码。当不加 [-] 时,当前目录没有变化,加上 [-] 时,当前目录为家目录,区别在于是否初始化当前用户的各种环境变量。
[root@ryan ~]# su bob
[bob@ryan root]$ pwd
/root
[bob@ryan root]$ echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[bob@ryan root]$ whoami
bob
[root@ryan ~]# su - bob
[bob@ryan ~]$ pwd
/home/bob
[bob@ryan ~]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/bob/bin
[bob@ryan ~]$ whoami
bob
14. 命令 sudo
sudo, sudoedit - execute a command as another user,执行 root 才能执行的命令,sudo命令用来以其他身份来执行命令,预设的身份为root。在/etc/sudoers 中设置了可执行sudo指令的用户。若其未经授权的用户企图使用sudo,则会发出警告的邮件给管理员。用户使用sudo时,必须先输入密码,之后有5分钟的有效期限,超过期限则必须重新输入密码。配置sudo必须通过编辑/etc/sudoers文件,而且只有超级用户才可以修改它,还必须使用visudo编辑。之所以使用visudo有两个原因,一是它能够防止两个用户同时修改它;二是它也能进行有限的语法检查。所以,即使只有你一个超级用户,你也最好用visudo来检查一下语法。visudo默认的是在vi里打开配置文件,用vi来修改文件。
[root@ryan ~]# su bob
[bob@ryan root]$ pwd
/root
[bob@ryan root]$ ls
ls: cannot open directory .: Permission denied
[bob@ryan root]$ echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[bob@ryan root]$ sudo ls
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for bob:
bob is not in the sudoers file. This incident will be reported.
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
bob ALL=(ALL) ALL
[root@ryan ~]# su bob
[bob@ryan root]$ pwd
/root
[bob@ryan root]$ ls
ls: cannot open directory .: Permission denied
[bob@ryan root]$ sudo ls
[sudo] password for bob:
anaconda-ks.cfg Documents install.log linux Pictures Templates
Desktop Downloads install.log.syslog Music Public Videos
扩展权限 ACL
以上属于基本权限的范畴,此外还有扩展权限 ACL(Access Control List),ACL 权限是为了防止权限不够用的情况,一般的权限有所有者、所属组、其他人这三种,当这三种满足不了我们的需求的时候就可以使用ACL权限。
比如:一个网络老师,给一个班的学员上课,他在linux的根目录下面建立了一个文件,只允许本班级的学员对该目录进行上传下载,其他人都不行,这时该目录的权限一般是770(一般我们设置权限都是所有者的权限大于所属组的权限,所属组的权限大于其他人的权限,依次往下),此时有个同学想试听我们的课程,该怎么给他分配权限呢?此时的所属组、所有者、其他人都不满足,这时就要用到 ACL 权限,ACL 权限的原理类似 Windows 给一个文件添加用户(这个用户对该文件具有的权限)。
设置 ACL 权限:
设置用户:setfacl -m u:user1:rx test [u表示设置用户的 ACL,user1为具体的用户,rx 为要设置的权限,test 为目录或者文件]
设置组:setfacl -m g:group1:rx test [g表示设置组的 ACL,group1为具体的组,rx 为要设置的权限,test 为目录或者文件]
其中的选项 -m 表示修改ACL,你可以增加新的,或修改存在的ACL。
查看 ACL 权限:
getfacl test,用于显示分配完的 ACL 权限。
[root@ryan linux]# getfacl test # file: test # owner: root # group: root user::rwx group::r-x other::r-x [root@ryan linux]# setfacl -m u:adam:rx test [root@ryan linux]# setfacl -m g:pbwm:rx test [root@ryan linux]# getfacl test # file: test # owner: root # group: root user::rwx user:adam:r-x group::r-x group:pbwm:r-x mask::r-x other::r-x
可以看到添加了一个 adam 用户和一个 pbwm 组,这两个就是通过设置 ACL 权限做到的。
[root@ryan linux]# ll -d test drwxr-xr-x+ 2 root root 4096 Dec 3 13:35 test
如上,设置 ACL 权限后,权限后会多一个 + 标记,这表示ACL已经设置成功。
删除 ACL 权限:
删除ACL用户权限:setfacl -x u:user1 test
删除ACL组权限:setfacl -x g:group1 test
删除整个ACL权限:setfacl -b test
附录