5.1 用户身份与能力

管理员UID为0:系统的管理员用户。

系统用户UID为1~999: Linux系统为了避免因某个服务程序出现漏洞而被×××提权至整台服务器,默认服务程序会有独立的系统用户负责运行,进而有效控制被破坏范围。

普通用户UID从1000开始:是由管理员创建的用于日常工作的用户。UID是不能冲突的,而且管理员创建的普通用户的UID默认是从1000开始的(即使前面有闲置的号码)。

1.  useradd命令

  • useradd命令用于创建新的用户,格式为“useradd [选项] 用户名”。

  • 用useradd创建用户账户时,默认的家目录会被存放在/home目录中,默认的Shell解释器为/bin/bash,而且默认会创建一个与该用户同名的基本用户组。

  • useradd命令中的用户参数以及作用

参数 作用
-d 指定用户的家目录(默认为/home/username)
-e 账户的到期时间,格式为YYYY-MM-DD.
-u 指定该用户的默认UID
-g 指定一个初始的用户基本组(必须已存在)
-G 指定一个或多个扩展用户组
-N 不创建与用户同名的基本用户组
-s 指定该用户的默认Shell解释器

[root@linuxprobe ~]# useradd -d /home/linux -u 8888 -s /sbin/nologin linuxprobe #用户的解释器被设置为nologin,则代表该用户不能登录到系统中[root@linuxprobe ~]# id linuxprobeuid=8888(linuxprobe) gid=8888(linuxprobe) groups=8888(linuxprobe)

2.  groupadd命令

  • groupadd命令用于创建用户组,格式为“groupadd [选项] 群组名”。

[root@linuxprobe ~]# groupadd ronny #创建用户组

3.  usermod命令

  • usermod命令用于修改用户的属性,格式为“usermod [选项] 用户名”。

  • Linux系统中一切皆文件。用户的信息保存在/etc/passwd文件中,可以直接用文本编辑器来修改其中的用户参数项目,也可以用usermod命令修改已经创建的用户信息,诸如用户的UID、基本/扩展用户组、默认终端等。

  • usermod命令中的参数及作用

参数 作用
-c 填写用户账户的备注信息
-d -m 参数-m与参数-d连用,可重新指定用户的家目录并自动把旧的数据转移过去
-e 账户的到期时间,格式为YYYY-MM-DD
-g 变更所属用户组
-G 变更扩展用户组
-L 锁定用户禁止其登录系统
-U 解锁用户,允许其登录系统
-s 变更默认终端
-u 修改用户的UID

[root@linuxprobe ~]# id linuxprobeuid=1000(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe)[root@linuxprobe ~]# usermod -G root linuxprobe #使用-G将用户加入到扩展组中,基本组不受影响[root@linuxprobe ~]# id linuxprobeuid=1000(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe),0(root)[root@linuxprobe ~]# usermod -u 8888 linuxprobe #-u参数修改linuxprobe用户的UID号码值[root@linuxprobe ~]# id linuxprobeuid=8888(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe),0(root)

4.  passwd命令

  • passwd命令用于修改用户密码、过期时间、认证信息等,格式为“passwd [选项] [用户名]”。

  • 普通用户只能使用passwd命令修改自身的系统密码,而root管理员则有权限修改其他所有人的密码。

  • root管理员在Linux系统中修改自己或他人的密码时不需要验证旧密码。

  • passwd命令中的参数以及作用

