poetry
常用命令类型 | 举例 |
---|---|
用户 | who, whoami, su, useradd, userdel, passwd, usermod, /etc/passwd |
组 | groupadd, groupdel, groupmod, /etc/group |
文件 | chmod, chown, chgrp |
其他 | sudo、exit |
用户和组
用户和组的概念
在Linux中,用户分为管理员用户和普通用户,普通用户又分为系统用户和登录用户,每一个用户都有用户名和独一无二的用户id。管理员的用户id为0,普通用户中,系统用户的用户id为1~499,登录用户的用户id为500+。组也分为管理员组和普通用户组,不过又可以分为基本组(主组)和附加组(额外组)。基本组的组名与用户名相同,附加组是为了方便管理用户,一个用户可以有多个附加组。
Linux安全上下文:
运行中的程序我们称之为进程(process),进程能够访问其所有资源的权限,取决于进程发起者身份。
相关配置文件
Linux中与用户和组相关的配置文件
目录 | 含义 |
---|---|
/etc/passwd | 用户及其属性信息(名称、UID、基本组ID等) |
/etc/group | 组及其属性信息 |
/etc/shadow | 用户密码及其相关属性 |
/etc/gshadow | 组密码及其相关属性 |
为了方便管理属于同一组的用户,Linux 系统中还引入了用户组的概念。通过使用用户组号码(GID,Group IDentification),我们可以把多个用户加入到同一个组中,从而方便为组中的用户统一规划权限或指定任务。另外,在 Linux 系统中创建每个用户时,将自动创建一个与其同名的基本用户组,而且这个基本用户组只有该用户一个人。如果该用户以后被归纳入其他用户组,则这个其他用户组称之为扩展用户组。一个用户只有一个基本用户组,但是可以有多个扩展用户组,从而满足日常的工作需要。
1、/etc/passwd
1 | /etc/passwd存放用户信息,由6个冒号组成7个信息 |
2、/etc/group
1 | 用户组的所有信息都存放在/etc/group文件中。此文件的格式是由冒号(:)隔开若干个字段,具体如下: |
3、/etc/shadow
1 | root:$6$iDHbyICea.JiS60r.c0::0:99999:7::: |
4、/etc/gshadow
1 | /etc/gshadow 格式如下,每个用户组独占一行; |
查看当前用户
一般使用who
命令可以查看当前用户:
1 | # 显示当前所有已登录的用户信息(包括 闲置时间, 用户状态, 各列标题) |
用户操作命令
用户
1、useradd 增
可以使用 useradd 命令创建用户账户。使用该命令创建用户账户时,默认的用户家目录会被存放在/home 目录中,默认的 Shell 解释器为/bin/bash,而且默认会创建一个与该用户同名的基本用户组
参数 | 作用 |
---|---|
-d | 指定用户的家目录(默认为/home/username) |
-e | 账户的到期时间,格式为 YYYY-MM-DD |
-u | 指定该用户的默认 UID |
-g | 指定一个初始的用户基本组(必须已存在) |
-G | 指定一个或多个扩展用户组 |
-N | 不创建与用户同名的基本用户组 |
-s | 指定该用户的默认 Shell 解释器 |
一旦用户的解释器被设置为-s nologin,则代表该用户不能登录到系统中,有哪些解释器可以再/etc/passwd中查看,详情请参见Linux的目录结构。
查看当前用户的属组和属主
1 | [root@DZQ etc]# id root |
1 | For example: |
2、userdel 删
删除用户时, 如果用户所属组是创建用户时自动创建的和用户名称同名的组, 并且该组内没有其他用户, 则该组也会被删掉。
1 | 参数: |
3、usermod 改
用户的信息保存在/etc/passwd 文件中,可以直接用文本编辑器来修改其中的用户参数项目,也可以用 usermod 命令修改已经创建的用户信息
参数 | 作用 |
---|---|
-c | 填写用户账户的备注信息 |
-d -m | 参数-m 与参数-d 连用,可重新指定用户的家目录并自动把旧的数据转移过去 |
-e | 账户的到期时间,格式为 YYYY-MM-DD |
-g | 变更所属用户组 |
-G | 变更扩展用户组 |
-L | 锁定用户禁止其登录系统 |
-U | 解锁用户,允许其登录系统 |
-s | 变更默认终端 |
-u | 修改用户的 UID |
4、passwd
当创建完用户,需要给用户添加密码,比如:
1 | useradd dzq |
组
1、groupadd
语法:
1 | groupadd [-g gid [-o]] [-r] [-f] group |
参数说明:
- -g:指定新建工作组的 id;
- -r:创建系统工作组,系统工作组的组ID小于 500;
- -K:覆盖配置文件 “/ect/login.defs”;
- -o:允许添加组 ID 号不唯一的工作组。
- -f,–force: 如果指定的组已经存在,此选项将失明了仅以成功状态退出。当与 -g 一起使用,并且指定的GID_MIN已经存在时,选择另一个唯一的GID(即-g关闭)。
实例:
创建一个新的组,并添加组 ID。
1 | #groupadd -g 344 runoob |
2、groupmod
语法
1 | groupmod [-g <群组识别码> <-o>][-n <新群组名称>][群组名称] |
参数:
- -g <群组识别码> 设置欲使用的群组识别码。
- -o 重复使用群组识别码。
- -n <新群组名称> 设置欲使用的群组名称。
实例
修改组名
1 | [root@runoob.com ~]# groupadd linuxso |
3、groupdel
语法:
1 | groupdel [群组名称] |
实例:
删除一个群组
1 | # groupdel hnuser |
4、gpasswd
参数 | 作用 |
---|---|
-a | –add USER 添加用户到组 |
-d | –delete USER 移除组中用户 |
-Q | –root CHROOT_DIR 更改组的chroot目录 |
-r | –delete-password 删除组密码 |
-M | –members USER,… 批量添加用户到组 |
-A | –administrators ADMIN,…设置组管理员 |
执行管理员权限
这里把执行管理员权限分为三种方式,分别是:直接切换管理员账户、临时使用管理员权限、将管理员权限写入到配置文件。
1、su - 切换用户
使用su
命令可以切换用户,在没有参数的情况下调用时,su默认以root的身份运行一个交互式的shell。对于向后兼容性,su默认不改变当前目录,只设置环境变量HOME和SHELL(如果目标不是root,则加上USER和LOGNAME)。
这个版本的su使用PAM作为认证、账户和会话管理。在其他su实验中发现一些配置选项(例如:对轮组的支持)必须通过PAM进行配置
su
后面加上 “-” 表示完全切换到新用户,即把环境变量信息也变更为新用户相应信息。如果没有指明用户名,则切换到root,如:su
2、sudo - 临时权限
sudo 命令用于给普通用户提供额外的权限来完成原本 root 管理员才能完成的任务,格式为“sudo [参数] 命令名称”
参数 | 作用 |
---|---|
-h | 列出帮助信息 |
-l | 列出当前用户可执行的命令 |
-u | 用户名或 UID 值 以指定的用户身份执行命令 |
-k | 清空密码的有效时间,下次执行 sudo 时需要再次进行密码验证 |
-b | 在后台执行指定的命令 |
-p | 更改询问密码的提 |
3、修改配置文件
配置文件 /etc/sudoers ,只有root管理员才可以使用visudo命令编辑sudo服务配置文件。visudo禁止多个用户同时修改配置sudoers文件。进入普通用户时,还是需要sudo才可以执行相关权限。
第一步:vim /etc/sudoers,将第99行左右的位置,添加想要赋予权限的用户
1 | [root@localhost ~]# sed '99,102p' -n /etc/sudoers |
第二步:登录普通用户
1 | [root@localhost ~]# su - NIKI |
第三部:sudo -l,这里填的密码是NIKI用户自己的密码
1 | [NIKI@localhost ~]$ sudo -l |
第四步:显示
不用sudo
1
2[NIKI@localhost ~]$ ls /root/
ls: cannot open directory /root/: Permission denied用sudo
1
2[NIKI@localhost ~]$ sudo ls /root
1.txt de dem demo mou nin.sh rubbish script.sh test.py w.sh w.sh~
但是考虑到生产环境中不允许某个普通用户拥有整个系统中所有命令的最高执行权(这也不符合前文提到的权限赋予原则,即尽可能少地赋予权限),因此 ALL 参数(第99行)就有些不合适了。因此只能赋予普通用户具体的命令以满足工作需求,这也受到了必要的权限约束。如果需要让某个用户只能使用 root 管理员的身份执行指定的命令,切记一定要给出该命令的绝对路径,否则系统会识别不出来。我们可以先使用 whereis 命令找出命令所对应的保存路径,然后把配置文件第 99 行的用户权限参数修改成对应的路径即可
1 | [linuxprobe@linuxprobe ~]$ exit |
此时,用户只能用sudo执行cat命令。
这样虽然赋予了普通用户执行管理员命令的权限,但每次执行之前都要输入密码,可以通过以下配置,使得用户执行sudo时,不用密码验证。
1 | [root@linuxprobe ~]# visudo |
文件
linux一切皆文件,但文件类型和权限有所不同,用字符来区分。
概述
文件类型
1 | -:普通文件 |
文件权限
r | w | x |
---|---|---|
读 | 写 | 执行 |
4 | 2 | 1 |
对于文件而言
r | w | x |
---|---|---|
可以读文件的内容 | 可以编辑文件的内容 | 可以执行这个文件 |
对于目录而言
r | w | x |
---|---|---|
读目录中的文件属性信息 | 可以在目录中添加或删除文件数据信息 | 是否可以进入到目录 |
权限详解
1 | [root@nginxs qiandao]# ll |
特殊权限
可读可写可执行不能够满足我们对安全和灵活性的需求,因此便有了 SUID、SGID 与 SBIT 的特殊权限位
SUID
SUID 是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。
例如,所有用户都可以执行 passwd 命令来修改自己的用户密码,而用户密码保存在/etc/shadow 文件中。仔细查看这个文件就会发现它的默认权限是 000,也就是说除了 root 管理员以外,所有用户都没有查看或编辑该文件的权限。但是,在使用 passwd 命令时如果加上 SUID 特殊权限位,就可让普通用户临时获得程序所有者的身份,把变更的密码信息写入到 shadow 文件中。这很像我们在古装剧中见到的手持尚方宝剑的钦差大臣,他手持的尚方宝剑代表的是皇上的权威,因此可以惩戒贪官,但这并不意味着他永久成为了皇上。因此这只是一种有条件的、临时的特殊权限授权方法。
查看 passwd 命令属性时发现所有者的权限由 rwx 变成了 rws,其中 x 改变成 s 就意味着该文件被赋予了 SUID 权限。另外有读者会好奇,那么如果原本的权限是 rw-呢?如果原先权限位上没有 x 执行权限,那么被赋予特殊权限后将变成大写的 S。
1 | [root@nginx ~]# ll /usr/bin/passwd |
1 | chmod 4700 test.txt #添加suid权限 |
SGID
SGID 主要实现如下两种功能:
1、让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置);
2、在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。
1 | [root@DZQ dev]# ll mem |
1、在某个目录中创建的文件自动继承该目录的用户组
2、由于 ps 命令被增加了 SGID 特殊权限位,所以当用户执行该命令时,也就临时获取到了 system 用户组的权限,从而可以顺利地读取设备文件了
SBIT
Sticky Bit ,SBIT 特殊权限位可确保用户只能删除自己的文件,而不能删除其他用户的文件。换句话说,当对某个目录设置了 SBIT 粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作了与前面所讲的 SUID 和 SGID 权限显示方法不同,当目录被设置 SBIT 特殊权限位后,文件的其他人权限部分的 x 执行权限就会被替换成 t 或者 T,原本有 x 执行权限则会写成 t,原本没有 x 执行权限则会被写成 T。
1 | [linuxprobe@linuxprobe tmp]$ ls -ald /tmp |
要是也想对其他目录来设置 SBIT 特殊权限位,用 chmod 命令就可以了。对应的参数 o+t 代表设置 SBIT 粘滞位权限
1 | [root@linuxprobe ~]# chmod -R o+t linux/ |
隐藏权限
chattr
chattr 命令用于设置文件的隐藏权限,格式为“chattr [参数] 文件”。如果想要把某个隐藏功能添加到文件上,则需要在命令后面追加“+参数”,如果想要把某个隐藏功能移出文件,则需要追加“-参数”。
参数 | 作用 |
---|---|
i | 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的而不能新建或删除文件 |
a | 仅允许补充(追加)内容,无法覆盖/删除内容(Append Only) |
S | 文件内容在变更后立即同步到硬盘(sync) |
s | 彻底从硬盘中删除,不可恢复(用 0 填充原文件所在硬盘区域) |
A | 不再修改这个文件或目录的最后访问时间(atime) |
b | 不再修改文件或目录的存取时间 |
D | 检查压缩文件中的错误 |
d | 使用 dump 命令备份时忽略本文件/目录 |
c | 默认将文件或目录进行压缩 |
u | 当删除该文件后依然保留其在硬盘中的数据,方便日后恢复 |
t | 让文件系统支持尾部合并(tail-merging) |
X | 可以直接访问压缩文件中的内容 |
lsattr
用chattr执行改变文件或目录的属性,可执行lsattr指令查询其属性。
参数 | 作用 |
---|---|
-a | 显示所有文件和目录,包括以”.”为名称开头字符的额外内建,现行目录”.”与上层目录”..” |
-d | 显示,目录名称,而非其内容。 |
-R | 递归处理,将指定目录下的所有文件及子目录一并处理 |
1 | for example |
文件操作命令
chmod
chmod 可以藉以控制文件如何被他人所调用。
1 | for example: |
参数 | 作用 |
---|---|
-c | 显示更改的部分的信息 |
-f | 忽略错误信息 |
-h | 修复符号链接 |
-v | 显示详细的处理信息 |
-R | 处理指定目录以及其子目录下的所有文件 |
chown
chown 将指定文件的拥有者改为指定的用户或组
参数 | 作用 |
---|---|
user | 新的文件拥有者的使用者 ID |
group | 新的文件拥有者的使用者组(group) |
-c | 显示更改的部分的信息 |
-f | 忽略错误信息 |
-h | 修复符号链接 |
-v | 显示详细的处理信息 |
-R | 处理指定目录以及其子目录下的所有文件 |
1 | For example: |
chgrp
变更文件或目录的所属群组。
1 | chgrp -v bin myhouse/ |
1 | [root@node ~]# ll |
文件访问控制列表
对指定的用户进行单独的权限控制,就需要用到文件访问控制列表(ACL,Access Control List)
setfacl
Set File Acess Control List
chmod命令可以把文件权限分为u,g,o三个组,而setfacl可以对每一个文件或目录设置更精确的文件权限。换句话说,setfacl可以更精确的控制权限的分配。比如:让某一个用户对某一个文件具有某种权限。
参数 | 作用 |
---|---|
-m | 更改当前文件的ACL |
-M, –modify-file=file | 从文件中读取访问列表条目ACL进行修改 |
-x | 根据访问控制列表移除条目 |
-b | 删除所有扩展访问控制列表条目 |
-k | 移除默认访问控制列表 |
-n –no-mask | 不重新计算有效权限掩码 |
-d –default | 应用到默认访问控制列表的操作 |
-R | 递归操作子目录 |
-L | 依照系统逻辑,跟随符号链接 |
-P | 依照自然逻辑,不跟随符号链接 |
1 | [root@localhost ~]# setfacl -Rm u:root:rwx /root/dem |
getfacl
显示文件上的ACL信息
常见用法
1 | [root@nginx ~]# getfacl hello2.md |