Linux系统安全

一.账号管理基础

措施 配置要点 风险点
账号分类管理 区分特权账号 (root/admin)、普通账号服务账号;服务账号禁用交互式登录。 特权账号滥用、服务账号权限过高
sudo 精细化控制 避免直接使用 root;通过 sudoers 配置最小必要命令集;记录详细操作日志(sudo.log);启用 sudo 密码验证。 命令白名单绕过、日志审计缺失
用户组策略 新用户加入默认低权限组;定期清理冗余组与无主文件;严格控制 wheel/sudo 组成员。 组权限过度继承、权限扩散

1. 用户账号类型

  • 超级用户 (root) :UID 为 0,拥有系统最高权限。应避免日常使用
  • 普通用户:由管理员创建,权限受限,通常 UID >= 500。
  • 程序用户:用于维持系统或应用服务运行,不允许登录系统,通常 UID 为 1-499。
2. 组账号
  • 基本组 (私有组):用户创建时默认所属的组。
  • 附加组 (公共组):用户除了基本组外加入的其他组,用于方便地分配额外权限。
  1. UID 与 GID
  • UID (用户标识号):0 (root), 1-499 (程序用户), 500-60000 (普通用户)。
  • GID (组标识号):与 UID 范围划分一致。
  1. 账号相关文件
  • /etc/passwd :保存用户基本信息(用户名、UID、GID、家目录、登录Shell等)。
    • 格式:username:x:UID:GID:comment:homedir:shell
  • /etc/shadow :存储用户加密密码、密码有效期等敏感信息,仅 root 可读。
    • 格式:username:encrypted_password:last_change:min_age:max_age:warn_period:inactive:expire_date:reserved
3. 系统账号清理

/etc/passwd:放登录 Shell 的用户

  • usermod:修改用户账户的相关属性

    • 对账户进行操作
      • -c:修改用户的注释信息
      • -d:修改用户的家目录
      • -e:修改用户账户的过期时间
      • -f:设置用户密码过期,宽限的天数
      • -l:修改用户名
    • 用户登录账户权限
      • -L:锁定
      • -U:解除锁定
      • -s:修改用户登录时默认的 shell
  • passwd:查看用户密码的相关状态

    • 用户密码状态
      • -s:查看用户密码的状态
    • 用户密码属性
      • -l:锁定用户账户密码
      • -u:解锁用户账户密码
      • -d:删除密码
      • -e:强制用户在下次登录时修改密码
  • chattr:锁定账号配置文件

    • +i:锁定
    • -i:解锁
  • lsattr:查看文件锁定情况

二.账号安全措施

1. 系统账号清理

①确保非登录账号Shell为 /sbin/nologin

适用场景:服务账号(如 www、mysql)仅用于进程运行,不允许人工登录。

bash

复制代码
# 1. 创建用户时直接指定不可登录 Shell
useradd www -s /sbin/nologin

# 2. 修改现有用户的登录 Shell
usermod -s /sbin/nologin mysql
1.删除冗余账号

适用场景:清理长期不用、离职或系统默认无用账号(如 games、gopher 等)。

bash

复制代码
# 1. 仅删除用户账号(保留家目录和邮件池)
userdel games

# 2. 彻底删除:同时删除用户家目录和邮件池(谨慎操作)
userdel -r olduser
2.锁定 / 解锁长期不用的账号

适用场景:临时停用账号,保留数据,防止登录。

1. 锁定账号(两种方式)

bash

复制代码
# 方式一:使用 usermod 锁定
usermod -L lisi

# 方式二:使用 passwd 命令锁定
passwd -l lisi
2. 解锁账号

bash

复制代码
# 方式一:使用 usermod 解锁
usermod -U lisi

# 方式二:使用 passwd 命令解锁
passwd -u lisi
3. 查看账号锁定状态

查看 /etc/shadow 文件中密码栏位:

三.密码有效期与强制修改策略

1. 为已有用户设置密码有效期

使用 chage 命令精细化控制密码生命周期:

bash

运行

复制代码
# 密码最大有效期为30天(30天后必须修改)
chage -M 30 zhangsan

# 密码最短5天内不能修改(防止频繁改回旧密码)
chage -m 5 zhangsan

# 密码到期前7天开始警告用户
chage -W 7 zhangsan
2. 创建用户时直接指定账号过期日期

bash

运行

复制代码
# 新建用户 zhangsan,并设置账号在 2024-12-31 过期
useradd zhangsan -e 2024-12-31
3. 强制用户下次登录时修改密码

适用于初始密码发放、密码泄露后重置等场景:

bash

复制代码
# 强制用户 zhangsan 下次登录时必须立即修改密码
chage -d 0 zhangsan

四.命令历史记录限制(防止敏感命令泄露)

1. 全局限制历史记录条数

编辑全局配置文件 /etc/profile,添加或修改:

bash

复制代码
# 仅保留最近 200 条历史命令
export HISTSIZE=200

生效方式

bash

复制代码
source /etc/profile

说明:HISTSIZE 控制当前会话内存中保存的命令数;如需限制写入文件的条数,可额外配置 export HISTFILESIZE=200

2. 用户退出时自动清空历史记录

编辑目标用户家目录下的 ~/.bash_logout 文件,添加:

bash

复制代码
# 清空当前会话的历史记录(内存中)
history -c

# 可选:彻底清空历史文件中的记录(更严格)
> ~/.bash_history

作用:用户退出登录时自动执行,避免命令历史被后续登录者查看。

3.核心命令速查表

表格

功能 命令示例 说明
密码最长有效期 chage -M 30 user 30 天后密码过期
密码最短修改间隔 chage -m 5 user 5 天内不可改密码
过期前警告 chage -W 7 user 到期前 7 天提醒
账号过期日期 useradd -e 2024-12-31 user 账号到指定日期失效
强制改密码 chage -d 0 user 下次登录必须改密码
限制历史条数 export HISTSIZE=200 全局仅存 200 条命令
登出清空历史 history -c 写入 ~/.bash_logout 退出时清除痕迹

五.用户切换与权限提升

1.su命令------切换用户

bash

复制代码
su - zhangsan    # 切换到用户zhangsan,并加载其环境变量
su zhangsan      # 仅切换身份,不切换环境(仍保持原用户的环境)
  • 密码验证: root 切换至任何用户无需密码;普通用户切换至其他用户需要目标用户的密码。

  • 限制使用 su 命令 (仅 wheel 组成员可使用 su):

    a. 将用户加入 wheel 组:

    bash

    复制代码
    gpasswd -a zhangsan wheel

    b. 启用 pam_wheel 认证:编辑 /etc/pam.d/su 文件,取消以下行的注释:

    bash

    复制代码
    auth required pam_wheel.so use_uid

此后,未加入 wheel 组的用户执行 su 命令时将提示 "拒绝权限"。

2.sudo 机制 ------ 提升权限
  • 用途:允许被授权的普通用户以 root(或其他用户)身份执行特定的命令,而无需知道 root 密码。
  • 用法:在需要特权执行的命令前加上 sudo

bash

复制代码
sudo systemctl restart nginx
  • 配置 sudo 授权:使用 visudo 命令编辑 /etc/sudoers 文件(此命令会进行语法检查,最安全)。

授权格式:

text

复制代码
用户    主机名=(可切换的身份)   NOPASSWD: 命令列表
  • 用户:可以是用户名(如 zhangsan)或组名(如 %wheel% 代表组)。
  • 主机名:通常设置为 ALL,代表所有主机。
  • 可切换的身份:通常设置为 ALL(root),代表可以以谁的身份执行命令。省略时默认为 root。
  • NOPASSWD:可选,表示执行 sudo 时不需要输入密码。
  • 命令列表:必须使用绝对路径,多个命令用逗号分隔。支持通配符 *
3.sudo 授权案例总结

案例 1:授予用户 zhangsan 全部权限(相当于 root)