参数 作用
-l 锁定用户,禁止其登录
-u 解除锁定,允许用户登录
--stdin 允许通过标准输入修改用户密码,如echo "NewPassWord" | passwd --stdin Username
-d 使该用户可用空密码登录系统
-e 强制用户在下次登录时修改密码
-S 显示用户的密码是否被锁定,以及密码所采用的加密算法名称
[root@linuxprobe ~]# passwd #修改当前用户密码Changing password for user root.New password:此处输入密码值Retype new password: 再次输入进行确认passwd: all authentication tokens updated successfully.[root@linuxprobe ~]# passwd -l linuxprobe #锁定用户,禁止登录Locking password for user linuxprobe.passwd: Success[root@linuxprobe ~]# passwd -S linuxprobe #查询用户密码是否被锁定linuxprobe LK 2017-12-26 0 99999 7 -1 (Password locked.)[root@linuxprobe ~]# passwd -u linuxprobe #解除用户锁定Unlocking password for user linuxprobe.passwd: Success[root@linuxprobe ~]# passwd -S linuxprobe #查询用户状态及加密算法linuxprobe PS 2017-12-26 0 99999 7 -1 (Password set, SHA512 crypt.)

5.  userdel命令

  • userdel命令用于删除用户,格式为“userdel [选项] 用户名”。

  • userdel命令的参数以及作用

参数 作用
-f 强制删除用户
-r 同时删除用户及用户家目录

[root@linuxprobe ~]# id linuxprobeuid=8888(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe),0(root)[root@linuxprobe ~]# userdel -r linuxprobe[root@linuxprobe ~]# id linuxprobeid: linuxprobe: no such user
5.2 文件权限与归属
  • Linux系统中常见的字符:

 -:普通文件。

d:目录文件。

l:链接文件。

b:块设备文件。

c:字符设备文件。

p:管道文件。

  • 文件和目录权限的理解:

    文件 目录
    可读(r)
    能够读取文件的实际内容 能够读取目录内的文件列表
    可写(w) 能够编辑、新增、修改、删除文件的实际内容 能够在目录内新增、删除、重命名文件
    可执行(x) 能够运行一个脚本程序 能够进入该目录

image.png

image.png

上图文件属性信息以此为:文件的类型、访问权限(属主,属组,其他)、所有者(属主)、所属组(属组)、占用的磁盘大小、修改时间和文件名称;

5.3 文件的特殊权限

1.  SUID

  • SUID是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。例如,所有用户都可以执行passwd命令来修改自己的用户密码,而用户密码保存在/etc/shadow文件中。仔细查看这个文件就会发现它的默认权限是000,也就是说除了root管理员以外,所有用户都没有查看或编辑该文件的权限。但是,在使用passwd命令时如果加上SUID特殊权限位,就可让普通用户临时获得程序所有者的身份,把变更的密码信息写入到shadow文件中。这很像我们在古装剧中见到的手持尚方宝剑的钦差大臣,他手持的尚方宝剑代表的是皇上的权威,因此可以惩戒贪官,但这并不意味着他永久成为了皇上。因此这只是一种有条件的、临时的特殊权限授权方法。

  • 查看passwd命令属性时发现所有者的权限由rwx变成了rws,其中x改变成s就意味着该文件被赋予了SUID权限。如果原先权限位上没有x执行权限,那么被赋予特殊权限后将变成大写的S。规则:rwx -> rws;rw- -> rwS。

[root@linuxprobe ~]# ls -l /etc/shadow----------. 1 root root 1004 Jan 3 06:23 /etc/shadow[root@linuxprobe ~]# ls -l /bin/passwd #所有者权限由rwx变为rws,使用"chmod u+s 对象"命令来设置-rwsr-xr-x. 1 root root 27832 Jan 29 2017 /bin/passwd

2.  SGID

  • SGID主要实现如下两种功能:

  1. 1.让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置);

  2. 2.在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。

  • SGID的第一种功能是参考SUID而设计的,不同点在于执行程序的用户获取的不再是文件所有者的临时权限,而是获取到文件所属组的权限。

