Linux 权限管理相关的一些知识

January 25, 2021 Linux 访问: 83 次

Linux也是一个多用户操作系统,不同的用户拥有不同的权限

关于权限的命令

  • chown是修改所属用户和组
  • chmod是修改用户的权限
  • chgrp是修改文件属组

查看文件及属性

在linux中我们可以通过执行命令ls -al来查看文件的属性以及所属的用户和组

root@ubuntu ~/awd
❯ ls -al
总用量 48324
drwxr-xr-x  3 root root     4096 Dec 18 11:22 .
drwx------ 68 root root     4096 Jan 18 14:31 ..
drwxrwxr-x  8 root root     4096 Oct 14 13:49 awd
-rw-r--r--  1 root root 49391013 Oct  4 20:36 awd.tar.gz
* -rwxrwxr-x  1 root root    13296 Aug 21 17:06 babynotes
-rw-r--r--  1 root root     1217 Oct  6 10:57 Dockerfile
-rw-r--r--  1 root root     6148 Oct  6 10:57 .DS_Store
-rw-r--r--  1 root root     1746 Oct  6 11:02 expmy.py
-rw-r--r--  1 root root       39 Sep 30  2019 flag
-rw-r--r--  1 root root     8792 Oct  6 11:10 music_box_1601953824
-rw-r--r--  1 root root      601 Oct  6 10:57 my_pwn.xinetd
-rw-r--r--  1 root root       95 Sep 30  2019 run.sh
-rw-r--r--  1 root root    16242 Oct  6 12:22 sandbox.py
root@ubuntu ~/awd
❯ 

第一列表明文件的属性以及文件的类型

  • 当为 d 则是目录
  • 当为 - 则是文件;
  • 若是 l 则表示为链接文档(link file);
  • 若是 b 则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
  • 若是 c 则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。

接下来是三组rwx的组合,r表示可读,w表示可写,x表示可执行,如果没有权限的话,对应的位置上用-填充

  • 第一组表示文件所属用户-属主权限
  • 第二组表示文件所属用户组-属组权限
  • 第三组表示其他用户-其他用户权限

用户管理

添加用户:

[root@centos-linux home]# useradd --help
用法:useradd [选项] 登录
      useradd -D
      useradd -D [选项]