bash

复制代码
zhangsan ALL=(ALL) ALL
# 用户zhangsan可以在任何主机上,以任何用户的身份,执行任何命令。

案例 2:授予组 wheel 全部权限

bash

复制代码
%wheel ALL=(ALL) ALL
# 属于wheel组的所有用户都拥有全部sudo权限。

案例 3:授予用户 lisi 管理网络服务和软件包的权限

bash

复制代码
lisi ALL=(ALL) /usr/bin/systemctl, /usr/bin/apt, /usr/bin/dpkg
# 用户lisi可以执行systemctl(重启服务)、apt(安装软件)、dpkg命令。

案例 4:授予用户 wangwu 管理用户账号的权限(无需密码)

bash

复制代码
wangwu ALL=(root) NOPASSWD: /usr/sbin/useradd, /usr/sbin/userdel, /usr/bin/passwd
# 用户wangwu可以添加用户、删除用户,并且执行passwd命令(为自己或他人改密码)。
# 注意:`passwd` 后如果不加参数,可以修改root密码,这很危险!更好的做法是限制:
wangwu ALL=(root) NOPASSWD: /usr/sbin/useradd, /usr/sbin/userdel, /usr/bin/passwd [A-Za-z0-9]*
# 这样他只能执行 `passwd username`,而不能单独执行 `passwd`

案例 5:授予开发团队部署应用的权限

bash

复制代码
%developers ALL=(root) NOPASSWD: /bin/cp /data/app/* /www/, /bin/systemctl restart myapp
# 属于developers组的所有用户,可以无需密码:
# 1. 将/data/app/下的文件拷贝到/www/目录
# 2. 重启名为myapp的服务

案例 6:使用别名简化配置(更高级的用法)

可以定义用户别名、主机别名、命令别名,让配置更清晰。

bash

复制代码
# 定义用户别名
User_Alias ADMINS = zhangsan, lisi, %wheel
User_Alias DEVOPS = wangwu, heizi

# 定义命令别名
Cmnd_Alias NETCMDS = /sbin/ip, /sbin/route, /sbin/ifconfig
Cmnd_Alias SOFTCMDS = /usr/bin/apt, /usr/bin/dpkg

# 使用别名进行授权
ADMINS ALL=(ALL) ALL
DEVOPS ALL=(root) NETCMDS, SOFTCMDS

重要提示 :配置 sudo 权限时,遵循最小权限原则,只授予完成工作所必需的最少权限。

相关推荐
程序员敲代码吗1 小时前
DVR设备FTP更新故障及修复指南
服务器·开发语言·php
网硕互联的小客服2 小时前
网站出现Deprecated: Function的解决方法?
运维·服务器·网络·安全·ssh
不懒不懒2 小时前
【苏宁易购商品评价文本分析实战:从自动化爬取到分词清洗全流程】
运维·数据库·自动化
济6172 小时前
ARM Linux 驱动开发篇--- Linux 按键输入实验--- Ubuntu20.04互斥体实验
linux·嵌入式·嵌入式linux驱动开发
亦复何言??2 小时前
Ubuntu内核更新导致显卡驱动掉线 (nvidia-smi报错) 的“最小化改动”修复方案
linux·运维·ubuntu
_OP_CHEN2 小时前
【MySQL数据库基础】(三)MySQL 库的核心操作全解析:创建、修改、备份一条龙搞定
linux·数据库·sql·mysql·c/c++·mysql操作·企业级组件
袋子(PJ)2 小时前
Windows 下本地部署 Qwen3-0.6B:WSL2 + vLLM + Open WebUI 全流程
服务器·人工智能·windows
_OP_CHEN2 小时前
【Linux系统编程】(四十六)线程池原理与实现:从固定线程池到线程安全单例模式
linux·单例模式·操作系统·线程池·进程·线程安全·c/c++
爱吃生蚝的于勒2 小时前
【Linux】网络基础(一)
linux·运维·服务器·网络·后端·算法·架构