Linux用户及权限管理与文件权限

用户身份与能力

Linux系统中,是通过UID来判断用户身份的。

  • 管理员UID为0:系统的管理员用户。
  • 系统用户UID为1~999: Linux系统为了避免因某个服务程序出现漏洞而被黑客提权至整台服务器,默认服务程序会有独立的系统用户负责运行,进而有效控制被破坏范围。
  • 普通用户UID从1000开始:由管理员创建的用于日常工作的用户。

在Linux系统中创建每个用户时,将自动创建一个与其同名的基本用户组,而且这个基本用户组只有该用户一个人。如果该用户以后被归纳入其他用户组,则这个其他用户组称之为扩展用户组。一个用户只有一个基本用户组,但是可以有多个扩展用户组。通过使用用户组号码(GID,Group IDentification),我们可以把多个用户加入到同一个组中。

useradd

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命令用于创建用户组,格式为“groupadd [选项] 群组名”。

代码演示:

#创建一个名为admin的用户组
[root@localhost ~]# groupadd admin
usermod

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 [选项] [用户名]”。

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 [选项] 用户名”。

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来表示;
文件所有者,所属组及其他用户权限之间无关联,如下图表中所示:

Linux用户及权限管理与文件权限_第1张图片
文件权限的数字法表示基于字符表示(rwx)的权限计算而来,其目的是简化权限的表示。
例如,若某个文件的权限为7则代表可读、可写、可执行(4+2+1);若权限为6则代表可读、可写(4+2)。

详解文件属性信息

Linux用户及权限管理与文件权限_第2张图片
在上图中,包含了文件的类型、访问权限、所有者(属主)、所属组(属组)、占用的磁盘大小、修改时间和文件名称等信息。
通过分析可知,该文件的类型为普通文件,所有者权限为可读、可写(rw-),所属组权限为可读(r–),除此以外的其他人也只有可读权限(r–),文件的磁盘占用大小是34298字节,最近一次的修改时间为4月2日的凌晨23分,文件的名称为install.log。

文件的特殊权限

SUID

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主要实现如下两种功能:

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

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

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命令能够用来设置文件或目录的权限,格式为“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命令可以设置文件或目录的所有者和所属组,格式为“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

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 [参数] 文件”。
如果想要把某个隐藏功能添加到文件上,则需要在命令后面追加“+参数”;
如果想要把某个隐藏功能移出文件,则需要追加“-参数”。

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命令用于显示文件的隐藏权限,格式为“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

setfacl命令用于管理文件的ACL规则,格式为“setfacl [参数] 文件名称”。
文件的ACL提供的是在所有者、所属组、其他人的读/写/执行权限之外的特殊权限控制。使用setfacl命令可以针对单一用户或用户组、单一文件或目录来进行读/写/执行权限的控制。部分规则如下:

  • 针对目录文件,使用-R参数
  • 针对普通文件,使用-m参数
  • 删除某个文件的ACL,使用-b参数

代码演示:

#对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

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命令与sudo服务

su

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 [参数] 命令名称”。

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

Linux用户及权限管理与文件权限_第3张图片
素材来源:https://www.linuxprobe.com/chapter-05.html

你可能感兴趣的:(Linux学习手记)