选项:
  -b, --base-dir BASE_DIR    新账户的主目录的基目录
  -c, --comment COMMENT         新账户的 GECOS 字段
  -d, --home-dir HOME_DIR       新账户的主目录
  -D, --defaults        显示或更改默认的 useradd 配置
 -e, --expiredate EXPIRE_DATE  新账户的过期日期
  -f, --inactive INACTIVE       新账户的密码不活动期
  -g, --gid GROUP        新账户主组的名称或 ID
  -G, --groups GROUPS    新账户的附加组列表
  -h, --help                    显示此帮助信息并推出
  -k, --skel SKEL_DIR    使用此目录作为骨架目录
  -K, --key KEY=VALUE           不使用 /etc/login.defs 中的默认值
  -l, --no-log-init    不要将此用户添加到最近登录和登录失败数据库
  -m, --create-home    创建用户的主目录
  -M, --no-create-home        不创建用户的主目录
  -N, --no-user-group    不创建同名的组
  -o, --non-unique        允许使用重复的 UID 创建用户
  -p, --password PASSWORD        加密后的新账户密码
  -r, --system                  创建一个系统账户
  -R, --root CHROOT_DIR         chroot 到的目录
  -P, --prefix PREFIX_DIR       prefix directory where are located the /etc/* files
  -s, --shell SHELL        新账户的登录 shell
  -u, --uid UID            新账户的用户 ID
  -U, --user-group        创建与用户同名的组
  -Z, --selinux-user SEUSER        为 SELinux 用户映射使用指定 SEUSER

eg:

useradd -d /home/user_1 -m -s /bin/sh -g test_1 user_1

删除用户

[root@centos-linux home]# userdel --help
用法:userdel [选项] 登录

选项:
  -f, --force                   force some actions that would fail otherwise
                                e.g. removal of user still logged in
                                or files, even if not owned by the user
  -h, --help                    显示此帮助信息并推出
  -r, --remove                  删除主目录和邮件池
  -R, --root CHROOT_DIR         chroot 到的目录
  -P, --prefix PREFIX_DIR       prefix directory where are located the /etc/* files
  -Z, --selinux-user            为用户删除所有的 SELinux 用户映射

eg:

userdel -r user_1

添加用户组

[root@centos-linux home]# groupadd --help
用法:groupadd [选项] 组

选项:
  -f, --force        如果组已经存在则成功退出
            并且如果 GID 已经存在则取消 -g
  -g, --gid GID                 为新组使用 GID
  -h, --help                    显示此帮助信息并推出
  -K, --key KEY=VALUE           不使用 /etc/login.defs 中的默认值
  -o, --non-unique              允许创建有重复 GID 的组
  -p, --password PASSWORD       为新组使用此加密过的密码
  -r, --system                  创建一个系统账户
  -R, --root CHROOT_DIR         chroot 到的目录
  -P, --prefix PREFIX_DIR       directory prefix

eg:

groupadd test_1

删除用户组

[root@centos-linux home]# groupdel --help
用法:groupdel [选项] 组

选项:
  -h, --help                    显示此帮助信息并推出
  -R, --root CHROOT_DIR         chroot 到的目录
  -P, --prefix PREFIX_DIR       prefix directory where are located the /etc/* files
  -f, --force                   delete group even if it is the primary group of a user

eg:

groupdel test_1

当用户组中存在用户的时候,是删除不了该用户组的

test

sLsE9g.jpg
创建如图所示关系的用户组和用户

各个用户的根目录初始权限如下所示:

[root@centos-linux home]# ll
总用量 0
drwx------. 2 user_1 test_1 83 1月  25 11:59 user_1
drwx------. 2 user_2 test_1 62 1月  25 11:56 user_2
drwx------. 2 user_3 test_2 62 1月  25 11:56 user_3
drwx------. 2 user_4 test_2 62 1月  25 11:56 user_4

我们su切换到user_1,进入自己的家目录是可以进去的,但是进入同组用户user_2的家目录是进不去的,因为user_2的家目录的权限中组权限的000,所以无法访问,如果把它的组权限改成7的话,user_1就可以进到user_2的家目录下,但是不同组的用户是进不到的

一开始我以为用户组的权限是直接在用户组上操作赋值权限的,学过这些之后知道之前的想法是错的,其实是通过文件或者是目录的权限来限制的

切换用户组

如果一个用户同时属于多个用户组,那么用户可以在用户组之间切换,以便具有其他用户组的权限

newgrp root

S权限和T权限

S权限是使文件在执行阶段具有文件所有者的权限,相当于临时拥有文件所有者的身份
eg:

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
    printf("uid:%d\teuid:%d\tgid:%d\tegid:%d\n",getuid(),geteuid(),getgid(),getegid());
    int fd;
    fd=open("/etc/passwd",O_RDWR);
    printf("fd:%d\n",fd);
    return 0;
}

编译出两份,然后给pwn加上S权限

gcc pwn.c -o pwn
gcc pwn.c -o pwn2
chmod u+s pwn

切换到user_1用户执行效果:

[root@centos-linux tmp]# su user_1
sh-4.2$ ./pwn
uid:1000    euid:0    gid:1000    egid:1000
fd:5
sh-4.2$ ./pwn2
uid:1000    euid:1000    gid:1000    egid:1000
fd:-1
sh-4.2$

可以看到,没有S权限是打不开/etc/passwd

T权限一般只用在目录上,要删除一个文件,不一定需要这个文件的写权限,但是一定要有这个文件的上级目录的写权限
当上级目录设置了T权限之后,这个目录就可以能够让任何用户创建文件,又不让用户删除别人的文件,只能删除自己的文件。

eg 1: 无T权限

user_2目录中有一个file文件,user_2的权限对同用户组是7的权限,file文件对通用户组的只读权限,切换用户到user_1,尝试删除file文件,发下是可以删除的

[root@centos-linux home]# ls -al
总用量 0
drwxr-xr-x.  6 root   root    62 1月  25 11:56 .
dr-xr-xr-x. 18 root   root   255 1月  24 12:58 ..
drwx------.  2 user_1 test_1  83 1月  25 11:59 user_1
drwxrwx---.  2 user_2 test_1  95 1月  25 13:26 user_2
drwx------.  2 user_3 test_2  83 1月  25 12:23 user_3
drwx------.  2 user_4 test_2  62 1月  25 11:56 user_4
[root@centos-linux home]# ls -al ./user_2/file
-rw-r--r--. 1 user_2 test_1 0 1月  25 13:26 ./user_2/file
sh-4.2$ rm ./user_2/file
rm:是否删除有写保护的普通空文件 "./user_2/file"?

eg 2:加T权限

[root@centos-linux home]# ll
总用量 0
drwx------. 2 user_1 test_1 83 1月  25 11:59 user_1
drwxrwx---. 2 user_2 test_1 95 1月  25 13:44 user_2
drwx------. 2 user_3 test_2 83 1月  25 12:23 user_3
drwx------. 2 user_4 test_2 62 1月  25 11:56 user_4
[root@centos-linux home]# chmod +t user_2
[root@centos-linux home]# ll
总用量 0
drwx------. 2 user_1 test_1 83 1月  25 11:59 user_1
drwxrwx--T. 2 user_2 test_1 95 1月  25 13:44 user_2
drwx------. 2 user_3 test_2 83 1月  25 12:23 user_3
drwx------. 2 user_4 test_2 62 1月  25 11:56 user_4
[root@centos-linux home]# su user_1
sh-4.2$ cd user_2/
sh-4.2$ ls
file
sh-4.2$ id
uid=1000(user_1) gid=1000(test_1) 组=1000(test_1) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
sh-4.2$ ls -al
总用量 16
drwxrwx--T. 2 user_2 test_1  95 1月  25 13:44 .
drwxr-xr-x. 6 root   root    62 1月  25 11:56 ..
-rw-------. 1 user_2 test_1  77 1月  25 13:44 .bash_history
-rw-r--r--. 1 user_2 test_1  18 4月   1 2020 .bash_logout
-rw-r--r--. 1 user_2 test_1 193 4月   1 2020 .bash_profile
-rw-r--r--. 1 user_2 test_1 231 4月   1 2020 .bashrc
-rw-r--r--. 1 user_2 test_1   0 1月  25 13:44 file
sh-4.2$ rm file
rm:是否删除有写保护的普通空文件 "file"?y
rm: 无法删除"file": 不允许的操作

可以看到,我们已经无法删除file文件了

实际用户ID和有效用户ID、实际用户组ID和有效用户组ID

实际用户ID、实际用户组ID是当前登录用户的uidgid

有效用户ID、有效用户组ID是用来决定我们对资源的访问权限,一般情况下,有效用户ID等于实际用户ID,有效用户组ID等于实际用户组ID,当设置S位的时候,则有效用户ID等于文件的所有者的uid,而不是实际用户ID;同样,如果设置了S位,则有效用户组ID等于文件所有者的gid,而不是实际用户组ID。

利用S位提权

setuid

如果由普通用户调用,将当前进程的有效ID设置为uid.
如果由有效用户ID符为0的进程调用,则将真实,有效和已保存用户ID都设置为uid.

非root用户是不可能通过setuid或者seteuid取得其他权限

pwn.c

#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include<stdlib.h>
#include<errno.h>
int main()
{
    printf("uid:%d\teuid:%d\tgid:%d\tegid:%d\n",getuid(),geteuid(),getgid(),getegid());
    int fd;
    fd=open("/etc/passwd",O_RDWR);
    printf("fd:%d\n",fd);
    int res = setuid(0);
    if(res!=0)
    {
        printf("error!\n%d",errno);
    }
    else{
       puts("yes");
    }
    printf("uid:%d\teuid:%d\tgid:%d\tegid:%d\n",getuid(),geteuid(),getgid(),getegid());
//system("/bin/sh");
return 0;
}

给编译出的可执行文件添加上S权限,切换到user_1用户

[root@centos-linux tmp]# gcc pwn.c -o pwn
[root@centos-linux tmp]# chmod u+s pwn
[root@centos-linux tmp]# su user_1
sh-4.2$ ./pwn
uid:1000    euid:0    gid:1000    egid:1000
fd:5
yes
uid:0    euid:0    gid:1000    egid:1000
sh-4.2$

可以看到,uid已经成功被修改成了0

添加新评论