用户身份与文件权限

用户身份与文件权限


用户身份与能力

用户身份:

  • 管理员UID为0
  • 系统用户 UID 为 1~999: Linux 系统为了避免因某个服务程序出现漏洞而被黑客提权至整台服务器,默认服务程序会有独立的系统用户负责运行,进而有效控制被破坏范围。
  • 普通用户 UID 从 1000 开始:是由管理员创建的用于日常工作的用户。

UID 是不能冲突的

用户组号码(GID,Group IDentification):

多个用户加入到同一个组中,从而方便为组中的用户统一规划权限或指定任务

一个用户只有一个基本用户组,但是可以有多个扩展用户组

useradd 命令

useradd 命令用于创建新的用户

格式为“useradd [选项] 用户名”。

useradd 命令中的用户参数以及作用
参数作用
-d指定用户的家目录(默认为/home/username)
-e账户的到期时间,格式为 YYYY-MM-DD.
-u指定该用户的默认 UID
-g指定一个初始的用户基本组(必须已存在)
-G指定一个或多个扩展用户组
-N不创建与用户同名的基本用户组
-s指定该用户的默认 Shell 解释器(默认为/bin/bash)
[root@linuxprobe ~]# useradd -d /home/linux -u 8888 -s /sbin/nologin linuxprobe
[root@linuxprobe ~]# id linuxprobe
uid=8888(linuxprobe) gid=8888(linuxprobe) groups=8888(linuxprobe)

一旦用户的解释器被设置为 nologin,则代表该用户不能登录到系统中:

groupadd 命令

groupadd 命令用于创建用户组

格式为“groupadd [选项] 群组名”

使

用如下命令创建一个用户组 ronny:

[root@linuxprobe ~]# groupadd ronny
usermod命令

usermod 命令用于修改用户的属性

格式为“usermod [选项] 用户名”。

usermod 命令中的参数及作用
参数作用
-c填写用户账户的备注信息
-d -m参数-m 与参数-d 连用,可重新指定用户的家目录并自动把旧的数据转移过去
-e账户的到期时间,格式为 YYYY-MM-DD
-g变更所属用户组
-G变更扩展用户组
-L锁定用户禁止其登录系统
-U解锁用户,允许其登录系统
-s变更默认终端
-u修改用户的 UID

然后将用户 linuxprobe 加入到 root 用户组中,这样扩展组列表中则会出现 root 用户组的字样,而基本组不会受到影响:

[root@linuxprobe ~]# usermod -G root linuxprobe
[root@linuxprobe ~]# id linuxprobe
uid=1000(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe),0(root)
passwd 命令

passwd 命令用于修改用户密码、过期时间、认证信息等

格式为“passwd [选项] [用户名]”。

passwd 命令中的参数以及作用
参数作用
-l锁定用户,禁止其登录
-u解除锁定,允许用户登录
–stdin允许通过标准输入修改用户密码,如 echo “NewPassWord” | passwd --stdin Username
-d使该用户可用空密码登录系统
-e强制用户在下次登录时修改密码
-s显示用户的密码是否被锁定,以及密码所采用的加密算法名称

如何修改用户自己的密码,以及如何修改其他人的密码(修改他人密码时,需要具有 root 管理员权限):

[root@linuxprobe ~]# passwd
Changing password for user root.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
[root@linuxprobe ~]# passwd linuxprobe
Changing password for user linuxprobe.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
userdel 命令

userdel 命令用于删除用户

格式为“userdel [选项] 用户名”。

在执行删除操作时,该用户的家目录默认会保留下来,此时可以使用-r 参数将其删除。

userdel 命令的参数以及作用
参数作用
-f强制删除用户
-r同时删除用户及其家目录

下面使用 userdel 命令将 linuxprobe 用户删除,其操作如下:

[root@linuxprobe ~]# id linuxprobe
uid=8888(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe),0(root)
[root@linuxprobe ~]# userdel -r linuxprobe
[root@linuxprobe ~]# id linuxprobe
id: linuxprobe: no such user
文件权限与归属

是每个文件的类型不尽相同,因此 Linux 系统使用了不同的字符来加以区分,常见的字符如下所示。

  • -: 普通文件。
  • d:目录文件。
  • l:链接文件。
  • b:块设备文件。
  • c:字符设备文件。
  • p:管道文件

