权限简介


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

  • 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

权限管理命令


chmod修改权限命令:

  1. //修改三类用户的权限:
  2. //语法:chmod MODE file,...
  3. -R //递归修改权限
  4. //修改某类用户或某些类用户权限:
  5. //u,g,o,a(用户类别)
  6. //实例
  7. [root@Gin-Kin ~]# chmod u=rwx,g=rwx anaconda-ks.cfg
  8. [root@Gin-Kin ~]# ll
  9. total 4
  10. -rwxrwx---. 1 root root 1306 Jul 1 15:38 anaconda-ks.cfg
  11. [root@Gin-Kin ~]#
  12. [root@Gin-Kin ~]# chmod u+rwx anaconda-ks.cfg
  13. [root@Gin-Kin ~]# ll
  14. total 4
  15. -rwx------. 1 root root 1306 Jul 1 15:38 anaconda-ks.cfg
  16. [root@localhost ~]#
  17. [root@Gin-Kint ~]# chmod 400 anaconda-ks.cfg
  18. [root@localhost ~]# ll
  19. total 4
  20. -r--------. 1 root root 1306 Jul 1 15:38 anaconda-ks.cfg
  21. [root@Gin-Kin ~]#
  22. //chmod 用户类别=MODE file,.....
  23. //chmod 用户类别=MODE,用户类别=MODE file,.....
  24. //修改某类的用户某位或某些位权限:
  25. //u,g,o,a(用户类别)
  26. //chmod 用户类别+|-MODE file,.....
  27. //chmod 用户类别+|-MODE,用户类别+|-MODE file,.....
  28. //chmod +|-MODE file,.....

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

  1. //chown USERNAME file,...
  2. -R //修改目录及其内部文件的属主
  3. //chown USERNAME:GROUPNAME file,...
  4. //chown USERNAME.GROUPNAME file,.
  5. //实例
  6. [root@Gin-Kin ~]# ll
  7. total 4
  8. -rw-------. 1 root root 1428 Jul 5 09:50 anaconda-ks.cfg
  9. [root@Gin-Kin ~]# chown .Gin anaconda-ks.cfg
  10. [root@Gin-Kin ~]# ll
  11. total 4
  12. -rw-------. 1 root Gin 1428 Jul 5 09:50 anaconda-ks.cfg
  13. [root@Gin-Kin ~]#

遮罩码


为什么文件创建以后默认权限是644?
为什么目录创建以后默认权限是755?
这是由遮罩码umask来控制的。
从名字就能看出来,遮罩码umask是用来隐藏一些权限的。举例:如果你不想让人家认出你,你会怎么办?
文件最终的权限为:

  • 666-umask

目录最终的权限为:

  • 777-umask

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

  1. #在wowo用户里面创建目录和文件
  2. [root@Gin-Kin ~]$ mkdir Gin #创建目录
  3. [root@Gin-Kin ~]$ touch Kin #创建文件
  4. [root@Gin-Kin ~]$ ll
  5. total 0
  6. -rw-rw-r--. 1 root root 0 Jul 7 15:15 Kin
  7. drwxrwxr-x. 2 root root 6 Jul 7 15:15 Gin
  8. #设置遮罩码033 遮罩码只影响到你设置后的创建,之前的没有影响
  9. [wowo@Gin-Kin ~]$ umask 033
  10. [wowo@Gin-Kin ~]$ mkdir aaa #目录 777-033=744
  11. [wowo@Gin-Kin ~]$ touch bbb #文件 666-033=633+011=644
  12. [wowo@Gin-Kin ~]$ ll
  13. total 0
  14. -rw-rw-r--. 1 root root 0 Jul 7 15:15 Kin
  15. drwxrwxr-x. 2 root root 6 Jul 7 15:15 Gin
  16. drwxr--r--. 2 root root 6 Jul 7 15:16 aaa
  17. -rw-r--r--. 1 root root 0 Jul 7 15:16 bbb
  18. [root@Gin-Kin ~]$

Linux安全上下文与特殊权限


