Linux-权限管理

权限简介

文件的权限主要针对三类对象进行定义:

  • owner:属主,u
  • group:属组,g
  • other:其它,o

每个文件针对每个访问者都定义了三种权限:

权限

对应的操作对象

权限说明

r

文件

可读,可以使用类似cat等命令查看文件内容

w

文件

可写,可以编辑或删除此文件

x

文件

可执行,eXacutable,可以在命令提示符下 当作命令提交给内核运行

r

目录

可以对此目录执行ls以列出内部的所有文件

w

目录

可以在此目录中创建文件,也可删除此目录中的文件

x

目录

可以使用cd切换进此目录,也可以 使用ls -l查看内部文件的详细信息

权限管理命令

chmod 修改权限的命令

u/g/o=r/w/x 只赋予某某权限
[root@localhost ~]# ll
total 4
----------. 1 root root 0 Nov 11 18:41 abc
-rw-------. 1 root root 1188 Nov 11 18:06 anaconda-ks.cfg
[root@localhost ~]# chmod u=rw abc
[root@localhost ~]# ll
total 4
-rw-------. 1 root root 0 Nov 11 18:41 abc
-rw-------. 1 root root 1188 Nov 11 18:06 anaconda-ks.cfg

u/g/o+r/w/x 新加某某权限
[root@localhost ~]# chmod u+x abc
[root@localhost ~]# ll
total 4
-rwx------. 1 root root 0 Nov 11 18:41 abc
-rw-------. 1 root root 1188 Nov 11 18:06 anaconda-ks.cfg

u/g/o-r/w/x 去除某某权限
[root@localhost ~]# chmod u-wx abc
[root@localhost ~]# ll
total 4
-r--------. 1 root root 0 Nov 11 18:41 abc
-rw-------. 1 root root 1188 Nov 11 18:06 anaconda-ks.cfg

权限的二进制与十进制转换:

权限

二进制

十进制

---

000

0

--x

001

1

-w-

010

2

-wx

011

3

r--

100

4

r-x

101

5

rw-

110

6

rwx

111

7

[root@localhost ~]# chmod 700 abc
[root@localhost ~]# ll
total 4
-rwx------. 1 root root 0 Nov 11 18:41 abc
-rw-------. 1 root root 1188 Nov 11 18:06 anaconda-ks.cfg
[root@localhost ~]# chmod 777 abc
[root@localhost ~]# ll
total 4
-rwxrwxrwx. 1 root root 0 Nov 11 18:41 abc
-rw-------. 1 root root 1188 Nov 11 18:06 anaconda-ks.cfg

chown 修改文件属主和属组的命令

chown命令只有管理员可以使用

更该属主

[root@localhost ~]# ll
total 4
-rwx------. 1 root root 0 Nov 11 18:41 abc
-rw-------. 1 root root 1188 Nov 11 18:06 anaconda-ks.cfg
[root@localhost ~]# chown tom abc
[root@localhost ~]# ll
total 4
-rwx------. 1 tom root 0 Nov 11 18:41 abc
-rw-------. 1 root root 1188 Nov 11 18:06 anaconda-ks.cfg

更改属组(“:”可换成".")

[root@localhost ~]# chown :yqh abc
[root@localhost ~]# ll
total 4
-rwx------. 1 tom yqh 0 Nov 11 18:41 abc
-rw-------. 1 root root 1188 Nov 11 18:06 anaconda-ks.cfg

更改属主和属组

-R //修改目录及其内部文件的属主

[root@localhost ~]# chown -R yqh.tom abc
[root@localhost ~]# ll
total 4
-rwx------. 1 yqh tom 0 Nov 11 18:41 abc
-rw-------. 1 root root 1188 Nov 11 18:06 anaconda-ks.cfg

遮罩码

文件创建以后默认权限是644

目录创建以后默认权限是755

是因为这是由遮罩码umask来控制的

[root@localhost ~]# umask
0022

文件的最大权限是666

目录的最大权限是777

所以文件最终的权限为:


  • 666-umask

目录最终的权限为:


  • 777-umask

更改遮罩码

[root@localhost opt]# touch 123
[root@localhost opt]# mkdir abc
[root@localhost opt]# ll
total 0
drwxr-xr-x. 2 root root 6 Nov 13 21:08 123
-rw-r--r--. 1 root root 0 Nov 13 21:08 abc
[root@localhost opt]# rm -f *
[root@localhost opt]# umask 033
[root@localhost opt]# touch 123
[root@localhost opt]# mkdir abc
[root@localhost opt]# ll
total 0
-rw-r--r--. 1 root root 0 Nov 13 21:34 123 //默认权限被改变
drwxr--r--. 2 root root 6 Nov 13 21:34 abc