每个文件都有所属的所有者和所有组,并且规定了文件的所有者,所有组以及其他人对文件所拥有的可读(r)、可写(w)、可执行(x)等权限

对于一般文件来说

  • “可读”表示能够读取文件的实际内容
  • “可写”表示能够编辑、新增、修改、删除文件的实际内容
  • “可执行”则表示能够运行一个脚本程序

对目录文件来说

  • “可读”表示能够读取目录内的文件列表
  • “可写”表示能够在目录内新增、删除、重命名文件
  • 而“可执行”则表示能够进入该目录。

文件的读、写、执行权限可以简写为 rwx,亦可分别用数字 4、2、1 来表示,文件所有者,所属组及其他用户权限之间无关联,

文件权限的字符与数字表示
权限分配文件所有文件所属其他用户
权限组执行执行执行
读字符表示rwxrwxrwx
数字表示421421421

文件权限的数字法表示基于字符表示(rwx)的权限计算而来

我们来看这样一个例子。现在有这样一个文件,其所有者拥有可读、可写、可执行的权限,其文件所属组拥有可读、可写的权限;而且其他人只有可读的权限。那么,这个文件的权限就是 rwxrw-r–,数字法表示即为 764

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tY5LhcrG-1574054816080)(C:\Users\kris\AppData\Roaming\Typora\typora-user-images\image-20191118121013057.png)]

通过分析可知,该文件的类型为普通文件,所有者权限为可读、可写(rw-),所属组权限为可读(r–),除此以外的其他人也只有可读权限(r–),文 件的磁盘占用大小是 34298 字节,最近一次的修改时间为 4 月 2 日的凌晨 23 分,文件的名称为 install.log。

文件的特殊权限

特殊权限位

  • SUID

SUID 是一种对二进制程序进行设置的特殊权限,,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)

[root@linuxprobe ~]# ls -l /etc/shadow
----------. 1 root root 1004 Jan 3 06:23 /etc/shadow
[root@linuxprobe ~]# ls -l /bin/passwd
-rwsr-xr-x. 1 root root 27832 Jan 29 2017 /bin/passwd
  • SGID

    让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置)

    在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。

    [root@linuxprobe ~]# cd /tmp
    [root@linuxprobe tmp]# mkdir testdir
    [root@linuxprobe tmp]# ls -ald testdir/
    drwxr-xr-x. 2 root root 6 Feb 11 11:50 testdir/
    [root@linuxprobe tmp]# chmod -Rf 777 testdir/
    [root@linuxprobe tmp]# chmod -Rf g+s testdir/
    [root@linuxprobe tmp]# ls -ald testdir/
    drwxrwsrwx. 2 root root 6 Feb 11 11:50 testdir/
    
    [root@linuxprobe tmp]# su - linuxprobe
    Last login: Wed Feb 11 11:49:16 CST 2017 on pts/0
    [linuxprobe@linuxprobe ~]$ cd /tmp/testdir/
    [linuxprobe@linuxprobe testdir]$ echo "linuxprobe.com" > test
    [linuxprobe@linuxprobe testdir]$ ls -al test
    -rw-rw-r--. 1 linuxprobe root 15 Feb 11 11:50 test
    
    chmod 命令

是一个非常实用的命令,能够用来设置文件或目录的权限

格式为“chmod [参数] 权限 文件或目录名称”。

chown

设置文件或目录的所有者和所属组

其格式为“chown [参数] 所有者:所属组 文件或目录名称”

  • SBIT

    SBIT 特殊权限位可确保用户只能删除自己的文件,而不能删除其他用户的文件。

    RHEL 7 系统中的/tmp 作为一个共 享文件的目录,默认已经设置了 SBIT 特殊权限位,因此除非是该目录的所有者,否则无法删除这里面的文件。

[root@linuxprobe tmp]# su - linuxprobe
Last login: Wed Feb 11 12:41:20 CST 2017 on pts/0
[linuxprobe@linuxprobe tmp]$ ls -ald /tmp
drwxrwxrwt. 17 root root 4096 Feb 11 13:03 /tmp
[linuxprobe@linuxprobe ~]$ cd /tmp
[linuxprobe@linuxprobe tmp]$ ls -ald
drwxrwxrwt. 17 root root 4096 Feb 11 13:03 .
[linuxprobe@linuxprobe tmp]$ echo "Welcome to linuxprobe.com" > test
[linuxprobe@linuxprobe tmp]$ chmod 777 test
[linuxprobe@linuxprobe tmp]$ ls -al test
-rwxrwxrwx. 1 linuxprobe linuxprobe 10 Feb 11 12:59 test