Linux安全上下文

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

  • 任何一个可执行程序文件能不能启动为进程,取决于发起者对程序文件是否拥有可执行权限;
  • 启动为进程后,其进程的属主为发起者,属组为发起者所属的组
  • 进程访问文件时的权限取决于进程的发起者:
    • 进程的发起者是文件的属主时,则应用文件属主权限
    • 进程的发起者是文件的属组时,则应用文件属组权限
    • 应用文件“其它”权限

      特殊权限

      linux默认权限是根据linux安全上下文的方式来控制的,而特殊权限的存在打破了linux安全上下文的规则。

  1. SUID(4) //运行程序时,这个程序启动的进程的属主是程序文件自身的属主,而不是启动者为属主
  2. chmod u+s file
  3. chmod u-s file
  4. //如果file本身原来就有执行权限,则SUID显示为s,否则显示为S
  5. //加s
  6. [root@Gin-Kin ~]# ll /usr/bin/sleep
  7. -rwxr-xr-x. 1 root root 38424 Apr 27 2020 /usr/bin/sleep
  8. [root@Gin-Kin ~]# chmod u+s /usr/bin/sleep
  9. [root@Gin-Kin ~]# ll /usr/bin/sleep
  10. -rwsr-xr-x. 1 root root 38424 Apr 27 2020 /usr/bin/sleep
  11. [root@Gin-Kin ~]# ps -efl | grep sleep
  12. 0 S root 2136 2115 0 99 19 - 1820 hrtime 15:31 pts/1 00:00:00 sleep 500
  13. 0 S root 2142 1647 0 99 19 - 3027 - 15:32 pts/0 00:00:00 grep --color=auto sleep
  14. //减去s
  15. [root@Gin-Kin ~]# chmod u-s /usr/bin/sleep
  16. [root@Gin-Kin ~]# ll /usr/bin/sleep
  17. -rwxr-xr-x. 1 root root 38424 Apr 27 2020 /usr/bin/sleep
  18. [root@Gin-Kin ~]# ps -efl | grep sleep
  19. 0 S Gin 2164 2115 0 99 19 - 1820 hrtime 15:43 pts/1 00:00:00 sleep 50
  20. 0 S root 2166 1647 0 99 19 - 3027 - 15:43 pts/0 00:00:00 grep --color=auto sleep
  21. SGID(2) //运行程序时,这个程序启动的进程的属组是程序文件自身的属组,而不是启动者所属的基本组
  22. //默认情况下,用户创建文件时,其属组为此用户所属的基本组;
  23. //一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件或目录,其所属的组 \
  24. //为此设定了SGID的目录的属组
  25. chmod g+s DIR
  26. chmod g-s DIR
  27. //如果file本身原来就有执行权限,则SGID显示为s,否则显示为S
  28. //不加g
  29. [root@Gin-Kin opt]# chown .Gin Gin/1205
  30. [root@Gin-Kin opt]# cd Gin/
  31. [root@Gin-Kin Gin]# ll
  32. total 0
  33. -rw-r--r--. 1 root Gin 0 Jul 7 15:46 1205
  34. [root@Gin-Kin Gin]# touch 0503
  35. [root@Gin-Kin Gin]# ll
  36. total 0
  37. -rw-r--r--. 1 root root 0 Jul 7 15:47 0503
  38. -rw-r--r--. 1 root Gin 0 Jul 7 15:46 1205
  39. //加g
  40. [root@Gin-Kin opt]# chown .Gin Gin/
  41. [root@Gin-Kin opt]# chmod g+s Gin/
  42. [root@Gin-Kin opt]# ll
  43. total 0
  44. drwxr-sr-x. 2 root Gin 6 Jul 7 15:53 Gin
  45. [root@Gin-Kin opt]# cd Gin/
  46. [root@Gin-Kin Gin]# touch 1205
  47. [root@Gin-Kin Gin]# touch 0503
  48. [root@Gin-Kin Gin]# ll
  49. total 0
  50. -rw-r--r--. 1 root Gin 0 Jul 7 15:54 0503
  51. -rw-r--r--. 1 root Gin 0 Jul 7 15:54 1205
  52. Sticky(1) //在一个公共目录,每个人都能创建文件,删除自己的文件,但是不能删除别人创建的文件
  53. chmod o+t DIR
  54. chmod o-t DIR
  55. //如果DIR本身原来就有执行权限,则Sticky显示为t,否则显示为T
  56. //实例
  57. [root@Gin-Kin opt]# chmod 1777 Gin/
  58. [root@Gin-Kin opt]# ll
  59. total 0
  60. drwxrwxrwt. 2 root Gin 30 Jul 7 15:54 Gin
  61. [root@Gin-Kin opt]# cd Gin/
  62. [root@Gin-Kin Gin]# touch 1205
  63. [root@Gin-Kin Gin]# su - Gin
  64. [Gin@Gin-Kin ~]$ cd /opt/Gin/
  65. [Gin@Gin-Kin Gin]$ ll
  66. total 0
  67. -rw-r--r--. 1 root Gin 0 Jul 7 15:54 0503
  68. -rw-r--r--. 1 root Gin 0 Jul 7 15:59 1205
  69. [Gin@Gin-Kin Gin]$ rm -rf 1205
  70. rm: cannot remove '1205': Operation not permitted
  71. [Gin@Gin-Kin Gin]$ touch 7878
  72. [Gin@Gin-Kin Gin]$ ll
  73. total 0
  74. -rw-r--r--. 1 root Gin 0 Jul 7 15:54 0503
  75. -rw-r--r--. 1 root Gin 0 Jul 7 15:59 1205
  76. -rw-rw-r--. 1 Gin Gin 0 Jul 7 16:00 7878
  77. [Gin@Gin-Kin Gin]$ rm -rf 7878
  78. [Gin@Gin-Kin Gin]$ ll
  79. total 0
  80. -rw-r--r--. 1 root Gin 0 Jul 7 15:54 0503
  81. -rw-r--r--. 1 root Gin 0 Jul 7 15:59 1205
  82. 4755 //有SUID,文件权限为755
  83. 2755 //有SGID,文件权限为755
  84. 1755 //有Sticky,文件权限为755
  85. //这里前面的421分别表示SUIDSGIDSticky

