管理用户和组
用户账户
用户配置文件
根据man的提示我们知道在/etc/passwd下
如上这些字段的含义,需要注意的是在password这个字段都是x,即不显示密码
第一个字段是用户名
第二个字段是加密后的密码
第三个字段是最后一次密码修改的日期距离1970年的天数
...
管理用户账户
新建用户账户
useradd -g f23a55 -m -d /home/cilinmengye cilinmengye
passwd cilinmengye
su - cilinmengye
新建用户账号的默认设置
使用命令
man useradd
进行查看帮助
这里需要注意的是,当我们按照用useradd这个命令去创建用户时没有指定各种参数的时候,是按照默认设置,但是结果并不是与/etc/default/useradd中的默认设置相同
这个可以看man useradd手册得到答案
同时还有/etc/login.defs中的设置会影响用户创建时的状态
可以通过man login.def
查看其中的man手册
修改用户账号
-L 锁定其实就是在/etc/shadow中将用户的密码字段前加上"!","!"表示字段无效
则其实锁定就是让这个用户登入不了了
- 批量操作
userdel tom 其只会将 /etc/passwd 和 /etc/shadow 中关于要删除用户的记录给去除,并不会删除用户的主目录和邮箱
加上选项-r可以
(find /) 是在主目录下寻找 (-user tom) 权限是tom的文件 (-exec -delete) 并删除
组账户
组配置文件
新建和修改组账号
- 新建修改
- 删除
组成员管理
- 添加
-
删除
-
批量操作
切换组身份
超级用户权限
这里解释一下为何说su只适用于系统只有单一系统管理员的情况:
当使用su命令的时候,我们需要输入root用户的密码,当有单个root管理员,许多普通用户,当普通用户需要使用某个权限的时候都用su命令,也就是都要知道root用户的密码。这样容易导致root密码泄露
sudo只需要输入自己的命令,但是需要root用户进行配置文件,用户才能使用sudo命令
-u 表示切换到其他用户身份进行执行命令
关于sudo的配置文件
我们一般是去用visudo命令修改/etc/sudoers文件的
为何不去直接用vim修改/etc/sudoers文件?因为用vim去修改/etc/sudoers不会进行语法检查,但是visudo会
如:
限制使用su命令的配置
权限管理
文件的基本权限模型
我们在linux中可以通过如下命令:
ls -l file
ls -ld dir
看到如下信息:
- 这些-rw之类的是什么意思?
- 我们有没有什么办法可以改变权限?chmod!
其改变权限的方法有三种:
-
以字符串符形式
chmod u=rw-,g=r--,o=--- file
-
以+-的形式
chmod g+w,o-r file
-
以数字的形式
chmod 664 file
这里每一个表示的是权限的累加,如6=4+2 表示rw-
拥有的rwx权限后我们只能读,写,执行吗?更多的思考!
其实都是错误的
用户对文件的权限取决于这个文件的目录给予了用户什么样的权限
当我们用ls -ld dir
列出目录信息后可以看到如下:
其中目录权限影响我们对文件的操作映射表如下:
改变文件所有者和属组
上面
chown root: file
这里:后省略了属组,这样是默认将属组为前面的文件所有者组去了
:前面省略表示不改变文件所有者
决定新建文件/目录权限的权限掩码
权限掩码是不同用户都有的,通过umask命令查看
比如如果是0002,在权限掩码中我们先不管最左边的0,看后3位,每一位都是8进制数。
每位从左到右分别代表的所有者权限掩码,属组用户权限掩码,其他用户权限掩码
比如上面的例子中就是000,000,010(二进制下)
新建文件/目录开始申请的权限是0666/0777,但是这是他申请的,最终其权限要与取反后的用户权限掩码进行相与才是真正得到的权限
- 为何是与取反后的用户权限掩码进行相与?
根据权限掩码中值为1的为对应权限被禁止,我们在计算的时候应该取反才对
比如我们用户权限掩码为0002,这个时候这位用户创建了一个新文件,这个文件申请权限为0666
然后我们对0002进行取反,得到7775,然后与0666相与,得到0664。
则表示这个文件的权限为rw-rw-r--
特殊权限
这里有三种特殊权限:setuid(suid),setgid(sgid),sticky bit(sbit)
我们之前不是说要忽视权限掩码的最左边一位八进制数吗?其实最左边一位数八进制数对应的正好是这三个权限,分别为4,2,1
- 为何需要这三种权限?
我们来思考一下如下问题:
本来确实我们的mike用户没有权限去修改/etc/shadow文件,但是我们设置了特殊权限suid
我们来看下passwd命令的权限:
这里的s就表示我们设置了suid权限,这样即使是mike用户也可以在运行这个程序的时候以root身份运行。(注意前提是mike用户有执行这个passwd命令(文件)的权限)
-
sgid
-
sbit
这里的这个t表示我们设置了sbit权限
文件扩展属性
比如如果设置了i,则表示文件不能更改(写,删除等操作)
文件访问控制列表(FACL)
- 为何需要文件访问控制列表?
前面我们权限控制的方法无法实现指定某个特定的用户/组有权对某个指定的文件/目录进行操作
想一下,无论是我们通过chmod命令修改文件/目录的权限(无法只限定某个用户/组进行操作),
还是使用将用户加入组的方式(用户会还可以对组中其他文件/目录有权操作)
所以我们有了文件访问控制列表(FACL)
这里的访问控制项就是我们要指定的权限,其写法如下:
在使用setfacl后可以看到
这里后面有"+"
一个具体案例
user::rw-表示文件所有者和其所在组对这个文件的权利
user:mary:rwx和group::rw-,group:groupB:r--是指定其他用户和本组用户,其他组中用户的权限
如user:mary:rwx和group::rw-,group:groupB:r--设置的权限的并集就是mask默认的权限(当然我们也可以修改mask权限)
mask的权限会反应到ls -l 的属组权限结果中
ACL访问权限检查算法
上述表明,我们其实可以通过手动设置mask权限来“压制”指定用户的权限
这三者的权限不能大于mask的权限
设置默认ACL和删除ACL
前面这个d:就表示设置默认的ACL权限了,然后在这个目录下的所有文件都会继承这个目录的默认ACL
还记得这个吗?
当一个文件/目录继承其父目录的默认ACL后,还要与用户的默认掩码的反码进行与操作,才是其最终的权限
训练
如何手动地创建一个用户而不用useradd命令?
首先man useradd 查看下帮助,得到一下有用信息:
可以看到首先第一步是会更新系统文件,那更新哪些文件呢?
可以再次在man useradd 中找到
- 修改/etc/passwd文件
man 5 passwd 可以查看passwd的一些字段
感觉不够直观,我们先随便创建一个用户test来看看他影响了哪些文件吧
首先来看看/etc/passwd
发现新加了如下一条记录:
test❌1004:1004::/home/test:/bin/bash
同时发现在我的/home下多了一个test目录!
我们仔细看看这个test目录,发现是空的
但是我们重启登入test后目录下就有如下内容
然后看看/etc/shadow
多了如下记录
test:$1$.3l.bjLr$F6KJTFPmMKevXNBlookOA1:19664:0:99999:7:::简单来说各个字段的含义为
用户名:密码(当然是不能看到的,所以用加密过后的密码来替代了):上一次密码改动的距离时间:密码能够被改动的最小等待时间:密码的有效时间:距离在密码快过期多少时间来提醒用户:(后面的一般用不到)
(好像密码如果是!!这样的,说明是非法的,好像不能登入)
再看看/etc/group
发现多了如下记录
test❌1004:
看来useradd 不但会改动/etc/passwd和/ect/shadow 这些关于用户的记录
还确实会在/home下创建用户目录
而且还会创建这个用户的组,用户作为这个组的所有者
-
来看看/ect/gshadow,添加了如下内容
test:!:: -
/etc/default/useradd 是默认设置没什么好说了
-
/etc/skel 我的/etc/skel是一个空文件夹,没啥好说了
-
/etc/subgid 加上了如下内容
test:231072:65536 -
/etc/subuid 加上了如下内容
test:231072:65536
/etc/subuid 和 /etc/subgid 是用于管理用户和组的子用户ID(Sub-User ID)和子组ID(Sub-Group ID)的配置文件
通常在Linux系统中使用。它们的作用是为用户和组分配附加的用户ID和组ID,通常与容器技术如Docker或LXC等一起使用,以确保容器内的进程能够正常运行,而不会与主机上的其他进程发生冲突。
这些文件中保存的内容指定了哪些用户或组可以使用子用户ID和子组ID范围。这有助于限制哪些用户或组可以创建容器或其他需要分配额外用户ID和组ID的任务。
字段含义为:
用户名:起始ID:范围
组名:起始ID:范围
如我这里表示/etc/subuid中的字段test:231072:65536
表示子用户的ID开始为231072~231072+65536
- /etc/login/defs 一个配置文件没啥好说的
所以下面开始解题:
在/etc/passwd下:
生成密码:
$6$01234567$OB.0uFDHHIuZXCWlYC56JNDt30Pg6jNU/JiQsPbMALYTidZX4OITEUdawteO89njUF7EjRVDIQobP2dRCBFXI0
在/etc/shadow下:
附件
- Linux文件 profile、bashrc、bash_profile区别
完成公司开发项目的权限分配问题
问题描述
假设A公司的总经理兼总裁为a01-carl,公司下设4个部门:
(1)技术部(tech):部门经理为a01-tony,部门员工包括a01-t1、a01-t2,a01-t3、a01-t4,他们都属于组a01-tech,组管理员为a01-tech。
(2)市场部(marcket):部门经理为a01-mary,部门员工包括a01-m1、a01-m2,a01-m3、a01-m4,他们都属于组a01-market,组管理员为a01-marcket。
(3)服务部(service):部门经理为a01-sandy,部门员工包括a01-s1、a01-s2,a01-s3、a01-s4,他们都属于组a01-service,组管理员为a01-service。
(4)财务部(finance):部门经理为a01-frank,部门员工包括a01-f1、a01-f2,a01-f3、a01-f4,他们都属于组a01-finance,组管理员为a01-finance。
(5)各部门经理均属于a01-managers组
假设公司新承接了一个项目,项目编号为prj01,需要为该项目成立一个新项目组group01,
假设该项目组从各部门抽调如下员工参与该项目并加入组group01:
技术部:a01-t1、a01-t2
市场部:a01-m1
服务部:a01-s1
财务部:a01-f1
现在指派a01-t2为prj01的项目负责人兼group01组的组管理员,由他负责该组的管理。
指定目录/Prj01专门用于存放prj01项目的相关资料,该目录属于root用户和group01组,权限为770,并要求所有在该目录中创建的文件和目录自动属于group01组,目录中创建一个项目合同文件contract01,要求任何人不得更改、删除、移动该文件,还要创建一个prj01.log文件用于记录项目日志,要求该文件只能从尾部添加内容。另外要求允许总裁a01-carl对该目录中的文件具有读写权限,而属于a01-managers组的各部门经理均对该目录中的文件具有只读权限。
基础知识的回顾
useradd //创建新用户
groupadd //创建新组
# 需要注意的是我们在创建新用户的同时也会自动创建出组来,这个组与用户同名
gpasswd -A //为组设置管理员用户
gpasswd -a //为组添加用户
groups //查看当前用户的属组
chown // 改变文件的所有者和属组
# 需要注意的是,如果要改变dir的属组要用
如:chgrp group01 dirname
chmod //改变文件或目录的权限
|
|-当我们想要为文件设置一些独有的,特殊的权限,我们就要设置这个文件的扩展属性
-举个例子:在某个目录下单独要求一个文件需要不能删改只能看
-[文件扩展属性](https://www.cnblogs.com/cilinmengye/p/17758959.html#%E6%96%87%E4%BB%B6%E6%89%A9%E5%B1%95%E5%B1%9E%E6%80%A7)
|
|-lsattr //查看文件扩展权限
|-chattr +i //设置文件为只读(即不能删改只能看)
|-需要注意的是chattr 是个很强的权限限定
|-比如当root设置chattr +i (只读)给某个文件的时候,连root用户都无法进行修改写等操作,甚至修改这个文件的权限都不行!除非对这个文件执行chattr -i(去除只读),然后才能够操作
|
|-当我们想要在某个目录下创建文件时,这个文件的属组不属于创建者(文件本来是默认属于文件创建者的属组的),而是属于这个目录的所有者,如何办?
|-当遇到这样的奇怪要求可以思考一下文件的特殊权限
|-[文件特殊权限](https://www.cnblogs.com/cilinmengye/p/17758959.html#%E7%89%B9%E6%AE%8A%E6%9D%83%E9%99%90)
|
|-chmod g+s dir //让这个目录下的文件运行时(创建,执行等)是以这个目录的属组身份进行运行,则创建时文件自然是属于目录的属组
|
|-当我们想要指定某一个用户具有特殊的权限,那来看看ACL(文件访问控制列表)吧
|
|- getfacl //查看当前文件下的权限设置
|- 需要注意的是这个命令显示的才真正是详细的哪些用户对这个文件有何权限,平时我们用ls -al 看的其实是"虚假"的!
|-当我们想要指定一个组中的全部用户或者是某个用户 对目录下的全部文件有特殊权限,那来看看ACL的默认权限吧
|-比如我想要a01这个组的成员对dir01这个目录下的文件有读操作
|-setfacl -m d:g:a01:r dir01
|-[默认ACL](https://www.cnblogs.com/cilinmengye/p/17758959.html#%E8%AE%BE%E7%BD%AE%E9%BB%98%E8%AE%A4acl%E5%92%8C%E5%88%A0%E9%99%A4acl)
来具体讲讲上面的getfacl吧!
这里我有一个prjf23a55文件,他是属于grou01组的,同时我也有个用户f23a55-t1他也是属于group01组的,同时ls -al 显示prjf23a55对group01组成员给了rw权限,但是我作为f23a55-t1却无法写,这是什么原因?
是因为其实ls -al 中反应的权限并不是真实的用户组的权限,而是这些权限的并集
所以其实要看
则用户组group01的用户其实是没有写权限的,而只有读权限