用户身份
root用户是存在于所有类UNIX操作系统中的超级用户,它拥有最高的系统所有权。root用户的用户身份号码UID为0,UID相当于用户的身份证号码一样,具有唯一性。管理员用户(超级用户)UID为0;系统用户UID为1~999(不同的系统不一样),Linux系统为了避免因某个服务程序出现漏洞而被黑客提权至整个服务器,默认服务会有独立的系统用户负责运行,进而有效控制被破坏的范围(windows是单用户操作系统,一旦该用户被入侵,则有权限对整个环境进行操作),系统用户只是用来管理某一项具体的服务,因此不需要登陆该系统服务器中,其终端解释器为/sbin/nologin,因此该用户被入侵时,并不能提权至整台服务器;普通用户的UID从1000开始(即使前面有闲置的号码),是由管理员创建的日常工作的用户。
用户组分为基本用户组(-g)和扩展用户组(-G)。用户组身份号码GID可以把多个用户加入到同一个组中,从而方便为组中的用户统一规划权限或指定任务。创建每个用户时,将自动创建一个与其同名的基本用户组,而且这个基本用户组只有该用户一个人。如果该用户被纳入其它用户组,则这个其它用户组称之为扩展用户组。一个用户只能拥有一个基本用户组,可以拥有多个扩展用户组。 用id命令可以查看:用户的用户身份号码(用户名);基本用户组身份号码(基本用户组名);扩展用户组身份号码(扩展用户组名)。在默认情况下,基本用户组名与用户名一样,除非自己指定。
useradd命令 用于创建新的普通用户,该命令创建的用户目录默认会存放在/home目录中,默认的shell解释器为/bin/bash,而且会默认创建一个与其同名的基本用户组。 -d 指定家目录 -u指定用户的UID -g指定一个基本用户组(必须是存在的组,没有就要创建) -G指定扩展用户组 -N不创建与用户同名的基本用户组 -s指定用户的shell解释器 useradd -d /home/linux -u 8888 -s /sbin/nologin linuxprobe 创建了一个名为linuxprobe的用户 # id linuxprobe 输出为:uid=8888(linuxprobe) gid=8888(linuxprobe) groups=8888(linuxprobe) 此时用户只有基本用户组(名字为linuxprobe),没有扩展用户组
groupadd命令 用于创建组(基本或者扩展) groupadd zsx 创建一个名为zsx的组
usermod命令 修改用户的属性 用户的信息保存在/etc/passwd文件中,可以直接用文本编辑器来修改其中的用户参数项目,也可以用usermod命令来修改已经创建的用户信息,如用户的UID、基本/扩展用户组、默认终端等。-g 变更基本用户组 -G 变更扩展用户组 -s变更默认终端 -u修改用户的UID usermod -G root linuxprobe 增加扩展用户组root, 则id查看信息为: uid = 8888 (linuxprobe) gid=8888 (linuxprobe) groups=8888(linuxprobe),0(root) 可见其扩展用户组名为root,扩展用户组身份号码为0。这里在次变更: usermod -G zsx linuxprobe 变为: uid=8888(linuxprobe) gid= 8888 (linuxprobe) groups = 8888(linuxprobe) ,1001(zsx)
passwd命令 passwd命令用于修改用户的密码,格式:passwd 用户名 仅仅只有passwd,则为修改自己的密码。 -l 锁定用户,禁止其登陆 -u解除锁定,允许其登陆 passwd -l luciusvorenus --stdin 允许通过管道符方式来设定用户密码 echo "zsx" | passwd --stdin luciusvorenus
userdel命令 删除用户 userdel linuxprobe 删除该用户,但是家目录/home/linuxprobe会保留下来,可添加-r参数,连同家目录一起删除 -f 强制删除用户
文件权限与归属
-为普通文件(一般文件、文本文件);d为目录文件;l为软链接文件;b为块设备文件;c为字符设备文件(设备文件为硬件映射形成的文件,如硬盘等);p为管道文件;s为socket文件。
文件的所有者(所属主)、所属组和其它用户对该文件所拥有的可读(r,4)、可写(w,2)和可执行(x,1)等权限。对目录文件来说,可读表示能够读取目录内的文件列表;可写表示能够在目录内新增、删除和重命名 文件;可执行表示能够进入该目录。 文件的权限表示:rwxrw-r-- 用数字表示则为: 764 -rwxr--r--. 1 root root 206 Sep 29 21:24 ex.sh 该文件为普通文件,所属主(所有者)为root用户,拥有7权限;所属组为root,拥有4权限;其他用户拥有权限4。所属主前面的数字1代表该文件的硬链接数(即实际指针的文件个数,软链接不算)为1个。该文件的磁盘占用大小为206个字节,最后一次修改的时间为9月29日的21:24分,文件的名称为ex.sh。
SUID特殊权限位(u+s)
SUID、SGID和SBIT的特殊权限位,是一种对文件进行设置的特殊功能,可以与一般权限同时使用,以弥补一般权限不能实现的功能。SUID拥有权限4,SGID拥有权限2,SBIT拥有权限1。rwsrwSrw-用数字表示为:其一般权限为rwxrw-rw-,即为766,载加上特殊权限,则为6766。第一个6为4+2。SUDI特殊权限位仅对拥有执行权限的二进制程序有效,即当用户执行该二进制程序时,可以临时拥有该二进制程序所属主(所有者)的身份。对于/etc/passwd -rw-r--r--. 1 root root 1926 Sep 29 21:50 /etc/passwd 除了root管理员之外,其余所有用户都只能读取该文件信息,不能修改;对于/etc/shadow(保存了用户的密码)
----------. 1 root root 1990 Sep 29 18:48 /etc/shadow 除了root用户外,其余任何用户都不能读取、修改该文件; 对于passwd命令文件:-rwsr-xr-x. 1 root root 27832 Jan 29 2014 /bin/passwd 该文件是二进制程序文件,所有用户都可以执行该文件,因此任何一个用户执行该文件时,都会临时获得该文件所属主的身份,即root身份,进一步利用该身份可以取修改/etc/shadow和/etc/passwd文件的信息了(把变更的密码信息写到/etc/shadow文件中)。 rwx变为rws rw-变为rwS 后面一样 rwt rwT
SGID特殊权限位(g+s)
SGID特殊权限位实现两种功能:1.让执行者临时拥有属组的权限(身份)(仅对拥有执行权限的二进制程序有效);2.对目录文件进行设置时,在该目录文件中创建的文件自动继承该目录的用户组(只可以对目录设置)。对于/dev/kmem文件(早期的linux系统才会有):cr--r----- 1 root system 2, 1 Feb 11 2017 kmem 该文件为字符设备文件,只有root用户和system组内的用户才可以读取该文件,其余用户不能访问。ps命令文件: -rwxr-sr-x. 1 bin system 100120 Feb 27 2014 /usr/bin/ps 该文件为二进制程序,当任何一个用户执行该文件时,可以临时获得所属组的身份(system),从而可以读取kmem文件中的信息,获得系统中所有进程的状态信息。利用SGID特殊权限位,可以为一个部门内部所有用户设置一个共享目录,即首先将所有用户划分为一个组,然后设置这个目录的用户组就为该部门成员所在的那个组:# mkdir /tmp/haha drwxrwxr-x. 2 root root 6 Mar 5 15:46 haha 可以看出该目录文件的用户组为root,则root组内的用户都可以该目录读、写和执行。赋予该目录SGID特殊权限位: chmod g+s /tmp/haha 则:drwxrwsr-x. 2 root root 6 Mar 5 15:46 haha 则root组内任何一个用户在该目录内部创建文件时,创建的文件的所属组都为root,从而该文件能够被组内所有用户访问,即实现了组内用户的共享目录。 注意:在对目录设置SGID权限之前目录内的所有文件的所属组在设置SGID权限后不会发生变化。比如:chown root:bin /tmp/haha 此后,创建的文件的所属组为bin 之前的文件依然为root 在默认情况下,一个用户创建的文件的所属主为该用户,所属组为该用户的基本用户组。一个用户的基本用户组只有该用户一个成员,且默认情况下组名与用户名相同。 当创建或传送一个文件,这个文件的所属主就为执行这个操作的用户。
chmod和chown命令
chmod命令用于设置一个文件的权限位,包括一般权限和特殊权限。对于文件zs,所有者可读可写可执行,对于所属组可读可写,对于其它用户没有任何权限,即rwxrw----,其对应的数字为760,则:chmod 760 zs 要设置为:rwsrw----,则: chmod 4760 zs chown命令用于设置文件的所有者和所属组。其格式为:chown 所有者:所属组 文件或目录名称 chown bin:root zs 设置zs文件的所有者为bin,所属组为root
SUID特殊权限位的设置: chmod u+s 文件名称(仅对可执行的二进制程序文件有效)
SGID特殊权限位的设置: chmod g+s 文件名称(仅对可执行的二进制程序文件有效)
chmod g+s 目录名称(仅对目录文件有效)
SBIT特殊权限位的设置: chmod o+t 目录名称
共性:chmod与chown命令在对目录文件进行操作时,加上-R参数表示递归操作,即对目录内所有的文件进行整体操作。不加-R参数,只是对目录进行设置。
u 代表所属主 g代表所属组 o代表其它用户 a代表全部用户, 如 chmod u+x ex.sh 表示对ex.sh文件的所属主增加执行权限(x)。 r w x s t 也可以用字母指明,可以不用数字 chmod +x file 和 chmod a+x file等价。
SBIT特殊权限位(o+t) 仅对目录设置
对于一个共享目录,在设置了SGID特殊权限位后,该目录及目录内部创建的所有文件的用户组都为该部门成员。为了防止一个人的文件被其他用户删除,则可以设置SBIT特殊权限位。SBIT特殊权限位可以确保用户只能删除自己的文件,不能删除他人的文件(root用户除外),即只能被文件的所有者执行删除操作。 如RHEL7系统中的/tmp为一个共享目录,默认已经设置好了SBIT特殊权限位: drwxrwxrwt. 61 root root 4096 Oct 6 22:35 /tmp 则,在该目录中创建的文件只能够被该文件的所有者和root用户删除,其余人都没有权限删除。 即使该文件的权限最大(777),且目录允许进行读、写和执行,但还是无法删除该文件。
另外需要注意,一个文件能否被删除不取决于自身的权限,而取决于其所在目录是否有写入权限。如 /tmp/haha目录: drwxr-sr-x. 2 root root 16 Mar 5 16:18 haha 可见对与该文件,只有root用户有写入权限,即新增、重命名和删除目录内的文件,其它任何用户都不能在该目录内部创建、删除或者重命名文件,只能进入该目录和读取该目录内部的文件列表。 chmod 775 haha 则:drwxrwsr-x. 2 root root 6 Mar 5 16:43 haha 则此时root组内成员增加了写权限,而账户zsx为root组内成员,此时zsx用户可以在目录内部新增、重命名和删除文件。 综上,对文件的删除、新增和重命名并不取决于文件本身,而是取决于文件所在的目录。 chmod o+t /tmp/zsx
文件的隐藏权限
文件被隐藏起来的权限,默认情况下不能被用户察觉。
chattr命令用于设置(增加或删除)文件的隐藏权限: chattr +参数 filename 增加隐藏权限 chattr -参数 filename 删除隐藏权限 i 无法对文件进行修改(本身无法删除,内容无法修改),对于目录文件,仅能修改其中的子文件内容,不能新建或删除文件。 a 仅允许补充(追加)内容,不能覆盖/删除内容,也不能删除该文件或对文件重命名。 chattr +a zs 此时zs文件所在的目录即使开放了用户可以删除文件的权限,但是该文件依然不能删除,因为设置了隐藏权限。 移出: chattr -a zs lsattr filename 用于查看文件的隐藏权限 ls命令是无法查看文件的隐藏权限的。
文件访问控制列表ACL
用于对某个指定的用户(u)或用户组(g)进行单独的权限设置,基于普通文件或者目录文件设置ACL其实就是针对指定的用户或用户组设置文件或目录的操作权限。如果针对目录设置了ACL且采用了-R参数,则目录中的文件会继承其ACL;若针对文件设置了ACL,则文件不再继承其所在目录的ACL。
setfacl命令 用于设置文件的ACL(文件访问控制列表),对于普通文件采用-m参数即可;对于目录文件若采用-m参数,则仅仅只是对目录文件进行ACL的设置,对目录内的其余文件没有影响(注意,必须清晰目录权限与目录内部文件的权限之间的区别与联系,严格遵守),若采用-Rm参数,则对目录和目录内部所有文件都设置ACL,即对于某个特定的用户或用户组有哪些权限,如果目录内部已经有文件设置了ACL,则该文件不再继承目录的ACL。setfacl -b filename 用于删除对文件已经设置好了的ACL。下面示例:
setfacl -m u:zsx:rx /root
setfacl -Rm u:zsx:rwx /root/work/ 对/root/work目录设置ACL u指定用户 g指定用户组
getfacl guess.sh guess.h文件是该目录内部的文件,可见该文件继承了目录的ACL
# file: guess.sh 文件名
# owner: root 所属主
# group: root 所属组
user::rw-
user:zsx:rwx
group::r--
mask::rwx 有效权限
other::r--
注意:zsx用户要能进入到/root/work目录,还必须对/root目录也要设置ACL(上面第一条),若只是
对/root/work目录进行设置,仍然进入不了该目录。
getfacl /root/
# file: root/
# owner: root
# group: root
user::r-x
user:zsx:r-x
group::r-x
mask::r-x
other::---
getfacl /root/Desktop/
# file: root/Desktop/
# owner: root
# group: root
user::rwx
group::r-x
other::r-x 可见目录Desktop/并没有继承目录/root的ACL,因为上面没有使用-R参数
setfacl -b /root/
getfacl /root/
# file: root/
# owner: root
# group: root
user::r-x
group::r-x
other::--- 可见已经删除了ACL
setfacl -m g:wheel:rwx work/ 针对wheel用户组设置权限
getfacl work/
# file: work/
# owner: root
# group: root
user::rwx
group::r-x
group:wheel:rwx
mask::rwx
other::r-x
getfacl命令 可以查看文件的所属主、所属组、各种权限和ACL权限。如查看/root目录:
getfacl /root/
# file: root/
# owner: root
# group: root
user::r-x 所属主权限
group::r-x 所属组权限
other::--- 其它用户权限
如查看/root/work/:
getfacl work/
# file: work/
# owner: root
# group: root
user::rwx
group::r-x
group:wheel:rwx
mask::rwx 有效权限
other::r-x
dr-xr-x---+ 17 root root 4096 Mar 5 15:12 /root 采用ls命令可以查看文件是否设置了ACL,.号会变为+号。但是这也不是绝对的,如果文件的ACL是继承了目录的,那么用ls命令查看其属性依然为.号,因此查看一个文件是否设置ACL,最准确的方法是使用getfacl命令。注意:某个用户或用户组的权限并不是只根据ACL配置来决定的,它是由该用户或用户组基本权限与配置的ACL权
限的“与”运算决定的,即other:r-x 与 wheel:rwx = wheel:r-x 即实质上wheel组内的用户对该目录(上面的/root/work/目录)只有读和执行权限。对于有效权限mask:用户或组所设置的权限必须要存在于mask的权限设置范围内才会生效,否则无效。设置mask
的方法: setfacl -m m:w filenanme 即设置文件filename的有效权限mask为w(写)。
su命令与sudo服务(visudo)
su命令可以解决切换用户身份的要求。 su与su -是有区别的,前者只是切换了身份,但Shell环境仍然是原来用户的Shell(环境不变);而后者连用户和Shell环境一起切换成新用户身份了。只有切换了Shell环境才不会出现PATH环境变量错误。
sudo命令可以把特定命令的执行权限赋予给指定用户,这样既可以保证普通用户完成特定的工作,又可以避免密码的泄漏。sudo服务的配置原则:在保证普通用户完成工作的前提下,应当尽量少赋予额外的权限。格式:sudo 命令名称
sudo命令具有如下功能:限制用户执行指定的命令;记录用户执行的每一条命令;配置文件/etc/sudoers提供集中的用户管理、权限与主机等参数;验证密码的后5分钟内(默认值)无需再让用户再次验证密码。
对于/etc/sudoers文件:-r--r-----. 1 root root 4000 Jan 15 2014 /etc/sudoers 可以看出,只有只有管理员用户才可以对该配置文件进行修改,管理员和root组用户可以对该文件查看。 sudo命令文件:---s--x--x. 1 root root 130712 Feb 26 2014 /usr/bin/sudo 该文件具有SUID特殊权限位,即任何用户利用sudo命令都可以临时获得root管理员的身份,从而可以读取和修改配置文件/etc/sudoers。如果担心直接修改配置文件/etc/sudoers会出现问题,也可以使用sudo命令提供的visudo命令来配置用户权
限,该命令在配置用户权限时将禁止多个用户同时修改sudoers配置文件,还可以对配置文件内参数进行语法检查,并在发现参数错误时进行报错。只有root管理员才可以使用visudo命令编辑sudo服务的配置文件。visudo命令配置sudo命令的配置文件/etc/sudoers时,其操作方法与Vim编辑器中用到的方法相同。综上,sudo命令文件的服务配置文件为/etc/sudoers,可以直接进行编辑,也可以使用visudo命令进入编辑。
sudo -h 列出帮助信息 sudo -l列出当前用户可以执行的命令 # visudo
(大约第99行:)
root ALL=(ALL) ALL //可以再下面接着添加(配置)某个用户的限制命令
谁可以使用 允许使用的主机=(以谁的身份) 可以执行的命令(必须用绝对路径)
luciusvorenus ALL=(ALL) /usr/bin/ls 允许使用的主机: 外部网络或者内部网络登陆进入系统,当采用ALL时,无论是本地还是远程登陆的主机都可以允许使用规定的服务。
以谁的身份:ALL代表可以以任何用户的身份,相当于root。 (ALL)=(root)
如果有多个命令,则命令之间用逗号进行间隔。在进行了以上配置以后,luciusvorenus用户使用:sudo ls命令就相当于root用户使用ls命令了,可以查看/root目录内的内容等(初次使用sudo需要luciusvorenus用户的密码,默认时间为5分钟,5分钟内无需再让用户再次验证密码),如下:
# ls /root
ls: cannot open directory /root: Permission denied
# sudo ls /root
[sudo] password for luciusvorenus:
anaconda-ks.cfg Desktop Documents Downloads gongxiang initial-setup-ks.cfg Music Pictures
Public Templates Videos work 为了避免用户在输入 sudo 命令 时频繁的验证用户的密码,可以将上面那一行内容改为如下内容:
luciusvorenus ALL=(ALL) NOPASSWD: /usr/bin/ls