文件系统访问控制列表facl


facl(Filesystem Access Control List),利用文件扩展保存额外的访问控制权限。

  1. //语法:setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
  2. -m //设定
  3. u:UID:perm
  4. g:GID:perm
  5. //setfacl -m u:test:rw file
  6. //setfacl -m g:test:rw file
  7. //如果要为某个目录设定默认的访问控制列表,只需要设定时在ug前面加上d即可。 如:\
  8. //实例
  9. [root@Gin-Kin opt]# touch Kin
  10. [root@Gin-Kin opt]# chmod 600 Kin
  11. [root@Gin-Kin opt]# ll
  12. total 0
  13. -rw-------. 1 root root 0 Jul 7 16:14 Kin
  14. [root@Gin-Kin opt]# su Gin
  15. [Gin@Gin-Kin opt]$ cat Kin
  16. cat: Kin: Permission denied
  17. [Gin@Gin-Kin opt]$ exit
  18. exit
  19. [root@Gin-Kin opt]# setfacl -m u:Gin:rw Kin
  20. [root@Gin-Kin opt]# ll
  21. total 0
  22. -rw-rw----+ 1 root root 0 Jul 7 16:14 Kin
  23. [root@Gin-Kin opt]# su Gin
  24. [Gin@Gin-Kin opt]$ cat Kin
  25. [Gin@Gin-Kin opt]$
  26. //setfacl -m d:u:test:rw file,此时在此目录中创建的文件均继承此访问控制列表所设置的权限
  27. -x //取消
  28. u:UID
  29. g:GID
  30. //实例
  31. [root@Gin-Kin opt]# setfacl -x u:Gin Kin
  32. [root@Gin-Kin opt]# getfacl Kin
  33. # file: Kin
  34. # owner: root
  35. # group: root
  36. user::rw-
  37. group::---
  38. mask::---
  39. other::---
  40. //setfacl -x u:test file
  41. //setfacl -x g:test file
  42. -b //Remove all //移除所有的用户权限
  43. //实例
  44. [root@Gin-Kin opt]# setfacl -b Kin
  45. [root@Gin-Kin opt]# getfacl Kin
  46. # file: Kin
  47. # owner: root
  48. # group: root
  49. user::rw-
  50. group::---
  51. other::---
  52. //语法:getfacl [-aceEsRLPtpndvh] file ... //查看文件的用户权限方式
  53. //getfacl file
  54. //实例
  55. [Gin@Gin-Kin opt]$ getfacl /opt/Kin
  56. getfacl: Removing leading '/' from absolute path names
  57. # file: opt/Kin
  58. # owner: root
  59. # group: root
  60. user::rw-
  61. user:Gin:rw-
  62. group::---
  63. mask::rw-
  64. other::---

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 =
      • 命令路径
      • 目录(此目录内的所有命令)
      • 其它已定义的命令别名 ```python //sudo命令语法:sudo [options] COMMAND -V //显示版本编号 -h //会显示版本编号及指令的使用方式说明 -l //列出当前用户可以使用的所有sudo类命令 -v //因为sudo在第一次执行时或是在N分钟内没有执行(N默认为5)会问密码,这个参数 \
        1. //是重新做一次确认,如果超过N分钟,也会问密码
        -k //让认证信息失效,如果不指定-k,默认认证信息在5分钟后失效 -b //将要执行的指令放在后台执行 -u USERNAME //以指定的用户名执行命令,默认为root

//实例 [Gin@Gin-Kin ~]$ useradd long useradd: Permission denied. useradd: cannot lock /etc/passwd; try again later. [Gin@Gin-Kin ~]$

[root@Gin-Kin ~]# visudo root ALL=(ALL) ALL Gin ALL=(ALL) /usr/sbin/useradd,/usr/sbin/userdel

[Gin@Gin-Kin ~]$ sudo useradd long [sudo] password for Gin: [Gin@localhost ~]$ id long uid=2003(long) gid=2003(long) groups=2003(long) [Gin@localhost ~]$

[root@Gin-Kin ~]# visudo root ALL=(ALL) ALL Gin ALL=(ALL) NOPASSWD:/usr/sbin/useradd, /usr/sbin/userdel

[Gin@Gin-Kin ~]$ sudo useradd ling [Gin@Gin-Kin ~]$ id ling uid=2004(ling) gid=2004(ling) groups=2004(ling) [Gin@Gin-Kin ~]$

[Gin@Gin-Kin ~]$ sudo -l Matching Defaults entries for wowo on localhost: !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 User wowo may run the following commands on localhost: (ALL) /usr/sbin/useradd, /usr/sbin/userdel

[Gin@Gin-Kin ~]$ sudo -v

  1. <a name="fSXqm"></a>
  2. ## 管理命令
  3. ```python
  4. w //显示当前登录到系统的用户有哪些,以及其正在做什么
  5. //实例
  6. [root@Gin-Kin ~]# who
  7. root tty1 2022-07-07 09:50
  8. root pts/0 2022-07-07 09:51 (192.168.22.1)
  9. root pts/1 2022-07-07 15:30 (192.168.22.1)
  10. [root@Gin-Kin ~]# w
  11. 21:01:57 up 10:03, 3 users, load average: 0.02, 0.02, 0.00
  12. USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
  13. root tty1 - 09:50 11:11m 0.03s 0.03s -bash
  14. root pts/0 192.168.22.1 09:51 2.00s 0.73s 0.00s w
  15. root pts/1 192.168.22.1 15:30 5:18m 0.07s 0.04s bash
  16. sleep //睡眠,写脚本为防止上一个命令没执行完下一命令就开始执行时可以加上sleep # \
  17. //表示停顿#秒后再执行后面的命令
  18. sleep NUMBER[SUFFIX]...
  19. SUFFIX:
  20. s:秒,默认
  21. m:分
  22. h:小时
  23. d:天
  24. last //显示/var/log/wtmp文件,显示用户登录历史及系统重启历史
  25. -n # //显示最近#次的相关信息
  26. //实例
  27. [root@Gin-Kin ~]# last -n 5 -R
  28. root pts/1 Thu Jul 7 15:30 still logged in
  29. root pts/0 Thu Jul 7 09:51 gone - no logout
  30. root tty1 Thu Jul 7 09:50 gone - no logout
  31. reboot system boot Thu Jul 7 09:50 still running
  32. root pts/1 Wed Jul 6 15:05 - 18:13 (03:08)
  33. wtmp begins Tue Jul 5 09:54:36 2022
  34. [root@Gin-Kin ~]#
  35. lastb //显示/var/log/btmp文件,显示用户错误的登录尝试
  36. -n # //显示最近#次的相关信息
  37. //实例
  38. [root@Gin-Kin ~]# lastb -n 5
  39. btmp begins Thu Jul 7 09:50:37 2022
  40. lastlog //显示每个用户最近一次成功登录信息
  41. -u username //显示特定用户最近的登录信息
  42. //实例
  43. [root@Gin-Kin ~]# lastlog -u Gin
  44. Username Port From Latest
  45. Gin pts/0 Thu Jul 7 16:16:59 +0800 2022
  46. [root@Gin-Kin ~]#
  47. basename //显示路径基名
  48. //实例取后⾯ 取前⾯
  49. [root@Gin-Kin ~]# basename /usr/local/src/
  50. src
  51. [root@Gin-Kin ~]# dirname /usr/local/src/
  52. /usr/local
  53. [root@Gin-Kin ~]#
  54. [root@Gin-Kin ~]# a=/opt/software/xx.tar.gz
  55. [root@Gin-Kin ~]# basename $a //可以知道包的名字
  56. Gin.tar.gz
  57. [root@Gin-Kin ~]# dirname $a //可以知道包的路径
  58. /opt/software