要是也想对其他目录来设置 SBIT 特殊权限位,用 chmod 命令就可以了。对应的参数 o+t 代表设置 SBIT 粘滞位权限:

[root@linuxprobe tmp]# cd ~
[root@linuxprobe ~]# mkdir linux
[root@linuxprobe ~]# chmod -R o+t linux/
[root@linuxprobe ~]# ls -ld linux/
drwxr-xr-t. 2 root root 6 Feb 11 19:34 linux/
文件的隐藏属性

Linux 系统中的文件除了具备一般权限和特殊权限之外,还有一种隐藏权限,即被隐藏起来的权限,默认情况下不能直接被用户发觉

chattr 命令

用于设置文件的隐藏权限

格式为“chattr [参数] 文件”。

如果想要把某个隐藏

功能添加到文件上,则需要在命令后面追加“+参数”

如果想要把某个隐藏功能移出文件,则需要追加“-参数”

chattr 命令中用于隐藏权限的参数及其作用
参数作用
i无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件
a仅允许补充(追加)内容,无法覆盖/删除内容(Append Only)
S文件内容在变更后立即同步到硬盘(sync)
s彻底从硬盘中删除,不可恢复(用 0 填充原文件所在硬盘区域)
A不再修改这个文件或目录的最后访问时间(atime)
b不再修改文件或目录的存取时间
D检查压缩文件中的错误
d使用 dump 命令备份时忽略本文件/目录
C默认将文件或目录进行压缩
u当删除该文件后依然保留其在硬盘中的数据,方便日后恢复
t让文件系统支持尾部合并(tail-merging)
X可以直接访问压缩文件中的内容

接下来我们新建一个普通文件,并为其设置不允许删除与覆盖(+a 参数)权限,然后再尝试将这个文件删除:

[root@linuxprobe ~]# echo "for Test" > linuxprobe
[root@linuxprobe ~]# chattr +a linuxprobe
[root@linuxprobe ~]# rm linuxprobe
rm: remove regular file ‘linuxprobe’? y
rm: cannot remove ‘linuxprobe’: Operation not permitted
lsattr 命令

令用于显示文件的隐藏权限

格式为“lsattr [参数] 文件”

[root@linuxprobe ~]# lsattr linuxprobe
-----a---------- linuxprobe
[root@linuxprobe ~]# chattr -a linuxprobe
[root@linuxprobe ~]# lsattr linuxprobe
---------------- linuxprobe
[root@linuxprobe ~]# rm linuxprobe
rm: remove regular file ‘linuxprobe’? y
文件访问控制列表

如果希望对某个指定的用户进行单独的权限控制,就需要用到文件的访问控制列表(ACL)了

[root@linuxprobe ~]# su - linuxprobe
Last login: Sat Mar 21 16:31:19 CST 2017 on pts/0
[linuxprobe@linuxprobe ~]$ cd /root
-bash: cd: /root: Permission denied
[linuxprobe@linuxprobe root]$ exit
setfacl 命令

setfacl 命令用于管理文件的 ACL 规则

格式为“setfacl [参数] 文件名称”。

使用 setfacl 命令可以针对单一用户或用户组、单一文件或目录来进行读/写/执行权限的控制。

针对目录文件需要使用-R 递归参数;针对普通文件则使用-m 参数;如果想要删除某个文件的 ACL,则可以使用-b 参数

下面来设置用户在/root 目录上的权限:

[root@linuxprobe ~]# setfacl -Rm u:linuxprobe:rwx /root
[root@linuxprobe ~]# su - linuxprobe
Last login: Sat Mar 21 15:45:03 CST 2017 on pts/1
[linuxprobe@linuxprobe ~]$ cd /root
[linuxprobe@linuxprobe root]$ ls
anaconda-ks.cfg Downloads Pictures Public
[linuxprobe@linuxprobe root]$ cat anaconda-ks.cfg
[linuxprobe@linuxprobe root]$ exit

常用的 ls 命令是看不到 ACL 表信息的,但是却可以看到文件的权限最后一个点(.)变成了加号(+),这就意味着该文件已经设置了 ACL 了。

[root@linuxprobe ~]# ls -ld /root
dr-xrwx---+ 14 root root 4096 May 4 2017 /root
getfacl 命令

