理解 Linux 文件权限

Linux 的安全性

每个能进入 Linux 系统的用户都会被分配唯一的用户账户,用户系统对各种对象的访问权限取决于他们登录系统时用的账户。用户权限使用过创建用户时分配的 UID 来跟踪的,每个用户都有唯一的 UID。

/etc/passwd 文件

Linux 系统有一个专门的文件来将用户的登录名匹配到对应的 UID 值。这个文件就是 /etc/passwd 。
Linux 系统会为各种各样的功能创建不同的用户账户,而这些账户并不是真正的用户。这些账户叫做系统账户,是系统上运行的各种服务进程访问资源用的特殊账户,所有运行在后台的服务都需要一个系统用户账户登录到 Linux 系统上,即使有人攻入了某个服务,也无法访问整个系统。
Linux 为系统账户预留了 200 以下的 UID 值。

登陆用户名:用户密码:UID(0:超级用户、1-499:系统用户、500-65535:普通用户):GID(初始组:就是指用户一登陆就立刻拥有这个用户组的相关权限,每个用户的初始组只能有一个,一般就是和这个用户的用户名相同的组名作为这个用户的初始组。每个用户只能有一个初始组。不推荐修改初始组。附加组:指用户可以加入多个其他的用户组,并拥有这些组的权限,附加组可以有多个。):用户账户的文本描述:用户HOME目录的位置:用户的默认shell

其中密码字段均被设置成x的原因是,Linux系统将用户密码保存在另一个单独的文件中,只有特定的程序才能够访问这个文件。
虽然可以使用文本编辑器编辑 /etc/passwd 文件,但是操作不当容易造成用户无法登陆,所以,使用标准的用户管理工具去执行这些用户管理功能会安全很多。

