前言:本博客仅作记录学习使用,部分图片出自网络,如有侵犯您的权益,请联系删除
目录
一、用户身份与能力
二、文件权限与归属
三、文件的特殊权限
四、文件的隐藏属性
五、文件访问控制列表
六、su命令和sudo服务
致谢
一、用户身份与能力
在Linux系统中,UID就相当于身份证号码一样具有唯一性,因此可通过用户的UID值来判断用户的身份。在RHEL8中,用户身份有:
- 管理员UID为0:系统的管理员用户
- 系统用户UID为1~999:Linux系统为了避免因某个服务程序出现漏洞而被黑客提权至整台服务器,默认服务程序会有独立的系统用户负责运行,进而有效控制被破坏范围
- 普通用户UID从1000开始:是由管理员创建的用于日常工作的用户
Linux系统中还引入了用户组的概念。通过使用用户组号码(GID),可以把多个用户加入到同一个组中,从而方便为组中的用户统一规划权限或指定任务。
另外,在Linux系统中创建每个用户时,将自动创建一个与其同名的基本用户组,而这个用户组只有该用户一个人。如果该用户以后被纳入其他组,则这个其他用户组被称之为扩展用户组。一个用户只有一个基本用户组,但是可以有多个扩展用户组
1、id命令
id命令用于显示用户详细信息,语法:“id 用户名”
[root@linuxprobe ~]# id lee
uid=1000(lee) gid=1000(lee) groups=1000(lee),10(wheel)
2、useradd命令
useradd用于创建新的用户账户,语法:“useradd [参数] 用户名”
可以使用useradd命令创建用户。使用该命令创建用户账号时,默认的用户家目录会被存放在/home目录中,默认的Shell解释器为/bin/bash,而且默认会创建一个与该用户同名的基本用户组。
参数 | 作用 |
---|---|
-d | 指定用户的家目录(默认为/home/username) |
-e | 账户的到期时间,格式为YYYY-MM-DD |
-u | 指定该用户的默认UID |
-g | 指定一个初始的用户基本组(必须已存在) |
-G | 指定一个或多个扩展用户组 |
-N | 不创建与用户同名的基本用户组 |
-s | 指定该用户的默认Shell解释器 |
示例:创建一个名为linuxcoo1的用户,并使用id命令确认信息:
[root@linuxprobe ~]# useradd linuxcoo1
[root@linuxprobe ~]# id linuxcoo1
uid=1009(linuxcoo1) gid=1009(linuxcoo1) groups=1009(linuxcoo1)
提高难度:创建一个普通用户并指定家目录路径、用户的UID以及Shell解释器。
# 注意/sbin/nologin,是终端解释器中的一员,与Bash解释器有天壤之别。一旦被设置成这个,则代表用户不能登录到系统中:
[root@linuxprobe ~]# useradd -d /home/linux -u 8888 -s /sbin/nologin linuxdown
[root@linuxprobe ~]# id linuxdown
uid=8888(linuxdown) gid=8888(linuxdown) groups=8888(linuxdown)
3、groupadd命令
groupadd命令用于创建新的用户组,语法:“groupadd [参数] 群组名”
[root@linuxprobe ~]# groupadd ronny
4、usermod命令
usermod命令用于修改用户的属性,语法:“usermod [参数] 用户名”
反复强调过,Linux系统中的一切都是文件,因此在系统中创建用户也就是修改配置文件的过程。用户的信息保存在/etc/passwd文件中,可以直接用文本编辑器来修改其中的用户参数项目,也可以用usermod命令修改已经创建的用户信息,命令参数如下:
参数 | 作用 |
---|---|
-c | 填写用户账户的备注信息 |
-d -m | 参数-m与参数-d连用,可重新指定用户的家目录并自动把旧的数据转移过去 |
-e | 账户的到期时间,格式为YYYY-MM-DD |
-g | 变更所属用户组 |
-G | 变更扩展用户组 |
-L | 锁定用户禁止其登录系统 |
-U | 解锁用户,允许其登录系统 |
-s | 变更默认终端 |
-u | 修改用户的UID |
示例:再次查看账户lee的信息
[root@linuxprobe ~]# id lee
uid=1000(lee) gid=1000(lee) groups=1000(lee)
然后将用户lee加入到root用户组中,这样扩展组列表中则会出现root用户组的字样,而基本组不会受影响:
[root@linuxprobe ~]# usermod -G root lee
[root@linuxprobe ~]# id lee
uid=1000(lee) gid=1000(lee) groups=1000(lee),0(root)
再试试用-u参数修改lee用户的UID值:
[root@linuxprobe ~]# usermod -u 6666 lee
[root@linuxprobe ~]# id lee
uid=6666(lee) gid=1000(lee) groups=1000(lee),0(root)
如果吧用户的解释器由默认的/bin/bash修改为/sbin/nologin后会怎样呢?
[root@linuxprobe ~]# usermod -s /sbin/nologin lee
[root@linuxprobe ~]# su - lee
This account is currently not available.
发现,修改后,不能被登录了,但这个用户依然可以被某个服务所调用,管理某个具体的服务。
5、passwd命令
passed命令用于修改用户的密码、过期时间等信息,语法:“passwd [参数] 用户名”
普通用户只能使用passwd命令修改自己的系统密码,而root管理员则有权限修改其他人的密码。passwd命令参数如下:
参数 | 作用 |
---|---|
-l | 锁定用户,禁止其登录 |
-u | 解除锁定,允许用户登录 |
--stdin | 允许通过标准输入修改用户密码,如echo "NewPassWord" | passwd --stdin Username |
-d | 使该用户可用空密码登录系统 |
-e | 强制用户在下次登录时修改密码 |
-S | 显示用户的密码是否被锁定,以及密码所采用的加密算法名称 |
示例:修改自己的密码只需要输入命令后敲回车即可:
[root@linuxprobe ~]# passwd
Changing password for user root.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
修改其他人的密码,首先需要检查当前是否为root管理员权限,然后命令后指定要修改那位用户的名称:
[root@linuxprobe ~]# passwd lee
Changing password for user lee.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
假如有位同时正在度假,那么可以使用passwd命令禁止该用户登录系统,等休假结束再允许登录:
[root@linuxprobe ~]# passwd -l lee
Locking password for user lee.
passwd: Success
[root@linuxprobe ~]# passwd -S lee
lee LK 2024-07-04 0 99999 7 -1 (Password locked.)
6、userdel命令
userdel命令用于删除已有的用户账户,语法:“userdel [参数] 用户名”
在使用userdel命令删除用户信息时,该用户的家目录会默认保留下来,此时可以用-r参数将其删除;
参数 | 作用 |
---|---|
-f | 强制删除用户 |
-r | 同时删除用户及家目录 |
正常情况下删除一个用户时会建议保留他的家目录数据,避免有什么重要的数据被误删除,所以不用加参数,写清要删除的用户名就行:
[root@linuxprobe ~]# userdel user11
[root@linuxprobe ~]# id user11
id: ‘user11’: no such user
此时该用户虽然被删除,但家目录数据会继续被存放在/home目录中,确认未来无需使用再手动删除:
[root@linuxprobe ~]# cd /home
[root@linuxprobe home]# ls
lee linux linuxcoo1 user11 user22 workdir
[root@linuxprobe home]# rm -rf user11
[root@linuxprobe home]# ls
lee linux linuxcoo1 user22 workdir
二、文件权限与归属
在Linux系统中,每个文件都有归属的所有者和所有组,并且规定了文件的所有者、所有组以及其他人对文件所拥有的读(r)、写(w)、执行(x)等权限。
对文件来说:
- 可读:能够读取文件的实际内容
- 可写:能够编辑、新增、修改和删除文件的实际内容
-
可执行:能够运行一个脚本程序
对目录来说:
- 可读:能够读取目录内的文件列表
- 可写:能够在目录内新增、删除、重命名文件
- 可执行:能够进入该目录
读写执行权限对于文件与目录可执行命令的区别:
文件 | 目录 | |
---|---|---|
读取(r) | cat | ls |
写入(w) | vim | touch |
执行(x) | ./script | cd |
文件权限的字符与数字表示:
权限项 | 读 | 写 | 执行 | 读 | 写 | 执行 | 读 | 写 | 执行 |
---|---|---|---|---|---|---|---|---|---|
字符表示 | r | w | x | r | w | x | r | w | x |
数字表示 | 4 | 2 | 1 | 4 | 2 | 1 | 4 | 2 | 1 |
权限分配 | 文件所属者 | 文件所属组 | 其他用户 |
通过上图得知文件的类型、访问权限、所有者(属主)、所属组(属组)、占用的磁盘大小、最后修改时间和文件名等信息。分析得知,该文件类型为普通文件,所有者权限为可读、可写,所属组权限为可读,除此之外的其他人只有可读权限,文件的磁盘占用大小是34298字节,最近一次的修改时间是4月2日的凌晨23分,文件的名称是install.log。
其中排在最前面的减号(-)是文件类型:常见的文件类型有:普通文件(-)、目录文件(d)、链接文件(l)、管道文件(p)、块设备文件(b)以及字符设备文件(c)
普通文件的范围特别广泛,比如纯文本信息、服务配置信息、日志信息以及Shell脚本等,所以几乎在每个目录下都能看到普通文件(-)和目录文件(d)。块设备文件(b)和字符设备文件(c)一般是指硬件设备,比如鼠标、键盘、光驱、硬盘等都是设备文件,主要集中在/dev/目录中
三、文件的特殊权限
在复杂多变的生产环境中,单纯设置文件的rwx权限已无法满足我们对安全和灵活性的需求,因此有了SUID、SGID和SBIT的特殊权限位。这是一种对文件权限进行设置的特殊功能,可以与一般权限同时使用,以弥补一般权限不能实现的功能。
1、SUID
SUID是一种对二进制程序进行设置的特殊权限,能够让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。
例如,所有用户都可以执行passwd命令来修改自己的用户密码,而用户密码保存在/etc/shadow文件中。仔细查看会发现它的默认权限是000,也就是说除了root管理者外,所有用户都没有查看或编辑该文件的权限。但是,在使用passwd命令时,如果加上SUID特殊权限位,就可以让普通用户临时获得程序所有者的身份,把变更的密码信息写入到shadow文件中。
示例:查看passwd命令属性时发现所有者的权限变成了rws,其中x改变成s就意味着该文件被赋予了SUID权限;如果原本的权限是rw-,没有x执行权限,那么被赋予特殊权限后将变成大写的S;
[root@linuxprobe ~]# ls -l /etc/shadow
---------- 1 root root 1587 Jul 4 17:29 /etc/shadow
[root@linuxprobe ~]# ls -l /bin/passwd
-rwsr-xr-x. 1 root root 33424 Feb 8 2022 /bin/passwd
注意:醒目的红色提醒告诫着用户一定要小心这个权限,因为一旦某个命令文件被设置上了SUID权限,那么就意味着凡是执行的人都可以临时获取到更高的权限,千万不要设置到vim、cat、rm等命令上!!!
2、SGID
SGID特殊权限有两种应用场景:对二进制程序进行设置时,能够让执行者临时获取到文件所有组的权限;而对目录进行设置时,则是让目录内新创建的文件自动继承该目录原有用户组的名称。
第一种功能是参考SUID而设计的,不同点在于执行程序的用户获取的不再是文件所有者的临时权限,而是获取到文件所属组的权限
举例:在早期的Linux系统中,/dev/kmem是一个字符设备文件,用于存储内核程序要访问的数据,权限为:
cr--r----- 1 root system 2, 1 Feb 11 2017 kmem
除了root管理员或属于system组成员外,所有用户都没有读取该文件的权限。由于在平时我们需要查看系统的进程状态,为了能够获取到进程的状态信息,可用于在查看系统进程状态的ps命令文件上增加SGID特殊权限位。查看ps命令文件的属性信息:
-r-xr-sr-x 1 bin system 59346 Feb 11 2017 ps
这样,由于ps命令被增加了SGID特殊权限位,所以当用户执行该命令时,也就临时获取到了system用户组的权限,从而顺利地读取到了设备文件。
前文提到,每个文件都有其归属的所有者和所属组,当创建或传送一个文件后,这个文件就会自动归属于执行这个操作的用户(即该用户是文件的所有者)
举例:如果现在需要在一个部门内设置共享目录,让部门内的所有人员都能读取目录中的内容,那么可以创建部门共享目录后,在该目录上设置SGID特殊权限位。这样,部门任何人员在里面创建的任何文件都会归属于该目录的所属组,而不再是自己的基本用户组。即在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)
[root@linuxprobe ~]# cd /tmp/
[root@linuxprobe tmp]# mkdir testdir
[root@linuxprobe tmp]# ls -ald testdir
drwxr-xr-x 2 root root 6 Jul 4 19:49 testdir
[root@linuxprobe tmp]# chmod -R 777 testdir # 确保普通用户可以写入文件
[root@linuxprobe tmp]# chmod -R g+s testdir # 为该目录设置SGID特殊权限位
[root@linuxprobe tmp]# ls -ald testdir
drwxrwsrwx 2 root root 6 Jul 4 19:49 testdir
# 切换普通用户,尝试在该目录中创建文件,并查看新文件是否会继承文件所在目录的所属组名称
[root@linuxprobe tmp]# useradd linuxprobe
[root@linuxprobe tmp]# su linuxprobe
[linuxprobe@linuxprobe tmp]$ cd /tmp/testdir
[linuxprobe@linuxprobe testdir]$ echo "linuxprobe.com" > test
[linuxprobe@linuxprobe testdir]$ ls -al test
-rw-rw-r-- 1 linuxprobe root 15 Jul 4 19:52 test
2.1、chmod命令
chmod命令用于设置文件的一般权限及特殊权限,语法:“chmod [参数] 文件名”
这是一个与日常设置文件权限相关的命令,例如要把一个文件的权限设置成其所有着可读可写可执行、所属组可读可写、其他人没设有任何权限,则相应的字符法表示为rwxrw----,其对应的数字法为760。
[root@linuxprobe ~]# ls -l anaconda-ks.cfg
-rw-------. 1 root root 1084 Jul 3 11:54 anaconda-ks.cfg
[root@linuxprobe ~]# chmod 760 anaconda-ks.cfg
[root@linuxprobe ~]# ls -l anaconda-ks.cfg
-rwxrw----. 1 root root 1084 Jul 3 11:54 anaconda-ks.cfg
2.2、chown命令
chown命令用于设置文件的所有者和所有组,语法:“chown 所有者:所有组 文件名”
chmod和chown命令是用于修改文件属性和权限的最常用命令,它们还有一个特别的共性,就是针对目录操作时需要加上大写参数-R来表示递归操作,即对目录内所有文件进行整体操作
使用“所有者:所有组”的格式更改:
[root@linuxprobe ~]# chown linuxprobe:linuxprobe anaconda-ks.cfg
[root@linuxprobe ~]# ls -l anaconda-ks.cfg
-rw-------. 1 linuxprobe linuxprobe 1084 Jul 3 11:54 anaconda-ks.cfg
3、SBIT
SBIT(Sticky Bit)特殊权限又称特殊权限位之粘滞位。SBIT特殊权限可确保用户只能删除自己的文件,而不能删除其他用户的文件。换句话说,当对某个目录设置了SBIT粘滞位后,那么该目录中的文件就只能被其所有着执行删除操作了。
RHEL 8系统中的/tmp作为一个共享文件的目录,默认已经设置了SBIT特殊权限位,因此除非是该目录的所有者,否则无法删除这里面的文件
与前面所讲的SUID和SGID权限显示方法不同,当目录被设置成SBIT特殊权限位后,文件的其他人权限部分的x执行权限会被替代成t或者T,原本有x执行权限则会写成t,原本没有x执行权限则会写成T。
/tmp目录上的SBIT权限默认已经存在,体现为“其他用户”权限字段变为rwt
[root@linuxprobe ~]# ls -ald /tmp
drwxrwxrwt. 21 root root 4096 Jul 4 22:13 /tmp
其实,文件能否被删除并不取决于自身的权限,而是看其所在目录是否有写入权限。之后解释,所以下面还是赋予777权限
[root@linuxprobe ~]# cd /tmp/
[root@linuxprobe tmp]# echo "Welcom to Linuxprobe.com" > test
[root@linuxprobe tmp]# chmod 777 test
[root@linuxprobe tmp]# ls -al test
-rwxrwxrwx 1 root root 25 Jul 4 22:15 test
随后,切换普通用户,尝试删除这个文件,发现即使权限全开,但是由于SBIT特殊权限位的缘故,依然无法删除该文件:
[root@linuxprobe tmp]# su - linuxprobe
[linuxprobe@linuxprobe ~]$ cd /tmp
[linuxprobe@linuxprobe tmp]$ rm -f test
rm: cannot remove 'test': Operation not permitted
chmod命令设置特殊权限时的参数:
参数 | 作用 |
---|---|
u+s | 设置SUID权限 |
u-s | 取消SUID权限 |
g+s | 设置SGID权限 |
g-s | 取消SGID权限 |
o+t | 设置SBIT权限 |
o-t | 取消SBIT权限 |
示例:在家目录中创建一个名为linux的新目录,随后设置上SBIT权限
[linuxprobe@linuxprobe tmp]$ exit
logout
[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 Jul 4 22:22 linux/
一般权限和特殊权限一起设置。其实SUID、SGID与SBIT也有对应的数字法表示、分别即是4、2、1。也就是说777还不是最大权限,满权限应该是7777,第一个数字代表的是特殊权限位。
四、文件的隐藏属性
1、chattr命令
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
2、lsattr命令
lsattr命令用于查看文件的隐藏权限,语法:“lsattr [参数] 文件名称”
在Linux系统中,文件的隐藏权限必须使用lsattr命令来查看:
[root@linuxprobe ~]# ls -al linuxprobe
-rw-r--r-- 1 root root 9 Jul 4 22:37 linuxprobe
[root@linuxprobe ~]# lsattr linuxprobe
-----a-------------- linuxprobe
此时按照显示的隐藏权限的类型(字母),使用chattr命令将其去掉:
[root@linuxprobe ~]# chattr -a linuxprobe
[root@linuxprobe ~]# lsattr linuxprobe
-------------------- linuxprobe
[root@linuxprobe ~]# rm linuxprobe
rm: remove regular file 'linuxprobe'? y
一般我们会将-a参数设置到日志文件(/var/log/messages)上面,这样在不影响系统正常写入日志的前提下,还可以防止黑客清理自己的作案证据,如果希望彻底的保护起某个文件,不允许任何人修改和删除的话,试试加上-i参数,效果特别好!!!要想彻底删除某个文件时,可以使用-s参数来保证其被删除后不可恢复。
五、文件访问控制列表
上述讲的一般权限、特殊权限、隐藏权限都有一个共性——权限是针对某一类用户设置的,能够对很多人同时生效。如果希望对某个指定的用户进行单独的权限控制,就需要用到文件的访问控制列表(FACL,File Access Control Lists)。通俗来讲,基于普通文件或目录设置ACL访问控制其实就是针对指定的用户或用户组设置文件或目录的操作权限,更加精准的派发权限。如果针对某个目录设置了ACL,则目录中的文件会继承其权限;若针对文件设置了ACL,则文件不再继承其所在目录的权限。
示例:切换普通用户,然后尝试进入root管理员的家目录中。在没有针对普通用户对root管理员的家目录设置ACL之前,其执行结果:
[root@linuxprobe ~]# su - linuxprobe
[linuxprobe@linuxprobe ~]$ cd /root
-bash: cd: /root: Permission denied
[linuxprobe@linuxprobe ~]$ exit
1、setfacl命令
setfacl命令用于管理文件的ACL权限规则,语法:“setfacl [参数] 文件名称”
ACL权限提供的是在所有者、所属组、其他人的读/写/执行权限之外的特殊权限控制,使用setfacl命令可以针对单一用户或用户组、单一文件或目录来进行读/写/执行权限的控制。其中,针对目录文件需要使用-R递归参数;针对普通文件则使用-m参数;如果想要删除某个文件的ACL,则可以使用-b参数。此命令参数如下:
参数 | 作用 |
---|---|
-m | 修改权限 |
-M | 从文件中读取权限 |
-x | 删除某个权限 |
-b | 删除全部权限 |
-R | 递归子目录 |
示例:原本我们是无法进入到/root目录中的,现在给这个普通用户单独设置权限:
[root@linuxprobe ~]# setfacl -Rm u:linuxprobe:rwx /root
[root@linuxprobe ~]# su - linuxprobe
[linuxprobe@linuxprobe ~]$ cd /root/
[linuxprobe@linuxprobe root]$ ls
anaconda-ks.cfg Checkkeys.sh Desktop Documents Downloads Guess.sh initial-setup-ks.cfg linux Music Pictures Public Templates users.txt Videos
[linuxprobe@linuxprobe root]$ exit
看到文件的权限最后一个点(.)变成了加号(+),这意味着该文件已经设置了ACL了
[root@linuxprobe ~]# ls -ld /root
dr-xrwx---+ 19 root root 4096 Jul 4 22:41 /root
2、getfacl命令
getfacl命令用于查看文件的ACL权限规则,语法:“getfacl [参数] 文件名称”
示例:查看root管理员家目录上设置的所有ACL信息:
[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::---
ACL权限还可以针对某个用户组来设置,例如设置允许某个组的用户都可以读写/etc/fstab个文件:
[root@linuxprobe ~]# setfacl -m g:linuxprobe:rw /etc/fstab
[root@linuxprobe ~]# getfacl /etc/fstab
getfacl: Removing leading '/' from absolute path names
# file: etc/fstab
# owner: root
# group: root
user::rw-
group::r--
group:linuxprobe:rw-
mask::rw-
other::r--
清空所有ACL权限用-b参数,指定删除某一条权限就用-x参数:
[root@linuxprobe ~]# setfacl -x g:linuxprobe /etc/fstab
[root@linuxprobe ~]# getfacl /etc/fstab
getfacl: Removing leading '/' from absolute path names
# file: etc/fstab
# owner: root
# group: root
user::rw-
group::r--
mask::r--
other::r--
操作前备份一下,总是好习惯
例如将/home目录上的ACL权限备份一份,要用-R递归参数,这样不仅能够把目录本身的权限备份,里面的文件也都能自动备份:
[root@linuxprobe ~]# getfacl -R /home > backup.acl
getfacl: Removing leading '/' from absolute path names
[root@linuxprobe ~]# ls
anaconda-ks.cfg backup.acl Desktop Documents Downloads initial-setup-ks.cfg linux Music Pictures Public Templates Videos
六、su命令和sudo服务
1、su命令
su命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺畅地切换其他用户:
[root@linuxprobe ~]# su - linuxprobe
[linuxprobe@linuxprobe ~]$ id
uid=8889(linuxprobe) gid=8890(linuxprobe) groups=8890(linuxprobe)
su命令与用户名之间有一个减号(-),这意味着完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始信息。强烈建议切换用户时添加这个减号(-)
另外root管理员切换普通用户不需要验证密码,而普通用户切换root用户管理员就需要进行密码验证了;
[linuxprobe@linuxprobe ~]$ su - root
Password:
[linuxprobe@linuxprobe ~]$
授权原则:在保证普通用户完成相应工作的前提下,尽可能少地赋予额外的权限
2、sudo命令
sudo命令用于给普通用户提供额外的权限,语法:“sudo [参数] 用户名”
使用sudo命令可以给普通用户提供额外的权限来完成原本只有root管理员才能完成的任务。可以限制用户执行指定的命令、记录用户执行过的每一条命令、集中的管理用户与权限(/etc/sudoers)以及验证密码后一段时间内免验证的方便措施。常见参数如:
参数 | 作用 |
---|---|
-h | 列出帮助信息 |
-l | 列出当前用户可执行的命令 |
-u 用户名或UID值 | 以指定的用户身份执行命令 |
-k | 清空密码的有效时间,下次执行sudo时需要再次进行密码验证 |
-b | 在后台执行指定的命令 |
-p | 更改询问密码的提示语 |
3、visudo命令
如果担心直接修改配置文件会出现问题,则可以使用sudo命令提供的visudo命令来配置用户权限
visudo命令用于编辑配置用户sudo权限文件,语法:“visudo [参数]”
这是一条会自动调用vi编辑器来配置/etc/sudoers权限文件的命令。能够解决多个用户同时修改权限而导致的冲突问题,不仅如此,visudo命令还可以对配置文件内的参数进行语法检查,在发现参数错误时进行报错提醒,比直接修改文件更友好、方便、安全。
配置权限文件时,按照下面格式将第101行(大约)填写上指定信息:
谁可以使用 允许使用的主机=(以谁的身份) 可执行命令的列表
谁可以使用:稍后要为那位用户进行命令授权
允许使用的主机:可以填写ALL代表不限制来源主机,亦可填写如192.168.10.0/24的网段限制来源地址,只有从网段登录时才能使用sudo命令
以谁的身份:可以填写ALL代表系统最高权限,也可以是另外一位用户的名字
可执行命令的列表:可以填写ALL代表不限制命令的列表,也可填写如/usr/bin/cat的文件名称来限制命令列表,多个文件之间用逗号(,)间隔
[root@linuxprobe ~]# visudo
99 ## Allow root to run any commands anywhere
100 root ALL=(ALL) ALL
101 linuxprobe ALL=(ALL) ALL
填写完毕后保存退出,然后切换普通用户身份,此时就可以用sudo -l命令查看到所有可执行的命令了
[root@linuxprobe ~]# su - linuxprobe
[linuxprobe@linuxprobe ~]$ sudo -l
We trust you have received the usual lecture from the local System
Administrator. It usually boils down to these three things:
#1) Respect the privacy of others.
#2) Think before you type.
#3) With great power comes great responsibility.
[sudo] password for linuxprobe:
Matching Defaults entries for linuxprobe on linuxprobe:
!visiblepw, always_set_home, match_group_by_gid, always_query_group_plugin, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE 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 linuxprobe:
(ALL) ALL
下面实验:作为一名普通用户,肯定不能看到root管理员的家目录,但是只要加上sudo命令就可以
[linuxprobe@linuxprobe ~]$ sudo ls /root
anaconda-ks.cfg backup.acl Checkkeys.sh Desktop Documents Downloads Guess.sh initial-setup-ks.cfg linux Music Pictures Public Templates users.txt Videos
如果需要让某个用户只能使用root管理员的身份执行指定的命令,切记一定要给出该命令的绝对路径,这里可以先使用whereis命令找出命令所对应的保存路径:
[root@linuxprobe ~]# whereis cat
cat: /usr/bin/cat /usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.gz
[root@linuxprobe ~]# whereis reboot
reboot: /usr/sbin/reboot /usr/share/man/man8/reboot.8.gz /usr/share/man/man2/reboot.2.gz
[root@linuxprobe ~]# visudo
99 ## Allow root to run any commands anywhere
100 root ALL=(ALL) ALL
101 linuxprobe ALL=(ALL) /usr/bin/cat,/usr/sbin/reboot
每次执行sudo命令都要输入一次密码,这时可以添加NOPASSWD参数,使得用户下次执行sudo命令时就不用密码验证了:
[root@linuxprobe ~]# visudo
99 ## Allow root to run any commands anywhere
100 root ALL=(ALL) ALL
101 linuxprobe ALL=(ALL) NOPASSWD:/usr/bin/cat,/usr/sbin/reboot
[linuxprobe@linuxprobe ~]$ reboot
User root is logged in on sshd.
User root is logged in on sshd.
User root is logged in on tty2.
Please retry operation after closing inhibitors and logging out other users.
Alternatively, ignore inhibitors and users with 'systemctl reboot -i'.
[linuxprobe@linuxprobe ~]$ sudo reboot
注意:visudo命令只有root管理员才可以执行,普通用户使用会提示权限不足
致谢
在此,我要对所有为知识共享做出贡献的个人和机构表示最深切的感谢。同时也感谢每一位花时间阅读这篇文章的读者,如果文章中有任何错误,欢迎留言指正。
学习永无止境,让我们共同进步!!