文章目录
Linux 多用户体系结构概述
Linux 是一个 多用户多任务 操作系统,多个用户可以同时登录并在系统上运行不同的进程。
- 每个用户都有一个唯一的 用户名 和 UID(用户 ID)
- 用户的权限和访问范围由 用户组(Group)和文件权限控制
- 典型的多用户登录方式:
- 本地终端(TTY)
- SSH 远程登录
- 图形界面登录(Desktop 环境)
Linux用户登录过程
1、当Linux系统正常引导完成后,系统就可以接受用户的登录。这是用户终端上显示login:提示符,如果是图形界面,则会显示用户登录窗口,这时就可以输入用户名和密码。
2、用户输入用户名后,系统会检查 /etc/passwd 是否有该用户,如不存在,则退出,如存在,则进行下一步。
3、首先读取 /etc/passwd 中的用户ID和组ID,同时改账户的其他信息(如用户的主目录)也会一并读出。
4、用户输入密码后,系统通过检查 /etc/shadow 来判断密码是否正确。如密码校验通过,这时就进入系统并启动系统的shell,系统启动的shell类型由 /etc/passwd 中的信息确定。通过系统提供的shell接口可以操作Linux。
/etc/passwd
— 用户基本信息
格式:用户名:密码占位符:UID:GID:注释:home目录:登录shell
/etc/shadow
— 用户密码与过期信息(只有 root 可读)/etc/group
— 用户组信息/etc/gshadow
— 组密码与管理信息
用户
用户类型
Linux用户类型分为 3 类:超级用户、系统用户和普通用户。
超级用户(root,UID=0):用户名为 root 或 USER ID(UID)为0的账号,具有一切权限,可以操作系统中的所有资源。root可以进行基础的文件操作以及特殊的文件管理,另外还可以进行网络管理,可以修改系统中的任何文件。日常工作中应避免使用此类账号,只有在必要的时候才使用root登录系统。
系统用户(UID 1-499):正常运行系统时使用的账户。每个进程运行在系统里都有一个相应的属主,比如某个进程以何种身份运行,这些身份就是系统里对应的用户账号。注意系统账户是不能用来登录的,比如 bin、mysql、daemon、mail等。(shell 设为 /usr/sbin/nologin
)
普通用户(UID 500-60000):普通使用者,能使用Linux的大部分资源,一些特定的权限受到控制。用户只对自己的目录有写权限,读写权限受到一定的限制,从而有效保证了Linux的系统安全,大部分用户属于此类。
认识/etc/passwd文件
1:用户名,用户登录系统时使用的用户名
2:密码位,密码占位符x,早期的unix系统中,该字段是存放账户和密码的,由于安全原因,后来把这个密码字段内容移到/etc/shadow中了。这里可以看到一个字母x,表示该用户的密码是/etc/shadow文件中保护的。
3:UID(0-65535),用户标识号
4:GID(0-65535),缺省组标识号,当添加用户时,默认情况下会同时建立一个与用户同名且UID和GID相同的组。
5:注释性描述,对这个账户的说明
6:宿主目录,用户登录系统后首先进入的目录,一般是"/home/用户名"这样的目录
7:用户使用的shell,默认为bash
认识/etc/shadow文件
因为每个用户登录时都需要取得UID和GID来判断权限问题,所以/etc/passwd的权限为644,这样一来就会带来安全问题,即所有的用户都可以都/etc/passwd文件,即使文件内的密码是加密的,但还是存在一定的被攻击破解的安全隐患。因此,就有了/etc/shadow文件。
由于passwd文件必须要被所有的用户读,所以会带来安全隐患。而shadow文件就是为了解决这个安全隐患而增加的。
权限为:---------
root:$6$jmM2rFzPCFbmqBkf$oz3AUooR3qaV5uXU67HcXlYiE3hNf0sSsunk1eBTDPrGUOM1xYCyesGoj.ZLTIzdiXEdrnnqNyC5g8SsRnxQm.:16338:0:99999:7:::
bin:*:15615:0:99999:7:::
daemon:*:15615:0:99999:7:::
adm:*:15615:0:99999:7:::
lp:*:15615:0:99999:7:::
字段1:帐号名称
字段2:加密的密码
字段3:最近更改密码的时间;从1970/1/1到上次修改密码的天数
字段4:禁止修改密码的天数;从1970/1/1开始,多少天之内不能修改密码,默认值为0
字段5:用户必须更改口令的天数;密码的最长有效天数,默认值为99999
字段6:警告更改密码的期限;密码过期之前警告天数,默认值为7;在用户密码过期前多少天提醒用户更改密码
字段7:不活动时间;密码过期之后账户宽限时间 3+5;在用户密码过期之后到禁用账户的天数
字段8:帐号失效时间,默认值为空;从1970/1/1日起,到用户被禁用的天数
字段9:保留字段(未使用),标志
用户组
每个用户至少属于一个用户组,每个用户组拥有多个用户,每个用户组共享共同的权限
cat /etc/group
1、组名
2、密码占位符x;通常不需要设置该密码,由于安全原因,该密码被记录在/etc/gshadow中,因此显示为’x’。这类似/etc/shadow
3、组账户GID号,用户组ID
4、本组的成员用户列表;加入这个组的所有用户账号
认识/etc/gshadow文件
root:::
bin:::bin,daemon
daemon:::bin,daemon
sys:::bin,adm
adm:::adm,daemon
字段1:组账号的名称
字段2:加密后的密码字符串,这个字段可以空的或者!;如果是空的或有!,表示没有密码
字段3:本组的管理员列表;这个字段也可为空;如果有多个用户组管理员,用,号分隔
字段4:本组的成员列表;加入这个组的所有用户账户;列表中多个用户通过","分隔
常用命令
# 切换角色
su 用户名
# 以root用户运行
sudo xx
# 添加用户
useradd 参数 usesname
# 添加组
groupadd [-g GID] 组名
# 查看Ubuntu有哪些用户
awk -F: '$3 >= 1000 {print $1}' /etc/passwd
我用sudo su切换到gitlab-runner的账号,我输入的密码是我的账号密码而不是gitlab-runner的账号密码
你如果单独用 su gitlab-runner,则会提示输入 gitlab-runner 用户的密码,但通常这个用户是系统用户,没有设置密码,所以你没法直接登录。
所以:用 sudo su - gitlab-runner 是用你自己密码授权执行切换,不用 gitlab-runner 密码。sudo 是以超级用户权限执行命令,它默认验证的是 调用者(当前登录用户)的密码,用来确认你有权限执行 sudo 操作。
我安装的node、mysql是在系统还是当前用户下?
软件 | 安装方式 | 安装位置 | 生效范围 |
---|---|---|---|
mysql-server | apt(系统包管理器) | /usr/bin、/etc、/var/lib/mysql | 全系统,所有用户 |
nodejs (apt) | apt | /usr/bin、/usr/lib | 全系统,所有用户 |
nodejs (nvm) | nvm(用户工具) | 当前用户家目录(~/.nvm ) | 仅当前用户 |
自定义源码安装 | 自定义路径 | 取决你配置 | 取决权限和路径 |
用户管理常用命令
创建用户
sudo adduser alice
sudo useradd -m bob # 手动指定创建 home 目录
删除用户
sudo deluser alice
sudo userdel -r bob # 删除 home 目录和邮件
修改用户信息
sudo usermod -l newname oldname # 修改用户名
sudo usermod -aG sudo alice # 添加到 sudo 组
sudo passwd alice # 修改密码
查看用户信息
id alice
groups alice
getent passwd alice
用户组管理
创建组
sudo groupadd devteam
删除组
sudo groupdel devteam
修改组
sudo usermod -aG devteam alice # 把 alice 加入 devteam
sudo gpasswd -d alice devteam # 从组中移除用户
查看组信息
getent group devteam
# 有哪些组
cut -d: -f1 /etc/group
权限与访问控制
Linux 使用 三类权限:
- 文件所有者(user)
- 所属组(group)
- 其他用户(others)
权限类型:
- 读(r = 4)
- 写(w = 2)
- 执行(x = 1)
查看文件权限
ls -l /path/to/file
修改权限
chmod 755 script.sh
chmod u+x script.sh
chmod g-w file.txt
修改所有者
sudo chown alice:devteam file.txt
常见管理场景与示例
1) 创建开发组并分配用户
sudo groupadd developers
sudo usermod -aG developers alice
sudo usermod -aG developers bob
2) 禁止用户登录
sudo usermod -s /usr/sbin/nologin testuser
3) 限制用户只访问特定目录(配合 chroot / sftp)
sudo usermod -d /var/www/webuser webuser
4) 批量创建用户
for u in user1 user2 user3; do
sudo adduser --disabled-password $u
done
安全建议与最佳实践
- 普通用户不要直接用 root 登录,使用
sudo
提升权限 - 服务进程应使用独立的系统用户运行
- 定期审计
/etc/passwd
和/etc/sudoers
- 禁用长期不用的账户:
sudo usermod -L username
- 对 SSH 登录启用密钥认证并关闭密码登录
常见问题与解决办法
问题:useradd: command not found
解决:安装 passwd
包(Debian/Ubuntu 系列):
sudo apt install passwd
问题:用户无法 sudo
解决:检查是否在 sudo
组:
sudo usermod -aG sudo username
问题:忘记 root 密码
解决:单用户模式(recovery mode)重置密码:
passwd root
参考
man useradd
man usermod
man groupadd
/etc/passwd
与/etc/shadow
格式- https://www.cnblogs.com/zhongguiyao/p/9165917.html