时间戳换算

  • 时间戳换算为日期
    date -d “1970-01-01 16006 dayg”
  • 日期换算为时间戳
    echo ( ( (( (date --date=“2014/0106”+%s)/86400+1))

/etc/shadow

只有 root 用户可以访问。

与/etc/passwd文件中的登录名字段对应的登录名:加密后的密码:自上次修改密码后过去的天数:多少天后才能更改密码:多少天后必须更改密码:密码过期前提前多少天提醒用户更改密码:密码过期后多少天禁用用户账户:用户账户被禁用的日期:预留字段给将来使用
用户名:加密密码(加密算法升级为 SHA512 散列加密算法。如果密码位是 !! 或 * 代表没有密码,不能登录):密码最后一次修改日期(使用1970.1.1作为标准时间,每过一天加1):设置两次密码的修改间隔时间:密码有效期:密码修改到期警告时间:密码过期后的宽限天数(0:密码到期后失效,-1:密码永远不会失效):账号失效时间:保留

添加新用户

命令名称: useradd
命令英文原意:
命令所在路径: /usr/sbin/useradd
执行权限: root
功能描述: 添加新用户
语法: useradd [选项] 用户名

user [选项]用户名
useradd -u 550 -G root,bin -d /home/lamp1 -c "test user" -s /bin/bash sc
参数 描述
-c comment 给新用户添加备注
-d home_dir 为主目录指定一个名字
-e expire_date 用 YYYY-MM-DD 格式指定一个账户过期的日期
-f inactive_days 指定这个账户密码过期多少天这个账户被禁用,0表示密码已过期就立即禁用,1表示禁用这个功能
-g initial_group 指定用户登陆组的GID或组名
-G group… 指定用户除登陆组之外所属的一个或多个附加组
-k 必须和 -m 一起使用,将 /etc/skel 目录的内容复制到HOME目录
-m 创建用户的HOME目录
-M 不创建用户的HOME目录
-n 创建一个与用户登录名同名的新组
-r 创建系统账户
-p passwd 为用户账户指定默认密码
-s shell 指定默认的登录shell
-u uid 为账户指定唯一的 UID

用户默认值配置文件

/etc/default/useradd
参数 说明
GROUP=100 用户默认组
HOME=/home 用户家目录
INACTIVE=-1 密码过期宽限天鼠
EXPIRE= 密码失效时间
SHELL=/bin/bash 默认shell
SKEL=/etc/skel 模板目录
CREATE_MAIL_SPOOL=yes 是否建立邮箱
/etc/login.defs
参数 说明
PASS_MAX_DAYS 99999 密码有效期
PASS_MIN_DAYS 0 密码修改间隔
PASS_MIN_LEN 5 密码最小5位
PASS_WARN_AGE 7 密码到期警告
UID_MIN 500 最小和最大 UID 范围
GID_MAX 60000
ENCRYPT_METHOD SHA512

系统默认值被设置在/etc/default/useradd文件中,可以使用 -D 选项查看默认值。
useradd 命令允许管理员创建一份默认的HOME目录配置,然后把它作为创建新用户HOME目录的模板,这样就能自动在每个新用户的HOME目录里放置默认的系统文件。
默认情况下,useradd命令不会创建HOME目录,但是 -m命令行选项会使其创建HOME目录,将/etc/skel目录中的文件复制过来。

用户模板目录

/etc/skel/
用户家目录的默认文件的根拷贝。

用户的家目录 —— 添加用户后自动创建

  • 普通用户
    /home/用户名/,所有者和所属组都是此用户。权限是 700.
  • 超级用户
    /root/,所有者和所属组都是 root 用户,权限是 550
    将普通用户改为 root,需要将 UID 改为 0。

删除用户

userdel 用户名

默认情况下,userdel命令只会删除/etc/passwd文件中的用户信息,而不会删除系统中属于该账户的任何文件,如果加上 -r 参数,userdel会删除用户的HOME目录以及邮件目录,然而,系统上仍可能存在有已删除用户的其他文件。
在有大量用户的环境中使用-r参数时要小心,该用户在他的HOME目录下是否存放了其他用户需要的文件。

修改用户

命令 描述
usermod 修改用户账号的字段,还可以指定主要组以及附加组的所属关系
passwd 修改已有用户的密码
chpasswd 从文件中读取登录名密码对,并更新密码
chage 修改密码的过期日期
chfn 修改用户账户的备注信息
chsh 修改用户账户的默认登录 shell

用户切换

su [选项] 用户名
参数 说明
- 连带用户的环境变量一起切换
-c 仅执行一次命令,而不切换用户身份
su - root -c "useradd user3"

usermod

usermod [选项] 用户名
参数 说明
-u UID 修改用户的 UID 号
-c 用户说明 修改用户的说明信息
-G 组名 修改用户的附加组
-L 临时锁定用户
-U 解锁用户锁定

用户管理命令 —— who

命令名称: who
命令英文原意:
命令所在路径: /usr/bin/who
执行权限: 所有用户
功能描述: 查看用户登陆的信息
语法: who
用户名 登录终端(tty:本地终端、pts:远程终端 /n:终端号) 登录时间 (IP地址,如果没有表示本机登录)

用户管理命令 —— w

命令名称: w
命令英文原意:
命令所在路径: /usr/bin/w
执行权限: 所有用户
功能描述: 查看用户登陆的详细信息
语法: w
UP:服务器累计开机时间
load average: 0.0 0.00 0.00 (CPU、内存负载情况 1min 5min 15min)
IDLE:累计空闲时间
PCPU:操作占用CPU时间
WHAT:执行了什么操作

passwd 和 chpasswd

passwd [选项] 用户名
参数 说明
-S 查询用户密码的密码状态,root 用户可用。用户名 密码设定时间 密码修改时间 密码有效期 警告时间 密码失效时间
-l 暂时锁定用户,root 可用
-u 解锁用户,root 可用
–stdin 可以通过管道符输出的数据作为用户的密码

如果只用 passwd 命令,它会改变你自己的密码。系统上的任何用户都能更改自己的秘密,但只有root用户才有权限更改别人的密码。
如果需要为系统中的大量用户修改密码,可以使用 chpasswd 命令,它能从标准输入自动读取登录名和密码对(由冒号分隔)列表,给密码加密,然后为用户账户设置。

chpasswd < users.txt

chsh、chfn和chage

chsh命令用来快速修改默认的用户登录shell。使用时必须用shell的全路径名作为参数。

chsh -s /bin/csh test

chfn命令提供了在/etc/passwd文件的备注字段存储信息的标准方法。
chage命令用来帮助管理用户账户的有效期。

chage [选项] 用户名
参数 说明
-l 列出用户的详细密码状态
-d 日期 修改密码最后一次更改日期
-m 天数 两次密码修改间隔
-M 天数 密码有效期
-W 天数 密码过期前警告天数
-I 天数 密码过期后宽限天数
-E日期 账号失效时间

一般用此命令来强制用户修改密码。

chage -d 0 lamp

使用 Linux 组

组权限允许多个用户对系统中的对象共享一组共用的权限。
每个组都有唯一的GID,还有唯一的组名。

/etc/group 文件

组名: 组密码标志 (小组长可以替代 root 来添加用户。):GID:组中附加用户

不要直接修改/etc/group文件来添加用户到一个组,要用usermod命令,在添加用户到不同组之前,应该先创建组。

创建新组

groupadd [选项] 组名
选项 说明
-g GID 指定组 ID

修改组

groupmod 组名
选项 说明
-g GID 修改组 ID
-n 新组名 修改组名
groupmod -n testgrp group1 将group1修改为testgrp

删除用户组

groupdel 组名

组中如果有初始用户则不可以删除用户组。

groupadd tg
useradd -g tg lamp
useradd -G tg lamp1

并不会生成 lamp 组,lamp1会有。

把用户添加入组或从组中删除

gpasswd [选项] 组名
选项 说明
-a 用户名 把用户加入组
-d 用户名 把用户从组中删除

当然也可以直接修改文件 /etc/group

理解文件权限

使用文件权限符

ls -l

第一个字段:

  • -:文件
  • d:目录
  • l:链接
  • b:块设备
  • c:字符型设备
  • n:网络设备

默认文件权限

文件权限的默认值从 umask 中得到。
umask只是个掩码。对于文件来说全权限是666,而对于目录来说是777,文件一开始的权限666减去umask022后,剩下的权限就变成了644。
在大多数 Linux 发行版中,umash值通常会设置在/etc/profile启动文件中。
命令名称: umask
命令英文原意: the user file-creation mask
命令所在路径: shell 内置命令
执行权限: 所有用户
功能描述: 显示、设置文件的缺省权限 文件不具有可执行权限
语法: umask [-S] 以rwx形式显示新建文件缺省权限

改变安全性设置

改变权限

命令名称: chmod
命令英文原意: change the permissions mode of a file
命令所在路径: /bin/chmod
执行权限: 文件所有者、root
功能描述: 改变文件或目录权限
语法: chmod [{ugoa}{±=}{rwx}][文件或目录]

  • chmod [-R] [u+x, o-r,g=rwx,a+r] 777 Japanlovestory.list
代表字符 权限 对文件的含义 对目录的含义
r 读权限 可以查看文件内容 cat、more、less、head、tail 可以列出目录中的内容 ls
w 写权限 可以修改文件内容 vim 可以在目录中创建、删除文件 touch、rmdir、rm
x 执行权限 可以执行文件内容 script、command 可以进入出目录 cd

改变所属关系

改变文件的属主,chown命令改变文件的属主,chgrp命令用来改变文件的默认属组。
命令名称: chown
命令英文原意: change file ownership
命令所在路径: /bin/chown
执行权限: root
功能描述: 改变文件或目录的所有者、该所有者必须存在 useradd
语法: chown[选项][用户][文件或目录]

选项 说明
-R 配合通配符可以递归地改变子目录和文件的所属关系
-h 改变该文件的所有符号链接文件的所属关系

命令名称: chgrp
命令英文原意: change file group ownership
命令所在路径: /bin/chgrp
执行权限: 所有用户
功能描述: 改变文件或目录的所属组 groupadd
语法: chgrp [用户组][文件或目录]

共享文件

Linux 还为每个文件和目录存储了3个额外的信息位。

  • 设置用户 ID(SUID):当文件被用户使用时,程序会以文件属主的权限运行。
  • 设置组 ID(SGID):对文件来说,程序会以文件属组的权限运行;对目录来说,目录中创建的新文件会以目录的默认属组作为默认属组。
  • 黏着位:进程结束后文件还驻留在内存中。

SetUID

  1. SetUID 的功能
  • 只有执行的二进制程序才能设定 SUID 权限
  • 命令执行者要对该程序拥有 x 权限
  • 命令执行者在执行该程序时获得该程序文件属主的身份。
  • SetUID 权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效。
    passwd 所有者拥有 SetUID 权限,普通用户在执行 passwd 时,暂时行使 root 权限的功能,普通用户可以修改自己的密码。
    cat 命令没有 SetUID 权限,所以普通用户不能查看 /etc/shadow 文件内容。
  1. 设定 SetUID 的方法
    4 代表 SUID
    在权限码前面加上 (4,2,1)—— SetUID、SetGID、Sticky BIT
chmod 4755 文件名
或者
chmod u+s 文件名
  1. 取消 SetUID 的方法
chmod 777 文件名 # 或是其他三位数字
或者
chmod u-s 文件名
  1. 危险的 SetUID
    关键目录应严格控制写权限。
    用户的密码设置要严格遵守密码三原则。
    对系统中默认应该具有SetUID权限的文件做一列表,定时检查有没有之外的文件被设置了 SetUID 权限。

SetGID

  1. SetGID 针对二进制文件的作用
    只有可执行的二进制程序才能设置SGID权限
    命令执行者要对该程序拥有x权限
    命令执行在执行程序的时候,组身份升级为该程序文件的属组
    SetGID 权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效

/usr/bin/locate 是可执行二进制程序,可以赋予SGID
执行用户lamp对/usr/bin/locate命令拥有执行权限
执行/usr/bin/locate命令时,组身份会升级为slocate组,而slocate组对/var/lib/mlocate/mlocate.db 数据库拥有 r 权限,所以普通用户可以使用locate命令查询mlocate.db数据库
命令结束,lamp用户的组身份返回为lamp组

  1. SetGID针对目录的作用
    普通用户必须对此目录拥有r和x权限,才能进入此目录
    普通用户在此目录中的有效组会变成此目录的属组
    若普通用户对此目录拥有w权限时,新建的文件的默认属组是这个目录的属组

  2. 取消 SetGID

chmod 755 文件名
或者
chmod g-s 文件名
  1. 设定 SetGID
    2 代表 SetGID
chmod 2755 文件名
或者
chmod g+s 文件名

Sticky BIT

只能是 root 用户设置。

  1. SBIT 黏着位作用
    黏着位目前只对目录有效
    普通用户对该目录拥有 w 和 x 权限,即普通用户可以在此目录拥有写入权限。
    如果没有黏着位,因为普通用户拥有 w 权限,所以可以删除此目录下所有文件,包括其他用户建立的文件。一旦赋予了黏着位,除了 root 可以删除所有文件,普通用户就算拥有了 w 权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件。
  2. 设置黏着位
chmod 1755 目录名
chmod o+t 目录名
  1. 取消黏着位
chmod 755 目录名
chomod o-t 目录名
发布了247 篇原创文章 · 获赞 38 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/weixin_39541632/article/details/104697545
今日推荐