在Linux系统中,UID(User IDentification)就相当于我们的身份证号,具有唯一性。因此可以通过用户的UID来判断用户身份。
用户身份有如下这些:
值得注意的是,UID是不能冲突的,而且由管理员创建的普通用户的UID默认是从1000开始的。
为了方便管理属于同一组的用户,Linux系统中还引入了用户组的概念。通过使用用户组号码GID(Group IDentification),可以把多个用户加入到同一个组中,从而方便为组中的用户统一规划权限或指定任务。
另外,在Linux系统中创建每个用户时,将自动创建一个与其同名的基本用户组,而且这个基本用户组只有该用户一个人。如果该用户以后被纳入其他用户组,则这个其他用户组称之为扩展用户组。
一个用户只有一个基本用户组,但是可以有多个扩展用户组。
useradd命令用于创建新的用户,格式为:useradd [选项] 用户名
使用该命令创建用户账户时,默认的用户家目录会被存放在/home
目录中,默认的shell解释器为\bin\bash
,而且默认会创建一个与该用户同名的基本用户组。
下面时useradd命令中的常用参数:
参数 | 作用 |
---|---|
-d | 指定用户的家目录(默认为/home/username) |
-e | 指定用户的到期时间,格式为YYYY-MM-DD |
-u | 指定该用户的UID |
-g | 指定一个初始的用户基本组(必须已存在) |
-G | 指定一个或多个扩展用户组 |
-N | 不创建和用户同名的基本用户组 |
-s | 指定该用户的默认Shell解释器 |
-m | 创建用户家目录,如果已经存在,则创建失败(需要用-d指定家目录) |
如,下面的命令创建一个名为userNew的新用户,并创建一个/home/userNew目录作为家目录:
root@linux:~# useradd -m userNew
root@linux:/home# id userNew
uid=1011(userNew) gid=1011(userNew) groups=1011(userNew)
其中,id命令用户查询该用户的UID、GID以及所属群组。
下面创建一个普通用户并指定家目录的路径、用户的UID以及Shell解释器。
root@linux:/home# useradd -d /home/userNew -u 8888 -s /sbin/nologin userNew1
root@linux:/home# id userNew1
uid=8888(userNew1) gid=8888(userNew1) groups=8888(userNew1)
指的注意的是,/sbin/nologin
是终端解释器的一员,一旦用户的解释器被设置为nologin,则代表该用户不能登陆到系统中。
root@linux:/home# su - userNew1
Cannot execute /sbin/nologin: No such file or directory
groupadd命令用户创建用户组,格式为:groupadd [选项] 群组名
。
为了能够高效地指派系统中各个用户的权限,在工作中常常会把几个用户加入到同一个组里面,这样便可以针对一类用户统一安排权限。
如下面的命令创建一个名为ronny的用户组:
root@linux:/home# groupadd ronny
usermod命令用户修改用户的属性,格式为:usermod [选项] 用户名
。
用户的信息保存在/etc/passwd
文件中,可以直接用文本编辑器来修改其中的用户参数项目,也可以用usermod命令修改已经创建的用户信息,如用户的UID、基本/扩展用户组、默认终端等。
usermod命令的参数以及作用如下表:
参数 | 作用 |
---|---|
-c | 填写用户账户的备注信息 |
-d -m | 参数-m与参数-d连用,可重新指定用户的家目录并自动把旧的数据转移过去 |
-e | 账户到期时间,YYYY-MM-DD |
-g | 变更所属用户组 |
-G | 变更扩展用户组 |
-L | 锁定用户禁止其登陆系统 |
-U | 解锁用户,允许其登陆系统 |
-s | 变更默认终端 |
-u | 修改用户的UID |
例如,下面的shell命令将newUser加入到root用户组中:
root@linux:/home# usermod -G root userNew
root@linux:/home# id userNew
uid=1011(userNew) gid=1011(userNew) groups=0(root),1011(userNew)
再如,下面的shell命令将newUser的UID更改为1234:
root@linux:/home# usermod -u 1234 userNew
root@linux:/home# id userNew
uid=1234(userNew) gid=1011(userNew) groups=0(root),1011(userNew)
passwd命令用户修改用户密码、过期时间、认证信息等,格式为:passwd [选项] [用户名]
。
passwd命令中常用的参数以及作用如下:
参数 | 作用 |
---|---|
-l | 锁定用户,禁止其登陆 |
-u | 解除锁定,允许用户登陆 |
-d | 使该用户可用空密码登陆系统 |
-e | 强制用户在下次登陆时修改密码 |
-S | 显示用户的密码是否被锁定,以及密码所采用的加密算法名称 |
例如,下面的shell命令用户修改自己的passwd:
zl@linux:~$ passwd
Changing password for zl.
(current) UNIX password:
值得注意的是,root用户可以修改所有用户的密码:
zl@linux:~$ sudo su - root
root@linux:~# passwd userNew
Enter new UNIX password:
user命令用于删除用户,格式为:userdel [选项] 用户名
。
userdel命令的常用参数如下:
参数 | 作用 |
---|---|
-f | 强制删除目录 |
-r | 同时删除用户及其家目录 |
下面的shell命令将userNew用户删除:
root@linux:~# id userNew
uid=1234(userNew) gid=1011(userNew) groups=0(root),1011(userNew)
root@linux:~# userdel -f userNew
root@linux:~# id userNew
id: ‘userNew’: no such user
在Linux系统中一切都是文件,但是每个文件的类型不尽相同,因此Linux系统使用了不同的字符来加以区分,常见的字符如下所示:
利用ls -l 文件
命令可以查看文件的详细信息,其中第一个字符就是文件的类型:
root@linux:~# ls -l 1.txt
-rw-r--r-- 1 root root 10498 Jul 28 10:02 1.txt
上面返回值的第一个字符为-
,表示1.txt
是一个普通文件。
下面直接用ls -l
来查看当前文件夹下所有文件的详细信息:
root@linux:~/temp# ls -l
total 4
-rw-r--r-- 1 root root 0 Jul 28 11:15 1.txt
drwxr-xr-x 2 root root 4096 Jul 28 11:15 Temp
可以看到,第一个1.txt
的类型为普通文件,而第二个Temp
的类型为目录文件。
在Linux系统中,每个文件都有所属的所有者和所属组,并且规定了所有的所有者、所有组以及其他人对文件拥有着的可读(r)、可写(w)、可执行(x)等权限。
文件的读、写、执行权限可以简写为rwx,也可以用数字4 2 1来表示。文件所有者,所属组及其他用户权限之间无关联,如下表:
文件权限的数字表示法表示基于字符表示(rwx)的权限计算而来,其目的是简化权限的表示。例如,数字7 = 4 + 2 + 1
表示可读写与执行,数字6 = 4 + 2
表示可读写。
再看shell命令ls -l 1.txt
的输出:
-rw-r--r-- 1 root root 10498 Jul 28 10:02 1.txt
可以将-rw-r--r--
分解为四个部分:-
、rw-
、r--
、r--
。分别表示:①文件类型为普通文件;②文件所有者的权限为读写(rw-);③文件所属组的其他用户的权限为只读(r–);④其他用户的权限为只读(r–)。
如上面所说,rw-r--r--
还可以用数字644
来表示。
1. SUID:SUID是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限。
例如,所有用户都可以执行passwd命令来修改自己的用户密码,而用户密码保存在/etc/shadow
文件中,而该文件的权限如下:
root@linux:~# ls -l /etc/shadow
---------- 1 root shadow 1582 Jul 28 15:26 /etc/shadow
按理说没有用户可以更改这个文件,但是修改密码是利用的/usr/bin/passwd
程序进行的,该程序的权限如下:
root@linux:/home/zl# ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 54256 May 17 2017 /usr/bin/passwd
可以看到所有者的权限从rwx
变为了rws
,其中x变成了s就意味着该文件被赋予了SUID权限。
因此,我们可以用passwd程序来修改用户的密码了。
2. SGID:SGID主要实现如下两种功能:
其中,第一个功能的作用类似于SUID。
第二个功能使得多个用户在某个文件夹中创建的文件具有相同的用户组,便于对文件进行管理。
举个例子,首先用root账户创建一个文件夹testdir
:
root@linux:/home/admin/temp# mkdir testdir
然后为testdir
文件夹设置SGID特殊权限位:
root@linux:/home/admin/temp# chmod 777 testdir
root@linux:/home/admin/temp# chmod g+s testdir
root@linux:/home/admin/temp# ll testdir
total 8
drwxrwsrwx 2 root root 4096 Jul 28 15:52 ./
然后分别切换到不同用户,在testdir
目录中创建新文件:
root@linux:/home/admin/temp/testdir# ls
file1 file2 file3
查看它们的权限:
root@linux:/home/admin/temp/testdir# ls -l
total 0
-rw-r--r-- 1 zl root 0 Jul 28 15:56 file1
-rw-rw-r-- 1 zheng root 0 Jul 28 15:56 file2
-rw-rw-r-- 1 lang root 0 Jul 28 15:57 file3
可以看到,虽然文件的拥有者属于三个不同的用户,但它们的属组都是root
,也就是继承了这个文件夹的属组。
3. SBIT:SBIT特殊权限位可确保用户只能删除自己的文件,而不能删除其他用户的文件。也就是说,当对某个目录设置了SBIT权限位后,那么该目录中的文件就只能被其所有者执行删除了。
举个例子,将上例中的testdir
文件夹设置SBIT:
root@linux:/home/admin/temp# chmod o+t testdir
root@linux:/home/admin/temp# ls -al
drwxrwsrwt 2 root root 4096 Jul 28 16:08 testdir
其中,权限位的最后一位变为了t
,表示SBIT设置成功。
然后切换到一个普通用户:
zl@linux:/home/admin/temp/testdir$ ls -l
total 0
-rw-r--r-- 1 zl root 0 Jul 28 16:05 file1
-rw-rw-r-- 1 zheng root 0 Jul 28 15:56 file2
-rw-rw-r-- 1 lang root 0 Jul 28 16:08 file3
可以看到,zl
只对它自己创建的file1
有所有权,由于SBIT的存在,zl
用户只能删除file1
这个文件而不能删除其它两个文件:
zl@linux:/home/admin/temp/testdir$ rm *
rm: cannot remove 'file2': Operation not permitted
rm: cannot remove 'file3': Operation not permitted
zl@linux:/home/admin/temp/testdir$ ls
file2 file3
从结果可以看到,zl
用户确实只能删除file1
,而没有权限删除file2
和file3
。
chattr命令用于设置文件的隐藏权限,格式为chattr [参数] 文件
。
如果要把某个隐藏功能添加到文件上,则需要在命令后面追加+参数
,如果想要把某个隐藏功能移出文件,则需要追加-参数
。
下面是chattr命令中可供选择的隐藏权限参数:
参数 | 作用 |
---|---|
i | 无法对文件进行修改;若对目录设置了该参数,则仅能修改其中的子文件内容,而不能新建或删除文件 |
a | 仅允许追加内容,无法覆盖/删除内容 |
S | 文件内容在变更后立即同步到硬盘 |
s | 彻底从硬盘中删除,不可恢复 |
A | 不再修改这个文件或目录的最后访问时间(atime) |
b | 不再修改文件或目录的存取时间 |
D | 检查压缩文件中的错误 |
d | 使用dump命令备份时忽略本文件/目录 |
c | 默认将文件或目录进行压缩 |
u | 当删除该文件后依然保留其在硬盘中的数据,方便日后恢复 |
c | 让文件系统支持尾部合并 |
x | 可以直接访问压缩文件中的内容 |
下面的例子通过对文件添加a
功能,使得该文件只能添加而不能覆盖或删除:
root@linux:~# echo "Hello World" > file.txt
root@linux:~# chattr +a file.txt
root@linux:~# rm file.txt
rm: cannot remove 'file.txt': Operation not permitted
lsattr命令可以查看文件的隐藏属性:
root@linux:~# lsattr file.txt
-----a-------e-- file.txt
用chattr将隐藏属性a删除之后就可以使用rm命令删除该文件了:
root@linux:~# chattr -a file.txt
root@linux:~# rm file.txt
前面提到的一般权限、特殊权限、隐藏权限起始有一个共性–权限是针对某一类用户设置的。如果希望对某个特定的用户进行单独的权限控制,需要用到文件的访问控制列表(ACL)。
通俗来讲,基于普通文件或目录设置ACL其实就是针对指定用户或用户组设置文件或目录的操作权限。
另外,如果针对某个目录设置了ACL,则目录中的文件会继承其ACL;若针对某个文件设置了ACL,则该文件不再继承其所在目录的ACL。
1. setfacl命令:setfacl命令用于管理文件的ACL规则,格式为:setfacl [参数] 文件名称
。
其中,针对目录文件需要使用-R递归参数;针对普通文件则使用-m参数;如果要删除某个文件的ACL,则可以使用-b参数。
下面一个例子修改一个普通用户zl
对其他用户创建的文件的读写权限:
zl@linux:/home/admin/temp/testdir$ echo "Hello World" > file2
-su: file2: Permission denied
zl@linux:/home/admin/temp/testdir$ sudo su - root
root@linux:~# setfacl -Rm u:zl:rwx /home/admin/temp/testdir
root@linux:~# su - zl
zl@linux:~$ cd /home/admin/temp/testdir/
zl@linux:/home/admin/temp/testdir$ echo "Hello World" > file2
zl@linux:/home/admin/temp/testdir$
其中,u:zl:rwx
中的u表示user,如果要设置组的话将u改为g即可。
2. getfacl命令:getfacl命令用于显示文件上 设置的ACL信息,格式为:getfacl 文件名称
。
root@linux:~# getfacl /home/admin/temp/testdir/file2
getfacl: Removing leading '/' from absolute path names
# file: home/admin/temp/testdir/file2
# owner: zheng
# group: root
user::rw-
user:zl:rwx
group::rw-
mask::rwx
other::r--
可以看到,上面的ACL列表中,zl
用户的权限被单列出来,为rwx
。
此外,用ls -l
命令也可以看到文件的ACL信息发生了改变:
root@linux:~# ls -l /home/admin/temp/testdir/file2
-rw-rwxr--+ 1 zheng root 12 Jul 28 17:14 /home/admin/temp/testdir/file2
其权限字段最后多了一个加号(+)。
su命令可以解决切换用户身份的需求,使得当前用户在不退出登录的情况下,顺畅地切换到其他用户,比如从root
管理员切换到普通用户:
root@linux:~# su - zl
zl@linux:~$
上面的su命令与用户名之间有一个减号(-),这意味着完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息。
另外,当从root管理员切换到普通用户是不需要密码验证的,而从普通用户切换到root管理员需要进行密码验证。
使用sudo命令可以把特定命令的执行权限赋予给指定用户,这样既可保证普通用户能够完成特定的工作,也可以避免泄露root管理员密码。
sudo命令用于给普通用户提供额外的权限来完成原本root管理员才能完成的任务,格式为:sudo [参数] 命令名称
。
可用参数以及作用如下:
参数 | 作用 |
---|---|
-h | 列出帮助信息 |
-l | 列出当前用户可执行的命令 |
-u | 以指定的用户身份执行命令 |
-k | 清空密码的有效时间,下次执行sudo时需要再次进行密码验证 |
-b | 在后台执行指定的命令 |
-p | 更改询问密码的提示语 |