[root@linuxprobe ~]# cd /tmp[root@linuxprobe tmp]# mkdir testdir[root@linuxprobe tmp]# ls -ald testdir/drwxr-xr-x. 2 root root 6 Feb 11 11:50 testdir/[root@linuxprobe tmp]# chmod -Rf 777 testdir/[root@linuxprobe tmp]# chmod -Rf g+s testdir/ #设置SGID特殊权限位[root@linuxprobe tmp]# ls -ald testdir/drwxrwsrwx. 2 root root 6 Feb 11 11:50 testdir/[root@linuxprobe tmp]# su - linuxprobeLast login: Wed Feb 11 11:49:16 CST 2017 on pts/0[linuxprobe@linuxprobe ~]$ cd /tmp/testdir/[linuxprobe@linuxprobe testdir]$ echo "linuxprobe.com" > test[linuxprobe@linuxprobe testdir]$ ls -al test-rw-rw-r--. 1 linuxprobe root 15 Feb 11 11:50 test
  • chmod命令是一个非常实用的命令,能够用来设置文件或目录的权限,格式为“chmod [参数] 权限 文件或目录名称”。

[root@linuxprobe ~]# ls -al test-rw-rw-r--. 1 linuxprobe root 15 Feb 11 11:50 test[root@linuxprobe ~]# chmod 760 test[root@linuxprobe ~]# ls -l test-rwxrw----. 1 linuxprobe root 15 Feb 11 11:50 test
  • chown命令,能够用来设置文件或目录的所有者和所属组,其格式为“chown [参数] 所有者:所属组 文件或目录名称”。

[root@linuxprobe ~]# ls -l test-rwxrw----. 1 linuxprobe root 15 Feb 11 11:50 test[root@linuxprobe ~]# chown root:bin test #设置所属者和所属组[root@linuxprobe ~]# ls -l test-rwxrw----. 1 root bin 15 Feb 11 11:50 test
  • chmod和chown命令有一个特别的共性,就是针对目录进行操作时需要加上大写参数-R来表示递归操作,即对目录内所有的文件进行整体操作。

  • chmod u+s temp -- 为temp文件加上set uid标志. (set uid 只对文件有效,u=用户)

    chmod g+s tempdir -- 为tempdir目录加上set gid标志 (set gid 只对目录有效,g=组名)
    chmod o+t temp -- 为temp文件加上sticky标志 (sticky只对文件有效)

3.  SBIT

  • SBIT(Sticky Bit)特殊权限位(也可以称之为特殊权限位之“粘滞位”或“保护位”)。SBIT特殊权限位可确保用户只能删除自己的文件,而不能删除其他用户的文件。换句话说,当对某个目录设置了SBIT粘滞位权限后,那么该目录中的文件就只能被其所有者执行删除操作了。

  • RHEL 7系统中的/tmp作为一个共享文件的目录,默认已经设置了SBIT特殊权限位,因此除非是该目录的所有者,否则无法删除这里面的文件。

  • 与前面所讲的SUID和SGID权限显示方法不同,当目录被设置SBIT特殊权限位后,文件的其他人权限部分的x执行权限就会被替换成t或者T,原本有x执行权限则会写成t,原本没有x执行权限则会被写成T。

[root@linuxprobe tmp]# su - linuxprobeLast login: Wed Feb 11 12:41:20 CST 2017 on pts/0[linuxprobe@linuxprobe tmp]$ ls -ald /tmpdrwxrwxrwt. 17 root root 4096 Feb 11 13:03 /tmp[linuxprobe@linuxprobe ~]$ cd /tmp[linuxprobe@linuxprobe tmp]$ ls -alddrwxrwxrwt. 17 root root 4096 Feb 11 13:03 .[linuxprobe@linuxprobe tmp]$ echo "Welcome to linuxprobe.com" > test[linuxprobe@linuxprobe tmp]$ chmod 777 test[linuxprobe@linuxprobe tmp]$ ls -al test -rwxrwxrwx. 1 linuxprobe linuxprobe 10 Feb 11 12:59 test[root@linuxprobe tmp]# su - blackshieldLast login: Wed Feb 11 12:41:29 CST 2017 on pts/1[blackshield@linuxprobe ~]$ cd /tmp[blackshield@linuxprobe tmp]$ rm -f testrm: cannot remove ‘test’: Operation not permitted #由于SBIT特殊权限位的缘故,所以无法删除该文件[root@linuxprobe tmp]# cd ~[root@linuxprobe ~]# mkdir linux[root@linuxprobe ~]# chmod -R o+t linux/ #使用参数o+t代表设置SBIT粘滞位权限[root@linuxprobe ~]# ls -ld linux/drwxr-xr-t. 2 root root 6 Feb 11 19:34 linux/

