权限管理


文章目录

  • 权限管理
  • 1. 权限简介
  • 2. 权限管理命令
  • 2.1 修改权限的命令chmod
  • 2.2 修改文件属主和属组的命令chown
  • 3. 遮罩码
  • 4. linux安全上下文与特殊权限
  • 4.1 linux安全上下文
  • 4.2 特殊权限
  • 5. 文件系统访问控制列表facl
  • 6. sudo
  • 7. 管理命令


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      //递归修改权限

//修改某类用户或某些类用户权限:
//u,g,o,a(用户类别)

[root@yjh ~]# chmod u=rwx,g=rwx,o=rwx y
[root@yjh ~]# ll y
total 0
drwxr-xr-x. 2 yy root 6 Jun 28 10:36 ac

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

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

//chown USERNAME file,...
    -R      //修改目录及其内部文件的属主
[root@yjh ~]# ll y
total 0
drwxr-xr-x. 2 yy root 6 Jun 28 10:36 ac
[root@yjh ~]# chown -R root:root /root/y
[root@yjh ~]# ll /root/y
total 0
drwxr-xr-x. 2 root root 6 Jun 28 10:36 ac

3. 遮罩码

为什么文件创建以后默认权限是644?
为什么目录创建以后默认权限是755?

这是由遮罩码umask来控制的。

从名字就能看出来,遮罩码umask是用来隐藏一些权限的。举例:如果你不想让人家认出你,你会怎么办?

文件最终的权限为:

  • 666-umask

目录最终的权限为:

  • 777-umask

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

[root@yjh ~]# umask 
0022
[root@yjh ~]# umask 0011
[root@yjh ~]# umask 
0011

4. linux安全上下文与特殊权限

4.1 linux安全上下文

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

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

4.2 特殊权限

SUID(4)     //运行程序时,这个程序启动的进程的属主是程序文件自身的属主,而不是启动者为属主
    chmod u+s file
    chmod u-s file
    //如果file本身原来就有执行权限,则SUID显示为s,否则显示为S
[root@yjh ~]# ll /usr/bin/sleep 
-rwxr-xr-x. 1 root root 37464 May 31  2022 /usr/bin/sleep
[root@yjh ~]# chmod u+s /usr/bin/sleep
[root@yjh ~]# ll /usr/bin/sleep 
-rwsr-xr-x. 1 root root 37464 May 31  2022 /usr/bin/sleep
[root@yjh ~]# su - tom
Last login: Thu Jul  6 19:08:03 CST 2023 on pts/0
[tom@yjh ~]$ sleep 1000&
[1] 1224
[tom@yjh ~]$ ps -ef |grep sleep
root        1224    1202  0 11:22 pts/0    00:00:00 sleep 1000
tom         1228    1202  0 11:22 pts/0    00:00:00 grep --color=auto sleep

SGID(2)     //运行程序时,这个程序启动的进程的属组是程序文件自身的属组,而不是启动者所属的基本组
    //默认情况下,用户创建文件时,其属组为此用户所属的基本组;
    //一旦某目录被设定了SGID,则对此目录有写权限的用户在此目录中创建的文件或目录,其所属的组 \
    //为此设定了SGID的目录的属组
    chmod g+s DIR
    chmod g-s DIR
    //如果file本身原来就有执行权限,则SGID显示为s,否则显示为S
[root@yjh ~]# ll -d /tmp/test/
drwxr-xr-x. 2 tom tom 6 Jul  7 11:31 /tmp/test/
[root@yjh ~]# chmod g+s /tmp/test/
[root@yjh ~]# ll -d /tmp/test/
drwxr-sr-x. 2 tom tom 6 Jul  7 11:31 /tmp/test/
[root@yjh ~]# touch /tmp/test/abc
[root@yjh ~]# ll -d /tmp/test/
drwxr-sr-x. 2 tom tom 17 Jul  7 11:33 /tmp/test/
[root@yjh ~]# ll /tmp/test/
total 0
-rw-r--r--. 1 root tom 0 Jul  7 11:33 abc
   
