Linux系统中,是通过UID来判断用户身份的。
在Linux系统中创建每个用户时,将自动创建一个与其同名的基本用户组,而且这个基本用户组只有该用户一个人。如果该用户以后被归纳入其他用户组,则这个其他用户组称之为扩展用户组。一个用户只有一个基本用户组,但是可以有多个扩展用户组。通过使用用户组号码(GID,Group IDentification),我们可以把多个用户加入到同一个组中。
useradd命令用于创建新的用户,格式为“useradd [选项] 用户名”。
useradd命令中的用户参数以及作用:
参数 | 作用 |
---|---|
-d |
指定用户的家目录(默认为/home/username) |
-e |
账户的到期时间,格式为YYYY-MM-DD. |
-u |
指定该用户的默认UID |
-g |
指定一个初始的用户基本组(必须已存在) |
-G |
指定一个或多个扩展用户组 |
-N |
不创建与用户同名的基本用户组 |
-s |
指定该用户的默认Shell解释器 |
代码演示:
#创建指定家目录和shell解释器的用户linux,默认解释器被设置为/bin/nologin,则该用户无法登录系统
[root@localhost ~]# useradd -d /home/linux -u 8888 -s /sbin/nologin linux
[root@localhost ~]# id linux
uid=8888(linux) gid=8888(linux) groups=8888(linux)
groupadd命令用于创建用户组,格式为“groupadd [选项] 群组名”。
代码演示:
#创建一个名为admin的用户组
[root@localhost ~]# groupadd admin
usermod命令用于修改用户的属性,格式为“usermod [选项] 用户名”。
usermod命令中的参数及作用:
参数 | 作用 |
---|---|
-c |
填写用户账户的备注信息 |
-d -m |
两个参数连用,可重新指定用户的家目录并自动把旧的数据转移过去 |
-e |
账户的到期时间,格式为YYYY-MM-DD |
-g |
变更所属用户组 |
-G |
变更扩展用户组 |
-L |
锁定用户禁止其登录系统 |
-U |
解锁用户,允许其登录系统 |
-s |
变更默认终端 |
-u |
修改用户的UID |
代码演示:
#查看账户linux的默认信息:
[root@localhost ~]# id linux
uid=1000(linux) gid=1000(linux) groups=1000(linux)
#将用户linux加入到root用户组中
[root@localhost ~]# usermod -G root linux
[root@localhost ~]# id linux
uid=1000(linux) gid=1000(linux) groups=1000(linux),0(root)
#修改linux用户的UID号码值
[root@localhost ~]# usermod -u 8888 linux
[root@localhost ~]# id linux
uid=8888(linux) gid=1000(linux) groups=1000(linux),0(root)
passwd命令用于修改用户密码,格式为“passwd [选项] [用户名]”。
passwd命令中的参数以及作用:
参数 | 作用 |
---|---|
-l |
锁定用户,禁止其登录 |
-u |
解除锁定,允许用户登录 |
--stdin |
允许通过标准输入修改用户密码 |
-d |
使该用户可用空密码登录系统 |
-e |
强制用户在下次登录时修改密码 |
-S |
显示用户的密码是否被锁定,以及密码所采用的加密算法名称 |
代码演示:
#修改自己的密码
[root@localhost ~]# passwd
Changing password for user root.
New password:此处输入密码值
Retype new password: 再次输入进行确认
passwd: all authentication tokens updated successfully.
#修改其他用户的密码
[root@localhost ~]# passwd linux
Changing password for user linux.
New password:此处输入密码值
Retype new password: 再次输入进行确认
passwd: all authentication tokens updated successfully.
[root@localhost ~]# passwd -l linux #锁定用户
Locking password for user linux.
passwd: Success
[root@localhost ~]# passwd -S linux #查看用户密码信息
linux LK 2017-12-26 0 99999 7 -1 (Password locked.)
[root@localhost ~]# passwd -u linux #解除锁定
Unlocking password for user linux.
passwd: Success
[root@localhost ~]# passwd -S linux #查看用户密码信息
linux PS 2017-12-26 0 99999 7 -1 (Password set, SHA512 crypt.)
userdel命令用于删除用户,格式为“userdel [选项] 用户名”。
userdel命令的参数以及作用:
参数 | 作用 |
---|---|
-f |
强制删除用户 |
-r |
同时删除用户及用户家目录 |
代码演示:
[root@localhost ~]# id linux
uid=8888(linux) gid=1000(linux) groups=1000(linux),0(root)
[root@localhost ~]# userdel -r linux #删除用户及其家目录
[root@localhost ~]# id linux
id: linux: no such user
Linux系统使用了不同的字符来区分不同的文件类型,如下:
- :普通文件。
d:目录文件。
l :链接文件。
b:块设备文件。
c:字符设备文件。
p:管道文件。
在Linux系统中,每个文件都有所属的所有者和所有组,并且规定了文件的所有者、所有组以及其他人对文件所拥有的可读(r)、可写(w)、可执行(x)等权限。
对于一般文件来说:
对目录文件来说:
文件的读、写、执行权限可以简写为rwx,亦可分别用数字4、2、1来表示;
文件所有者,所属组及其他用户权限之间无关联,如下图表中所示:
文件权限的数字法表示基于字符表示(rwx)的权限计算而来,其目的是简化权限的表示。
例如,若某个文件的权限为7则代表可读、可写、可执行(4+2+1);若权限为6则代表可读、可写(4+2)。
在上图中,包含了文件的类型、访问权限、所有者(属主)、所属组(属组)、占用的磁盘大小、修改时间和文件名称等信息。
通过分析可知,该文件的类型为普通文件,所有者权限为可读、可写(rw-),所属组权限为可读(r–),除此以外的其他人也只有可读权限(r–),文件的磁盘占用大小是34298字节,最近一次的修改时间为4月2日的凌晨23分,文件的名称为install.log。
SUID是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。
在Linux系统中,用户密码被保存在 /etc/shadow 文件中,查看该文件信息可知,/etc/shadow文件的权限为000,即只有root用户可编辑。对 /etc/passwd 赋予SUID权限,当普通用户使用该命令时,可以临时获得root用户的权限,使得普通用户也可修改自己的密码。
[root@localhost ~]# ls -l /etc/shadow
----------. 1 root root 1004 Jan 3 06:23 /etc/shadow
[root@localhost ~]# ls -l /bin/passwd
-rwsr-xr-x. 1 root root 27832 Jan 29 2017 /bin/passwd
SGID主要实现如下两种功能:
让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置);
在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。
SGID的第一种功能是参考SUID而设计的,不同点在于执行程序的用户获取的不再是文件所有者的临时权限,而是获取到文件所属组的权限。举例来说,在早期的Linux系统中,/dev/kmem是一个字符设备文件,用于存储内核程序要访问的数据,权限为:
cr--r----- 1 root system 2, 1 Feb 11 2017 kmem
除了root管理员或属于system组成员外,所有用户都没有读取该文件的权限。由于在平时我们需要查看系统的进程状态,为了能够获取到进程的状态信息,可在用于查看系统进程状态的ps命令文件上增加SGID特殊权限位。查看ps命令文件的属性信息:
-r-xr-sr-x 1 bin system 59346 Feb 11 2017 ps
这样一来,由于ps命令被增加了SGID特殊权限位,所以当用户执行该命令时,也就临时获取到了system用户组的权限,从而可以顺利地读取设备文件了。
SGID的第二个功能,可以使得在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。
代码演示:
#进入/tmp目录,新建testdir目录,赋予SGID权限
[root@localhost ~]# cd /tmp
[root@localhost tmp]# mkdir testdir
[root@localhost tmp]# ls -ald testdir/
drwxr-xr-x. 2 root root 6 Feb 11 11:50 testdir/
[root@localhost tmp]# chmod -Rf 777 testdir/
[root@localhost tmp]# chmod -Rf g+s testdir/
[root@localhost tmp]# ls -ald testdir/
drwxrwsrwx. 2 root root 6 Feb 11 11:50 testdir/
#切换到普通用户,进入/tmp/testdir目录,创建文件,查看权限
[root@localhost tmp]# su - linux
Last login: Wed Feb 11 11:49:16 CST 2017 on pts/0
[linux@localhost ~]$ cd /tmp/testdir/
[linux@localhost testdir]$ echo "www.linuxprobe.com" > test
[linux@localhost testdir]$ ls -al test
-rw-rw-r--. 1 linux root 15 Feb 11 11:50 test #新建文件的属组为root组
chmod命令能够用来设置文件或目录的权限,格式为“chmod [参数] 权限 文件或目录名称”。
代码演示:
[rootlocalhost ~]# ls -al test
-rw-rw-r--. 1 linux root 15 Feb 11 11:50 test
[rootlocalhost ~]# chmod 760 test #根据数字表示法设置文件权限
[rootlocalhost ~]# ls -l test
-rwxrw----. 1 linux root 15 Feb 11 11:50 test
chown命令可以设置文件或目录的所有者和所属组,格式为“chown [参数] 所有者:所属组 文件或目录名称”。
代码演示:
[rootlocalhost ~]# ls -l test
-rwxrw----. 1 linux root 15 Feb 11 11:50 test
[rootlocalhost ~]# chown root:bin test #更改文件属主和属组
[rootlocalhost ~]# ls -l test
-rwxrw----. 1 root bin 15 Feb 11 11:50 test
chmod和chown命令是用于修改文件属性和权限的最常用命令,它们还有一个特别的共性,就是针对目录进行操作时需要加上大写参数-R来表示递归操作,即对目录内所有的文件进行整体操作。
SBIT特殊权限位可确保用户只能删除自己的文件,而不能删除其他用户的文件。
代码演示:
#/tmp目录默认被添加了SBIT权限
[root@localhost ~]# ls -ald /tmp
drwxrwxrwt. 17 root root 4096 Feb 11 13:03 /tmp
#创建目录,并对其添加SBIT权限
[root@localhost ~]# mkdir linux
[root@localhost ~]# chmod -R o+t linux/
[root@localhost ~]# ls -ld linux/
drwxr-xr-t. 2 root root 6 Feb 11 19:34 linux/
chattr命令用于设置文件的隐藏权限,格式为“chattr [参数] 文件”。
如果想要把某个隐藏功能添加到文件上,则需要在命令后面追加“+参数”;
如果想要把某个隐藏功能移出文件,则需要追加“-参数”。
chattr命令中用于隐藏权限的参数及其作用:
参数 | 作用 |
---|---|
i |
无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件 |
a |
仅允许补充(追加)内容,无法覆盖/删除内容(Append Only) |
S |
文件内容在变更后立即同步到硬盘(sync) |
s |
彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域) |
A |
不再修改这个文件或目录的最后访问时间(atime) |
b |
不再修改文件或目录的存取时间 |
D |
检查压缩文件中的错误 |
d |
使用dump命令备份时忽略本文件/目录 |
c |
默认将文件或目录进行压缩 |
u |
当删除该文件后依然保留其在硬盘中的数据,方便日后恢复 |
t |
让文件系统支持尾部合并(tail-merging) |
x |
可以直接访问压缩文件中的内容 |
代码演示:
#创建普通文件并删除
[root@localhost ~]# echo "for Test" > test
[root@localhost ~]# rm test
rm: remove regular file ‘test’? y
#创建普通文件,为其添加不允许删除与覆盖权限,尝试删除
[root@localhost ~]# echo "for Test" > test
[root@localhost ~]# chattr +a test
[root@localhost ~]# rm test
rm: remove regular file ‘test’? y
rm: cannot remove ‘test’: Operation not permitted
lsattr命令用于显示文件的隐藏权限,格式为“lsattr [参数] 文件”。
在Linux系统中,文件的隐藏权限必须使用lsattr命令来查看。
代码演示:
#ls命令无法显示出文件的隐藏权限
[root@localhost ~]# ls -al test
-rw-r--r--. 1 root root 9 Feb 12 11:42 test
#lsattr查看文件的隐藏权限
[root@localhost ~]# lsattr test
-----a---------- test
[root@localhost ~]# chattr -a test # - 移除文件的隐藏权限
[root@localhost ~]# lsattr test
---------------- test
[root@localhost ~]# rm test
rm: remove regular file ‘test’? y
如果希望对某个指定的用户进行单独的权限控制,就需要用到文件的访问控制列表(ACL)了。通俗来讲,基于普通文件或目录设置ACL其实就是针对指定的用户或用户组设置文件或目录的操作权限。另外,如果针对某个目录设置了ACL,则目录中的文件会继承其ACL;若针对文件设置了ACL,则文件不再继承其所在目录的ACL。
#未对/root目录设置ACL
[root@localhost ~]# su - linux
Last login: Sat Mar 21 16:31:19 CST 2017 on pts/0
[linux@localhost ~]$ cd /root
-bash: cd: /root: Permission denied
[linux@localhost root]$ exit
setfacl命令用于管理文件的ACL规则,格式为“setfacl [参数] 文件名称”。
文件的ACL提供的是在所有者、所属组、其他人的读/写/执行权限之外的特殊权限控制。使用setfacl命令可以针对单一用户或用户组、单一文件或目录来进行读/写/执行权限的控制。部分规则如下:
代码演示:
#对linux用户在/root目录上设置ACL规则
[root@localhost ~]# setfacl -Rm u:linux:rwx /root
[root@localhost ~]# su - linux
Last login: Sat Mar 21 15:45:03 CST 2017 on pts/1
[linux@localhost ~]$ cd /root
[linux@localhost root]$ ls
anaconda-ks.cfg Downloads Pictures Public
[linux@localhost root]$ cat anaconda-ks.cfg
[linux@localhost root]$ exit
#查看文件权限,最后的"."变成了"+",意味着该文件已经设置了ACL
[root@localhost ~]# ls -ld /root
dr-xrwx---+ 14 root root 4096 May 4 2017 /root
getfacl命令用于显示文件上设置的ACL信息,格式为“getfacl 文件名称”。
#使用getfacl命令显示在/root目录上设置的所有ACL信息。
[root@localhost ~]# getfacl /root
getfacl: Removing leading '/' from absolute path names
# file: root
# owner: root
# group: root
user::r-x
user:linux:rwx
group::r-x
mask::rwx
other::---
su命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺畅地切换到其他用户,比如从root管理员切换至普通用户:
代码演示:
[root@localhost ~]# id
uid=0(root) gid=0(root) groups=0(root)
[root@localhost ~]# su - linux
Last login: Wed Jan 4 01:17:25 EST 2017 on pts/0
[linux@localhost ~]$ id
uid=1000(linux) gid=1000(linux) groups=1000(linux)
su命令与用户名之间有一个减号(-),这意味着完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。
sudo命令可以把特定命令的执行权限赋予给指定用户。格式为“sudo [参数] 命令名称”。
sudo服务中的可用参数以及作用:
参数 | 作用 |
---|---|
-h |
列出帮助信息 |
-l |
列出当前用户可执行的命令 |
-u |
用户名或UID值 以指定的用户身份执行命令 |
-k |
清空密码的有效时间,下次执行sudo时需要再次进行密码验证 |
-b |
在后台执行指定的命令 |
-p |
更改询问密码的提示语 |
代码演示:
#使用visudo命令配置sudo命令的配置文件
#配置格式
#谁可以使用 允许使用的主机=(以谁的身份) 可执行命令的列表
[root@localhost ~]# visudo
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 linux ALL=(ALL) ALL
#保存退出,切换为linux用户,查看sudo服务可使用的命令列表
[root@localhost ~]# su - linux
Last login: Thu Sep 3 15:12:57 CST 2017 on pts/1
[linux@localhost ~]$ sudo -l
[sudo] password for linux:此处输入linux用户的密码
Matching Defaults entries for linux on this host:
requiretty, !visiblepw, always_set_home, env_reset, env_keep="COLORS
DISPLAY HOSTNAME HISTSIZE INPUTRC KDEDIR LS_COLORS", env_keep+="MAIL PS1
PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE
LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES", env_keep+="LC_MONETARY
LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL
LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY",
secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
User linux may run the following commands on this host:
(ALL) ALL
#测试sudo服务
[linux@localhost ~]$ ls /root
ls: cannot open directory /root: Permission denied
[linux@localhost ~]$ sudo ls /root
anaconda-ks.cfg Documents initial-setup-ks.cfg Pictures Templates
Desktop Downloads Music Public Videos
#为sudo服务配置免密码验证
[root@localhost ~]# whereis poweroff
poweroff: /usr/sbin/poweroff /usr/share/man/man8/poweroff.8.gz
[root@localhost ~]# visudo
96 ##
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 linux ALL=NOPASSWD: /usr/sbin/poweroff
# 添加NOPASSWD 命令必须写为绝对路径的形式
#验证免密码
[root@localhost ~]# su - linux
Last login: Thu Sep 3 15:58:31 CST 2017 on pts/1
[linux@localhost ~]$ poweroff
User 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'.
[linux@localhost ~]$ sudo poweroff