- 文件的特殊权限
单纯对文件位置的rwx权限肯定不能满足我们对安全、便捷工作的需求,所以便有了SUID与SGID的特殊权限机制
SUID:让执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)
比如:所有用户都可以执行用于修改用户密码的 passwd命令,但用户密码保存在/etc/ shadow文件中,默认权限是000即除了超级用户root外的所有用户都没有查看或编辑该文件的权限,所以对 passwd命令加上SUID权限位,则可让普通用户临时获得程序所有者的身份,即以root用户的身份将变更的密码信息写入到 shadow文件中。
SGID功能一:让执行者临时拥有属组的权限(对拥有执行权限的二进制程序设置)
举例来说/dev/kmem是一个字符设备文件,用于存储内核程序要访问的数据,权限为
Cr -r--- 1 root system 2, I Feb 11 2015 kmem
除了以root身份或 system组成员的用户都没有读取该文件的权限,但用户又需要使用系统的ps命令来查看系统进程状态,所以为了让用户能够获取到系统状态信息,ps命令的权限被加了SGID位
-r-xr-sr-x I bin system 59346 Feb 11 2015 ps
这样因为被给予了SGID权限,所以当用户执行了ps命令,实际有效用户组就是 system,于是便能够顺和的读取设备文件
功能二:在该目录中创建的文件自动继承此目录的用户组(只可以对目录设置)
比如我们将某个部门的工作目录给予了SGID权限,这样所有人创建的文件都归相同的工作组,这样方便以后的管理。
chmod命令用于修改文件或目录的权限,格式为:” chmod [参数] 权限文件或目录名称
chown命令用于修改文件或目录的所属主与所属组,格式为:“ chown [参数] 所属主:所属组文件或目录名称”
chmod与 chown的命令参数很简单记一对于文件不加参数,遇到目录加大写-R(递归,修改目录内所有文件的属性)
#创建工作目录并给与GID权限
[root@localhost tmp]# mkdir testdir
[root@localhost tmp]# ls -ald testdir/
drwxr-xr-x. 2 root root 6 8月 8 14:22 testdir/
[root@localhost tmp]# chmod -Rf 777 testdir/
[root@localhost tmp]# chmod -Rf g+s testdir/
[root@localhost tmp]# ls -ald testdir/
drwxrwsrwx. 2 root root 6 8月 8 14:22 testdir/
#切换至普通用户hmk,在该目录下创建文件:
[root@localhost tmp]# su hmk
[hmk@localhost tmp]$ cd
[hmk@localhost ~]$ cd /tmp/testdir/
[hmk@localhost testdir]$ echo "linuxprobe.com" >test
[hmk@localhost testdir]$ ls -al
总用量 8
drwxrwsrwx. 2 root root 17 8月 8 14:43 .
drwxrwxrwt. 19 root root 4096 8月 8 14:43 ..
-rw-rw-r--. 1 hmk root 15 8月 8 14:43 test
- SBIT(Sticky Bit):只可管理自已的数据而不能删除他人文件(仅对目录有效)
一般老师希望学生可以将作业上传到某个特定目录——但为了避免某些小破坏份子,想限制删除其他人文件的话,那就要设置SBIT位了,当然也可以叫做特殊权限位之粘滞位。
#切换至普通用户,进入tmp目录
[root@localhost tmp]# su hmk
#查看目录权限,最后的t就代表沾滞位
[hmk@localhost tmp]$ ls -ald
drwxrwxrwt. 19 root root 4096 8月 8 14:43 .
#创建一个文件:
[hmk@localhost tmp]$ echo "for test" >test
#给与这个文件最大的权限 (rwx rwx rwx 777)
[hmk@localhost tmp]$ chmod -Rf 777 test
[hmk@localhost tmp]$ ls -al test
-rwxrwxrwx. 1 hmk hmk 9 8月 8 14:48 test
#切换到普通用户john 尝试删除该文件,
[hmk@localhost tmp]$ su john
密码:
[john@localhost tmp]$ rm test
rm: 无法删除"test": 不允许的操作
#删除文件时候,会提示错误,所以即便权限很充足,但因为特殊权限SBIT的缘故,所以依然无法删除他人文件
- 文件的隐藏属性
文件权限除了读写执SUID、SGID、SBIT外还有一种隐藏权限
例如明明有权限删除某个文件却报错了,或者仅能为某个文件追加内容而不能减少内容,遇到这种很奇怪的文件,就要怀疑是文件被说置险藏权限了。
chattr命令用于设置文件的隐藏权限,格式为:chattr [参数] 文件
参数 | 作用 |
i | 将无法对文件进行修改,若对目录设置后则仅能修改子文件而不能新建或删除。 |
a | 仅允许补充(追加)内容无法覆盖/删除( Append Only) |
S | 文件内容变更后立即同步到硬盘(sync) |
s | 彻底从硬盘中删除,不可恢复(用O填充原文件所在硬盘区域) |
A | 不再修改这个文件的最后访问时间 (atime) |
b | 不再修改文件或目录的存取时间 |
D | 检查压缩文件中的错误 |
d | 当使用dump命令备份时忽略本文件/目录 |
c | 默认将文件或目录进行压缩 |
u | 当删除此文件后依然保留其在硬盘中的数据,方便日后恢复。 |
t | 让文件系统支持尾部合并( (tail-merging) |
X | 可以直接访问压缩文件的内容 |
lsattr命令用于显示文件的隐藏权限,格式为:"lsattr [参数] 文件”
参数 | 作用 |
a | 显示所有文件和目录 |
l | 显示隐藏属性的全称(默认简写成一个字母) |
R | 递归处理,将指定目录下的所有文件及子目录一并处理 |
d | 若目标文件为目录,请加此参数 |
[hmk@localhost 桌面]$ sudo su
[sudo] password for hmk:
[root@localhost 桌面]# cd
[root@localhost ~]# echo "for Test"> linuxprobe
[root@localhost ~]# rm linuxprobe
rm:是否删除普通文件 "linuxprobe"?y
[root@localhost ~]# echo "for Test"> linuxprobe
[root@localhost ~]# chattr +a linuxprobe
[root@localhost ~]# rm linuxprobe
rm:是否删除普通文件 "linuxprobe"?y
rm: 无法删除"linuxprobe": 不允许的操作
[root@localhost ~]# ls -al linuxprobe
-rw-r--r--. 1 root root 9 8月 8 15:35 linuxprobe
[root@localhost ~]# lsattr linuxprobe
-----a---------- linuxprobe
[root@localhost ~]# chattr -a linuxprobe
[root@localhost ~]# lsattr linuxprobe
---------------- linuxprobe
[root@localhost ~]# rm linuxprobe
rm:是否删除普通文件 "linuxprobe"?Y
[root@localhost ~]# rm linuxprobe
rm: 无法删除"linuxprobe": 没有那个文件或目录
[root@localhost ~]# y
bash: y: 未找到命令...
[root@localhost ~]#
[root@localhost ~]# rm linuxprobe
rm: 无法删除"linuxprobe": 没有那个文件或目录
[root@localhost ~]#
- su命令与sudo服务
-
su命令与sudo 服务
-
su命令用于变更使用者的身份(切换登陆者) 格式:su [-] 用户名
-
root用户切换到其他用户时,无需输入密码,尝试切换到普通用户。
-
[root@localhost ~]# su john
[john@localhost root]$ echo $PATH
/sbin:/bin:/usr/sbin:/usr/bin
[john@localhost root]$ su root
密码:
su: 鉴定故障
[john@localhost root]$ su root
密码:
[root@localhost ~]# su -john
su:无效选项 -- j
用法:
su [选项] [-] [USER [参数]...]
将有效用户 id 和组 id 更改为 USER 的 id。
单个 - 视为 -l。如果未指定 USER,将假定为 root。
选项:
-m, -p, --preserve-environment 不重置环境变量
-g, --group <组> 指定主组
-G, --supp-group <组> 指定一个辅助组
-, -l, --login 使 shell 成为登录 shell
-c, --command <命令> 使用 -c 向 shell 传递一条命令
--session-command <命令> 使用 -c 向 shell 传递一条命令
而不创建新会话
-f, --fast 向shell 传递 -f 选项(csh 或 tcsh)
-s, --shell <shell> 若 /etc/shells 允许,则运行 shell
-h, --help 显示此帮助并退出
-V, --version 输出版本信息并退出
更多信息请参阅 su(1)。
[root@localhost ~]# echo $PATH
/sbin:/bin:/usr/sbin:/usr/bin
[root@localhost ~]# su - john
上一次登录:日 8月 8 15:40:57 CST 2021pts/0 上
[john@localhost ~]$ echo $PATH
/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/john/.local/bin:/home/john/bin
[john@localhost ~]$ exit
登出
[root@localhost ~]#
sudo命令用于给普通用户提供额外权利来完成原本超级用户才能完成的任务,
格式为:“sudo [参数] 命令名称
上面su命令允许普通用户完全变更为超级管理员的身份,但这也无疑会让系统増添很多的安全隐患,我们使用sudo程序可以仅将特定的命令/程序执行权限赋予给指定的用户,同时也避免了过多使用root身份,只要合理的配置sudo功能便可以合理的兼顾系统的安全性和用户便捷性
原则:
在保证普通用户完成工作的前提下,尽可能少的给予额外的权限
sudo的特色功能:
- 有限制用户执行指定的命令。
- 记录用户执行的每一条命令。
- 配置文件(etc/ sudoers)提供集中的管理用户、权限与主机等参数。
- 验证过密码后5分钟(默认值)内无须再让用户验证密码,更加的方便
sudo命令的常用参数包括:
参数 | 作用 |
-h | 列出帮助信息 |
-l | 列出当前用户可执行的命令 |
-u用户名或UID值 | 以指定的用户身份执行命令 |
-k | 清空安全时间,下次执行sudo时需要再次密码验证 |
-b | 在后台执行指定的命令 |
-p | 更改询问密码的提示语 |
只用超级用户才可以使用 visudo命令编辑sudo程序的配置文件(/etc/ sudoers),
visudo命令的优势:
防止多个用户同时修改sudo配置文件。
对sudo程序配置文件的语法检查
visudo会调用ⅵ编辑器来修改配置文件,而如果语法有报错则会报错:
visudo: >>>/etc/sudoers: syntax error near line 111 <<<
What now?
Options are
(e) dit sudoers file again
(x)it without saving changes to sudoers file
(Q)uit and save changes to sudoers file(DANGER!)
此时可以敲击 e 键来修正内容,敲 x 键 直接退出不保存 还可敲击 Q 键强制保存退出(sudo程序将不能被启动)。
[hmk@localhost 桌面]$ sudo su
[root@localhost 桌面]# cd
[root@localhost ~]# visudo
[root@localhost ~]# su john
[john@localhost root]$ cd
[john@localhost ~]$ 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 john:
匹配此主机上 john 的默认条目:
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
用户 john 可以在该主机上运行以下命令:
(ALL) ALL
[john@localhost ~]$ ls /root
ls: 无法打开目录/root: 权限不够
[john@localhost ~]$ sudo ls /root
anaconda-ks.cfg initial-setup-ks.cfg
[john@localhost ~]$
[hmk@localhost 桌面]$ sudo root
[sudo] password for hmk:
sudo:root:找不到命令
[hmk@localhost 桌面]$ sudo su
[root@localhost 桌面]# cd
[root@localhost ~]# visudo
[root@localhost ~]# su john
[john@localhost root]$ cd
[john@localhost ~]$ 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 john:
匹配此主机上 john 的默认条目:
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
用户 john 可以在该主机上运行以下命令:
(ALL) ALL
[john@localhost ~]$ ls /root
ls: 无法打开目录/root: 权限不够
[john@localhost ~]$ sudo ls /root
anaconda-ks.cfg initial-setup-ks.cfg
[john@localhost ~]$ clear
[3;J
[john@localhost ~]$ exit
exit
[root@localhost ~]# visudo
[root@localhost ~]# visudo
[root@localhost ~]# su - john
上一次登录:日 8月 8 16:05:34 CST 2021pts/1 上
[john@localhost ~]$ cat /etc/shadow
cat: /etc/shadow: 权限不够
[john@localhost ~]$ sudo cat /etc/shadow
[sudo] password for john:
root:$6$1qJbLXBmIK.WfxLB$6Sn7nguFjYKEq3mmurv1pcIHy3qpzG9AIGwSDTdnBMjNopVqijdIvY2qpH7zlnH6CZ7qL7y9/bnger7NGvDK70:18840:0:99999:7:::
bin:*:16141:0:99999:7:::
daemon:*:16141:0:99999:7:::
adm:*:16141:0:99999:7:::
lp:*:16141:0:99999:7:::
sync:*:16141:0:99999:7:::
shutdown:*:16141:0:99999:7:::
halt:*:16141:0:99999:7:::
mail:*:16141:0:99999:7:::
operator:*:16141:0:99999:7:::
games:*:16141:0:99999:7:::
ftp:*:16141:0:99999:7:::
nobody:*:16141:0:99999:7:::
dbus:!!:18840::::::
polkitd:!!:18840::::::
unbound:!!:18840::::::
colord:!!:18840::::::
usbmuxd:!!:18840::::::
avahi:!!:18840::::::
avahi-autoipd:!!:18840::::::
libstoragemgmt:!!:18840::::::
saslauth:!!:18840::::::
qemu:!!:18840::::::
rpc:!!:18840:0:99999:7:::
rpcuser:!!:18840::::::
nfsnobody:!!:18840::::::
rtkit:!!:18840::::::
radvd:!!:18840::::::
ntp:!!:18840::::::
chrony:!!:18840::::::
abrt:!!:18840::::::
pulse:!!:18840::::::
gdm:!!:18840::::::
gnome-initial-setup:!!:18840::::::
postfix:!!:18840::::::
sshd:!!:18840::::::
tcpdump:!!:18840::::::
hmk:$6$xQahu5tkCtX5j08T$mFSTvigrWWeeZWFYlUoTjBuWNopBVdBFiUHjza7yd29h/zICb3YL0PgSvwa1TnPwqQ6lkhSSAZ/nHUvx9ElCh0:18840:0:99999:7:::
john:$6$kE9FHO3w$LplK49di04uiwYOEdQJSCPATVQhAcsH0AySlZR57Ox8wetGW5nBlCmIw7lo6UgtU/IXhMv8JcLzwPI5nGzHt7.:18847:0:99999:7:::
[john@localhost ~]$ exit
登出
[root@localhost ~]# visudo
[root@localhost ~]# su - john
上一次登录:日 8月 8 16:23:42 CST 2021pts/1 上
[john@localhost ~]$ sudo -k
[john@localhost ~]$ sudo ifconfig
eno16777736: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.220.135 netmask 255.255.255.0 broadcast 192.168.220.255
inet6 fe80::20c:29ff:fe56:2380 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:56:23:80 txqueuelen 1000 (Ethernet)
RX packets 1553 bytes 139108 (135.8 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 344 bytes 34717 (33.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 0 (Local Loopback)
RX packets 6 bytes 560 (560.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 6 bytes 560 (560.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[john@localhost ~]$ exit
登出
[root@localhost ~]# visudo
[root@localhost ~]#
- 文件访问控制列表
rwx权限、特殊权限、隐藏权限都是对某一类用户设置的,而希望对某个指定的用户进行单独的权限设置,那么就需要用文件的访问控制列表。
基于普通文件或目录设置进行设置ACL,通俗来讲ACL就是设置指定的特定用户或用户组对某个文件的操作权限。并且如果对某个目录设置了访问策略,那么子文件则继承其访问策略,而若对文件设置了访问控制策略则不再继承上级目录发控制策略。
setfacl命令用于增加或者修改ACL规则,格式为: setfacl [参数] 文件
参数:
-R 递归(对目录使用)
-m 设置文件的acl规则
-b 删除acl规则
getfacl命令用于显示文件的acl规则,格式为getfacl 文件
[hmk@localhost 桌面]$ sudo su
[sudo] password for hmk:
[root@localhost 桌面]# getfacl/root
bash: getfacl/root: 没有那个文件或目录
[root@localhost 桌面]# cd
[root@localhost ~]# getfacl/root
bash: getfacl/root: 没有那个文件或目录
[root@localhost ~]# getfacl /root
getfacl: Removing leading '/' from absolute path names
# file: root
# owner: root
# group: root
user::r-x
group::r-x
other::---
[root@localhost ~]# su - john
上一次登录:日 8月 8 16:27:34 CST 2021pts/1 上
[john@localhost ~]$ cd /root
-bash: cd: /root: 权限不够
[john@localhost ~]$ exit
登出
[root@localhost ~]# setfacl -Rm u:john:rwx /root
[root@localhost ~]# su - john
上一次登录:日 8月 8 16:33:04 CST 2021pts/0 上
[john@localhost ~]$ cd /root
[john@localhost root]$ ls
anaconda-ks.cfg initial-setup-ks.cfg
[john@localhost root]$ cat anaconda-ks.cfg
#version=RHEL7
# System authorization information
auth --enableshadow --passalgo=sha512
# Use CDROM installation media
cdrom
# Run the Setup Agent on first boot
firstboot --enable
ignoredisk --only-use=sda
# Keyboard layouts
keyboard --vckeymap=us --xlayouts='cn'
# System language
lang zh_CN.UTF-8
# Network information
network --bootproto=dhcp --device=eno16777736 --onboot=off --ipv6=auto
network --hostname=localhost.localdomain
# Root password
rootpw --iscrypted $6$1qJbLXBmIK.WfxLB$6Sn7nguFjYKEq3mmurv1pcIHy3qpzG9AIGwSDTdnBMjNopVqijdIvY2qpH7zlnH6CZ7qL7y9/bnger7NGvDK70
# System timezone
timezone Asia/Shanghai --isUtc
# X Window System configuration information
xconfig --startxonboot
# System bootloader configuration
bootloader --location=mbr --boot-drive=sda
autopart --type=lvm
# Partition clearing information
clearpart --none --initlabel
%packages
@base
@core
@desktop-debugging
@dial-up
@fonts
@gnome-desktop
@guest-agents
@guest-desktop-agents
@input-methods
@internet-browser
@multimedia
@print-client
@x11
%end
[john@localhost root]$