系统相关
首页 > 系统相关> > Linux学习笔记(十):Linux账号管理和访问控制

Linux学习笔记(十):Linux账号管理和访问控制

作者:互联网

Linux学习笔记(十):Linux账号管理和访问控制

账号与群组

每个Linux账号至少会使用两个ID,即UID(User ID)和GID(Group ID)。使用指令id 账户名可以查看。文件/etc/passwd中记录的账号信息的每行第三个和第四个字段分别代表UID和GID。文件/etc/group中记录的用户组信息的每行第三个字段代表对应的GID。

账号

用户在登录Linux终端时一般会用到两个系统文件。首先系统会在/etc/passwd文件中寻找输入的账号及对应的UID、GID、家目录和Shell设定等信息,然后系统会在/etc/shadow文件中核对输入的密码与该账号是否匹配。

/etc/passwd
/etc/passwd文件中的每一行对应一个账号。除了root账号、普通用户账号之外,还包括许多系统账号如bin, adm, daemon, nobody。切忌不要随便删除这些系统账号信息。每一行的账号信息包含七个字段,以冒号分隔,依次为

root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

/etc/shadow
/etc/shadow文件中每一行的账号信息包含九个字段,以冒号分隔,依次为

root:$w$6$wtbCce/PxMe5wm$Jr.XP6oacai/T7KFh...:16559:0:99999:7:::

忘记密码怎么办
一般用户忘记密码,请管理员使用passwd指令直接设定新密码即可。如果是root用户忘记密码,则需要重启进入单人维护模式修改密码;或者,以Live CD开机后挂载根目录,然后去/etc/shadow中清空root账号的密码字段,重启后无需密码即可登录,最后再使用passwd修改密码即可。

群组

与群组相关的配置文件是/etc/group/etc/gshadow

/etc/group
/etc/group文件中每一行的信息包含四个字段,以冒号分隔,依次为

root:x:0:fang,alex
bin:x:1:

有效群组与初始群组
一个账号可以加入多个群组。/etc/passwd文件中账户GID对应的群组称为初始群组(initial group)。账号登录后即拥有初始群组的相关权限。使用指令groups可以查看当前登录账号所属的所有群组,其中第一个被称为该账号的有效群组(effective group)。在当前登录账号下新建的文件对应的群组为该账号的有效群组。

[fang@study ~] groups
fang users root
[fang@study ~] touch testfile
[fang@study ~] ll testfile
-rw-rw-r--.	1	fang	fang	0	Jul 20 19:54	testfile

使用newgrp 群组名指令可以切换当前账号的有效群组(必须是账号所属的群组)。该指令功能是通过新建一个shell环境实现的,因此使用exit指令可以撤销newgrp操作,返回到原有的shell中。

一个账号要加入一个新群组有两种途径,一是root账号使用usermod指令设置,二是root账号利用gpasswd指令。

/etc/gshadow
/etc/gshadow文件中每一行的信息包含四个字段,以冒号分隔,依次为

账号管理

用户新增与删除

useradd
创建新账号可以使用useradd指令,其格式为useradd [-u UID] [-g 初始用户组] [-G 次要用户组] [-mM] [-c 说明栏] [-d 家目录绝对路径] [-s shell] 账号名。其选项与参数包括:

使用指令useradd -D可以查看创建用户时的选项默认值。其中,GROUP=100仅对SUSE等少数Linux发行版有效;对于RHEL、Fedora、CentOS而言,新建用户默认的初始群组GID与账号UID相同。

passwd
passwd指令用于设置账号密码。
一般用户指令格式(账号名可省略,需要输入旧密码):
passwd [--stdin] [账号名]
root用户指令格式(不需要输入旧密码):
passwd [-l] [-u] [--stdin] [-S] [-n 日数] [-x 日数] [-w 日数] [-i 日期] 账号名
其选项与参数包括:

passwd -l fang  # 使fang账号的密码失效
passwd -u fang  # 使fang账号的密码恢复正常

