Linux_权限管理
权限管理
1. 权限简介
文件的权限主要针对三类对象进行定义:
- owner:宿主,u
- group:属组,g
- other:其它,o
每个文件针对每个访问者都定义了三种权限:
权限 | 对应的操作对象 | 权限说明 |
---|---|---|
r | 文件 | 可读,可以使用类似cat等命令查看文件内容 |
w | 文件 | 可写,可以编辑或删除此文件 |
x | 文件 | 可执行,eXacutable,可以在命令提示符下 |
当作命令提交给内核运行 | ||
r | 目录 | 可以对此目录执行ls以列出内部的所有文件 |
w | 目录 | 可以在此目录中创建文件,也可删除此目录中的文件 |
x | 目录 | 可以使用cd切换进此目录,也可以 |
使用ls -l查看内部文件的详细信息 |
权限的二进制与十进制转换:
权限 | 二进制 | 十进制 |
---|---|---|
--- | 000 | 0 |
--x | 001 | 1 |
-w- | 010 | 2 |
-wx | 011 | 3 |
r-- | 100 | 4 |
r-x | 101 | 5 |
rw- | 110 | 6 |
rwx | 111 | 7 |
2. 权限管理命令
2.1. 权限管理 //chmod
- chmod u/g/o/a 根据需求选择(u是属主g是属组o是其他a是所有)
- +是追加
- =是最后的结果
- -是在原本的权限上减去权限
下面是举例(可举一反三,道理一样):
- chmod u=r //把宿主owner查看abc变为只读权限(u+r是在原本的权限上加一个权限,u=r是最终的权限)
[root@runtime ~]# ll
total 12
-rw-r--r--. 1 root root 12 Nov 10 00:15 abc
-rw-r--r--. 1 root root 5 Nov 8 18:51 baozi
-rw-r--r--. 1 root root 5 Nov 8 18:16 def
[root@runtime ~]# chmod u=r abc
[root@runtime ~]# ll
total 12
-r--r--r--. 1 root root 12 Nov 10 00:15 abc
-rw-r--r--. 1 root root 5 Nov 8 18:51 baozi
-rw-r--r--. 1 root root 5 Nov 8 18:16 def
[root@runtime ~]#
- chmod u-r //u-r是在原本的权限上减去一个权限
[root@runtime ~]# ll
total 12
-r--r--r--. 1 root root 12 Nov 10 00:15 abc
-rw-r--r--. 1 root root 5 Nov 8 18:51 baozi
-rw-r--r--. 1 root root 5 Nov 8 18:16 def
[root@runtime ~]# chmod u-r abc
[root@runtime ~]# ll
total 12
----r--r--. 1 root root 12 Nov 10 00:15 abc
-rw-r--r--. 1 root root 5 Nov 8 18:51 baozi
-rw-r--r--. 1 root root 5 Nov 8 18:16 def
[root@runtime ~]#
- chmod 664 abc //把abc文件变为只读;这里用数字来表示权限,可以对照上面的表格
[root@runtime ~]# ll abc
----r--r--. 1 root root 12 Nov 10 00:15 abc
[root@runtime ~]# chmod 644 abc
[root@runtime ~]# ll
total 12
-rw-r--r--. 1 root root 12 Nov 10 00:15 abc
-rw-r--r--. 1 root root 5 Nov 8 18:51 baozi
-rw-r--r--. 1 root root 5 Nov 8 18:16 def
[root@runtime ~]#
2.2 修改文件属主和属组的命令 //chown
- 只有管理员才可以使用
- chown root abc//修改用户
[root@runtime tmp]# ll
total 4
-------r--. 1 tom root 5 Nov 11 23:53 abc
-------r--. 1 root root 0 Nov 11 23:58 hehe
[root@runtime tmp]# chown root abc
[root@runtime tmp]# ll
total 4
-------r--. 1 root root 5 Nov 11 23:53 abc
-------r--. 1 root root 0 Nov 11 23:58 hehe
[root@runtime tmp]#
- chown :leichen abc //修改属组
[root@runtime tmp]# chown :leichen abc
[root@runtime tmp]# ll
total 4
-------r--. 1 root leichen 5 Nov 11 23:53 abc
-------r--. 1 root root 0 Nov 11 23:58 hehe
[root@runtime tmp]#
- chown tom:tom abc //同时修改用户和组;:可以换成·
[root@runtime tmp]# chown tom:tom abc
[root@runtime tmp]# ll
total 4
-------r--. 1 tom tom 5 Nov 11 23:53 abc
-------r--. 1 root root 0 Nov 11 23:58 hehe
[root@runtime tmp]#
3. 遮掩码
- 为什么文件创建以后默认权限是644?
- 为什么目录创建以后默认权限是755?
演示如下:
[root@localhost tmp]# touch abc
[root@localhost tmp]# mkdir 123
[root@localhost tmp]# ll
total 0
drwxr-xr-x. 2 root root 6 Nov 13 23:52 123
-rw-r--r--. 1 root root 0 Nov 13 23:52 abc
[root@localhost tmp]# umask
0022
[root@localhost tmp]# umask 003
[root@localhost tmp]# touch hehe
[root@localhost tmp]# mkdir 456
[root@localhost tmp]# ll
total 0
drwxr-xr-x. 2 root root 6 Nov 13 23:52 123
drwxrwxr--. 2 root root 6 Nov 13 23:53 456
-rw-r--r--. 1 root root 0 Nov 13 23:52 abc
-rw-rw-r--. 1 root root 0 Nov 13 23:52 hehe
这是由遮罩码umask来控制的。
- 修改后的遮罩码不能影响之前的遮罩码
从名字就能看出来,遮罩码umask是用来隐藏一些权限的。举例:如果你不想让人家认出你,你会怎么办?
文件最终的权限为:
- 666-umask
目录最终的权限为:
- 777-umask
文件默认是不能具有执行权限的,如果算得的结果有执行权限则将其权限整体加1。
4. linux安全上下文与特殊权限
4.1 linux安全上下文
前提:进程有属主和属组;文件有属主和属组
- 任何一个可执行程序文件能不能启动为进程,取决于发起者对程序文件是否拥有可执行权限;
- 启动为进程后,其进程的属主为发起者,属组为发起者所属的组
- 进程访问文件时的权限取决于进程的发起者:
- 进程的发起者是文件的属主时,则应用文件属主权限
- 进程的发起者是文件的属组时,则应用文件属组权限
- 应用文件“其它”权限
4.2 特殊权限
linux默认权限是根据linux安全上下文的方式来控制的,而特殊权限的存在打破了linux安全上下文的规则。
特殊权限分为三种:
- SUID //只能对程序和命令进行设置,不能对其他的普通文件进行设置(没有意义)
- SDGID //对某一个目录进行设置
- Sticky //在一个公共目录,每个人都能创建文件,删除自己的文件,但是不能删除别人创建的文件
SUID(4)
- chmod u+s file //给一个文件设置SUID;运行程序时,这个程序启动的进程的属主是程序文件自身的属主,而不是启动者为属主
[root@localhost ~]# chmod u+s /usr/bin/vi
[root@localhost ~]# ll
total 4
-rw-------. 1 root root 1187 Nov 13 21:53 anaconda-ks.cfg
[root@localhost ~]# ll /usr/bin/vi
-rwsr-xr-x. 1 tom root 1416744 Jul 23 2019 /usr/bin/vi
[root@localhost ~]#
- chmod 4755 file //用数字的方式设置SUID;4代表SUID
[root@localhost ~]# chmod 4755 /usr/bin/vi
[root@localhost ~]# ll /usr/bin/vi
-rwsr-xr-x. 1 tom root 1416744 Jul 23 2019 /usr/bin/vi
[root@localhost ~]#
- chmod u-x file //取消执行权限;x代表执行权限
- 显示大写S代表之前没有执行权限
- 显示小写s代表之前有执行权限
[root@localhost ~]# chmod u-x /usr/bin/vi
[root@localhost ~]# ll /usr/bin/vi
-rwSr-xr-x. 1 tom root 1416744 Jul 23 2019 /usr/bin/vi
[root@localhost ~]#
[root@localhost ~]# chmod u+x /usr/bin/vi
[root@localhost ~]# ll /usr/bin/vi
-rwsr-xr-x. 1 tom root 1416744 Jul 23 2019 /usr/bin/vi
[root@localhost ~]#
SGID(2)
-
chmod g+s dir //给一个目录设置SGID;这个个程序启动的进程的属组是程序文件自身的属组,而不是启动者所属的基本组
[root@localhost tmp]# chmod g+s abc [root@localhost tmp]# ll total 0 drwxr-srwx. 2 root root 17 Nov 14 01:44 abc [root@localhost tmp]# /*Tom用户下在abc下创建456组是root*/ [tom@localhost abc]$ touch 456 [tom@localhost abc]$ ll total 0 -rw-rw-r--. 1 tom tom 0 Nov 14 01:44 123 -rw-rw-r--. 1 tom root 0 Nov 14 01:45 456 [tom@localhost abc]$ mkdir hehe [tom@localhost abc]$ ll total 0 -rw-rw-r--. 1 tom tom 0 Nov 14 01:44 123 -rw-rw-r--. 1 tom root 0 Nov 14 01:45 456 drwxrwsr-x. 2 tom root 6 Nov 14 01:52 hehe [tom@localhost abc]$
-
chmod g-s dir//取消设置SGID
[root@localhost tmp]# chmod g-s abc
[root@localhost tmp]# ll
total 0
drwxr-xrwx. 3 root tom 52 Nov 14 01:58 abc
[root@localhost tmp]#
- chmod 2757 dir //用数字的方式设置SGID;2代表SGID
- 显示大写S代表有执行权限
- 显示小写s代表没有执行权限
[root@localhost tmp]# chmod 2757 abc
[root@localhost tmp]# ll
total 0
drwxr-srwx. 3 root tom 52 Nov 14 01:58 abc
[root@localhost tmp]# chmod g-x abc
[root@localhost tmp]# ll
total 0
drwxr-Srwx. 3 root tom 52 Nov 14 01:58 abc
[root@localhost tmp]# chmod g+x abc
[root@localhost tmp]# ll
total 0
drwxr-srwx. 3 root tom 52 Nov 14 01:58 abc
[root@localhost tmp]#
Sticky(1)
- chmod o+t dir //设置Sticky;可以删除自己创建的文件,不可以删除别人的文件
[root@localhost tmp]# chmod o+t abc
[root@localhost tmp]# ll abc
total 0
-rw-r--r--. 1 root root 0 Nov 14 02:27 123
[root@localhost tmp]# ll
total 0
drwxrwxrwt. 2 root root 17 Nov 14 02:27 abc
[root@localhost tmp]#
- chmod 1777 dir //用数字来设置Sticky
- 显示大写T表示有执行权限
- 显示小写t表示没有执行权限
[root@localhost tmp]# chmod 1777 abc
[root@localhost tmp]# ll
total 0
drwxrwxrwt. 2 root root 17 Nov 14 02:27 abc
[root@localhost tmp]# chmod o-x abc
[root@localhost tmp]# ll
total 0
drwxrwxrwT. 2 root root 17 Nov 14 02:27 abc
[root@localhost tmp]# chmod o+x abc
[root@localhost tmp]# ll
total 0
drwxrwxrwt. 2 root root 17 Nov 14 02:27 abc
[root@localhost tmp]#
3.chmod o-t dir取消Sticky
[root@localhost tmp]# chmod o-t abc
[root@localhost tmp]# ll
total 0
drwxrwxrwx. 2 root root 17 Nov 14 02:27 abc
[root@localhost tmp]#
- 4755 //有SUID,文件权限为755
- 2755 //有SGID,文件权限为755
- 1755 //有Sticky,文件权限为755
- 这里前面的4、2、1分别表示SUID、SGID、Sticky
5. 文件系统访问控制列表facl
facl(Filesystem Access Control List),利用文件扩展保存额外的访问控制权限
- -m //设置权限
- u:UID:perm //用户:用户ID:权限
- g:GID:perm //组:组ID:权限
- -x //取消权限,指定的一个。
- -b //取消所有的权限
- setfacl -m u:tom:rw hehe //设置tom账户对hehe有读写权限
[root@localhost tmp]# setfacl -m u:tom:rw hehe
/*在tom账户下可以对hehe读写*/
[tom@localhost tmp]$ echo 'jjyy' >> hehe
[tom@localhost tmp]$ cat hehe
hello world
jjyy
[tom@localhost tmp]$
- setfacl -x u:tom hehe //取消tom用户对hehe的执行权限
[root@localhost tmp]# setfacl -x u:tom hehe
[root@localhost tmp]# getfacl hehe
# file: hehe
# owner: root
# group: root
user::rw-
group::r--
mask::r--
other::r--
[root@localhost tmp]#
- setfacl -b hehe //对hehe这个文件取消所有的facl权限
[root@localhost tmp]# setfacl -b hehe
[root@localhost tmp]# getfacl hehe
# file: hehe
# owner: root
# group: root
user::rw-
group::r--
other::r--
[root@localhost tmp]#
- getfacl hehe查看hehe文件的facl权限
[root@localhost tmp]# getfacl hehe
# file: hehe
# owner: root
# group: root
user::rw-
group::r--
other::r--
[root@localhost tmp]#
6. sudo //权限委派
sudo可以实现某个用户能够以另外哪一个用户的身份通过哪些主机执行什么命令
sudo的配置文件:/etc/sudoers
- visudo //给tom用户加一个可执行命令;如需多个命令权限用逗号隔开
[root@localhost ~]# visudo
## Allows people in group wheel to run all commandsroot ALL=(ALL) ALL
tom ALL=(ALL) /usr/sbin/useradd /*我想让tom用户在所有的主机上以任何人的身份执行这个命令*/
## Same thing without a password
# %wheel ALL=(ALL) NOPASSWD: ALL
[root@localhost ~]#
/*在tom用户下创建zhangsan用户*/
[tom@localhost ~]$ sudo useradd zhangsan
[sudo] password for tom:
[tom@localhost ~]$
/*添加了一个删除用户userdel命令*/
[tom@localhost ~]$ sudo userdel zhangsan
[sudo] password for tom:
[tom@localhost ~]$ id zhangsan
id: ‘zhangsan’: no such user
[tom@localhost ~]$
使用visudo命令进行sudo的配置,每一行就是一个sudo条目,条目格式如下:
-
who which_hosts=(runas) command
-
who:User_Alias,表示运行命令者的身份
-
which_hosts:Host_Alias,通过哪些主机
-
runas:Runas_Alias,以哪个用户的身份
-
command:Cmnd_Alias,运行哪些命令
-
别名必须全部而且只能使用大写英文字母的组合,可以使用感叹号取反
别名分类:
- 用户别名:
- User_Alias NETWORKADMIN =
- 用户的用户名
- 组名,使用%引导
- 还可以其它已经定义的用户别名
- User_Alias NETWORKADMIN =
- 主机别名:
- Host_Alias =
- 主机名
- IP地址
- 网络地址
- 其它主机别名
- Host_Alias =
- Runas别名:
- Runas_Alias =
- 用户名
- %组名
- 其它的Runas别名
- Runas_Alias =
- 命令别名:
- Cmnd_Alias =
- 命令路径
- 目录(此目录内的所有命令)
- 其它已定义的命令别名
- Cmnd_Alias =
7.管理命令
w //显示当前登录到系统的用户有哪些,以及其在做什么
演示如下:
[root@localhost ~]# w
23:33:35 up 1:17, 5 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 - 07Nov20 6days 0.01s 0.01s -bash
root pts/0 192.168.91.1 08Nov20 6days 0.00s 0.00s -bash
root pts/1 192.168.91.1 22:17 35:59 0.02s 0.02s -bash
root pts/2 192.168.91.1 22:17 1:08m 0.00s 0.00s -bash
root pts/3 192.168.91.1 22:17 0.00s 0.02s 0.01s w
[root@localhost ~]#
sleep //睡眠,写脚本为防止上一个 命令没执行完下一个命令就开始执行时间可以加上sleep
- 表示停顿#秒后再执行后面的命令
sleep NUMBER[SUFFIX]...
SUFFIX:
s:秒,默认
m:分
h:小时
d:天
[root@localhost ~]# sleep 10
[root@localhost ~]#
last //显示/var/log/wtmp文件,显示用户登录历史及系统重新历史
- -n //显示最近#次的相关
[root@localhost ~]# last
root pts/3 192.168.91.1 Sat Nov 14 22:17 still logged in
root pts/1 192.168.91.1 Sat Nov 14 22:17 still logged in
root pts/2 192.168.91.1 Sat Nov 14 22:17 still logged in
root pts/1 192.168.91.1 Sat Nov 14 22:17 - 22:17 (00:00)
root pts/0 192.168.91.1 Sun Nov 8 00:00 gone - no logout
root tty1 Sat Nov 7 23:59 gone - no logout
reboot system boot 4.18.0-193.el8.x Sat Nov 7 23:59 still running
wtmp begins Sat Nov 7 23:59:28 2020
[root@localhost ~]#
lastb //显示/var/log/btmp文件,显示用户错误的登录尝试
- -n //显示最近#次的相关信息
[root@localhost ~]# lastb
btmp begins Sat Nov 7 23:59:30 2020
lastlog //显示每个用户最近一次登录成功的信息
- -u username //显示特定用户最近的登录信息
[root@localhost ~]# lastlog -u root
Username Port From Latest
root pts/3 Sat Nov 14 22:18:12 +0800 2020
[root@localhost ~]#
bashname //显示路径基名
- 不存在的也可以显示
[root@localhost ~]# basename /etc/sysconfig/network-scripts/ifcfg-ens160
ifcfg-ens160
[root@localhost ~]# basename /a/b/c/d/e/f
f