文章目录
权限管理
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 MODE file,…
- -R :递归修改权限
[root@localhost ~]# ll ww
总用量 0
[root@localhost ~]# cd ww
[root@localhost ww]# touch a b c
[root@localhost ww]# ll
总用量 0
-rw-r--r--. 1 root root 0 9月 20 13:27 a
-rw-r--r--. 1 root root 0 9月 20 13:27 b
-rw-r--r--. 1 root root 0 9月 20 13:27 c
[root@localhost ww]# cd //不能在目录里面修改
[root@localhost ~]# chmod -R 555 ww
[root@localhost ~]# ll ww
总用量 0
-r-xr-xr-x. 1 root root 0 9月 20 13:27 a
-r-xr-xr-x. 1 root root 0 9月 20 13:27 b
-r-xr-xr-x. 1 root root 0 9月 20 13:27 c
- u :修改属主权限
- g :修改属组权限
- 0 :修改其他用户权限
- a : 修改所有人的权限
//u,g,o,a(用户类别) - 语法:
- chmod 用户类别=MODE file,…
- chmod 用户类别=MODE,用户类别=MODE file,…
- //同理=可以换成± 意为增加或者减少某一权限
[root@localhost ~]# cd ww
[root@localhost ww]# ll
总用量 0
-r-xr-xr-x. 1 root root 0 9月 20 13:27 a
-r-xr-xr-x. 1 root root 0 9月 20 13:27 b
-r-xr-xr-x. 1 root root 0 9月 20 13:27 c
[root@localhost ww]# chmod u+w a //给a的属主加w权限
[root@localhost ww]# chmod g+w b //给b的数组加w权限
[root@localhost ww]# chmod o+w c //给c的其他用户加w权限
[root@localhost ww]# ll
总用量 0
-rwxr-xr-x. 1 root root 0 9月 20 13:27 a
-r-xrwxr-x. 1 root root 0 9月 20 13:27 b
-r-xr-xrwx. 1 root root 0 9月 20 13:27 c
[root@localhost ww]# chmod g+w,o+w a //给a的属组和其他用户加w权限
[root@localhost ww]# ll
总用量 0
-rwxrwxrwx. 1 root root 0 9月 20 13:27 a
-r-xrwxr-x. 1 root root 0 9月 20 13:27 b
-r-xr-xrwx. 1 root root 0 9月 20 13:27 c
[root@localhost ww]# chmod a-r a b c //去掉a,b,c所有人的r权限
[root@localhost ww]# ll
总用量 0
--wx-wx-wx. 1 root root 0 9月 20 13:27 a
---x-wx--x. 1 root root 0 9月 20 13:27 b
---x--x-wx. 1 root root 0 9月 20 13:27 c
[root@localhost ww]# chmod a=r a b c //设置a,b,c的所有权限为r
[root@localhost ww]# ll
总用量 0
-r--r--r--. 1 root root 0 9月 20 13:27 a
-r--r--r--. 1 root root 0 9月 20 13:27 b
-r--r--r--. 1 root root 0 9月 20 13:27 c
- 数字设置的方法,对应上面的权限进制转换表格
[root@localhost ww]# chmod 777 a
[root@localhost ww]# ll
总用量 0
-rwxrwxrwx. 1 root root 0 9月 20 13:27 a
-r--r--r--. 1 root root 0 9月 20 13:27 b
-r--r--r--. 1 root root 0 9月 20 13:27 c
[root@localhost ww]# chmod 124 b
[root@localhost ww]# ll
总用量 0
-rwxrwxrwx. 1 root root 0 9月 20 13:27 a
---x-w-r--. 1 root root 0 9月 20 13:27 b
-r--r--r--. 1 root root 0 9月 20 13:27 c
[root@localhost ww]# chmod 111 c
[root@localhost ww]# ll
总用量 0
-rwxrwxrwx. 1 root root 0 9月 20 13:27 a
---x-w-r--. 1 root root 0 9月 20 13:27 b
---x--x--x. 1 root root 0 9月 20 13:27 c
2.2 修改文件属主和属组的命令chown
- 语法:chown USERNAME file,…
[root@localhost ~]# chown ww ww //修改属主
[root@localhost ~]# ll
总用量 4
-rw-rw-rw-. 1 root root 0 9月 3 19:09 a
-rw-------. 1 root root 1412 9月 3 15:02 anaconda-ks.cfg
drwxr-xr-x. 2 ww root 33 9月 20 13:27 ww
[root@localhost ~]# chown .ww ww //修改属组
[root@localhost ~]# ll
总用量 4
-rw-rw-rw-. 1 root root 0 9月 3 19:09 a
-rw-------. 1 root root 1412 9月 3 15:02 anaconda-ks.cfg
drwxr-xr-x. 2 ww ww 33 9月 20 13:27 ww
[root@localhost ~]# chown :root ww //修改属组
[root@localhost ~]# ll
总用量 4
-rw-rw-rw-. 1 root root 0 9月 3 19:09 a
-rw-------. 1 root root 1412 9月 3 15:02 anaconda-ks.cfg
drwxr-xr-x. 2 ww root 33 9月 20 13:27 ww
[root@localhost ~]# chown root ww
[root@localhost ~]# chown ww.ww ww //属主和属组一起修改
[root@localhost ~]# ll
总用量 4
-rw-rw-rw-. 1 root root 0 9月 3 19:09 a
-rw-------. 1 root root 1412 9月 3 15:02 anaconda-ks.cfg
drwxr-xr-x. 2 ww ww 33 9月 20 13:27 ww
-R :修改目录及其内部文件的属主
[root@localhost ~]# ll ww
总用量 0
-rwxrwxrwx. 1 root root 0 9月 20 13:27 a
---x-w-r--. 1 root root 0 9月 20 13:27 b
---x--x--x. 1 root root 0 9月 20 13:27 c
[root@localhost ~]# chown -R ww.ww ww
[root@localhost ~]# ll ww
总用量 0
-rwxrwxrwx. 1 ww ww 0 9月 20 13:27 a
---x-w-r--. 1 ww ww 0 9月 20 13:27 b
---x--x--x. 1 ww ww 0 9月 20 13:27 c
2.3 修改文件的属组命令chgrp
- 语法:chgrp [OPTION]… GROUP FILE…
- -R :递归修改
[root@localhost ~]# ll
总用量 4
-rw-rw-rw-. 1 root root 0 9月 3 19:09 a
-rw-------. 1 root root 1412 9月 3 15:02 anaconda-ks.cfg
drwxr-xr-x. 2 ww ww 33 9月 20 13:27 ww
[root@localhost ~]# chgrp root ww
[root@localhost ~]# ll
总用量 4
-rw-rw-rw-. 1 root root 0 9月 3 19:09 a
-rw-------. 1 root root 1412 9月 3 15:02 anaconda-ks.cfg
drwxr-xr-x. 2 ww root 33 9月 20 13:27 ww
[root@localhost ~]# ll ww
总用量 0
-rwxrwxrwx. 1 ww ww 0 9月 20 13:27 a
---x-w-r--. 1 ww ww 0 9月 20 13:27 b
---x--x--x. 1 ww ww 0 9月 20 13:27 c
[root@localhost ~]# chgrp -R root ww
[root@localhost ~]# ll ww
总用量 0
-rwxrwxrwx. 1 ww root 0 9月 20 13:27 a
---x-w-r--. 1 ww root 0 9月 20 13:27 b
---x--x--x. 1 ww root 0 9月 20 13:27 c
3. 遮罩码
- 文件的最终权限为666,即读写rw
- 目录的最终权限为777,即读写执行rwx
- 遮罩码:umask,可隐藏一些权限
[root@localhost ~]# umask
0022
[root@localhost ~]# touch b
[root@localhost ~]# ll b
-rw-r--r--. 1 root root 0 9月 22 17:38 b
//新创建的文件的权限为,最终权限-遮罩码的权限即666-022
文件默认是不能具有执行权限的,如果算得的结果有执行权限则将其权限整体加1。
4. linux安全上下文与特殊权限
4.1 linux安全上下文
前提:进程有属主和属组;文件有属主和属组
- 任何一个可执行程序文件能不能启动为进程,取决于发起者对程序文件是否拥有可执行权限;
- 启动为进程后,其进程的属主为发起者,属组为发起者所属的组
- 进程访问文件时的权限取决于进程的发起者:
- 进程的发起者是文件的属主时,则应用文件属主权限
- 进程的发起者是文件的属组时,则应用文件属组权限
- 应用文件“其它”权限
4.2 特殊权限
- SUID(4) :运行程序时,这个程序启动的进程的属主是程序文件自身的属主,而不是启动者为属主
- 语法:
- chmod u+s file
- chmod u-s file
- //如果file本身原来就有执行权限,则SUID显示为s,否则显示为S
[root@localhost ~]# which vi //查看vi文件的路径
/usr/bin/vi
[root@localhost ~]# cp /usr/bin/vi /home/gg //将文件vi复制到家目录的用户gg
[root@localhost ~]# cd /home/gg
[root@localhost gg]#
[root@localhost gg]# ll //查看gg用户里面的vi文件,的属组和属主
总用量 892
-rwxr-xr-x. 1 root root 910088 9月 22 18:52 vi
[root@localhost gg]# chown gg.gg vi //将属主和属组root,修改为gg
[root@localhost gg]# ll
总用量 892
-rwxr-xr-x. 1 gg gg 910088 9月 22 18:52 vi
[root@localhost gg]# cd
[root@localhost ~]# ls
a anaconda-ks.cfg b ww
[root@localhost ~]# vi a
[root@localhost ~]# /home/gg/vi a //用复制过去的vi文件,编辑a
[root@localhost ~]# cat a
dkasjdpoiaj
oalsdjopasjpod
aodjpoasj
//此时切换到用户gg,查看进程
[gg@localhost ~]$ ps -ef|grep vi //发现属主还是root,而非文件的属主gg
root 760 1 0 13:13 ? 00:00:00 /usr/bin/VGAuthService -s
root 2246 2215 0 18:55 pts/1 00:00:00 /home/gg/vi a
gg 2248 2192 0 18:56 pts/0 00:00:00 grep --color=auto vi
//切换到root,用特殊权限修改vi的权限
[root@localhost ~]# ll /home/gg/vi
-rwxr-xr-x. 1 gg gg 910088 9月 22 18:52 /home/gg/vi
[root@localhost ~]# chmod 4755 /home/gg/vi
[root@localhost ~]# /home/gg/vi a
[root@localhost ~]# ll /home/gg/vi //此时执行权限变为s,详解查看上文
-rwsr-xr-x. 1 gg gg 910088 9月 22 18:52 /home/gg/vi
//切换到gg,查看进程
[gg@localhost ~]$ ps -ef|grep vi
root 760 1 0 13:13 ? 00:00:00 /usr/bin/VGAuthService -s
gg 2251 2215 0 18:58 pts/1 00:00:00 /home/gg/vi a //属主变为gg,权限修改成功
gg 2253 2192 0 18:58 pts/0 00:00:00 grep --color=auto vi
- SGID(2) :运行程序时,这个程序启动的进程的属组是程序文件自身的属组,而不是启动者所属的基本组。默认情况下,用户创建文件时,其属组为此用户所属的基本组;一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件或目录,其所属的组为此设定了SGID的目录的属组
- 语法:
- chmod g+s DIR
- chmod g-s DIR
- //如果file本身原来就有执行权限,则SGID显示为s,否则显示为S
[root@localhost ~]# mkdir qq //在root下创建一个目录
[root@localhost ~]# ll //查看目录属组
总用量 8
-rw-rw-rw-. 1 root root 37 9月 22 18:55 a
-rw-------. 1 root root 1412 9月 3 15:02 anaconda-ks.cfg
-rw-r--r--. 1 root root 0 9月 22 17:38 b
drwxr-xr-x. 2 root root 6 9月 22 19:20 qq
drwxr-xr-x. 2 ww root 33 9月 20 13:27 ww
[root@localhost ~]# chown .gg qq //修改属组为gg
[root@localhost ~]# ll
总用量 8
-rw-rw-rw-. 1 root root 37 9月 22 18:55 a
-rw-------. 1 root root 1412 9月 3 15:02 anaconda-ks.cfg
-rw-r--r--. 1 root root 0 9月 22 17:38 b
drwxr-xr-x. 2 root gg 6 9月 22 19:20 qq
drwxr-xr-x. 2 ww root 33 9月 20 13:27 ww
[root@localhost ~]# cd qq
[root@localhost qq]# mkdir abc
[root@localhost qq]# touch efg
[root@localhost qq]# ll //进入目录qq,创建一个目录和文件,此时创建的东西属组为root,而非目录qq的属组gg
总用量 0
drwxr-xr-x. 2 root root 6 9月 22 19:21 abc
-rw-r--r--. 1 root root 0 9月 22 19:21 efg
[root@localhost qq]# cd
[root@localhost ~]# chmod 2755 qq //修改目录qq的权限
[root@localhost ~]# ll
总用量 8
-rw-rw-rw-. 1 root root 37 9月 22 18:55 a
-rw-------. 1 root root 1412 9月 3 15:02 anaconda-ks.cfg
-rw-r--r--. 1 root root 0 9月 22 17:38 b
drwxr-sr-x. 3 root gg 28 9月 22 19:21 qq
drwxr-xr-x. 2 ww root 33 9月 20 13:27 ww
[root@localhost ~]# cd qq
[root@localhost qq]# touch a
[root@localhost qq]# mkdir b
[root@localhost qq]# ll //再次进入qq创建同样的目录和文件,属组变为目录qq的属组gg。试验成功
总用量 0
-rw-r--r--. 1 root gg 0 9月 22 19:22 a
drwxr-xr-x. 2 root root 6 9月 22 19:21 abc
drwxr-sr-x. 2 root gg 6 9月 22 19:22 b
-rw-r--r--. 1 root root 0 9月 22 19:21 efg
- Sticky(1) :在一个公共目录,每个人都能创建文件,删除自己的文件,但是不能删除别人创建的文件
- 语法:
- chmod o+t DIR
- chmod o-t DIR
- 如果DIR本身原来就有执行权限,则Sticky显示为t,否则显示为T
[root@localhost ~]# mkdir /tmp/ee //创建个目录ee
[root@localhost ee]# cd /tmp
[root@localhost tmp]# ll //查看ee的权限
总用量 0
-rw-rw-r--. 1 gg gg 0 9月 22 19:31 a
drwxr-xr-x. 2 root root 6 9月 22 19:36 ee
[root@localhost tmp]# chmod 1777 ee //修改ee的特殊权限
[root@localhost tmp]# ll
总用量 0
-rw-rw-r--. 1 gg gg 0 9月 22 19:31 a
drwxrwxrwt. 2 root root 6 9月 22 19:36 ee
[root@localhost tmp]# touch /tmp/ee/a //在root用户的ee目录下,创建一个文件a
[root@localhost tmp]# cd /tmp/ee
[root@localhost ee]# ll
总用量 0
-rw-r--r--. 1 root root 0 9月 22 19:38 a
//切换到用户gg
[gg@localhost tmp]$ cd /tmp/ee //进入到公共目录ee
[gg@localhost ee]$ ll //查看到root创建的a
总用量 0
-rw-r--r--. 1 root root 0 9月 22 19:38 a
[gg@localhost ee]$ touch b //自己创建一个b
[gg@localhost ee]$ ll
总用量 0
-rw-r--r--. 1 root root 0 9月 22 19:38 a
-rw-rw-r--. 1 gg gg 0 9月 22 19:39 b
[gg@localhost ee]$ rm -rf a //a不允许删除
rm: 无法删除"a": 不允许的操作
[gg@localhost ee]$ rm -rf b
[gg@localhost ee]$ ll //b可以,实验成功
总用量 0
-rw-r--r--. 1 root root 0 9月 22 19:38 a
- 数值设置:4、2、1分别表示SUID、SGID、Sticky
- 语法:
- chmod +特殊权限,属主权限,属组权限,其它权限 +目录、文件、公共目录
5. 文件系统访问控制列表facl
- 语法:setfacl [-bkndRLP] { -m|-M|-x|-X … } file …
- -m :设定
- u:UID:perm
- g:GID:perm
- 查看设置:
- getfacl 语法:[-aceEsRLPtpndvh] file …
[root@localhost opt]# setfacl -m u:gg:rw a
[root@localhost opt]# ll
总用量 0
-rw-rw-r--+ 1 root root 0 9月 22 21:18 a
drwx------. 3 ww gdx 105 9月 3 19:30 ww
[root@localhost opt]# getfacl a
# file: a
# owner: root
# group: root
user::rw-
user:gg:rw-
group::r--
mask::rw-
other::r--
[root@localhost opt]# setfacl -m g:gg:rw a
[root@localhost opt]# getfacl a
# file: a
# owner: root
# group: root
user::rw-
user:gg:rw-
group::r--
group:gg:rw-
mask::rw-
other::r--
- 为某个目录设定默认的访问控制列表
- 语法:setfacl -dm u:test:rw file
- 此时在此目录中创建的文件均继承此访问控制列表所设置的权限
[root@localhost opt]# setfacl -dm g:gg:wrx abc
[root@localhost opt]# getfacl abc
# file: abc
# owner: root
# group: root
user::rwx
group::r-x
other::r-x
default:user::rwx
default:group::r-x
default:group:gg:rwx
default:mask::rwx
default:other::r-x
- -x :取消
- u:UID //setfacl -x u:test file
- g:GID //setfacl -x g:test file
- -b:清除所有facl设置
[root@localhost opt]# getfacl a
# file: a
# owner: root
# group: root
user::rw-
user:gg:rw-
group::r--
group:gg:rw-
mask::rw-
other::r--[root@localhost opt]# setfacl -x u:gg a
[root@localhost opt]# getfacl a
# file: a
# owner: root
# group: root
user::rw-
group::r--
group:gg:rw-
mask::rw-
other::r--
[root@localhost opt]# setfacl -b a
[root@localhost opt]# getfacl a
# file: a
# owner: root
# group: root
user::rw-
group::r--
other::r--
- 文件权限应用次序:
- 默认情况下:
- Owner --> Group --> Other
- 有设置facl的情况下:
- Owner --> facl,user --> Group --> facl,group --> Other
6. sudo
- sudo可以实现某个用户能够以另外哪一个用户的身份通过哪些主机执行什么命令
- sudo的配置文件:/etc/sudoers
- 使用visudo命令进行sudo的配置,每一行就是一个sudo条目,条目格式如下:
- who which_hosts=(runas) command
- who:User_Alias,表示运行命令者的身份
- which_hosts:Host_Alias,通过哪些主机
- runas:Runas_Alias,以哪个用户的身份
- command:Cmnd_Alias,运行哪些命令
别名必须全部而且只能使用大写英文字母的组合,可以使用感叹号取反
别名分类:
- 用户别名:
- User_Alias NETWORKADMIN =
- 用户的用户名
- 组名,使用%引导
- 还可以其它已经定义的用户别名
- 主机别名:
- Host_Alias =
- 主机名
- IP地址
- 网络地址
- 其它主机别名
- Runas别名:
- Runas_Alias =
- 用户名
- %组名
- 其它的Runas别名
- 命令别名:
- Cmnd_Alias =
- 命令路径
- 目录(此目录内的所有命令)
- 其它已定义的命令别名
- sudo命令语法:sudo [options] COMMAND
- -V :显示版本编号
- -h :会显示版本编号及指令的使用方式说明
- -l :列出当前用户可以使用的所有sudo类命令
- -v :因为sudo在第一次执行时或是在N分钟内没有执行(N默认为5)会问密码,这个参数是重新做一次确认,如果超过N分钟,也会问密码
- -k :让认证信息失效,如果不指定-k,默认认证信息在5分钟后失效
- -b :将要执行的指令放在后台执行
- -u USERNAME:以指定的用户名执行命令,默认为root
7. 管理命令
- w :显示当前登录到系统的用户有哪些,以及其正在做什么
[root@localhost ~]# w
22:12:03 up 8:52, 5 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root tty1 五13 2days 0.02s 0.02s -bash
root pts/0 192.168.120.1 17:23 2:23m 0.37s 0.30s -bash
root pts/1 192.168.120.1 18:50 2:23m 0.31s 0.31s -bash
root pts/2 192.168.120.1 21:13 1:55 0.53s 0.01s sudo -l
root pts/3 192.168.120.1 21:16 3.00s 0.13s 0.01s w
- sleep :睡眠,写脚本为防止上一个命令没执行完下一命令就开始执行时可以加上sleep#, 表示停顿#秒后再执行后面的命令
- 语法:sleep NUMBER[SUFFIX]…
- SUFFIX:
s:秒,默认
m:分
h:小时
d:天
[root@localhost ~]# echo 'hello world';sleep 5;echo 'runtime'
hello world
runtime
- last :显示/var/log/wtmp文件,显示用户登录历史及系统重启历史
- -n#:显示最近#次的相关信息
[root@localhost ~]# last -n2
root pts/3 192.168.120.1 Sun Sep 22 21:16 still logged in
root pts/2 192.168.120.1 Sun Sep 22 21:13 still logged in
wtmp begins Tue Sep 3 15:03:06 2019
- lastb :显示/var/log/btmp文件,显示用户错误的登录尝试
- -n # :显示最近#次的相关信息
[root@localhost ~]# lastb -n2
gg ssh:notty 192.168.120.1 Sun Sep 22 18:49 - 18:49 (00:00)
ww ssh:notty 192.168.120.1 Sun Sep 22 18:47 - 18:47 (00:00)
btmp begins Tue Sep 3 15:04:17 2019
- lastlog:显示每个用户最近一次成功登录信息
- -u username:显示特定用户最近的登录信息
[root@localhost ~]# lastlog -u gg
用户名 端口 来自 最后登陆时间
gg pts/2 日 9月 22 22:08:34 +0800 2019
- basename :显示路径基名
[root@localhost ~]# basename /a/b/c/d/e/f.txt
f.txt
[root@localhost ~]# basename /a/b/c/d/e/f/
f
[root@localhost ~]# dirname /a/b/c/d/e/f.txt
/a/b/c/d/e