type
status
date
slug
summary
tags
category
icon
password
Property
用户身份与能力
设计Linux系统的初衷之一就是为了满足多个用户同时工作的需求,因此Linux系统必须具备很好的安全性。
在安装Linux系统时,特别要求设置root管理员密码,这个root管理员就是存在于所有类UNIX系统中的超级用户。它拥有最高的系统所有权,能够管理系统的各项功能,如添加/删除用户、启动/关闭服务进程、开启/禁用硬件设备等。虽然以root管理员的身份工作时不会受到系统的限制,但一旦使用这个高能的root管理员权限执行了错误的命令可能会直接毁掉整个系统。
Linux系统的管理员之所以是root,并不是因为它的名字叫root,而是因为该用户的身份号码即UID(User IDentification)的数值为0。在Linux系统中,UID就相当于我们的身份证号码一样具有唯一性,因此可通过用户的UID值来判断用户身份。
- 管理员UID为0:系统的管理员用户
- 系统用户UID为1~999: Linux系统为了避免因某个服务程序出现漏洞而被黑客提权至整台服务器,默认服务程序会有独立的系统用户负责运行,进而有效控制被破坏范围
- 普通用户UID从1000开始:由管理员创建的用于日常工作的用户
为了方便管理属于同一组的用户,Linux系统中还引入了用户组的概念。通过用户组号码(GID,Group IDentification),可以把多个用户加入到同一个组中,从而方便为组中的用户统一规划权限或指定任务。假设有一个公司中有多个部门,每个部门中又有很多员工。如果只想让员工访问本部门内的资源,则可以针对部门而非具体的员工来设置权限。例如,可以通过对技术部门设置权限,使得只有技术部门的员工可以访问公司的数据库信息等。
另外,在Linux系统中创建每个用户时,将自动创建一个与其同名的基本用户组,而且这个基本用户组只有该用户一个人。如果该用户以后被归纳入其他用户组,则这个其他用户组称之为扩展用户组。一个用户只有一个基本用户组,但是可以有多个扩展用户组,从而满足日常的工作需要。
useradd–创建并设置用户信息
useradd命令用于创建新的用户,格式为
useradd [选项] 用户名
。使用useradd命令可以自动的完成创建用户的信息、基本组、家目录等工作,并在创建的过程中对用户初始信息进行定制。使用该命令创建用户账户时,默认的用户家目录会被存放在/home目录中,默认的Shell解释器为
/bin/bash
,而且默认会创建一个与该用户同名的基本用户组。这些默认设置可以根据useradd命令参数自行修改。常用参数:
-D | 改变新建用户的预设值 |
-c | 添加备注文字 |
-d | 新用户每次登陆时所使用的家目录(默认为/home/username) |
-e | 用户终止日期,日期的格式为YYYY-MM-DD |
-f | 用户过期几日后永久停权。当值为0时用户立即被停权,而值为-1时则关闭此功能,预设值为-1 |
-g | 指定一个初始的用户基本组(必须已存在) |
-G | 指定一个或多个扩展用户组 |
-m | 用户目录不存在时则自动创建 |
-M | 不建立用户家目录,优先于/etc/login.defs文件设定 |
-n | 不创建与用户同名的基本用户组 |
-r | 建立系统帐号 |
-u | 指定该用户的默认UID |
-s | 指定该用户的默认Shell解释器 |
已创建的用户则需使用chmod命令修改账户信息,passwd命令修改密码信息
groupadd–创建新的用户组
groupadd命令用于创建用户组,格式为
groupadd [选项] 群组名
。每个用户在创建时都有一个与其同名的基本组,后期可以使用groupadd命令创建出新的用户组信息,让多个用户加入到指定的扩展组中,为后续的工作提供了良好的文档共享环境。常用参数:
-g | 指定新建工作组的id |
-r | 创建系统工作组 |
-K | 覆盖配置文件“/ect/login.defs” |
-o | 允许添加组ID号不唯一的工作组 |
usermod–修改用户账号信息
usermod命令来自于英文词组“user modify”的缩写,其功能是用于修改用户账号中的各项参数,格式为
usermod [选项] 用户名
Linux系统中的一切都是文件,因此在系统中创建用户也就是修改配置文件的过程。用户的信息保存在
/etc/passwd
文件中,可以直接用文本编辑器来修改其中的用户参数项目,也可以用usermod命令修改已经创建的用户信息,诸如用户的UID、基本/扩展用户组、默认终端等。常用参数:
-c<备注> | 修改用户账号的备注文字 |
-d -m | 参数-m与参数-d连用,可重新指定用户的家目录并自动把旧的数据转移过去 |
-e<有效期限> | 修改账号的有效期限 |
-f<缓冲天数> | 修改在密码过期后多少天即关闭该账号 |
-g<群组> | 修改用户所属的群组 |
-G<群组> | 修改用户所属的附加群组 |
-l<账号名称> | 修改用户账号名称 |
-L | 锁定用户密码,使密码无效 |
-s<shell> | 修改用户登入后所使用的shell |
-u<uid> | 修改用户ID |
-U | 解除密码锁定 |
passwd–修改用户的密码值
passwd命令用于修改用户密码、过期时间、认证信息等,格式为
passwd [选项] [用户名]
普通用户只能使用passwd命令修改自身的系统密码,而root管理员则有权限修改其他所有人的密码。而且,root管理员在Linux系统中修改自己或他人的密码时不需要验证旧密码。既然root管理员可以修改其他用户的密码,就表示完全拥有该用户的管理权限。
常用参数:
userdel命令用于删除用户,格式为
userdel [选项] 用户名
Linux系统中一切都是文件,用户信息被保存到了/etc/passwd、/etc/shadow以及/etc/group文件中,因此使用userdel命令实际就是帮助我们删除了指定用户在上述三个文件中的对应信息。在执行删除操作时,该用户的家目录默认会保留下来,此时可以使用-r参数将其删除。
常用参数:
-f | 强制删除用户账号 |
-r | 删除用户主目录及其中的任何文件 |
-h | 显示命令的帮助信息 |
身份切换
su–切换用户身份
su命令来自于英文单词“switch user”的缩写,其功能是用于切换用户身份。管理员切换至任意用户身份而无需密码验证,而普通用户切换至任意用户身份均需密码验证。另外添加单个减号(-)参数为完全的身份变更,不保留任何之前用户的环境变量信息。
语法格式:
su [参数] 用户名
常用参数:
单个减号(-) | 完全身份变更 |
-c | 执行完指定的指令后,即恢复原来的身份 |
-f | 适用于csh与tsch,使shell不用去读取启动文件 |
-l | 改变身份时,也同时变更工作目录 |
-m | 变更身份时,不要变更环境变量 |
-s | 指定要执行的shell |
--help | 显示帮助信息 |
--version | 显示版本信息 |
sudo–授权普通用户执行管理员命令
sudo命令来自于英文词组“super user do”的缩写,中文译为“超级用户才能干的事”,其功能是用于授权普通用户执行管理员命令。使用su命令变更用户身份虽然好用,但是需要将管理员的账户密码告诉他人,总感觉心里不踏实,幸好有了sudo服务。
使用sudo服务可以授权某个指定的用户去执行某些指定的命令,在满足工作需求的前提下尽可能少的放权,保证服务器的安全。配置sudo服务可以直接编辑配置文件/etc/sudoers,亦可以执行visudo命令进行设置,一切妥当后普通用户便能够使用sudo命令进行操作了。
语法格式:
sudo [参数] 命令
常用参数:
-V | 显示版本编号 |
-h | 显示版本编号及指令的使用方式说明 |
-l | 显示出自己(执行 sudo 的使用者)的权限 |
-v | 因为 sudo 在第一次执行时或是在 N 分钟内没有执行(N 预设为五)会问密码,这个参数是重新做一次确认,如果超过 N 分钟,也会问密码 |
-k | 将会强迫使用者在下一次执行 sudo 时问密码(不论有没有超过 N 分钟) |
-b | 将要执行的指令放在后台执行 |
-p prompt | 可以更改问密码的提示语,其中 %u 会代换为使用者的帐号名称, %h 会显示主机名称 |
-u username/#uid | 不加此参数,代表要以 root 的身份执行指令,而加了此参数,可以以 username 的身份执行指令(#uid 为该 username 的使用者号码) |
-s | 执行环境变数中的 SHELL 所指定的 shell ,或是 /etc/passwd 里所指定的 shell |
-H | 将环境变数中的 HOME (家目录)指定为要变更身份的使用者家目录(如不加 -u 参数就是系统管理者 root ) |
文件属性与权限
尽管在Linux系统中一切都是文件,但是每个文件的类型不尽相同,因此Linux系统使用了不同的字符来加以区分,常见的字符:
-
:普通文件- 纯文本文件(ASCII):Linux系统中最多的一种文件类型, 内容为我们可以直接读到的数据,例如数字、字母等等。 几乎只要是可以用来做为设置的文件都属于这一种文件类型。
- 二进制档(binary):Linux当中的可执行文件(scripts, 文字体批处理文件不算)就是这种格式,指令cat就是一个binary file。
- 数据格式文件(data): 有些程序在运行的过程当中会读取某些特定格式的文件,那些特定格式的文件可以被称为数据文件。举例来说,Linux在使用者登陆时,都会将登录的数据记录在
/var/log/wtmp
文件内,该文件是一个data file,能够通过last这个指令读出来, 但是使用cat读出乱码。
在由
ls -al
所显示出来的属性方面,第一个字符为-
,例如-rwxrwxrwx
。另外,依照文件的内容,又大略可以分为:d
:目录文件
l
:链接文件(link),和Windows的快捷方式有点相似
b
:块设备文件,集中在/dev这个目录之下,一些储存数据, 以提供系统随机存取的周边设备,例如硬盘与软盘
c
:字符设备文件,一些串行端口的接口设备, 例如键盘、鼠标等等,这些设备的特色就是一次性读取的,不能够截断输出
s
:数据接口文件(sockets),这种类型的文件通常被用在网络上的数据承接了。可以启动一个程序来监听用户端的要求, 而用户端就可以通过这个socket来进行数据的沟通了, 最常在/run
或/tmp
这些个目录中看到这种文件类型了。
p
:管道文件(FIFO, pipe),主要的目的在解决多个程序同时存取一个文件所造成的错误问题, FIFO是first-in-first-out的缩写
在Linux系统中,每个文件都有所属的所有者和所有组,并且规定了文件的所有者、所有组以及其他人对文件所拥有的可读(r)、可写(w)、可执行(x)等权限。对于一般文件来说,“可读”表示能够读取文件的实际内容,“可写”表示能够编辑、新增、修改、删除文件的实际内容,“可执行”则表示能够运行一个脚本程序。但是,对于目录文件来说,“可读”表示能够读取目录内的文件列表,“可写”表示能够在目录内新增、删除、重命名文件,而“可执行”则表示能够进入该目录。
元件 | 内容 | 叠代物件 | r | w | x |
文件 | 详细数据data | 文件数据夹 | 读到文件内容 | 修改文件内容 | 执行文件内容 |
目录 | 文件名 | 可分类抽屉 | 读到文件名 | 修改文件名 | 进入该目录的权限(key) |
文件的读、写、执行权限可以简写为rwx,亦可分别用数字4、2、1来表示,文件所有者,所属组及其他用户权限之间无关联
文件权限的数字法表示基于字符表示(rwx)的权限计算而来,其目的是简化权限的表示。例如,若某个文件的权限为7则代表可读、可写、可执行(4+2+1);若权限为6则代表可读、可写(4+2)。
如果有这样一个文件,其所有者拥有可读、可写、可执行的权限,其文件所属组拥有可读、可写的权限;而且其他人只有可读的权限。那么,这个文件的权限就是rwxrw-r--,数字法表示即为764。
通过ls命令查看到的文件属性信息:
包含了文件的类型、访问权限、所有者(属主)、所属组(属组)、占用的磁盘大小、修改时间和文件名称等信息
Linux文件扩展名:
基本上,Linux的文件是没有所谓的“扩展名”的,一个Linux文件能不能被执行,与他的第一栏的十个属性有关, 与文件名无关。在Windows下面, 能被执行的文件扩展名通常是
.com
.exe
.bat
等等,而在Linux下面,只要权限当中具有x的话,例如即代表这个文件具有可以被执行的能力!具有“可执行的权限”以及“具有可执行的程序码”是两回事!在 Linux 下面,可以让一个文本文件,具有“可执行的权限” (加入x权限即可), 但是这个文件明显的无法执行,因为他不具备可执行的程序码!而如果将cat 这个可以执行的指令的x拿掉,那么 cat 将无法被你执行!
虽然如此,不过仍然希望可以借由扩展名来了解该文件是什么东西,所以, 通常还是会以适当的扩展名来表示该文件是什么种类的。下面有数种常用的扩展名:
- .
sh
: 脚本或批处理文件 (scripts)
Z,
.tar,
.tar.gz,
.zip, *.tgz
: 经过打包的压缩文件。由于不同的压缩软件,而取其相关的扩展名
.html,
.php
:网页相关文件,分别代表 HTML 语法与 PHP 语法的网页文件
Linux文件长度限制:
在Linux下面,使用传统的Ext2/Ext3/Ext4文件系统以及近来被 CentOS 7 当作默认文件系统的 xfs 而言,针对文件的文件名长度限制为:
单一文件或目录的最大容许文件名为 255Bytes,以一个 ASCII 英文占用一个 Bytes 来说,则大约可达 255 个字符长度。若是以每个中文字占用 2Bytes 来说, 最大文件名就是大约在 128 个中文字之谱!
Linux文件名称的限制:
由于Linux在命令行下的一些指令操作关系,一般来说,在设置Linux下面的文件名称时, 最好可以避免一些特殊字符比较好!例如:
. ? > < ; & ! [ ] | \ ' " ` ( ) { }
因为这些符号在命令行下,是有特殊意义的!另外,文件名称的开头为小数点“.”时, 代表这个文件为“隐藏文件”!同时,由于指令下达当中,常常会使用到 -option 之类的选项, 所以最好也避免将文件文件名的开头以 - 或 + 来命名!
chgrp–更改文件用户组
chgrp是英语单词“change group”的缩写,命令的作用和其中文释义一样,为用于变更文件或目录的所属群组。
语法格式:
chgrp [参数] [目录]
常用参数:
-c | 效果类似”-v”参数,但仅回报更改的部分 |
-f | 不显示错误信息 |
-h | 对符号连接的文件作修改,而不更动其他任何相关文件 |
-R | 递归处理,将指定目录下的所有文件及子目录一并处理 |
-v | 显示指令执行过程 |
--reference | 把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同 |
chown–改变文件或目录的用户和用户组
chown命令来自于英文词组”Change owner“的缩写,其功能是用于改变文件或目录的用户和用户组信息。管理员可以改变一切文件的所属信息,而普通用户只能改变自己文件的所属信息。
语法格式:
chown [参数] 所属主:所属组 文件
常用参数:
-R | 对目前目录下的所有文件与目录进行相同的变更 |
-c | 显示所属信息变更信息 |
-f | 若该文件拥有者无法被更改也不要显示错误 |
-h | 只对于链接文件进行变更,而非真正指向的文件 |
-v | 显示拥有者变更的详细资料 |
--help | 显示辅助说明 |
--version | 显示版本 |
chmod–改变文件或目录权限
chmod命令来自于英文词组”change mode“的缩写,其功能是用于改变文件或目录权限的命令。默认只有文件的所有者和管理员可以设置文件权限,普通用户只能管理自己文件的权限属性。
设置权限时可以使用数字法,亦可使用字母表达式,对于目录文件建议加入-R参数进行递归操作,意味着不仅对于目录本身,也对目录内的子文件/目录都进行新权限的设定。
语法格式:
chmod 参数 文件
常用参数:
-c | 若该文件权限确实已经更改,才显示其更改动作 |
-f | 若该文件权限无法被更改也不显示错误讯息 |
-v | 显示权限变更的详细资料 |
-R | 对目前目录下的所有文件与子目录进行相同的权限变更(即以递回的方式逐个变更) |
特殊权限位SUID、SGID与SBIT
特殊权限位是一种对文件权限进行设置的特殊功能,可以与一般权限同时使用,以弥补一般权限不能实现的功能
SUID是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。设置命令 :
chmod
u
+s 文件名
例如,所有用户都可以执行passwd命令来修改自己的用户密码,而用户密码保存在
/etc/shadow
文件中。仔细查看这个文件就会发现它的默认权限是000,也就是说除了root管理员以外,所有用户都没有查看或编辑该文件的权限。但是,在使用passwd命令时如果加上SUID特殊权限位,就可让普通用户临时获得程序所有者的身份,把变更的密码信息写入到shadow文件中。查看passwd命令属性时发现所有者的权限由rwx变成了rws,其中x改变成s就意味着该文件被赋予了SUID权限。那么如果原本的权限是rw-呢?如果原先权限位上没有x执行权限,那么被赋予特殊权限后将变成大写的S。
SGID主要实现如下两种功能:
- 让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置)
- 在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)
SGID的第一种功能是参考SUID而设计的,不同点在于执行程序的用户获取的不再是文件所有者的临时权限,而是获取到文件所属组的权限。设置命令 :
chmod -Rf
g
+s 目录名
举例来说,在早期的Linux系统中,/dev/kmem是一个字符设备文件,用于存储内核程序要访问的数据,权限为:
除了root管理员或属于system组成员外,所有用户都没有读取该文件的权限。由于在平时我们需要查看系统的进程状态,为了能够获取到进程的状态信息,可在用于查看系统进程状态的ps命令文件上增加SGID特殊权限位。查看ps命令文件的属性信息:
这样一来,由于ps命令被增加了SGID特殊权限位,所以当用户执行该命令时,也就临时获取到了system用户组的权限,从而可以顺利地读取设备文件了。
SBIT特殊权限位可确保用户只能删除自己的文件,而不能删除其他用户的文件。换句话说,当对某个目录设置了SBIT保护位权限后,那么该目录中的文件就只能被其所有者执行删除操作了。设置命令 :
chmod -Rf o+t 目录名
与SUID和SGID权限显示方法不同,当目录被设置SBIT特殊权限位后,文件的其他人权限部分的x执行权限就会被替换成t或者T,原本有x执行权限则会写成t,原本没有x执行权限则会被写成T。
文件的隐藏属性
Linux系统中的文件除了具备一般权限和特殊权限之外,还有一种隐藏权限,即被隐藏起来的权限,默认情况下不能直接被用户发觉
lsattr–显示文件的隐藏属性
lsattr命令来自于英文词组“list attribute”的缩写,其功能是用于显示文件的隐藏属性。隐藏属性也叫隐藏权限,用常规ls命令无法查看到它们,需要使用lsattr命令查看这些属性信息。
语法格式:
lsattr [参数] 文件名
常用参数:
-a | 列出目录中的所有文件,包括隐藏文件 |
-d | 只显示目录名称 |
-R | 递归地处理指定目录下的所有文件及子目录 |
-v | 显示文件或目录版本 |
-V | 显示版本信息 |
-D | 显示属性的名称、默认值 |
-E | 显示从用户设备数据库中获得属性的当前值 |
chattr–更改文件隐藏属性
chattr命令来自于英文词组“change attribute”的缩写,其功能是用于更改文件隐藏属性。
ls
命令仅能够查看到文件的一般权限、特殊权限、SELinux安全上下文与是否有FACL访问控制列表等情况,但却无法查看到文件隐藏属性!语法格式:
chattr 参数 文件
实用参数:
-R | 递归处理目录下的所有文件 |
-v | 设置文件或目录版本 |
-V | 显示指令执行过程 |
+ | 开启文件或目录的该项属性 |
-- | 关闭文件或目录的该项属性 |
= | 指定文件或目录的该项属性 |
权限 | 作用 |
i | 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件 |
a | 仅允许补充(追加)内容,无法覆盖/删除内容(Append Only) |
S | 文件内容在变更后立即同步到硬盘(sync) |
s | 彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域) |
A | 不再修改这个文件或目录的最后访问时间(atime) |
b | 不再修改文件或目录的存取时间 |
D | 检查压缩文件中的错误 |
d | 使用dump命令备份时忽略本文件/目录 |
c | 默认将文件或目录进行压缩 |
u | 当删除该文件后依然保留其在硬盘中的数据,方便日后恢复 |
t | 让文件系统支持尾部合并(tail-merging) |
x | 可以直接访问压缩文件中的内容 |
文件访问控制列表
一般权限、特殊权限、隐藏权限其实有一个共性—权限是针对某一类用户设置的。如果希望对某个指定的用户进行单独的权限控制,就需要用到文件的访问控制列表(ACL)。通俗来讲,基于普通文件或目录设置ACL其实就是针对指定的用户或用户组设置文件或目录的操作权限。另外,如果针对某个目录设置了ACL,则目录中的文件会继承其ACL;若针对文件设置了ACL,则文件不再继承其所在目录的ACL。
setfacl–设置文件ACL规则
setfacl的英文全称是“ set file access control list ”,即“设置文件访问控制列表”。可以更精确的控制权限的分配,比如让某一个用户对某一个文件具有某种权限。
ACL指文件的所有者、所属组、其他人的读/写/执行之外的特殊的权限, 对于需要特殊权限的使用状况有一定帮助。 如,某一个文件,不让单一的某个用户访问。
语法格式:
setfacl [参数] [文件]
常用参数:
-m | --modify-acl 更改文件的访问控制列表 |
-M | --modify-file=file 从文件读取访问控制列表条目更改 |
-x | --remove=acl 根据文件中访问控制列表移除条目 |
-X | --remove-file=file 从文件读取访问控制列表条目并删除 |
-b | --remove-all 删除所有扩展访问控制列表条目 |
-k | --remove-default 移除默认访问控制列表 |
-d | --default 应用到默认访问控制列表的操作 |
-P | --physical 依照自然逻辑,不跟随符号链接 |
-v | --version 显示版本并退出 |
-R | --recursive 递归操作子目录 |
getfacl–显示文件或目录的ACL策略
getfacl命令来自于英文词组”get file access control list“的缩写,其功能是用于显示文件或目录的ACL策略。
语法格式:
getfacl [参数] 文件或目录
常用参数:
-a | 显示文件的ACL |
-d | 显示默认的ACL |
-c | 不显示注释标题 |
-e | 显示所有的有效权限 |
-E | 显示没有的有效权限 |
-s | 跳过文件,只具有基本条目 |
-R | 递归到子目录 |
-t | 使用表格输出格式 |
-n | 显示用户的UID和组群的GID |