也可以使用chage指令列出详细的密码参数,格式为chage -l 账号名

usermod
usermod指令可以用于修改账号属性,格式为usermod [-cdegGlsuLU]。其选项与参数与useradd指令基本相同,不同之处在

userdel
userdel [-r] 账号名用于删除账号。选项r表示连同其家目录一起删除。

用户功能
id
id [账号名]用于查看账号名的UID和GID等信息。

chsh
即change shell。指令格式为chsh [-ls]。选项s表示要修改自己的shell,选项l表示列出系统上可用的shell。

群组新增与删除

groupadd
指令格式为groupadd [-g gid] [-r] 组名,其选项与参数包括:

groupmod
指令格式为groupmod [-g gid] [-n 新组名] 组名,其选项与参数包括:

groupdel
指令格式为groupdel 组名。可以删除群组的前提是没有用户将该组作为自己的初始群组。

用户组管理员:gpasswd

# 设置群组密码
gpasswd groupname 
# 设置-A列表中的账号为组管理员,组管理员可以向该群组添加或移出账号
# 将-M列表中的账号加入群组
gpasswd [-A user1, ...] [-M user3, ...] groupname
# -r表示删除群组密码
# -R使群组密码失效
gpasswd [-rR] groupname

访问控制ACL

访问控制列表(Access Control List, ACL)可以针对单一用户、单一文件或目录进行rwx权限设置。如果有一个目录,需要给多个用户使用,每个用户或每个用户组的权限都不相同,就可以用到ACL。

getfacl
getfacl指令用于获取给定文件或目录的ACL设置。

[fang@study ~]$ getfacl acl_test1
# file: acl_test1
# owner: root
# group: root
user::rwx # 文件拥有者的权限
user:fang:r-x # fang账号的权限
group::r-- # 文件所属用户组的权限
mask::r-x # 文件默认的有效权限
other::r-- # 其他人拥有的权限

setfacl
setfacl指令用于设置给定文件的ACL规范,指令格式为setfacl [-bkRd] [{-m | -x} acl参数] 目标文件名。其选项与参数包括:

其中,有效权限(effective permission)是指对用户或用户组设置的权限必须在mask的权限范围内才会生效。

[fang@study ~]$ touch acl_test2
[fang@study ~]$ setfacl -m u:username1:rx acl_test2
[fang@study ~]$ ll acl_test2
-rw-r-xr--+ # 权限部分多了个加号,使用getfacl查看权限
[fang@study ~]$ setfacl -m u::rwx acl_test2
-rwxr-xr--+
[fang@study ~]$ setfacl -m g:groupname1:rx acl_test2
[fang@study ~]$ setfacl -m m:r acl_test2
[fang@study ~]$ getfacl acl_test2
# file: acl_test2
# owner: fang
# group: fang
user::rwx
user:username1:r-x #effective:r--   # x权限不会生效
group::r-x
group:groupname1:r-x #effective:r--   # x权限不会生效
mask::r-- # 有效权限范围
other::r--

用户身份切换

su

su指令可用于进行任何身份的切换,指令格式为su [-lm] [-c 命令] [username]。其选项与参数包括:

# Example 1
[fang@study ~]$ su	# 当前用户是fang
Password:	# 输入root的密码
[root@study fang]$ env | grep fang   # 用户身份已变成root
USER=fang
PATH=...:/home/fang/.local/bin:/home/fang/bin
MAIL=/var/spool/mail/fang
PWD=/home/fang
LOGNAME=fang
[root@study fang]$ env | grep root
HOME=/root
[root@study fang]$ exit	# 退出su环境

# Example 2
[fang@study ~]$ su -
Password:	# 输入root的密码
[root@study ~]$ env | grep root   # 环境信息全部切换为root
USER=root
PATH=...:/usr/bin:/root/bin
MAIL=/var/spool/mail/root
PWD=/root
LOGNAME=root
HOME=/root
[root@study ~]$ exit	

