ACL权限
查询分区状态命令:
[root@localhost ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/mapper/centos-root 17G 3.2G 14G 19% /
devtmpfs 475M 0 475M 0% /dev
tmpfs 487M 0 487M 0% /dev/shm
tmpfs 487M 7.7M 479M 2% /run
tmpfs 487M 0 487M 0% /sys/fs/cgroup
/dev/sda1 1014M 133M 882M 14% /boot
tmpfs 98M 0 98M 0% /run/user/0
查看是否支持ACL
临时开启分区ACL权限:
mount -o remount,acl / #重新挂载跟分区 ,并挂载加入acl权限
永久开启分区ACL权限
vim /etc/fstab
将/dev/mapper/centos-root / xfs defaults 0 0
改为:
/dev/mapper/centos-root / xfs defaults,acl 0 0
然后重启系统,或者 重新挂载:mount -o remount /
查看acl权限:
getfacle 文件名
设定acl权限:
setfacl 选项 文件名
选项:
-m 设定ACL权限
-x 删除指定的ACL权限
-b 删除所有的ACL权限
-d 设定默认ACL权限
-k 删除默认ACL权限
-R 递归设定ACL权限
举例:创建3个用户,1个用户组 并且把他们添加到组中,创建文件夹project ,修改project的所有者为root,所属组为tgroup
修改project的权限为所有者和所属组读写执行,其他用户没有任何权限
添加用户slsl,使该用户对/tmp/project具有读和执行的权限
[root@localhost tmp]# useradd sl7
[root@localhost tmp]# useradd sl8
[root@localhost tmp]# useradd sl9
[root@localhost tmp]# groupadd tgroup
[root@localhost tmp]# gpasswd -a sl7 tgroup
[root@localhost tmp]# gpasswd -a sl8 tgroup
[root@localhost tmp]# gpasswd -a sl9 tgroup
[root@localhost tmp]# cat /etc/group | grep tgroup
tgroup:x:1011:sl7,sl8,sl9
[root@localhost tmp]# mkdir project
[root@localhost tmp]# ls -ld project
drwxr-xr-x 2 root root 6 6月 15 16:47 project
[root@localhost tmp]# chown root:tgroup /tmp/project
[root@localhost tmp]# ls -ld project
drwxr-xr-x 2 root tgroup 6 6月 15 16:47 project
[root@localhost tmp]# chmod 770 /tmp/project/
[root@localhost tmp]# useradd slsl
[root@localhost tmp]# passwd slsl
setfacl -m u:slsl:rx /tmp/project/
[root@localhost tmp]# ll -d /tmp/project/
drwxrwx---+ 2 root tgroup 6 6月 15 16:47 /tmp/project/ (说明:在权限的后面多了一个+,说明有了acl权限)
给用户 slsl 赋值r-x权限,使用"u:用户名:权限" 格式
说明: -m是设置权限,u是给用户设置,如果是g说明给组设置
查看acl权限:
[root@localhost tmp]# getfacl /tmp/project/
getfacl: Removing leading '/' from absolute path names
# file: tmp/project/
# owner: root
# group: tgroup
user::rwx
user:slsl:r-x
group::rwx
mask::rwx
other::---
测试:
[root@localhost tmp]# su - slsl
[slsl@localhost ~]$ cd /tmp/project
[slsl@localhost project]$ ll
总用量 0
[slsl@localhost project]$ touch 333
touch: 无法创建"333": 权限不够
说明命令生效:可以读,不能写
给组添加acl:
[root@localhost ~]# groupadd tgroup2
[root@localhost ~]# setfacl -m g:tgroup2:rx /tmp/project/
[root@localhost ~]# getfacl /tmp/project/
getfacl: Removing leading '/' from absolute path names
# file: tmp/project/
# owner: root
# group: tgroup
user::rwx
user:slsl:r-x
group::rwx
group:tgroup2:r-x
mask::rwx
other::---
最大有效权限mask(acl权限和组的权限与mask相与的权限)
[root@localhost ~]# setfacl -m m:rx /tmp/project/
[root@localhost ~]# getfacl /tmp/project/
getfacl: Removing leading '/' from absolute path names
# file: tmp/project/
# owner: root
# group: tgroup
user::rwx
user:slsl:r-x
group::rwx #effective:r-x
group:tgroup2:r-x
mask::r-x
other::---
说明:mask默认是rwx,相与后 取决于设置的权限
#effective:r-x 说明;虽然组权限是rwx,但是与r-x相与后 真正的权限是r-x
本身权限与mask相与
r w x
&&
r - x
结果 r - x
删除ACL权限
setfacl -x u:用户名 文件名 #删除指定用户的ACL权限
setfacl -x g:组名 文件名 #删除组的ACL权限
setfacl -b 文件名 #删除文件的所有ACL权限
递归ACL权限
setfacl -m u:用户名:权限 -R 文件名
假如现在新建一个文件,它是没有acl权限的
------------------------------------------------
默认ACL权限,新建的文件也会有ACL权限
setfacl -m d:u:用户名:权限 文件名
说明d default
新建的文件也会有ACL权限了
递归和默认ACL权限 只能针对目录有效
文件特殊权限:
只有可以执行的二进制文件才能设定SUID权限
命令执行者要拥有x权限
任何用户执行拥有SUID权限的程序时 会获得该程序文件属主的身份
SetUID权限只有在该程序执行过程中有效
[root@localhost ~]# whereis passwd
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz
[root@localhost ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27832 6月 10 2014 /usr/bin/passwd
[root@localhost ~]# ll /etc/shadow
---------- 1 root root 1313 6月 15 16:59 /etc/shadow
说明:找到passwd命令的路径,查看,有个rwsr权限,其中s说明 该文件拥有SUID权限
修改密码最终是修改的 /etc/shadow文件,但是它权限是000
普通用户不能直接修改这个文件,用passwd命令时,临时拥有文件属主的身份,即root的身份,可以执行passwd命令,修 改/etc/shadow文件
cat: /usr/bin/cat /usr/share/man/man1/cat.1.gz
[root@localhost ~]# ll /usr/bin/cat
-rwxr-xr-x. 1 root root 54160 10月 31 2018 /usr/bin/cat
说明:cat 命令没有SUID权限,普通用户无法用 cat /etc/shadow 命令
设定SetUID的方法(两种)
chmod 4755 文件名
chmod u+s 文件名
说明:4代表SUID
取消SetUID的方法
chmod 755 文件名
chmod u-s 文件名
SetGID 操作文件
只有可执行的二进制程序才能设置SGID权限
命令执行者要对该程序拥有x(执行)权限
命令执行在执行程序的时候,组身份升级为该程序文件的属组
SetGID权限只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效
[root@localhost ~]# whereis locate
locate: /usr/bin/locate /usr/share/man/man1/locate.1.gz
[root@localhost ~]# ll /usr/bin/locate
-rwx--s--x 1 root slocate 40520 4月 11 2018 /usr/bin/locate
[root@localhost ~]# ll /var/lib/mlocate/mlocate.db
-rw-r----- 1 root slocate 959116 6月 15 11:48 /var/lib/mlocate/mlocate.db
[root@localhost ~]#
locate 命令组中有s,其他用户有x,该命令操作的是/var/lib/mlocate/mlocate.db文件
普通用户执行locate命令时,组变为slocate组,该组对mlocate.db文件拥有r权限,所以普通用户可以查询mlocate.db数据库
------------------------
SetGID 操作目录
设定SGID 两种方法:
chmod 2755 文件名
chmod g+s 文件名
取消SetGID
chmod 755 文件名
chmod g-s 文件名
[root@localhost tmp]# mkdir testsgid
[root@localhost tmp]# chmod 2777 /tmp/testsgid/
[root@localhost tmp]# ll -d testsgid/
drwxrwsrwx 2 root root 6 6月 15 20:53 testsgid/
[root@localhost tmp]# su - slsl
上一次登录:六 6月 15 17:08:11 CST 2019pts/0 上
[slsl@localhost ~]$ cd /tmp/testsgid/
[slsl@localhost testsgid]$ vim aa.txt
-rw-rw-r-- 1 slsl root 6 6月 15 20:55 aa.txt
说明:给目录设置2777(SGID)权限后,普通用户进入到该目录,在里面创建的 文件的属组 是 该目录的属组
Sticky BIT
只针对目录有效
普通用户对该目录有wx权限
假如没有粘着位,即SBIT,普通用户可以删除该目录下所有文件
一旦赋予了粘着位 ,除了root外,普通用户只能删除自己建立的文件,不能删除其他用户建立的文件。
tmp目录 权限多了一个t
[root@localhost ~]# ll -d /tmp/
drwxrwxrwt. 12 root root 4096 6月 15 20:53 /tmp/
设置粘着位两种方法
chmod 1755 目录名
chmod o+t 目录名
取消粘着位两种方法
chmod 777 目录名
chmod o-t 目录名
文件系统属性chattr权限
格式:
chattr [+-=][选项] 文件或目录名
+:增加权限
-:删除权限
=:等于某权限
选项
i:如果对文件设置i属性,不能对文件进行删除、改名 、不能添加、修改数据。
如果对目录设置i属性,只能修改目录下文件的数据,不能建立、不能删除文件。
a: 如果对文件设置a属性,只能在文件中增加数据,不能删除、不能修改数据
如果对目录设置a属性,只允许在目录中建立和修改文件,不能删除文件
查看文件系统属性
lsattr 选项 文件名
选项:
-a:显示所有文件和目录
-d:若目标是目录,仅列出目录本身的属性,而不是子文件的
[root@localhost ~]# cd /tmp
[root@localhost tmp]# touch abc
[root@localhost tmp]# echo 111 >> abc
[root@localhost tmp]# chattr +i abc
[root@localhost tmp]# lsattr -a abc
----i----------- abc
[root@localhost tmp]# echo 11111 >> abc
-bash: abc: 权限不够
[root@localhost tmp]# rm -f abc
rm: 无法删除"abc": 不允许的操作
[root@localhost tmp]# mkdir test2
[root@localhost tmp]# touch test2/abds
[root@localhost tmp]# chattr +i test2
[root@localhost tmp]# lsattr -a test2
----i----------- test2/.
---------------- test2/..
---------------- test2/abds
[root@localhost tmp]# echo 11111 >> test2/abds
[root@localhost tmp]# cat test2/abds
11111
[root@localhost tmp]# rm -f test2/abds
rm: 无法删除"test2/abds": 权限不够
[root@localhost tmp]# touch test2/asda
touch: 无法创建"test2/asda": 权限不够
chattr 也可以限制root用户
系统命令sudo权限
sudo的意义 :root把本来只能超级用户执行的命令赋予普通用户执行。
sudo的操作对象是系统命令。
visudo
#实际修改的是/etc/sudoers文件
root ALL=(ALL) ALL
#用户名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
%wheel ALL=(ALL) ALL
#组名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)
举例:
授权slsl用户可以重启服务器
slsl ALL=/sbin/shutdown -r now
-------------------------------------------
[slsl@localhost ~]$ sudo shutdown -r now
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:
#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。
[sudo] slsl 的密码:
slsl 不在 sudoers 文件中。此事将被报告。
slsl用户执行sudo shutdown -r now时 不能成功。
执行visudo命令,添加一行
##
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
slsl ALL=/usr/sbin/shutdown -r now
## Allows members of the 'sys' group to run networking, software,
执行查看命令 sudo -l,发现有一行(root) /usr/sbin/shutdown -r now,说明这个命令可以按照(root)用户执行
[slsl@localhost ~]$ sudo -l
[sudo] slsl 的密码:
匹配 %2$s 上 %1$s 的默认条目:
!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
用户 slsl 可以在 localhost 上运行以下命令:
(root) /usr/sbin/shutdown -r now
[slsl@localhost ~]$
现在执行一下:严格按照命令格式,负责报错
[slsl@localhost ~]$ sudo shutdown now
对不起,用户 slsl 无权以 root 的身份在 localhost.localdomain 上执行 /sbin/shutdown now。
[slsl@localhost ~]$ sudo shutdown -r now
已经重启了
------------------------------------------------------------
增加一行(slsl 192.168.31.170=/usr/bin/vim)
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
slsl ALL=/usr/sbin/shutdown -r now
slsl 192.168.31.170=/usr/bin/vim
## Allows members of the 'sys' group to run networking, software,
[slsl@localhost ~]$ sudo -l
[sudo] slsl 的密码:
匹配 %2$s 上 %1$s 的默认条目:
!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
用户 slsl 可以在 localhost 上运行以下命令:
(root) /usr/sbin/shutdown -r now
(root) /usr/bin/vim
说明:192.168.31.170 这个ip是linux服务器的ip,(ALL)默认不写就是root,以root身份运行。
换成客户端ip,则这些sudo -l 命令不会查出 (root) /usr/bin/vim 这一行
举例 root用户建立文件,其他用户没有写的权限,但是切换到slsl用户 用sudo vim sss.txt可以写入,
说明相当于root在执行,文件权限失效,这是一个反例。现实中不能这样做
[root@localhost tmp]# vim sss.txt
[root@localhost tmp]# ll sss.txt
-rw-r--r-- 1 root root 14 6月 16 01:38 sss.txt
[slsl@localhost tmp]$ sudo vim sss.txt
[sudo] slsl 的密码:
[slsl@localhost tmp]$ cat sss.txt
daf
asfda
asf
sdsdsd1111111111