文件默认是不能具有执行权限的,如果算得的结果有执行权限则将其权限整体加1

linux安全上下文与特殊权限

linux安全上下文

前提:进程有属主和属组;文件有属主和属组


  • 任何一个可执行程序文件能不能启动为进程,取决于发起者对程序文件是否拥有可执行权限;

Tom账户:
[tom@localhost ~]$ cp /usr/bin/vi .
[tom@localhost ~]$ ls
vi
[tom@localhost ~]$ ll
total 1384
-rwxr-xr-x. 1 tom tom 1416744 Nov 14 13:03 vi
Root账户:
[root@localhost ~]# chown root.root /home/tom/vi
[root@localhost ~]# chmod o-x /home/tom/vi
Tom账户:
[tom@localhost ~]$ ll
total 1384
-rwxr-xr--. 1 root root 1416744 Nov 14 13:03 vi
[tom@localhost ~]$ ./vi abc
-bash: ./vi: Permission denied


  • 启动为进程后,其进程的属主为发起者,属组为发起者所属的组
    ​①: [root@localhost ~]# vi root ②: [tom@localhost ~]# vi tom ③: [root@localhost ~]# ps -ef |grep vi root 1018 1 0 12:47 ? 00:00:00 /usr/bin/VGAuthService -s tom 1775 1752 0 12:54 pts/2 00:00:00 vi tom root 1776 1707 0 12:54 pts/1 00:00:00 vi root root 1778 1664 0 12:54 pts/0 00:00:00 grep --color=auto vi ​​//谁打开的就属于谁
  • 进程访问文件时的权限取决于进程的发起者:

    • 进程的发起者是文件的属主时,则应用文件属主权限
    • 进程的发起者是文件的属组时,则应用文件属组权限
    • 应用文件“其它”权限


特殊权限

linux默认权限是根据linux安全上下文的方式来控制的,而特殊权限的存在打破了linux安全上下文的规则,三种特殊权限应用的对象功能都不一样,SUID只能对程序文件进行设置,SGID和Sticky针对目录。

SUID:

默认情况是:程序文件的所有者是root,被tom启动后,是属于tom的。

设置了SUID后,无论是谁启动的,都是属于程序文件的所有者。

[root@localhost ~]# ll /usr/bin/vi
-rwxr-xr-x. 1 root root 1416744 Jul 23 2019 /usr/bin/vi
[root@localhost ~]# chmod 4755 /usr/bin/vi //4代表SUID
[root@localhost ~]# ll /usr/bin/vi
-rwsr-xr-x. 1 root root 1416744 Jul 23 2019 /usr/bin/vi
[root@localhost ~]# chmod u-x /usr/bin/vi //没有执行权限后是大写的S
[root@localhost ~]# ll /usr/bin/vi
-rwSr-xr-x. 1 root root 1416744 Jul 23 2019 /usr/bin/vi

SGID:

默认情况是:用户创建文件时,文件的基本组属于目录自身的基本组。

设置了SGID后,无论是谁创建的,基本组都是属于目录的所有者。

①:
[tom@localhost ~]$ mkdir abc
[tom@localhost ~]$ ll
total 1384
drwxrwxr-x. 2 tom tom 6 Nov 14 14:20 abc
②:
[root@localhost ~]# cd /home/tom/abc/
[root@localhost abc]# touch 123
[root@localhost abc]# ll
total 0
-rw-r--r--. 1 root root 0 Nov 14 14:20 123
[root@localhost abc]# chmod g+s /home/tom/abc/ //也可以用2755,2表示SGID
[tom@localhost ~]$ ll /home/tom/
total 1384
drwxrwsr-x. 2 tom tom 28 Nov 14 14:21 abc
[root@localhost abc]# touch 123
[root@localhost abc]# ll
total 0
-rw-r--r--. 1 root root 0 Nov 14 14:21 123
[root@localhost abc]# touch 456
[root@localhost abc]# ll
total 0
-rw-r--r--. 1 root root 0 Nov 14 14:21 123
-rw-r--r--. 1 root tom 0 Nov 14 14:21 456 //设置SGID后基本组变成了tom

[root@localhost ~]# chmod g-x /home/tom/abc/
[tom@localhost ~]$ ll /home/tom/
total 1384
drwxrwSr-x. 2 tom tom 28 Nov 14 14:21 abc //没有执行权限后是大写的S

Sticky:

在一个公共目录,每个人都能创建文件,删除自己的文件,但是不能删除别人创建的文件(只针对普通用户,管理员无效)


