作为Linux系统管理员,用户管理是最基础也是最重要的日常工作之一。不同于Windows系统的图形化操作,Linux通过命令行实现精细化的用户权限控制,这正是其强大安全性的体现。
Linux系统将用户分为三大类型,每种类型都有其特定的使用场景和权限范围:
超级用户(root)
这是Linux系统的"上帝账户",UID为0。我曾在生产环境中见过新手管理员滥用root权限导致系统崩溃的案例——某位同事用root账户误删了/lib目录,导致整个系统无法启动。因此务必谨记:
sudo命令而非直接登录root普通用户
这类用户UID从1000开始分配(基于不同发行版可能略有差异),具有以下特点:
sudo机制获得临时特权系统用户(程序用户)
这类用户UID通常在1-999之间,主要用于:
/sbin/nologin,禁止交互式登录。Linux用户信息存储在三个关键配置文件中,理解它们的结构对故障排查至关重要:
/etc/passwd
每行格式为:
code复制username:x:UID:GID:描述信息:家目录:登录shell
实际案例:
code复制mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/false
这里的x表示密码已移至/etc/shadow
/etc/shadow
存储加密后的密码及相关策略:
code复制mysql:!:19103:0:99999:7:::
各字段含义:
/etc/group
记录组信息:
code复制sudo:x:27:user1,user2
表示sudo组包含user1和user2两个成员
创建用户不是简单的useradd命令,需要考虑安全策略:
bash复制# 标准创建方式
sudo useradd -m -s /bin/bash -c "开发人员账户" -G developers,testers devuser
# 设置密码(交互式)
sudo passwd devuser
# 查看结果
id devuser
关键参数解析:
-m:自动创建家目录-s:指定登录shell-c:添加描述信息-G:附加到其他组生产环境建议添加
-e参数设置账户过期时间,如-e 2024-12-31
sudo权限分配
通过visudo命令编辑/etc/sudoers文件:
code复制# 允许devuser无需密码执行特定命令
devuser ALL=(ALL) NOPASSWD: /usr/bin/systemctl restart nginx
ACL高级权限控制
当基础权限不足时,可使用ACL:
bash复制# 查看ACL
getfacl /shared_dir
# 设置ACL
setfacl -m u:devuser:rwx /shared_dir
用户会话监控
使用who命令查看当前登录用户:
bash复制who -uH
输出示例:
code复制用户名 终端 登录时间 空闲时间 PID 注释
devuser pts/0 2023-08-01 09:30 . 1234 (192.168.1.100)
Linux采用统一的树形目录结构,这与Windows的盘符分区形成鲜明对比。这种设计源于Unix的"一切皆文件"哲学:
| 目录路径 | 核心功能 | 典型内容示例 |
|---|---|---|
| /bin | 基础命令 | ls, cp, mv等 |
| /sbin | 系统命令 | fdisk, ifconfig |
| /lib | 共享库 | libc.so.6 |
| /usr | 用户程序 | /usr/local(自定义安装) |
| /var | 可变数据 | /var/log(日志)、/var/www(网站) |
| /proc | 进程信息 | /proc/cpuinfo(CPU详情) |
| /sys | 系统信息 | 硬件设备树 |
*匹配任意字符:
bash复制ls /etc/*.conf # 列出所有.conf文件
?匹配单个字符:
bash复制ls file?.txt # 匹配file1.txt但不匹配file10.txt
[]字符集匹配:
bash复制ls [abc]*.log # 匹配a.log、b.log、c.log
~:当前用户家目录~username:指定用户的家目录.:当前目录..:上级目录Linux权限系统远比表面看到的复杂,理解其底层机制至关重要。
使用ls -l查看的权限字符串:
code复制-rwxr-xr-- 1 user group 4096 Aug 1 10:00 file.txt
分解说明:
符号模式:
bash复制chmod u+x,g-w,o=r file.txt
解释:
数字模式:
bash复制chmod 755 script.sh
权限计算:
SUID(Set User ID):
bash复制chmod u+s /usr/bin/passwd
作用:执行时以文件所有者权限运行
SGID(Set Group ID):
bash复制chmod g+s /shared_dir
作用:新建文件继承目录的组
Sticky Bit:
bash复制chmod +t /tmp
作用:仅文件所有者可删除自己的文件
bash复制sudo useradd -D # 查看默认配置
常用参数组合:
bash复制sudo useradd -m -d /custom_home/dev -s /bin/zsh -G docker,web -e 2024-12-31 devuser
设置复杂密码策略:
bash复制sudo passwd -x 90 -w 7 -i 14 devuser
参数说明:
按时间搜索:
bash复制find /var/log -mtime +30 -name "*.log"
查找30天前修改的日志文件
按大小搜索:
bash复制find /home -size +100M -exec ls -lh {} \;
查找大于100MB的文件并显示详情
多条件组合:
bash复制find . \( -name "*.txt" -o -name "*.md" \) -exec grep -l "keyword" {} \;
查找包含关键词的txt或md文件
增量备份示例:
bash复制rsync -avz --delete --backup --backup-dir=/backup/$(date +%F) \
/source/ user@remote:/destination/
参数解析:
权限最小化原则
我曾在某次安全审计中发现,开发人员被赋予了不必要的sudo权限,导致可以随意重启生产服务。解决方案:
bash复制# 在/etc/sudoers.d/下创建单独文件
%developers ALL=(ALL) NOPASSWD: /usr/bin/systemctl status *, /usr/bin/git
定期账户审计
建议每月执行:
bash复制# 检查空密码账户
sudo awk -F: '($2 == "") {print}' /etc/shadow
# 检查sudo权限用户
sudo grep -Po '^sudo.+:\K.*$' /etc/group
家目录权限控制
新建用户时自动设置严格权限:
bash复制sudo useradd -m -K UMASK=0077 devuser
这样家目录默认权限为700(rwx------)
磁盘空间监控
使用df和du组合命令:
bash复制# 查看各分区使用情况
df -hT -x tmpfs -x devtmpfs
# 找出大文件
du -ah / | sort -rh | head -20
inode耗尽问题
小文件过多可能导致inode用尽:
bash复制df -i # 查看inode使用
解决方案:
文件恢复技巧
误删重要文件时:
bash复制# 立即卸载分区
sudo umount /dev/sda1
# 使用extundelete尝试恢复
sudo extundelete /dev/sda1 --restore-file /path/to/file
用户登录审计
bash复制# 查看成功登录
sudo grep "Accepted password" /var/log/auth.log
# 查看失败尝试
sudo grep "Failed password" /var/log/auth.log
sudo命令审计
bash复制sudo grep sudo /var/log/auth.log | grep -v "not in sudoers"
文件修改监控
使用inotifywait实时监控:
bash复制sudo apt install inotify-tools
inotifywait -m -r -e modify,create,delete /etc
问题现象:用户无法SSH登录
排查步骤:
检查账户状态:
bash复制sudo passwd -S username
检查shell配置:
bash复制grep username /etc/passwd
确认shell不是/sbin/nologin或/bin/false
检查SSH配置:
bash复制sudo grep -E "DenyUsers|AllowUsers" /etc/ssh/sshd_config
检查PAM限制:
bash复制sudo grep pam_access /etc/pam.d/sshd
查看/etc/security/access.conf
问题现象:Permission denied
解决方案:
检查基础权限:
bash复制ls -l /path/to/file
检查父目录权限:
bash复制namei -l /path/to/file
检查SELinux上下文:
bash复制ls -Z /path/to/file
如需临时禁用:
bash复制sudo setenforce 0
问题现象:df显示空间不足但du统计很小
可能原因:文件被删除但进程仍占用
解决方案:
查找被删除但仍打开的文件:
bash复制sudo lsof +L1
重启相关服务或进程
极端情况下需要重启服务器
密码策略强化
编辑/etc/login.defs:
code复制PASS_MAX_DAYS 90
PASS_MIN_DAYS 7
PASS_WARN_AGE 14
SSH安全配置
修改/etc/ssh/sshd_config:
code复制PermitRootLogin no
PasswordAuthentication no
AllowUsers user1 user2
历史记录加固
在/etc/profile中添加:
bash复制readonly HISTFILE
readonly HISTSIZE
readonly HISTFILESIZE
shopt -s histappend
敏感文件权限
bash复制sudo chmod 600 /etc/shadow
sudo chmod 700 /root
文件属性保护
bash复制sudo chattr +i /etc/passwd
sudo chattr +a /var/log/auth.log
挂载选项加固
在/etc/fstab中添加:
code复制/tmp tmpfs defaults,noexec,nosuid,nodev 0 0
安装auditd
bash复制sudo apt install auditd
sudo systemctl enable --now auditd
关键文件监控
bash复制sudo auditctl -w /etc/passwd -p wa -k passwd_changes
sudo auditctl -w /etc/shadow -p wa -k shadow_changes
查看审计日志
bash复制sudo ausearch -k passwd_changes | aureport -f -i
禁用不必要PAM模块
编辑/etc/pam.d/sshd:
code复制# 注释掉耗时的模块
# auth required pam_unix.so
使用SSH密钥缓存
在~/.ssh/config中添加:
code复制Host *
ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r
ControlPersist 1h
调整文件系统参数
对于ext4文件系统:
bash复制sudo tune2fs -o journal_data_writeback /dev/sda1
sudo tune2fs -O ^has_journal /dev/sda1
优化磁盘调度器
bash复制echo deadline | sudo tee /sys/block/sda/queue/scheduler
使用noatime挂载
在/etc/fstab中添加:
code复制/dev/sda1 / ext4 defaults,noatime 0 1
调整swappiness
bash复制echo 10 | sudo tee /proc/sys/vm/swappiness
清理缓存
bash复制sync; echo 3 | sudo tee /proc/sys/vm/drop_caches
使用zRAM
bash复制sudo apt install zram-config
sudo systemctl restart zram-config
bash复制#!/bin/bash
# 批量创建用户并设置随机密码
USER_LIST="user1 user2 user3"
DEFAULT_PASS="ChangeMe123"
for USER in $USER_LIST; do
# 创建用户
sudo useradd -m -s /bin/bash $USER
# 设置密码
echo "$USER:$DEFAULT_PASS" | sudo chpasswd
# 强制首次登录修改密码
sudo chage -d 0 $USER
# 记录日志
echo "$(date): Created user $USER" >> /var/log/user_management.log
done
bash复制#!/bin/bash
# 递归修复目录权限
TARGET_DIR="/var/www/html"
# 目录设置为755
find $TARGET_DIR -type d -exec chmod 755 {} \;
# 文件设置为644
find $TARGET_DIR -type f -exec chmod 644 {} \;
# 特殊文件处理
chmod 750 $TARGET_DIR/cgi-bin
chmod 700 $TARGET_DIR/config.php
bash复制#!/bin/bash
# 实时监控用户登录
tail -f /var/log/auth.log | awk '
/sshd.*session opened/ {
print strftime("%Y-%m-%d %H:%M:%S"), $1, $2, $3, "LOGIN:", $11, "as", $13, "from", $15
}
/sshd.*session closed/ {
print strftime("%Y-%m-%d %H:%M:%S"), $1, $2, $3, "LOGOUT:", $11, "duration", $13
}
'
Linux man pages
bash复制man useradd
man passwd
man chmod
Filesystem Hierarchy Standard
详细说明Linux目录结构标准
POSIX标准文档
了解Unix/Linux基础规范
Linux Documentation Project
https://tldp.org/
Arch Linux Wiki
即使不使用Arch,其文档质量也非常高
Stack Overflow
实际问题解决方案宝库
在15年的Linux系统管理实践中,我总结了以下核心经验:
权限管理三原则
文件系统管理要点
故障排查方法论
安全加固优先级
自动化运维习惯
最后分享一个真实案例:某次服务器被入侵后,通过分析/var/log/secure发现攻击者是通过弱密码的测试账户进入。这让我意识到,即使是临时测试账户也必须设置强密码并及时清理。现在我的标准操作是:所有临时账户都设置24小时自动过期,并在创建时生成随机密码。