一、用户和权限管理
(1)个人电脑与服务器操作系统的差异
- 个人电脑: 通常只有一个用户(如"cc"用户),不支持多用户同时操作
- 服务器系统: 运行多个服务,允许多用户同时操作(如阿里云ECS服务器可通过多个终端连接)
(2)多用户功能的必要性
- 安全考量: 单一用户拥有全部权限存在安全隐患,账号泄露会导致系统完全失控
- 管理需求: 单个用户无法有效配置和管理服务器上的所有程序和服务
(3)其他系统中的权限管理功能
- 网站后台: 不同角色权限不同(如学员前台与管理后台)
- 数据库系统:
- root用户拥有全部库表权限
- 普通用户可能仅限访问特定库表
- 版本控制系统:
- 普通开发者只能访问自己的代码仓库
- 超级管理员可访问所有仓库
二、用户组
- 部门类比:用户组类似于公司的部门,每个用户必须至少属于一个组,就像新员工必须归属于某个部门一样。
- 权限管理意义:分组的主要目的是方便批量权限设置。例如财务部门员工自动拥有进入财务室的权限,无需单独授权。
- 多组归属:一个用户可以属于多个组(类似员工可跨部门),但必须指定一个主要组(primary group),其他为附加组(supplementary groups)。
- 实际应用:在代码管理系统(如Git/SVN)中,将成员加入特定组即可自动获得对应代码库的访问权限。
1. 组ID
- GID结构:每个组都有唯一的数字标识Group ID(GID),采用整型数字编号。
- root组:
- GID固定为0
- 拥有系统最高权限
- 系统用户组:
- GID范围:1-999(CentOS7)
- 用于运行系统服务(如邮件服务、FTP服务)
- 注意:CentOS5/6版本范围为1-499
- 普通用户组:
- GID范围:1000-65535
- 第一个自定义用户组默认从GID=1000开始分配
2. Group相关命令
- 查看全部组:
- 命令:cat /etc/group
- 输出说明:每行格式为"组名:x:GID:成员列表"
- 查看用户所属组:
- 命令:groups [用户名]
- 示例:root用户执行groups ccc显示ccc用户的主要组
- 添加用户组:
- 命令:groupadd [组名]
- 示例:groupadd redis创建redis组
- 删除用户组:
- 命令:groupdel [组名]
- 示例:groupdel redis删除redis组
3. gpasswd命令
- 功能:工作组文件(/etc/group和/etc/gshadow)管理工具
- 常用选项:
- -a:添加用户到组(如gpasswd -a user group)
- -d:从组删除用户
- -A:指定组管理员
- -r:删除组密码
- 特点:实际使用频率较低,主要用于精细化的组权限管理
三、用户
1、用户ID
- UID分类:
- root用户:UID=0(UID为0的用户一定是root用户,不论用户名是什么)
- 程序用户:1-999(CentOS7系统用户范围)
- 普通用户:1000-65535(CentOS5/6版本中系统用户范围为1-499)
- 查看方法:通过cat /etc/passwd命令查看所有用户信息
- 特殊说明:root用户的GID和UID必须都是0,这是系统管理员的特殊标识
2、User相关命令
- 核心命令:
- 添加用户:useradd(常用选项:-g指定主组,-G指定附加组,-d指定家目录)
- 修改密码:passwd(直接跟用户名即可修改密码)
- 删除用户:userdel(需确保用户未在使用状态)
- 修改信息:usermod(可修改用户名、家目录、所属组等)
- 重要选项:
- -m:自动创建用户家目录
- -s:指定用户登录shell(如/bin/bash)
- -L/-U:锁定/解锁用户账号
passwd命令
- 主要功能:
- 设置/修改用户密码
- 管理密码过期时间等认证信息
- 常用选项:
- -d:删除密码(仅管理员可用)
- -l:锁定密码
- -u:解锁密码
- -S:显示密码状态信息
- 密码策略:
- 系统会提示密码强度不足(如少于8字符)
- 需两次输入确认密码
- 普通用户只能修改自己的密码
3、用户管理相关文件
1)/etc/group文件
- 文件格式解析
- 分隔符结构: 文件使用冒号":"作为分隔符,将每行内容划分为四个字段
- 字段组成:
- 第1字段:组名(如root、bin、daemon等)
- 第2字段:组密码(通常显示为x)
- 第3字段:GID(组ID)
- 第4字段:组内用户列表(可能为空)
- 各字段详解
- 组名:
- 系统预定义组:root(0)、bin(1)、daemon(2)、sys(3)、adm(4)等
- 用户自定义组:如ccc(1000)、lll(1001)、security(1002)等
- 密码字段:
- 显示为x表示密码存储在影子文件/etc/gshadow中
- 实际密码可能显示为!,表示无密码
- 注意:组密码功能基本不使用,可以忽略
- GID:
- 系统组GID范围:0-999
- 用户组GID范围:1000+
- 用户列表:
- 显示属于该组的附加用户
- 主用户可能不显示(如root组默认包含root用户但不显示)
- 组名:
- 相关文件
- /etc/gshadow:
- 存储组密码的影子文件
- 密码字段显示!表示无密码
- 格式:组名:加密密码:组管理员:组附加用户列表
- /etc/gshadow:
- 注意事项
- 字段对应关系:
- 组名与/etc/passwd中的GID字段对应
- 用户主组信息存储在/etc/passwd中
- 用户附加组信息存储在/etc/group中
- 特殊组:
- wheel组(10):具有sudo权限的组
- mail组(12):邮件相关组
- disk组(6):磁盘管理组
- 字段对应关系:
2)/etc/passwd文件
- 文件作用:在渗透提权时经常使用,用于查看收集操作系统信息和提权操作
- 存储位置:系统用户信息保存在/etc/passwd文本文件中
- 典型内容:包含root、bin、daemon等系统用户和普通用户信息
- 字段数量:共7个字段,用冒号":"分隔
- 字段顺序:1.用户名 2.密码 3.UID 4.GID 5.全名 6.home路径 7.shell工具
- 用户名:第一位是用户名,如root、bin等
- 密码字段:
- 特殊标记:*表示无密码,!!表示锁定账户
- 实际存储:密码以加密形式保存在shadow文件
- x标记:表示密码存储在/etc/shadow文件中
- 系统用户特点:伪用户(如bin、daemon)通常没有密码,用于运行程序而非登录
用户描述字段
- 位置:第五位字段
- 内容:用户备注或描述信息
- 特点:
- 普通用户可能没有描述或只有姓名
- 系统用户常有功能描述,如"User for sssd"
- 可选字段,可为空
- 修改方式:使用useradd -c或usermod -c命令设置
用户主目录字段
- 位置:第六位字段
- 作用:指定用户登录后的初始工作目录
- 示例:
- 系统用户:/var/lib/service_name
- 普通用户:/home/username
- root用户:/root
- 修改方式:使用useradd -d或usermod -d命令设置
用户Shell字段
- 位置:第七位字段
- 作用:指定用户登录后使用的shell解释器
- 常见值:
- /bin/false:同样禁止登录
- /sbin/nologin:禁止登录的shell
- /bin/bash:可登录的交互式shell
- 系统用户:通常设置为nologin或false
- 修改方式:使用useradd -s或usermod -s命令设置
3)/etc/shadow文件
- 字段组成:包含9个字段,用冒号分隔:
- 用户名
- 密码(加密存储)
- 最后修改时间(从1970年1月1日起的天数)
- 最小修改间隔时间
- 密码有效期
- 密码变更前警告天数
- 密码过期后宽限天数
- 账号失效时间
- 保留字段
- 密码格式解析
- 时间转换方法:使用命令date -d "1970-01-01 19157 days"可将天数转换为具体日期(示例中19157天对应2022年7月14日)
- 密码字段说明:
- 密码字段为空表示无需密码即可登录
- "!!"表示密码被锁定
- "*"表示账号被禁用
密码加密方式
- 格式结构:$id$salt$encrypted三部分
- $encrypted:加密后的密码
- $salt:随机盐值
- $id:加密算法标识(1=MD5,5=SHA-256,6=SHA-512)
- 生成命令:openssl passwd -1 -salt admin 123456可生成MD5加密密码
MD5加密算法介绍
-
- 算法特性:
- 单向哈希算法(摘要算法)
- 相同输入必然产生相同输出
- 无法从哈希值反推原始数据
- 安全隐患:
- 可通过预先计算的彩虹表进行破解
- 常见密码的MD5值可被直接查表破解(如"123456"的MD5为e10adc3949ba59abbe56e057f20f883e)
- 算法特性:
加盐的作用与实现
-
- 加盐原理:
- 在密码前后添加随机字符串(盐值)
- 使相同密码产生不同的哈希结果
- 防止彩虹表攻击
- 实现方式:
- 系统自动生成随机盐值
- 盐值与加密结果一起存储
- 验证时使用相同盐值重新计算
- 安全优势:
- 即使两个用户使用相同密码,加密结果也不同
- 攻击者无法通过预计算破解
- 必须同时获取盐值和加密结果才可能破解
- 加盐原理:
4)密码格式
/etc/sudoers文件格式
-
- 全称解析:super user do的缩写,用于执行需要管理员权限的命令
- 语法结构:
kaliALL=(ALL)NOPASSWD:/bin/useradd\mathrm{kali} ALL=(ALL) NOPASSWD:/bin/useraddkaliALL=(ALL)NOPASSWD:/bin/useradd
表示kali用户可以在所有主机上以所有用户身份无需密码执行useradd命令
密码存储与加密方式
-
- 命令格式:openssl passwd -1 -salt admin 123456
- 参数说明:
- -1:指定使用MD5算法
- -salt:指定盐值为"admin"
- "123456"为明文密码
- 参数说明:
- 存储格式:$id$salt$encrypted
- 示例:$1$admin$LClYcRe.ee8dQwgrFc5nz.
- 数字对应算法:
- 1:MD5
- 2a:Blowfish(某些Linux发行版)
- 5:SHA-256
- 6:SHA-512
- 命令格式:openssl passwd -1 -salt admin 123456
5)/etc/sudoers文件
- 全称解释: sudo全称为"super user do",意为以超级用户(root)身份执行命令
- 核心功能: 允许普通用户临时获得root权限执行特定命令,避免频繁切换用户
- 典型场景: 如系统重启(
-
reboot(reboot)、用户管理(useradd)等需要root权限的操作
-
sudoers文件的配置
- 文件路径:/etc/sudoers
- 访问限制: 默认只有root用户可查看和修改
- 配置原理: 定义哪些用户/组可以执行哪些命令,以及是否需要密码验证
- 验证机制: 执行sudo时验证的是用户自身密码而非root密码
配置格式与示例
- 基础格式:
- root默认配置:
- root ALL=(ALL) ALL 表示root可在所有主机执行所有命令
- 组配置示例:
-
%wheel ALL=(ALL) ALL 表示wheel组成员可获得全部权限
- 具体案例:
-
kali ALL=(ALL) NOPASSWD:/bin/useradd 表示kali用户可在所有主机免密码执行useradd命令
-
users localhost=/sbin/shutdown −h now 表示users组成员可在本机执行关机命令
-
-
- no password配置的含义
- 标准流程: 执行sudo命令时需要输入用户自身密码进行验证
- 免密配置: 添加NOPASSWD选项后可直接执行命令而无需密码验证
- 安全提示: 免密配置应谨慎使用,仅适用于低风险操作场景
- 错误示范: 未配置sudo权限时,即使输入正确密码也会提示"不在sudoers文件中"的错误
四、sudo配置文件
查询用户可用的sudo命令
- 查询命令:使用sudo -l可以查询当前用户可用root权限执行的命令
- 空结果说明:若查询结果为空,表示该用户未被授权任何sudo命令
- 密码验证:执行查询时仍需输入用户密码进行验证
五、用户相关操作
1、id
- 功能:查看当前用户的UID和GID
- 应用场景:常用于检测远程代码执行漏洞,通过执行id命令验证服务器权限
- 输出内容:显示用户ID、组ID及所属附加组信息
2. finger
- 功能:查看用户登录属性,包括登录时间等
- 安装说明:在CentOS中需通过yum install -y finger安装
- 限制:非系统自带命令,需额外安装才能使用
3. w和who命令
- w命令:显示用户登录IP、登录时间和会话持续时间
- who命令:查看用户基本信息,包括登录终端等
- whoami:最常用命令,显示当前登录用户名
- users:查看当前在线用户列表
4. 用户切换
- 切换命令:su(switch user)用于切换用户身份
- 常用场景:如su root切换到root用户,su alan切换到普通用户
- 密码要求:切换时通常需要输入目标用户的密码
六、文件归属与权限
1. 文件和目录的归属
1)所属组
- 基本属性:每个文件/目录都有两个关键属性:拥有者(owner)和所属组(group),可通过ll命令查看
- 查看方法:在home目录执行ll命令时,输出结果中第二列为所属用户,第三列为所属组
- root权限示例:root目录下所有文件/目录的拥有者和所属组都是root,普通用户无权操作
- 归属重要性:文件必须明确归属关系,这是Linux权限系统的基础
2)修改文件归属命令
- 命令格式:chown [选项] 新用户[:新组] 文件/目录
- 递归修改:使用-R参数可递归修改目录下所有子文件和子目录的归属
- 同时修改用户和组:chown redis:redis 文件名 可同时修改拥有者和所属组
- 权限限制:普通用户只能修改自己拥有的文件,root用户可修改任何文件归属
- 操作示例:
- 创建测试用户组:groupadd redis
- 创建测试用户:useradd -g redis redis
- 修改目录归属:chown -R allen:security 目录名
2. 权限
1)文件和目录权限
- 权限表示法:
- 第一位表示类型:d为目录,-为普通文件
- 后9位分为3组,分别表示:用户权限(u)、组权限(g)、其他用户权限(o)
- 权限字母含义:
- r(read):读权限(文件可查看内容,目录可列出内容)
- w(write):写权限(文件可修改,目录可增删文件)
- x(execute):执行权限(文件可运行,目录可进入)
- -:无对应权限
- 数字表示法:
- r=4,w=2,x=1
- 每组权限值为字母对应数字之和(如rwx=7,r-x=5)
- 特殊说明:
- root用户不受普通权限限制
- 777表示所有用户都有完全权限(慎用)
2)权限修改命令
chmod命令
- 字母表示法:
- 示例:chmod g+w file(给组添加写权限)
- 操作符:+添加,-移除,=设置
- 用户类别:u=用户,g=组,o=其他,a=所有
- 格式:chmod [ugoa][+-=][rwx] 文件
- 数字表示法:
- 示例:chmod 755 file(用户rwx,组和其他rx)
- 格式:chmod 数字组合 文件
- 引用法:
- chmod --reference=参照文件 目标文件(复制权限设置)
- 示例:chmod --reference=file1 file2
chown命令
- 权限问题处理:
- 示例:chmod +x 文件名添加执行权限
- 当执行文件提示"Permission denied"时,需要添加执行权限
- 递归修改:
- 修改目录及其内容:chmod -R 权限 目录名
- 安全提示:
- 不要随意设置777权限,会带来安全隐患
- 特殊配置文件需要保持特定权限数字