04 Linux入门-用户、组合权限20210117
内容概述:Linux的安全模型、用户和组相关文件、用户和组管理命令、理解并设置文件权限 默认权限、特殊权限 文件访问控制列表
1 Linux 安全模型
资源分派:
Authentication:认证,验证用户身份
Authorization:授权,不同的用户设置不同权限
Accouting|Audition:审计
1.1 用户
Linux中每个用户是通过User Id (UID)来唯一标识的
管理员:root, 0
普通用户:1-60000 自动分配
#1系统用户:1-499 (CentOS 6以前), 1-999 (CentOS 7以后) 对守护进程获取资源进行权限分配
#2登录用户:500+ (CentOS6以前), 1000+ (CentOS7以后) 给用户进行交互式登录使用
提示:root之所以权限大,不是因为他的名称叫root,根本原因在于它的ID为0,ID为0的人就是具有最大权限的管理员; 如果有一天把kevin账号的ID改成了0,那么它将拥有root的所有权限,意味着kevin账号就是管理员。系统是根据ID来判断管理员的,不是根据名称来的。
1.2 用户组
Linux中可以将一个或多个用户加入用户组中,用户组是通过Group ID(GID) 来唯一标识的。
管理员组:root, 0
普通组:
#系统组:1-499(CentOS 6以前), 1-999(CentOS7以后), 对守护进程获取资源进行权限分配
#普通组:500+ (CentOS 6以前), 1000+(CentOS7以后), 给用户使用
1.3 用户和组的关系
用户的主要组(primary group):用户必须属于一个且只有一个主组,默认创建用户时会自动创建 和用户名同名的组,做为用户的主要组,由于此组中只有一个用户,又称为私有组
用户的附加组(supplementary group): 一个用户可以属于零个或多个辅助组,附属组
2.用户和组管理命令
用户管理命令
useradd 、usermod、 userdel
组帐号维护命令
groupadd 、groupmod 、groupdel
常见选项:
-u UID
-o 配合-u 选项,不检查UID的唯一性
-g GID 指明用户所属基本组,可为组名,也可以GID
-c "COMMENT“ 用户的注释信息
-d HOME_DIR 以指定的路径(不存在)为家目录
-s SHELL 指明用户的默认shell程序,可用列表在/etc/shells文件中
-G GROUP1[,GROUP2,...] 为用户指明附加组,组须事先存在
-N 不创建私用组做主组,使用users组做主组
-r 创建系统用户 CentOS 6之前: ID<500,CentOS 7以后: ID<1000
-m 创建家目录,用于系统用户
-M 不创建家目录,用于非系统用户
2.1 用户创建
2.1.1useradd 命令可以创建新的Linux用户
useradd 命令默认值设定由/etc/default/useradd定义
创建用户haha
用户是有家目录的,自动创建好了家目录,而且还会自动分配ID1002
2.1.2#getent passwd haha
[root@centos8 ~]# getent passwd haha
haha:x:1002:1002::/home/haha:/bin/bash
可以看到这个账号的属性如下:
名称/密码信息/账号ID/所属组ID/家目录/组的shell类型
2.1.3 我们可以根据选项修改一些信息;
/usr/sbin/useradd -d /var/spool/postfix -s /sbin/nologin -g postfix -G mail -M -r -u 89 postfix 2>/dev/null
-d 修改家目录位置;
-s 指定shell类型,也可以使用nologin类型,这个账号是不登录的,来给应用程序使用的,系统开机胡自动使用这个账号身份运行,不需要使用登录shell,版本不同,类型也不一样;
-g 主要组 ;
-G 辅助组 ;
-M 不创建家目录 ;
-r 系统账号 id 1-999之间 ;
-u 89 postfix 用户ID为89 名字为postfix ;
2>/dev/null 如果出错扔到/dev/null ;
比如ls &> /dev/null
2.1.4关于nologin
centos下是/sbin/nologin是不能登录的,是给应用程序执行使用的;
ubuntu 下面是/bin/false;
2.1.5使用#getent passwd 可以查看所有的账号;
[root@centos8 ~]# getent passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
....
2.1.6查看密码
[root@centos8 ~]# cat /etc/shadow
root:$6$SgUG.s0/nxDFixJT$p1/QgMLNM.2RTvEUnyrHEZbeDHj3QJpLQVeMt5PwIgyklgbunScUyHmbh.5PpbH7gYzcWz.3zfMuD8MHcFesI0::0:99999:7:::
bin:*:18397:0:99999:7:::
99999表示永不过期
2.1.7 创建mysql账号
加上-M不自动创建家目录,手动创建家目录/data/mysql,
应用自动创建的家目录里面有.bash 相关的文件,这些对于启动服务类的账号不需要这些.bash
还可以加个 -r,系统账号
2.2.1usermod 修改shell类型
#usermod -s /sbin/nologin mysql
2.2.2#usrmod --help可以查看帮助选项
2.3 userdel 删除用户
2.3.1 userdel haha
账号删除了,但是删除不彻底,家目录还在
ls /home 还可以看到haha,
id发生了变化,显示1002,
但是一旦创建了新账号xixi使用了1002,
haha 的用户组合用户组里面就变成了xixi;
所以用户和组主要还是根据ID来显示,
ID很重要,用户访问是根据ID来的,不是根据显示名来的。
2.3.2 新生成一个账号,就会有一个对应的邮箱
#ll /var/spool/mail
2.3.3 如果想删除用户信息,家目录,邮箱信息,-r 选项可以执行,但是生产中慎用!
#userdel -r xixi
2.4 组账号相关的三个命令
groupadd 、 groupmod 、groupdel
2.4.1用户信息
cat /etc/passwd
2.4.2密码信息
cat /etc/shadow
2.4.3组信息
cat /etc/group
2.4.4组密码
cat /etc/gshadow
18700
#echo `date +%s`/3600/24 | bc 计算改完密码的时间
0 表示多少天不能修改密码,改成3就是3天内不可以修改;
99999基本上是表示永不过期了;18700+99999天?(300多年...)
7表示提前7天通知修改密码;
7后面的:后面的数字,假设是10,那就是宽限期 10天
3.权限
文件属性图示
all.log这个文件保护了3部分的权限,owner 、group 、other
owner是读写
group是读
other是读
3.1.2举例:修改权限
chown -R mysql.mysql /data/mysql
3.1.3此处有个危险的提示
-R 慎用
执行此命令的时候千万小心,mysql后面的data前面不能有空格,有的话就相当于把根下面的文件的权限都改变了;
[root@rocky8 ~]# ls -R / | wc -l
此处可能涉及20多万个根下的文件被修改了权限;
--------------
3.1.5 数字法:
rwx 7
rw- 6
r-x 5
r-- 4
--- 0
chmod 640 file
-----------------
3.1.6:file
666-umask
如果:有奇数+1,偶数不变,结果默认权限
666-022=644和默认的文件权限一致
3.1.7 dir
777-umask=default
777-022=755 和dir1的默认执行权限是一致的
3.1.8 umask可以修改
umask 123
直接回车就改变了umask的值
创建之后新的文件和目录的权限如图
666-123=543(有奇数加1,5+1,3+1)结果是644=rw-r--r--
777-123=654 654=rw-r-xr--
umask这个是临时修改,如果要保存,需要vim .bashrc,手动修改,然后执行. .bashrc才能生效,这个值一般很少改;
1#centos8中修改
2#Rocky 8.4中修改umask
3.1.9#工作小技巧
# ( umask 777;touch app2.key;touch app3.key )
[root@rocky8 ~]# ( umask 777;touch app2.key;touch app3.key )
4 Linux文件系统上的特殊权限
前面介绍了三种常见的权限:r, w, x 还有三种特殊权限:SUID, SGID, Sticky
4.1 特殊权限SUID
前提:进程有属主和属组;文件有属主和属组
1. 任何一个可执行程序文件能不能启动为进程,取决发起者对程序文件是否拥有执行权限; 2. 启动为进程之后,其进程的属主为发起者,进程的属组为发起者所属的组; 3. 进程访问文件时的权限,取决于进程的发起者: (a) 进程的发起者,同文件的属主:则应用文件属主权限; (b) 进程的发起者,属于文件属组;则应用文件属组权限; (c) 应用文件“其它”权限。
二进制的可执行文件上SUID权限功能:
任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限; 启动为进程之后,其进程的属主为原程序文件的属主; SUID只对二进制可执行程序有效; SUID设置在目录上无意义
SUID权限设定
chmod u+s FILE...
chmod 6xxx FILE
chmod u-s FILE...
举例:
[root@rocky8 ~]# ls -l /usr/bin/passwd
-rwsr-xr-x. 1 root root 33544 Mar 15 2021 /usr/bin/passwd
4.2 特殊权限SGID
二进制的可执行文件上SGID权限功能:
任何一个可执行程序文件能不能启动为进程:取决发起者对程序文件是否拥有执行权限 启动为进程之后,其进程的属组为原程序文件的属组;
SGID权限设定:
chmod g+s FILE...
chmod 2xxx FILE
chmod g-s FILE...
目录上的SGID权限功能: 默认情况下,用户创建文件时,其属组为此用户所属的主组,一旦某目录被设定了SGID,则对此目录有 写权限的用户在此目录中创建的文件所属的组为此目录的属组,通常用于创建一个协作目录;
SGID权限设定:
chmod g+s DIR...
chmod 2xxx DIR
chmod g-s DIR...
4.3 特殊权限 Sticky
具有写权限的目录通常用户可以删除该目录中的任何文件,无论该文件的权限或拥有权 在目录设置Sticky 位,只有文件的所有者或root可以删除该文件 sticky 设置在文件上无意义 Sticky权限设定:
chmod o+t DIR...
chmod 1xxx DIR
chmod o-t DIR...
举例:[root@rocky8 ~]# ll -d /tmp
drwxrwxrwt. 15 root root 4096 Oct 5 20:18 /tmp
4.3.1特殊权限数字法
范例:
000 0
001 1
010 2
011 3
100 4
101 5
110 6
111 7
实例:
chmod 4777 /tmp/a.txt
4.3.2权限位映射:
SUID: user,占据属主的执行权限位
s:属主拥有x权限
S:属主没有x权限
SGID: group,占据属组的执行权限位
s: group拥有x权限
S:group没有x权限
Sticky: other,占据other的执行权限位
t:other拥有x权限
T:other没有x权限
4.4新建的账号是锁定状态的,无法直接正常登录,
!!表示锁定状态;
如果用vim删除了!!,就相当于空口令了,是可以正常登陆的;
4.2.1需要创建密码:
交互式和非交互式的创建办法分别如下
举例:
[root@rocky8 ~]# cat /etc/shadow
#方法1交互式创建密码成功
[root@rocky8 ~]# passwd haha
Changing password for user haha.
New password:
BAD PASSWORD: The password is a palindrome
Retype new password:
passwd: all authentication tokens updated successfully.
#方法2非交互式创建密码成功(注:只支持centos,不支持ubuntu)
[root@rocky8 ~]# echo 123456 | passwd --stdin haha
Changing password for user haha.
passwd: all authentication tokens updated successfully.
[root@rocky8 ~]#
4.2.2 ubuntu除了可以使用方法1外,还可以使用逐行重定向来设置密码
root@ubuntu1804:~# useradd ma
root@ubuntu1804:~# echo -e '123456\n123456'| passwd ma
Enter new UNIX password: Retype new UNIX password: passwd: password updated successfully
5.设定文件特殊属性
设置文件的特殊属性,可以访问 root 用户误操作删除或修改文件
不能删除,改名,更改
chattr +i file
只能追加内容,不能删除,改名
chattr +a file
显示特定属性:
lsattr
------------------------------------
6 账户直接的快速切换
su: 即 switch user,命令可以切换用户身份,并且以指定用户的身份执行命令
不完整的切换:su kevin;把root的路径也显示出来了
完整的切换:su - kevin
显示的pwd路径和path变量的值都有差别
[root@rocky8 ~]# id uid=0(root) gid=0(root) groups=0(root) [root@rocky8 ~]# su - kevin Last login: Wed Oct 6 01:54:31 CST 2021 on pts/1 [kevin@rocky8 ~]$ id uid=1001(kevin) gid=1001(kevin) groups=1001(kevin) [kevin@rocky8 ~]$ pwd /home/kevin [kevin@rocky8 ~]$ echo $PATH /home/kevin/.local/bin:/home/kevin/bin:/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin
centos \ rocky切换
ubuntu中切换
kevin@kevin:~$ su root
Password:
su: Authentication failure
kevin@kevin:~$ sudo -i
[sudo] password for kevin:
root@kevin:~#
root@ubuntu1804:~# su - kevin #切换回来kevin账户
kevin@ubuntu1804:~$ pwd
/home/kevin
kevin@ubuntu1804:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
exit登出
[kevin@rocky8 ~]$ exit
logout
#mkdir -p 可以在新的子目录中创建一个新的子目录,如果想看看mkdir到底做了什么,可以添加选项“-v”,
显示目录树 tree 删除空目录 rmdir
[root@centos8 ~]# mkdir -pv /data/dir1/dir2/dir3/ (#mkdir -p 可以在新的子目录中创建一个新的子目录,如果想看看mkdir到底做了什么,可以添加选项“-v”,) mkdir: created directory '/data/dir1' mkdir: created directory '/data/dir1/dir2' mkdir: created directory '/data/dir1/dir2/dir3/' [root@centos8 ~]# tree /data (#看一下结构) /data └── dir1 └── dir2 └── dir3 3 directories, 0 files [root@centos8 ~]# rmdir /data/dir1/dir2/dir3/ (#删除dir3) [root@centos8 ~]# tree /data /data └── dir1 └── dir2 2 directories, 0 files [root@centos8 ~]# rmdir /data/dir1/ (#删除dir1) rmdir: failed to remove '/data/dir1/': Directory not empty (#删除失败,文件夹不能为空,因为dir1里面还有个dir2,) [root@centos8 ~]# ls /data dir1 [root@centos8 ~]# rm -rf /data/dir1 (#使用此命令可以不提示直接删除,这条命令很霸道,不要轻易使用!) [root@centos8 ~]# ls /data [root@centos8 ~]#
(#显示为空,说明还是可以删除的,即使是有dir2还存在dir1的里面,也可以删除,慎用~!)
另外:我还测试了一次,安装顺序一个一个的删除dir文件,是可以一个一个的删除完整的。
1 [root@centos8 ~]# tree /data
2 /data
3 └── dir1
4 └── dir2
5 └── dir3
6
7 3 directories, 0 files
8 [root@centos8 ~]# rmdir /data/dir1/dir2/dir3/
9 [root@centos8 ~]# tree /data
10 /data
11 └── dir1
12 └── dir2
13
14 2 directories, 0 files
15 [root@centos8 ~]# ^C
16 [root@centos8 ~]# rmdir /data/dir1/dir2/
17 [root@centos8 ~]# tree /data
18 /data
19 └── dir1
20
21 1 directory, 0 files
22 [root@centos8 ~]# rmdir /data/dir1/
23 [root@centos8 ~]# tree /data
24 /data
25
26 0 directories, 0 files
注意:rmdir只能删除空目录,如果想删除非空目录,可以使用rm -r 命令,递归删除目录树,但是此命令谨慎使用
202101005renew~~~