5.4 文件的隐藏属性

1.  chattr命令

  • chattr命令用于设置文件的隐藏权限,格式为“chattr [参数] 文件”。

  • 如果想要把某个隐藏功能添加到文件上,则需要在命令后面追加“+参数”,如果想要把某个隐藏功能移出文件,则需要追加“-参数”。

  • chattr命令中用于隐藏权限的参数及其作用

参数 作用
i 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件
a 仅允许补充(追加)内容,无法覆盖/删除内容(Append Only)
S 文件内容在变更后立即同步到硬盘(sync)
s 彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域)
A 不再修改这个文件或目录的最后访问时间(atime)
b 不再修改文件或目录的存取时间
D 检查压缩文件中的错误
d 使用dump命令备份时忽略本文件/目录
c 默认将文件或目录进行压缩
u 当删除该文件后依然保留其在硬盘中的数据,方便日后恢复
t 让文件系统支持尾部合并(tail-merging)
x 可以直接访问压缩文件中的内容

[root@linuxprobe ~]# echo "for Test" > linuxprobe[root@linuxprobe ~]# rm linuxproberm: remove regular file ‘linuxprobe’? y #上面创建文件后,可以成功删除[root@linuxprobe ~]# echo "for Test" > linuxprobe[root@linuxprobe ~]# chattr +a linuxprobe #给文件加上a参数[root@linuxprobe ~]# rm linuxproberm: remove regular file ‘linuxprobe’? yrm: cannot remove ‘linuxprobe’: Operation not permitted#加上a参数后,删除失败

2.  lsattr命令

  • lsattr命令用于显示文件的隐藏权限,格式为“lsattr [参数] 文件”。在Linux系统中,文件的隐藏权限必须使用lsattr命令来查看。

[root@linuxprobe ~]# ls -al linuxprobe #使用ls查看不到隐藏权限-rw-r--r--. 1 root root 9 Feb 12 11:42 linuxprobe[root@linuxprobe ~]# lsattr linuxprobe #使用lsattr查看隐藏权限-----a---------- linuxprobe[root@linuxprobe ~]# chattr -a linuxprobe #去掉参数a隐藏权限[root@linuxprobe ~]# lsattr linuxprobe ---------------- linuxprobe[root@linuxprobe ~]# rm linuxprobe #此时可以成功删除 rm: remove regular file ‘linuxprobe’? y

5.5 文件访问控制列表

  • 前文讲解的一般权限、特殊权限、隐藏权限其实有一个共性 — 权限是针对某一类用户设置的。

  • 如果希望对某个指定的用户进行单独的权限控制,就需要用到文件的访问控制列表(ACL)。通俗来讲,基于普通文件或目录设置ACL其实就是针对指定的用户或用户组设置文件或目录的操作权限。针对目录设置ACL,则目录中的文件会继承其ACL;针对文件设置ACL,则文件不再继承其所在目录的ACL。

[root@linuxprobe ~]# su - linuxprobeLast login: Sat Mar 21 16:31:19 CST 2017 on pts/0[linuxprobe@linuxprobe ~]$ cd /root-bash: cd: /root: Permission denied #linuxprobe用户没有进去/root权限[linuxprobe@linuxprobe root]$ exit