# Example 3
# 以root身份和环境执行一次命令
[fang@study ~]$ su - -c "head -n 3 /etc/shadow"
...
[fang@study ~]$ 	# 不用exit退出

# Example 4
[fang@study ~]$ su -l sasuke
Password:   # 输入sasuke的账户密码
[sasuke@study ~]$ su -	
Password:   # 输入root账户密码
[root@study ~]$ exit	# 退出root身份
[sasuke@study ~]$ exit	# 退出sasuke身份
[fang@study ~]$ exit  

sudo

相比su需要知道切换用户的密码,sudo的执行仅需要自己的密码,通过设置甚至不需要密码即可执行sudo。但是仅有 /etc/sudoers 内的用户能够执行sudo。sudo的执行流程为:

  1. 当用户执行sudo时,系统在/etc/sudoers文件中查找该用户是否有sudo执行权限;
  2. 如果有执行权限,让用户输入自己的密码来确认(root用户不用);
  3. 如果密码输入成功,开始执行sudo后面接的命令。

修改/etc/sudoers文件可直接输入visudo命令(不建议使用vi /etc/sudoers)。

[root@study ~]$ visudo
......
root	ALL=(ALL)	ALL   
fang	ALL=(ALL)	ALL   # 需要新增的行
......

文件中四栏的意义分别是:

wheel用户组

[root@study ~]$ visudo
...... 
%wheel	ALL=(ALL)	ALL   # 大约在第98行,与系统有关
# 去掉%wheel前的注释符号,%表示用户组
......
# 将账号sasuke加入wheel用户组
[root@study ~]$ usermod -a -G wheel sasuke
# 这样任何加入wheel用户组的账号都能使用sudo

免密码功能

[root@study ~]$ visudo
...... 
%wheel	ALL=(ALL)	NOPASSWD: ALL
# 使用NOPASSED: ALL可以在执行sudo时免输入密码
......

有限制的操作

[root@study ~]$ visudo
......
user108	ALL=(root)	/usr/bin/passwd # 绝对路径命令
# 表示user108可以切换成root使用passwd命令
...... 

# 切换为user108
[user108@study ~]$ sudo passwd sasuke   # 可以修改sasuke的密码
......
[user108@study ~]$ sudo passwd   # 修改root的密码,危险!
Changing password for user root.

# 切换回root
[root@study ~]$ visudo
......
user108	ALL=(root)	!/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
# !表示不可执行,这样设置后user108不能执行sudo passwd和sudo passwd root 
...... 

使用别名
如果有多个用户,需要能够使用sudo执行同样的命令,为了避免多次重复,可以使用别名来编辑/etc/sudoers文件。可以使用的别名标识符为User_Alias(用户别名)、Host_Alias(来源主机别名)、Cmnd_Alias(命令别名)。别名必须使用大写字母,如ADMPW、ADMPWCMD。

[root@study ~]$ visudo
......
User_Alias ADMPW = user1, user2, user3, sasuke, fang
Cmnd_Alias ADMPWCOM = !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
ADMPW	ALL=(root)	ADMPWCMD
......

用户信息传递

查询用户
查询目前已经登录的用户,使用指令wwho
查看每个账号最近的登录时间,使用lastlog指令。

用户对话
使用write 账号名 终端界面给已经登录的用户发送消息。

[root@study ~]$ who
sasuke	tty3	2020-12-01 07:55
fang	tty2	2020-12-01 08:12
[root@study ~]$ write sasuke tty3
Hello there:
How you doing?
# 按下Ctrl D 退出消息编辑

[root@study ~]$ mesg n # 不想被打扰,可以设置拒收消息,但是root发来的消息不可拒收
[root@study ~]$ mesg
is n

# 使用wall指令可以对所有用户发送广播
[root@study ~]$ wall "I will shutdown my Linux Server in 5 minutes."

邮箱
使用mail指令可以发送邮件。用户邮箱位于/var/spool/mail/目录下。

标签:fang,账号,访问控制,群组,密码,Linux,root,study
来源: https://blog.csdn.net/Sebastien23/article/details/110287749