Linux用户和权限管理
用户和组的概念
Linux是一个多用户操作系统,支持多个用户同时登录和使用系统。为了确保系统安全和资源合理分配,Linux提供了完善的用户和组管理机制。
用户类型
- root用户:超级用户,拥有系统的完全控制权
- 系统用户:系统服务运行所需的用户账户
- 普通用户:日常使用的用户账户
组的概念
组是用户的集合,用于简化权限管理。一个用户可以属于多个组,文件和目录的权限可以分配给特定的组。
用户管理
查看用户信息
# 查看当前用户
whoami
# 查看系统所有用户
cat /etc/passwd
# 查看当前登录用户
who
# 查看详细登录信息
w
# 查看用户详细信息
id
id username
添加用户
# 添加新用户
sudo useradd newuser
# 添加用户并创建主目录
sudo useradd -m newuser
# 添加用户并指定shell
sudo useradd -m -s /bin/bash newuser
# 添加用户并指定用户ID
sudo useradd -m -u 1001 newuser
# 添加用户并指定组
sudo useradd -m -g groupname newuser
# 添加用户并指定附加组
sudo useradd -m -G group1,group2 newuser
设置用户密码
# 为用户设置密码
sudo passwd newuser
# 设置密码过期时间
sudo passwd -e newuser
# 锁定用户账户
sudo passwd -l newuser
# 解锁用户账户
sudo passwd -u newuser
修改用户信息
# 修改用户信息
sudo usermod -c "User Full Name" username
# 修改用户主目录
sudo usermod -d /new/home/directory username
# 修改用户shell
sudo usermod -s /bin/zsh username
# 将用户添加到附加组
sudo usermod -aG groupname username
# 修改用户登录名
sudo usermod -l newname oldname
删除用户
# 删除用户(保留主目录)
sudo userdel username
# 删除用户及其主目录
sudo userdel -r username
# 删除用户及其主目录和邮件
sudo userdel -r -f username
组管理
查看组信息
# 查看当前用户所属组
groups
# 查看用户所属组
groups username
# 查看系统所有组
cat /etc/group
# 查看组详细信息
getent group groupname
添加组
# 添加新组
sudo groupadd newgroup
# 添加系统组
sudo groupadd -r sysgroup
# 添加组并指定组ID
sudo groupadd -g 1001 newgroup
修改组
# 修改组名
sudo groupmod -n newname oldname
# 修改组ID
sudo groupmod -g 2001 groupname
删除组
# 删除组
sudo groupdel groupname
管理组成员
# 将用户添加到组
sudo usermod -aG groupname username
# 将用户从组中移除
sudo gpasswd -d username groupname
# 设置组管理员
sudo gpasswd -A adminuser groupname
# 设置组密码
sudo gpasswd groupname
文件权限管理
权限类型
Linux文件系统有三种基本权限:
- 读权限(r):允许查看文件内容或列出目录内容
- 写权限(w):允许修改文件内容或在目录中创建/删除文件
- 执行权限(x):允许执行文件或进入目录
权限类别
每种权限类型都对应三类用户:
- 所有者(user, u):文件的拥有者
- 组(group, g):文件所属组的成员
- 其他用户(others, o):既不是所有者也不属于该组的用户
查看文件权限
# 查看文件详细信息
ls -l filename
# 查看目录详细信息
ls -ld directory
# 以数字形式显示权限
stat -c "%a %n" filename
输出格式解释:
-rwxr-xr-- 1 user group 1234 date filename
||||||||||
||| ||| ||`--- 其他用户权限 (r--)
||| ||| |`---- 组权限 (r-x)
||| ||| `----- 文件类型 (- = 普通文件, d = 目录)
||| `--------- 所有者权限 (rwx)
权限数字表示法
权限可以用三位或四位八进制数字表示:
- 读(r)= 4
- 写(w)= 2
- 执行(x)= 1
三位数字分别代表所有者、组、其他用户的权限:
# 示例权限数字
755 = rwxr-xr-x (所有者:读写执行,组和其他:读执行)
644 = rw-r--r-- (所有者:读写,组和其他:只读)
600 = rw------- (所有者:读写,组和其他:无权限)
修改文件权限
使用数字模式
# 设置权限为755
chmod 755 filename
# 设置权限为644
chmod 644 filename
# 设置权限为600
chmod 600 filename
使用符号模式
# 给所有者添加执行权限
chmod u+x filename
# 移除组的写权限
chmod g-w filename
# 给其他用户添加读权限
chmod o+r filename
# 给所有用户添加读权限
chmod a+r filename
# 设置所有者权限为读写执行
chmod u=rwx filename
# 同时修改多个权限
chmod u+r,g-w,o=r filename
修改文件所有者和组
# 修改文件所有者
sudo chown newuser filename
# 修改文件所有者和组
sudo chown newuser:newgroup filename
# 递归修改目录及其内容的所有者
sudo chown -R newuser:newgroup directory
# 只修改文件所属组
sudo chgrp newgroup filename
# 递归修改目录及其内容的组
sudo chgrp -R newgroup directory
特殊权限
SetUID(SUID)
当一个可执行文件设置了SUID位时,任何用户执行该文件时都会以文件所有者的权限运行。
# 设置SUID位
chmod u+s filename
# 或
chmod 4755 filename
# 查看SUID位
ls -l filename
# 输出示例:-rwsr-xr-x 1 root root 1234 date filename
SetGID(SGID)
当一个目录设置了SGID位时,在该目录中创建的文件会继承目录的组所有权。
# 设置SGID位
chmod g+s directory
# 或
chmod 2755 directory
# 查看SGID位
ls -ld directory
# 输出示例:drwxr-sr-x 2 user group 4096 date directory
Sticky Bit
当一个目录设置了Sticky Bit时,只有文件所有者才能删除该目录中的文件。
# 设置Sticky Bit
chmod +t directory
# 或
chmod 1755 directory
# 查看Sticky Bit
ls -ld directory
# 输出示例:drwxrwxrwt 2 user group 4096 date directory
访问控制列表(ACL)
ACL提供了比传统权限模型更精细的权限控制。
安装ACL支持
# Ubuntu/Debian
sudo apt install acl
# CentOS/RHEL
sudo yum install acl
使用ACL
# 查看文件ACL
getfacl filename
# 为特定用户设置ACL
setfacl -m u:username:rwx filename
# 为特定组设置ACL
setfacl -m g:groupname:rx filename
# 设置默认ACL(对新创建的文件有效)
setfacl -d -m u:username:rwx directory
# 删除特定用户的ACL
setfacl -x u:username filename
# 删除所有ACL
setfacl -b filename
用户和权限安全实践
安全建议
-
避免使用root账户进行日常操作
# 使用sudo执行管理任务
sudo command -
定期检查用户账户
# 查看没有密码的账户
sudo awk -F: '($2 == "") {print $1}' /etc/shadow
# 查看最近添加的用户
tail /etc/passwd -
设置强密码策略
# 配置密码复杂度要求(/etc/pam.d/common-password)
password requisite pam_pwquality.so retry=3 minlen=8 difok=3 -
限制用户登录
# 禁止用户登录
sudo usermod -s /usr/sbin/nologin username -
定期审查权限
# 查找全局可写的文件
sudo find / -perm -0002 -type f -not -path "/proc/*" -not -path "/sys/*"
# 查找设置了SUID的文件
sudo find / -perm -4000 -type f
实践练习
练习1:用户和组管理
# 1. 创建新用户和组
sudo groupadd developers
sudo useradd -m -g developers -s /bin/bash alice
sudo useradd -m -g developers -s /bin/bash bob
# 2. 设置用户密码
sudo passwd alice
sudo passwd bob
# 3. 查看用户信息
id alice
groups alice
# 4. 将用户添加到附加组
sudo usermod -aG sudo alice
# 5. 验证组成员
getent group developers
getent group sudo
练习2:文件权限管理
# 1. 创建测试目录和文件
mkdir ~/test_permissions
cd ~/test_permissions
touch file1 file2
mkdir dir1 dir2
# 2. 查看默认权限
ls -l
# 3. 修改文件权限
chmod 644 file1
chmod 755 dir1
chmod u+x file2
# 4. 修改所有者和组
sudo chown alice:developers file1
sudo chown -R bob:developers dir1
# 5. 验证权限更改
ls -l
练习3:特殊权限应用
# 1. 创建测试脚本
cat > ~/test_script.sh << 'EOF'
#!/bin/bash
echo "Current user: $(whoami)"
echo "Effective user: $(id -un)"
EOF
chmod 755 ~/test_script.sh
# 2. 设置SUID位
sudo chown root:root ~/test_script.sh
sudo chmod u+s ~/test_script.sh
# 3. 测试SUID效果
~/test_script.sh
# 4. 创建共享目录并设置SGID和Sticky Bit
sudo mkdir /shared
sudo chown root:developers /shared
sudo chmod 2775 /shared
sudo chmod +t /shared
# 5. 验证特殊权限
ls -ld /shared
总结
Linux用户和权限管理是系统安全的基础。通过合理的用户和组管理,以及适当的文件权限设置,可以有效保护系统资源不被未授权访问。掌握这些概念和命令对于Linux系统管理员至关重要。
关键要点:
- 理解用户和组的概念及管理方法
- 掌握文件权限的三种类型和三类用户
- 熟练使用chmod、chown、chgrp命令
- 了解特殊权限(SUID、SGID、Sticky Bit)的应用
- 学会使用ACL进行精细权限控制
- 遵循安全最佳实践,定期审查用户和权限设置