1.  setfacl命令

  • setfacl命令用于管理文件的ACL规则,格式为“setfacl [参数] 文件名称”。

  • 文件的ACL提供的是在所有者、所属组、其他人的读/写/执行权限之外的特殊权限控制,使用setfacl命令可以针对单一用户或用户组、单一文件或目录来进行读/写/执行权限的控制。

  • setfacl的参数列表

参数 作用
-R 针对目录需要使用递归参数
-m 针对普通文件
-b 删除某个文件的ACL

[root@linuxprobe ~]# setfacl -Rm u:linuxprobe:rwx /root #添加linuxprobe用户访问/root的ACL[root@linuxprobe ~]# su - linuxprobeLast login: Sat Mar 21 15:45:03 CST 2017 on pts/1[linuxprobe@linuxprobe ~]$ cd /root[linuxprobe@linuxprobe root]$ ls #可以成功进入/root目录,及访问里面的文件anaconda-ks.cfg Downloads Pictures Public[linuxprobe@linuxprobe root]$ cat anaconda-ks.cfg[linuxprobe@linuxprobe root]$ exit[root@linuxprobe ~]# ls -ld /root
[root@linuxprobe ~]# ls -ld /rootdr-xrwx--- 14 root root 4096 May 4 2017 /root #文件的权限最后一个点(.)变成了加号(+),这就意味着该文件已经设置ACL

2.  getfacl命令

  • getfacl命令用于显示文件上设置的ACL信息,格式为“getfacl 文件名称”。

[root@linuxprobe ~]# getfacl /root #使用getfacl命令查看在root家目录上设置的ACL信息getfacl: Removing leading '/' from absolute path names# file: root# owner: root# group: rootuser::r-xuser:linuxprobe:rwxgroup::r-xmask::rwxother::---

5.6 su命令与sudo服务
  • su命令用于在当前用户不退出登陆的情况下,顺畅地切换用户身份。

[root@linuxprobe ~]# id uid=0(root) gid=0(root) groups=0(root)[root@linuxprobe ~]# su - linuxprobe #使用su命令切换到linuxprobe普通用户,不需要验证密码Last login: Wed Jan 4 01:17:25 EST 2017 on pts/0[linuxprobe@linuxprobe ~]$ id uid=1000(linuxprobe) gid=1000(linuxprobe) groups=1000(linuxprobe) context=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
  • 上面的su命令与用户名之间有一个减号(-),这意味着完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。强烈建议在切换用户身份时添加这个减号(-)。

[linuxprobe@linuxprobe root]$ su root #切换到root用户,需要密码,会暴露root管理员的密码Password:[root@linuxprobe ~]# su - linuxprobeLast login: Mon Aug 24 19:27:09 CST 2017 on pts/0[linuxprobe@linuxprobe ~]$ exitlogout
  • sudo命令用于给普通用户提供额外的权限来完成原本root管理员才能完成的任务,格式为“sudo [参数] 命令名称”。

  • sudo服务中的可用参数以及作用

参数 作用
-h 列出帮助信息
-l 列出当前用户可执行的命令
-u 用户名或UID值 以指定的用户身份执行命令
-k 清空密码的有效时间,下次执行sudo时需要再次进行密码验证
-b 在后台执行指定的命令
-p 更改询问密码的提示语

  • sudo命令具有如下功能:

    1.限制用户执行指定的命令:

    2.记录用户执行的每一条命令;

    3.配置文件(/etc/sudoers)提供集中的用户管理、权限与主机等参数;

    4.验证密码的后5分钟内(默认值)无须再让用户再次验证密码。

  • 可以使用sudo命令提供的visudo命令来配置用户权限。这条命令在配置用户权限时将禁止多个用户同时修改sudoers配置文件,还可以对配置文件内的参数进行语法检查,并在发现参数错误时进行报错。

  • 使用visudo命令配置sudo命令的配置文件时,其操作方法与Vim编辑器中用到的方法一致,因此在编写完成后记得在末行模式下保存并退出(:wq)。

  • 只有root管理员才可以使用visudo命令编辑sudo服务的配置文件。