[root@localhost opt]# mkdir abc
[root@localhost opt]# chmod 1777 abc //1表示Sticky
[root@localhost opt]# ll
total 0
drwxrwxrwt. 2 root root 6 Nov 14 14:39 abc
[root@localhost opt]# cd abc/
[root@localhost abc]# touch 123
[root@localhost abc]# ll
total 0
-rw-r--r--. 1 root root 0 Nov 14 14:41 123

[tom@localhost ~]$ cd /opt/abc/
[tom@localhost abc]$ ll
total 0
-rw-r--r--. 1 root root 0 Nov 14 14:41 123
[tom@localhost abc]$ rm -rf 123
rm: cannot remove '123': Operation not permitted
[tom@localhost abc]$ touch 456
[tom@localhost abc]$ ll
total 0
-rw-r--r--. 1 root root 0 Nov 14 14:41 123
-rw-rw-r--. 1 tom tom 0 Nov 14 14:42 456
[tom@localhost abc]$ rm -f 456
[tom@localhost abc]$ ll
total 0
-rw-r--r--. 1 root root 0 Nov 14 14:41 123

[root@localhost opt]# chmod o-x abc
[root@localhost opt]# ll
total 0
drwxrwxrwT. 2 root root 17 Nov 14 14:46 abc //没有执行权限后是大写的T

文件系统访问控制列表facl

setfact

-m //设定(用户是用u,组是用g)
①:
[tom@localhost opt]$ ll
total 0
-rw-r--r--. 1 root root 0 Nov 14 14:54 root
[tom@localhost opt]$ echo 'I am Tom' >> root
-bash: root: Permission denied
[tom@localhost opt]$ cat root
hello world
②:
[root@localhost opt]# setfacl -m u:tom:rw root //指定用户tom文件root权限是可读可写
[root@localhost opt]# getfacl root //getfacl查询文件权限
# file: root
# owner: root
# group: root
user::rw-
user:tom:rw-
group::r--
mask::rw-
other::r--
①:
[tom@localhost opt]$ echo 'I am Tom' >> root
[tom@localhost opt]$ cat root
hello world
I am Tom

-x //取消
[root@localhost opt]# setfacl -x u:tom root
[root@localhost opt]# getfacl root
# file: root
# owner: root
# group: root
user::rw-
group::r--
mask::r--
other::r--

-b //清空
[root@localhost opt]# setfacl -m u:tom:rw root 
[root@localhost opt]# setfacl -m u:jerry:wx root
[root@localhost opt]# getfacl root
# file: root
# owner: root
# group: root
user::rw-
user:tom:rw-
user:jerry:-wx
group::r--
mask::rwx
other::r--
[root@localhost opt]# setfacl -b root
[root@localhost opt]# getfacl root
# file: root
# owner: root
# group: root
user::rw-
group::r--
other::r--

权限委派,给用户一个指定权限

sudo //目录在/etc/sudoers

visudo


[tom@localhost ~]$ useradd zhangsan
useradd: Permission denied.

[root@localhost ~]# visudo
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
tom ALL=(ALL) /usr/sbin/useradd //tom账户在本机以任何人的身份执行useradd
:wq!

[tom@localhost ~]$ sudo useradd zhangsan

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 tom:
[tom@localhost ~]$ id zhangsan
uid=1002(zhangsan) gid=1002(zhangsan) groups=1002(zhangsan)

[root@localhost ~]# visudo
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
tom ALL=(ALL) /usr/sbin/useradd, /usr/sbin/userdel
:wq!

[tom@localhost ~]$ sudo userdel -r zhangsan
[tom@localhost ~]$ id zhangsan
id: ‘zhangsan’: no such user

别名必须全部而且只能使用大写英文字母的组合,可以使用感叹号取反

别名分类:


  • 用户别名:

    • User_Alias NETWORKADMIN =

      • 用户的用户名
      • 组名,使用%引导
      • 还可以其它已经定义的用户别名


  • 主机别名:

    • Host_Alias =

      • 主机名
      • IP地址
      • 网络地址
      • 其它主机别名


  • Runas别名:

    • Runas_Alias =

      • 用户名
      • %组名
      • 其它的Runas别名


  • 命令别名:

    • Cmnd_Alias =

      • 命令路径
      • 目录(此目录内的所有命令)
      • 其它已定义的命令别名



管理命令

w

显示当前登录到系统的用户有哪些,以及其正在做什么


[C:\~]$ ssh tom@192.168.21.129


Connecting to 192.168.21.129:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.

WARNING! The remote SSH server rejected X11 forwarding request.
Last login: Sat Nov 14 12:54:12 2020
[tom@localhost ~]$ vi abc