令用于显示文件上设置的 ACL 信息

格式为“getfacl 文件名称”

[root@linuxprobe ~]# getfacl /root
getfacl: Removing leading '/' from absolute path names
# file: root
# owner: root
# group: root
user::r-x
user:linuxprobe:rwx
group::r-x
mask::rwx
other::---
su 命令与 sudo 服务

su 命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺畅地切换到其他用户,比如从 root 管理员切换至普通用户:

[root@linuxprobe ~]# id
uid=0(root) gid=0(root) groups=0(root)
[root@linuxprobe ~]# su - linuxprobe
Last login: Wed Jan 4 01:17:25 EST 2017 on pts/0
[linuxprobe@linuxprobe ~]$ id
uid=1000(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe) context=unconfined_
u:unconfined_r:unconfined_t:s0-s0:c0.c1023

上面的 su 命令与用户名之间有一个减号(-),这意味着完全切 换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。强 烈建议在切换用户身份时添加这个减号-

sudo 命令用于给普通用户提供额外的权限来完成原本 root 管理员才能完成的任务,格式 为“sudo [参数] 命令名称”

sudo 服务中的可用参数以及作用
参数作用
-h列出帮助信息
-l列出当前用户可执行的命令
-u用户名或UID值用户名或 UID 值 以指定的用户身份执行命令
-k清空密码的有效时间,下次执行 sudo 时需要再次进行密码验证
-b在后台执行指定的命令
-p更改询问密码的提示语

sudo 命令具有如下功能:

  • 限制用户执行指定的命令:
  • 记录用户执行的每一条命令;
  • 配置文件(/etc/sudoers)提供集中的用户管理、权限与主机等参数;
  • 验证密码的后 5 分钟内(默认值)无须再让用户再次验证密码。

可以使用 sudo 命令提供的 visudo 命令来配置用户权限。这条命令在配置用户权限时将禁止多个用户同时修改 sudoers 配置文件,还 可以对配置文件内的参数进行语法检查,并在发现参数错误时进行报错。

只有root管理员才可以使用visudo命令编辑sudo服务的配置文件

[root@linuxprobe ~]# visudo
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 linuxprobe ALL=(ALL) ALL

在填写完毕后记得要先保存再退出,然后切换至指定的普通用户身份,此时就可以用 sudo -l 命令查看到所有可执行的命令了(下面的命令中,验证的是该普通用户的密码,而不是 root管理员的密码,请读者不要搞混了):

[root@linuxprobe ~]# su - linuxprobe
Last login: Thu Sep 3 15:12:57 CST 2017 on pts/1
[linuxprobe@linuxprobe ~]$ sudo -l
[sudo] password for linuxprobe: 
Matching Defaults entries for linuxprobe on this host:
requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORS
DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1
PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE
LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY
LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL
LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
User linuxprobe may run the following commands on this host:
(ALL) ALL

如果需要让某个用户只能使用 root 管理员的身份执行指定的命令,切记一定要给 出该命令的绝对路径,否则系统会识别不出来。我们可以先使用 whereis 命令找出命令所对应的保存路径,然后把配置文件第 99 行的用户权限参数修改成对应的路径即可:

[root@linuxprobe ~]# whereis cat
cat: /usr/bin/cat /usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.gz
[root@linuxprobe ~]# visudo
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 linuxprobe ALL=(ALL) /usr/bin/cat

可以添加 NOPASSWD 参数,使得用户执行 sudo 命令时不再需要密码验证:

[root@linuxprobe ~]# whereis poweroff
poweroff: /usr/sbin/poweroff /usr/share/man/man8/poweroff.8.gz
[root@linuxprobe ~]# visudo
………………省略部分文件内容………………
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 linuxprobe ALL=NOPASSWD: /usr/sbin/poweroff
………………省略部分文件内容………………

ot@linuxprobe ~]# visudo
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 linuxprobe ALL=(ALL) /usr/bin/cat


可以添加 NOPASSWD 参数,使得用户执行 sudo 命令时不再需要密码验证:

```shell
[root@linuxprobe ~]# whereis poweroff
poweroff: /usr/sbin/poweroff /usr/share/man/man8/poweroff.8.gz
[root@linuxprobe ~]# visudo
………………省略部分文件内容………………
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 linuxprobe ALL=NOPASSWD: /usr/sbin/poweroff
………………省略部分文件内容………………
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值