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
各个用户的根目录初始权限如下所示:
[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是当前登录用户的uid
、gid
有效用户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