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) 能够运行一个脚本程序 能够进入该目录
上图文件属性信息以此为:文件的类型、访问权限(属主,属组,其他)、所有者(属主)、所属组(属组)、占用的磁盘大小、修改时间和文件名称;
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.让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置);
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