Sticky(1)       //在一个公共目录,每个人都能创建文件,删除自己的文件,但是不能删除别人创建的文件
    chmod o+t DIR
    chmod o-t DIR
    //如果DIR本身原来就有执行权限,则Sticky显示为t,否则显示为T
[root@yjh ~]# ll -d /test1/
drwxr-xr-x. 2 root root 6 Jul  7 11:40 /test1/
[root@yjh ~]# chmod o+t /test1
[root@yjh ~]# ll -d /test1/
drwxr-xr-t. 2 root root 6 Jul  7 11:40 /test1/
[root@yjh ~]# su - tom
Last login: Fri Jul  7 11:44:02 CST 2023 on pts/0
[tom@yjh ~]$ ll /test1
total 0
-rw-r--r--. 1 root root 0 Jul  7 11:45 123
[tom@yjh ~]$ rm -r /test1/123
rm: remove write-protected regular empty file '/test1/123'? y
rm: cannot remove '/test1/123': Permission denied
[tom@yjh ~]$ cd /test1/
[tom@yjh test1]$ touch yyy
[tom@yjh test1]$ ll
total 0
-rw-r--r--. 1 root root 0 Jul  7 11:45 123
-rw-r--r--. 1 tom  tom  0 Jul  7 11:50 yyy

4755    //有SUID,文件权限为755
2755    //有SGID,文件权限为755
1755    //有Sticky,文件权限为755
//这里前面的4、2、1分别表示SUID、SGID、Sticky

5. 文件系统访问控制列表facl

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

//语法:setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
    -m      //设定
        u:UID:perm
        g:GID:perm
    //setfacl -m u:test:rw file
    //setfacl -m g:test:rw file
    //如果要为某个目录设定默认的访问控制列表,只需要设定时在u或g前面加上d即可。 如:\
    //setfacl -m d:u:test:rw file,此时在此目录中创建的文件均继承此访问控制列表所设置的权限
[root@yjh ~]# setfacl -m u:tom:rw /opt/abc 
[root@yjh ~]# setfacl -m g:tom:rw /opt/abc 
[root@yjh ~]# getfacl /opt/abc 
getfacl: Removing leading '/' from absolute path names
# file: opt/abc
# owner: root
# group: root
user::rw-
user:tom:rw-
group::r--
group:tom:rw-
mask::rw-
other::r--


    -x      //取消
        u:UID
        g:GID
    //setfacl -x u:test file
    //setfacl -x g:test file
    -b      //Remove all
        
//语法:getfacl [-aceEsRLPtpndvh] file ...
//getfacl file
[root@yjh ~]# setfacl -x u:tom /opt/abc 
[root@yjh ~]# setfacl -x g:tom /opt/abc
[root@yjh ~]# getfacl /opt/abc 
getfacl: Removing leading '/' from absolute path names
# file: opt/abc
# owner: root
# group: root
user::rw-
group::r--
mask::r--
other::r--

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      //显示版本编号
[root@yjh ~]# sudo -V
Sudo version 1.9.5p2
Configure options: --build=x86_64-redhat-linux-gnu --host=x86_64-redhat-linux-gnu --program-prefix= --disable-dependency-tracking --prefix=/usr --exec-prefix=/usr --bindir=/usr/bin --sbindir=/usr/sbin --sysconfdir=/etc --datadir=/usr/share --includedir=/usr/include --libdir=/usr/lib64 --libexecdir=/usr/libexec --localstatedir=/var --sharedstatedir=/var/lib --mandir=/usr/share/man --infodir=/usr/share/info --prefix=/usr --sbindir=/usr/sbin --libdir=/usr/lib64 --docdir=/usr/share/doc/sudo --disable-openssl --disable-root-mailer --disable-log-server --disable-log-client --with-logging=syslog --with-logfac=authpriv --with-pam --with-pam-login --with-editor=/bin/vi --with-env-editor --with-ignore-dot --with-tty-tickets --with-ldap --with-ldap-conf-file=/etc/sudo-ldap.conf --with-selinux --with-passprompt=[sudo] password for %p:  --enable-python --with-linux-audit --with-sssd
Sudoers policy plugin version 1.9.5p2
Sudoers file grammar version 48