visudo: >>> /etc/sudoers: syntax error near line 111 <<
 [root@linuxprobe ~]# visudo 96 ## 97 ## Allow root to run any commands anywhere 98 root ALL=(ALL) ALL 99 linuxprobe ALL=(ALL) ALL #将第99行(大约)填写上指定的信息:谁可以使用  允许使用的主机=(以谁的身份)  可执行命令的列表

[root@linuxprobe ~]# su - linuxprobe #切换到linuxprobe用户,查看可执行的命令Last login: Thu Sep 3 15:12:57 CST 2017 on pts/1[linuxprobe@linuxprobe ~]$ sudo -l[sudo] password for linuxprobe: #此处输入linuxprobe用户的密码,但每次执行都要验证密码Matching Defaults entries for linuxprobe on this host:requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORSDISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATELC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARYLC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALLLANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",secure_path=/sbin\:/bin\:/usr/sbin\:/usr/binUser linuxprobe may run the following commands on this host:(ALL) ALL
[linuxprobe@linuxprobe ~]$ ls /rootls: cannot open directory /root: Permission denied[linuxprobe@linuxprobe ~]$ sudo ls /root #使用sudo后就可以查看root管理员的家目录(/root)中的文件信息anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures TemplatesDesktop Downloads Music Public Videos
  • 考虑到生产环境中只能赋予普通用户具体的命令以满足工作需求。如果需要让某个用户只能使用root管理员的身份执行指定的命令,切记一定要给出该命令的绝对路径,否则系统会识别不出来。我们可以先使用whereis命令找出命令所对应的保存路径,然后把配置文件中用户权限参数修改成对应的路径即可:

[linuxprobe@linuxprobe ~]$ exitlogout[root@linuxprobe ~]# whereis catcat: /usr/bin/cat /usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.gz[root@linuxprobe ~]# visudo 96 ## 97 ## Allow root to run any commands anywhere 98 root ALL=(ALL) ALL 99 linuxprobe ALL=(ALL) /usr/bin/cat #将改行可执行命令修改为对应的路径
[root@linuxprobe ~]# su - linuxprobeLast login: Thu Sep 3 15:51:01 CST 2017 on pts/1[linuxprobe@linuxprobe ~]$ cat /etc/shadowcat: /etc/shadow: Permission denied[linuxprobe@linuxprobe ~]$ sudo cat /etc/shadow #再次切换到普通用户,使用sudo就可以成功执行命令root:$6$GV3UVtX4ZGg6ygA6$J9pBuPGUSgZslj83jyoI7ThJla9ZAULku3BcncAYF00Uwk6Sqc4E36MnD1hLtlG9QadCpQCNVJs/5awHd0/pi1:16626:0:99999:7:::bin:*:16141:0:99999:7:::daemon:*:16141:0:99999:7:::adm:*:16141:0:99999:7:::………………省略部分文件内容………………

[linuxprobe@linuxprobe ~]$ exitlogout[root@linuxprobe ~]# whereis poweroffpoweroff: /usr/sbin/poweroff /usr/share/man/man8/poweroff.8.gz[root@linuxprobe ~]# visudo 96 ## 97 ## Allow root to run any commands anywhere 98 root ALL=(ALL) ALL 99 linuxprobe ALL=NOPASSWD: /usr/sbin/poweroff #添加NOPASSWD参数,这样用户执行sudo命令时不再需要密码验证

[root@linuxprobe ~]# su - linuxprobeLast login: Thu Sep 3 15:58:31 CST 2017 on pts/1[linuxprobe@linuxprobe ~]$ poweroffUser root is logged in on seat0.Please retry operation after closing inhibitors and logging out other users.Alternatively, ignore inhibitors and users with 'systemctl poweroff -i'.[linuxprobe@linuxprobe ~]$ sudo poweroff