XiaowenBlog/source/_posts/Linux用户与权限.md

480 lines
9.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
title: Linux用户与权限
date: 2021-04-07 16:04:58
author: 文永达
top_img: https://gcore.jsdelivr.net/gh/volantis-x/cdn-wallpaper/abstract/00E0F0ED-9F1C-407A-9AA6-545649D919F4.jpeg
tags: [Linux, Shell, 用户管理]
categories: [操作系统, Linux]
---
# Linux用户与权限
## 用户管理
### 查看用户
```shell
# 查看当前用户
who am i
# 查看当前登录用户数量
who --count
```
### 用户组管理
```shell
# 创建用户组
groupadd groupname
# 删除用户组
groupdel groupname
```
### 用户管理
```shell
# 创建用户并指定用户组
useradd username -g usergroup
# 设置用户密码
passwd username
# 切换用户
# 从 root 切换到其他用户不需要输入密码
# 从其他用户切换到 root 需要输入密码
su username
# 退出登录
exit
```
### 收回用户 Shell 权限
限制用户登录系统,禁止其使用交互式 Shell。
#### 设置禁止登录的 Shell
```shell
# 方法一:使用 /sbin/nologin推荐
usermod -s /sbin/nologin username
# 方法二:使用 /bin/false
usermod -s /bin/false username
```
#### 查看用户当前 Shell
```shell
grep username /etc/passwd
# 或
getent passwd username
```
输出示例:
```
username:x:1001:1001::/home/username:/sbin/nologin
```
#### 各 Shell 对比
| Shell | 效果 |
| --- | --- |
| `/bin/bash` | 正常登录,可执行命令 |
| `/sbin/nologin` | 拒绝登录,提示 `This account is currently not available` |
| `/bin/false` | 拒绝登录,无提示,退出码为 1 |
| `/usr/sbin/nologin` | 与 `/sbin/nologin` 相同(部分系统软链接) |
> **适用场景**数据库用户、服务专用账户、FTP 账户等只需运行服务不需要登录系统的用户。
#### 恢复登录权限
```shell
usermod -s /bin/bash username
```
#### 批量收回
```shell
# 读取用户列表文件,批量设置
while read user; do
usermod -s /sbin/nologin "$user"
done < userlist.txt
```
---
## 权限管理
### Linux文件权限
Linux 文件有三种权限:
| 权限 | 说明 |
|-----|------|
| `r` | 可读 |
| `w` | 可写 |
| `x` | 可执行 |
### chmod 命令
修改文件或目录权限。
#### 基本语法
```shell
chmod [选项] 模式 文件
```
#### 符号模式
通过 `u`(所有者)、`g`(所属组)、`o`(其他用户)、`a`(所有人)配合 `+``-``=` 操作权限。
**操作符区别**
| 操作符 | 作用 | 说明 |
|--------|------|------|
| `+` | 添加权限 | 在原有权限基础上增加,不影响已有权限 |
| `-` | 移除权限 | 从现有权限中移除,不影响未指定的权限 |
| `=` | 直接设置 | 覆盖为指定权限,其余位清零 |
```shell
# + 添加权限(累加,不影响其他位)
chmod u+x script.sh # 所有者添加执行权限
chmod a+r file.txt # 所有人添加读权限
chmod g+w,o+r file.txt # 组添加写,其他添加读
# - 移除权限(仅移除指定位,其余保留)
chmod o-w file.txt # 其他用户移除写权限
chmod g-x script.sh # 组移除执行权限
chmod a-w file.txt # 所有人移除写权限
# = 直接设置(覆盖,未指定的位全部清零)
chmod u=r file.txt # 所有者只有读权限(写和执行被清除)
chmod g=r file.txt # 组只有读权限
chmod o= file.txt # 其他用户无任何权限
chmod u=rwx,g=rx,o= file.txt # 精确控制每位权限
# + 重复添加已有权限不会报错,保持不变
chmod u+x file.txt # 如果已有执行权限,不变
chmod a+r file.txt # 如果所有人已有读权限,不变
```
> **注意**`+` 是幂等操作,重复添加已有权限不会产生任何变化,也不会报错。`-` 同理,移除不存在的权限也不会报错。
**示例对比**
```shell
# 假设文件当前权限为 rw-r--r--644
chmod u+x file.txt # 结果rwxr--r--654只给所有者加了执行
chmod u-x file.txt # 结果rw-r--r--644移除执行本来就没有不变
chmod u=r file.txt # 结果r--r--r--444所有者变成只读写被清掉
chmod u=rw file.txt # 结果rw-r--r--644所有者读写
chmod u=rwx,g=rx,o= file.txt # 结果rwxr-x---750
```
#### 数字模式
用三位八进制数表示权限,每位对应 `u``g``o`
| 数字 | 权限 | 说明 |
|-----|------|------|
| 7 | rwx | 读、写、执行 |
| 6 | rw- | 读、写 |
| 5 | r-x | 读、执行 |
| 4 | r-- | 只读 |
| 0 | --- | 无权限 |
```shell
# rwxr-xr-x所有者全权限组和其他用户读执行
chmod 755 file.txt
# rw-r--r--(所有者读写,组和其他用户只读)
chmod 644 file.txt
# rw-rw----(所有者和组读写,其他用户无权限)
chmod 660 file.txt
# rwx------(仅所有者有全部权限)
chmod 700 file.txt
# rw-rw-rw-(所有人可读写)
chmod 666 file.txt
```
#### 常用权限参考
| 权限值 | 含义 | 适用场景 |
|--------|------|----------|
| `755` | rwxr-xr-x | 可执行脚本、程序,公开目录 |
| `644` | rw-r--r-- | 普通文件,所有人可读 |
| `700` | rwx------ | 私有目录,仅所有者可访问 |
| `600` | rw------- | 私有文件,如 SSH 密钥 |
| `640` | rw-r----- | 服务配置文件,组可读 |
| `777` | rwxrwxrwx | 所有人可读写执行(不推荐) |
#### 常用选项
```shell
# 递归修改目录及子目录下所有文件
chmod -R 755 /var/www/html
# 仅修改目录本身的权限
chmod 755 /var/www/html
# 修改符号链接的权限(不常用)
chmod -h 755 link_file
# 显示修改过程
chmod -v 755 file.txt
```
#### 设置特殊权限
```shell
# SUID4执行时以文件所有者身份运行
chmod 4755 /usr/bin/passwd
# SGID2执行时以文件所属组身份运行
chmod 2755 /shared_dir
# Sticky Bit1目录内文件只有所有者能删除
chmod 1777 /tmp
```
**特殊权限数字对照**
| 数字 | 权限 | 说明 |
|------|------|------|
| 4 | SUID | 执行时以所有者身份运行 |
| 2 | SGID | 执行时以组身份运行 |
| 1 | Sticky | 仅文件所有者可删除目录内文件 |
```shell
# 同时设置特殊权限和普通权限
chmod 4755 file # SUID + rwxr-xr-x
chmod 2755 dir # SGID + rwxr-xr-x
chmod 1777 /tmp # Sticky + rwxrwxrwx
```
#### 通过八进制运算理解权限
```
用户(u) 组(g) 其他(o)
rwx r-x r--
4+2+1 4+0+1 4+0+0
7 5 4 = 754
```
---
### chown 命令
修改文件或目录的所有者和所属组。
#### 基本语法
```shell
chown [选项] 所有者[:所属组] 文件
```
#### 常用操作
```shell
# 修改文件所有者
chown user file.txt
# 修改文件所有者和所属组
chown user:group file.txt
# 修改文件所属组
chown :group file.txt
# 递归修改目录及子文件
chown -R user:group /var/www/html
# 仅修改所有者
chown -R user /var/www/html
# 仅修改所属组
chown -R :group /var/www/html
# 显示修改过程
chown -v user file.txt
```
#### 常用选项
| 选项 | 说明 |
|------|------|
| `-R` | 递归修改目录及子目录下所有文件 |
| `-v` | 显示修改过程 |
| `-c` | 仅显示更改的文件 |
| `-f` | 静默模式,忽略错误 |
| `-h` | 修改符号链接本身而非链接目标 |
#### 与 chgrp 的区别
```shell
# chown 可同时修改所有者和所属组
chown user:group file.txt
# chgrp 只能修改所属组
chgrp group file.txt
```
#### 实用场景
```shell
# 部署 Web 项目
chown -R nginx:nginx /var/www/html
# 将目录交给特定用户管理
chown -R user:user /home/user/projects
# 修改 SSH 密钥权限
chmod 600 ~/.ssh/id_rsa
chown root:root ~/.ssh
chmod 700 ~/.ssh
```
---
## sudo权限
### 开启sudo权限
#### 1. 添加sudoers文件写权限
```shell
chmod u+w /etc/sudoers
```
#### 2. 编辑sudoers文件
```shell
vim /etc/sudoers
```
找到 `root ALL=(ALL) ALL` 这行,在其下面添加:
```
username ALL=(ALL) ALL
```
#### 3. sudoers配置选项
```shell
# 允许用户执行sudo命令需要输入密码
username ALL=(ALL) ALL
# 允许用户组里的用户执行sudo命令需要输入密码
%usergroup ALL=(ALL) ALL
# 允许用户执行sudo命令不需要输入密码
username ALL=(ALL) NOPASSWD: ALL
# 允许用户组里的用户执行sudo命令不需要输入密码
%usergroup ALL=(ALL) NOPASSWD: ALL
```
#### 4. 撤销sudoers文件写权限
```shell
chmod u-w /etc/sudoers
```
---
## ACL权限
> ACL访问控制列表提供更细粒度的权限控制允许为特定用户或组设置特定权限。
### 安装ACL工具
```shell
# Ubuntu/Debian
sudo apt install acl -y
# Fedora/AlmaLinux
sudo dnf install acl -y
```
### 设置ACL权限
```shell
# 为指定用户设置读写权限
sudo setfacl -m u:user:rwx /OLAP
```
### 验证ACL权限
```shell
getfacl /OLAP
```
**输出示例**
```
getfacl: Removing leading '/' from absolute path names
# file: OLAP
# owner: user
# group: user
user::rwx
group::r-x
other::r-x
```
### 设置默认ACL权限
让新创建的文件和子目录自动继承特定权限:
```shell
sudo setfacl -dm u:user:rwx /OLAP
```
---
## 目录权限修改
### 查看目录权限
```shell
sudo ls -ld /OLAP
```
**输出示例**
```
drwxr-xr-x 5 root root 4096 Aug 5 08:27 /OLAP
```
### 修改目录权限
```shell
# 设置权限为775rwxrwxr-x
sudo chmod 775 /OLAP
```
这样目录的所有者和所属组的用户都可以读写,其他用户只有读取和执行权限。
### 将用户加入目录所属组
```shell
# 将用户加入root组不推荐root组权限过高
sudo usermod -aG root user
```
重新登录或重启系统以使组变更生效。
### 更改目录所有者
```shell
# 将目录所有者更改为指定用户
sudo chown user:user /OLAP
```
这样用户将拥有对目录的完全控制权。