-h      //会显示版本编号及指令的使用方式说明
 [root@yjh ~]# sudo -h
sudo - execute a command as another user

usage: sudo -h | -K | -k | -V
usage: sudo -v [-AknS] [-g group] [-h host] [-p prompt] [-u user]
usage: sudo -l [-AknS] [-g group] [-h host] [-p prompt] [-U user] [-u user]
            [command]
usage: sudo [-AbEHknPS] [-r role] [-t type] [-C num] [-D directory] [-g group]
            [-h host] [-p prompt] [-R directory] [-T timeout] [-u user]
            [VAR=value] [-i|-s] [<command>]
usage: sudo -e [-AknS] [-r role] [-t type] [-C num] [-D directory] [-g group]
            [-h host] [-p prompt] [-R directory] [-T timeout] [-u user] file ...

-l      //列出当前用户可以使用的所有sudo类命令
[root@yjh ~]# sudo -l
Matching Defaults entries for root on yjh:
    !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 root may run the following commands on yjh:
    (ALL) ALL

-v      //因为sudo在第一次执行时或是在N分钟内没有执行(N默认为5)会问密码,这个参数 \
            //是重新做一次确认,如果超过N分钟,也会问密码         
-k      //让认证信息失效,如果不指定-k,默认认证信息在5分钟后失效
-b      //将要执行的指令放在后台执行
-u USERNAME     //以指定的用户名执行命令,默认为root

7. 管理命令

w   //显示当前登录到系统的用户有哪些,以及其正在做什么 
[root@yjh ~]# w
 14:46:18 up 23 min,  2 users,  load average: 0.79, 0.65, 0.36
USER     TTY        LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1      14:25   20:48   0.03s  0.03s -bash
root     pts/0     14:25    1.00s  0.28s  0.02s w

sleep   //睡眠,写脚本为防止上一个命令没执行完下一命令就开始执行时可以加上sleep # \
        //表示停顿#秒后再执行后面的命令 
    sleep NUMBER[SUFFIX]...
        SUFFIX:
            s:秒,默认
            [root@yjh ~]# time sleep 3
			real	0m3.006s
			user	0m0.000s
			sys	0m0.004s
			[root@yjh ~]#
			
            m:分
            h:小时
            d:天
last    //显示/var/log/wtmp文件,显示用户登录历史及系统重启历史                
    -n #        //显示最近#次的相关信息 
[root@yjh ~]# last -n 3
root     pts/0        192.168.203.1    Sat Jul  8 14:25   still logged in
root     tty1                          Sat Jul  8 14:25   still logged in
reboot   system boot  5.14.0-162.6.1.e Sat Jul  8 14:23   still running
wtmp begins Tue Jun 27 10:45:34 2023

lastb   //显示/var/log/btmp文件,显示用户错误的登录尝试                
    -n #        //显示最近#次的相关信息  
[root@yjh ~]# lastb -n 3
root     ssh:notty    192.168.203.1    Thu Jul  6 11:09 - 11:09  (00:00)
root     tty1                          Thu Jul  6 11:09 - 11:09  (00:00)
root     tty1                          Wed Jul  5 17:24 - 17:24  (00:00)
btmp begins Tue Jul  4 17:19:42 2023

lastlog //显示每个用户最近一次成功登录信息                
    -u username     //显示特定用户最近的登录信息 
[root@yjh ~]# lastlog -u tom
Username         Port     From                                       Latest
tom              pts/0                        Fri Jul  7 11:49:56 +0800 2023
    
basename        //显示路径基名 
[root@yjh ~]# basename /root/httpd-2.4.53-7.el9.x86_64.rpm 
httpd-2.4.53-7.el9.x86_64.rpm