[root@localhost ~]# w
15:21:13 up 2:33, 4 users, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 - 12:48 2:33m 0.01s 0.01s -bash
root pts/0 192.168.21.1 12:48 2:21m 0.04s 0.04s -bash
root pts/1 192.168.21.1 12:53 0.00s 0.34s 0.01s w
tom pts/2 192.168.21.1 15:20 6.00s 0.00s 0.03s sshd: tom

sleep 睡眠

[root@localhost ~]# sleep 600s      //睡眠600秒
^C
[root@localhost ~]# sleep 600m //睡眠600分
^C
[root@localhost ~]# sleep 600h //睡眠600小时
^C
[root@localhost ~]# sleep 600d //睡眠600天
^C
[root@localhost ~]# ls
abc anaconda-ks.cfg
[root@localhost ~]# sleep 5 && rm -f abc //在5秒后删除abc

5秒后

[root@localhost ~]# ls
anaconda-ks.cfg

last

显示/var/log/wtmp文件,显示用户登录历史及系统重启历史

[root@localhost ~]# last
tom pts/2 192.168.21.1 Sat Nov 14 15:20 still logged in
root pts/2 192.168.21.1 Sat Nov 14 12:53 - 15:20 (02:26)
root pts/1 192.168.21.1 Sat Nov 14 12:53 still logged in
root pts/0 192.168.21.1 Sat Nov 14 12:48 still logged in
root tty1 Sat Nov 14 12:48 still logged in
reboot system boot 4.18.0-193.el8.x Sat Nov 14 12:47 still running
root pts/1 192.168.21.1 Fri Nov 13 22:03 - crash (14:43)
root pts/0 192.168.21.1 Fri Nov 13 20:49 - crash (15:58)
root tty1 Fri Nov 13 20:48 - crash (15:58)
reboot system boot 4.18.0-193.el8.x Fri Nov 13 20:48 still running

wtmp begins Fri Nov 13 20:48:11 2020

-n 显示最近#次的相关信息
[root@localhost ~]# last -3
tom pts/2 192.168.21.1 Sat Nov 14 15:29 still logged in
tom pts/2 192.168.21.1 Sat Nov 14 15:20 - 15:28 (00:08)
root pts/2 192.168.21.1 Sat Nov 14 12:53 - 15:20 (02:26)

wtmp begins Fri Nov 13 20:48:11 2020

lastb

显示/var/log/btmp文件,显示用户错误的登录尝试

在输错tom用户密码3次后
[root@localhost ~]# lastb
tom ssh:notty 192.168.21.1 Sat Nov 14 15:29 - 15:29 (00:00)
tom ssh:notty 192.168.21.1 Sat Nov 14 15:28 - 15:28 (00:00)
tom ssh:notty 192.168.21.1 Sat Nov 14 15:28 - 15:28 (00:00)

btmp begins Sat Nov 14 15:28:53 2020

-n 显示最近#次的相关信息

[root@localhost ~]# lastb -2
tom ssh:notty 192.168.21.1 Sat Nov 14 15:29 - 15:29 (00:00)
tom ssh:notty 192.168.21.1 Sat Nov 14 15:28 - 15:28 (00:00)

btmp begins Sat Nov 14 15:28:53 2020

lastlog

显示每个用户最近一次成功登录信息

[root@localhost ~]# lastlog
Username Port From Latest
root pts/2 192.168.21.1 Sat Nov 14 12:53:41 +0800 2020
bin **Never logged in**
daemon **Never logged in**
adm **Never logged in**
lp **Never logged in**
sync **Never logged in**
shutdown **Never logged in**
halt **Never logged in**
mail **Never logged in**
operator **Never logged in**
games **Never logged in**
ftp **Never logged in**
nobody **Never logged in**
dbus **Never logged in**
systemd-coredump **Never logged in**
systemd-resolve **Never logged in**
tss **Never logged in**
polkitd **Never logged in**
unbound **Never logged in**
sssd **Never logged in**
sshd **Never logged in**
rngd **Never logged in**
tom pts/2 192.168.21.1 Sat Nov 14 15:29:04 +0800 2020
jerry **Never logged in**

-u 显示特定用户最近的登录信息
[root@localhost ~]# lastlog -u tom
Username Port From Latest
tom pts/2 192.168.21.1 Sat Nov 14 15:29:04 +0800 2020

basename 显示路径基名

[root@localhost ~]# basename /etc/sysconfig/network-scripts/ifcfg-ens160 
ifcfg-ens160 //取出文件名
[root@localhost ~]# basename /a/b/c/d/e/f
f //不实际存在的也能取

dirname 显示路径

[root@localhost ~]# basename /etc/sysconfig/network-scripts/ifcfg-ens160 
/etc/sysconfig/network-scripts //取出路径
[root@localhost ~]# dirname /a/b/c/d/e/f
/a/b/c/d/e //不实际存在的也能取