用户管理、权限管理

用户管理

用户和组的类型

用户账号:UID(User Identity,用户标识号) Centos6 Centos7
超级用户 UID:0 UID:0
系统用户 UID:1-499 UID:1-999
普通用户 UID:500-65535 UID:1000-65535
# 组账号:GID(Group Identify,组标识号)
	# 初始组(私有组)
	# 附加组(公共组)

用户和组相关文件

$ /etc/passwd # 用户信息文件
	第一列:用户名
	第二列:密码占位符
	第三列:用户ID(UID)
		0:超级用户的UID,只要UID是0就是超级用户
		1-999:系统用户的范围,此范围的用户不能用于登录系统,只能用于软件服务运行使用,其中1-99是系统保留的账户,系统自动创建。100-999是预留给用户创建系统用户的。
		1000-65535: 通用户UID。建立的普通用户UID从1000开始,最大到65535。这些用户足够使用了,但是如果不够也不用害怕,2.6.x内核以后的Linux系统用户UID已经可以支持232这么多了。
	第四列:组ID(GID)
		添加用户时,如果不指定用户的初始组,则会自动创建和用户名相同的组。
	第五列:用户描述信息
	第六列:用户家目录
	   超级管理员root的家目录/root/;普通用户的家目录 /home/***
	第七列:登录shell类型	
		/bin/bash 能登录系统;/sbin/nologin 不能登录系统
$ /etc/shadow # 用户密码文件
	第一列:用户名
	第二列:加密密码,我们也可以在密码前的加入“!!”或“*”改变加密值让密码暂时失效,使这个用户无法登陆,达到暂时禁止用户登录的效果。
注意:所有系统用户的密码都是“!!”或“*”,代表没有密码是不能登录的。当然我新创建的用户如果不设定密码,它的密码项也是“!!”,代表这个用户没有密码,不能登录。
	第三列:密码最近更改时间( 1970年1月1日作为标准时间-unix元年)			
		时间戳转日期:
			date -d “1970-01-01 19527 days”
		日期转时间戳:
			echo $(($(date --date=”2020/01/01” +%s )/86400+1))
	第四列:密码最短有效期(几天内不能修改密码)
	第五例:密码最长有效期
	第六列:密码到期前的警告天数
	第七列:密码过期后的宽限天数
	第八列:密码失效时间,这里同样要写时间戳
	第九列:保留
$ /etc/gshadow # 组密码文件
	第一列:用户组
	第二列:用户组密码,这个段可以是空的或!,如果是空的或有!,表示没有密码(没有密码时只能本地登录)
	第三列:用户组管理者,这个字段也可为空,如果有多个用户组管理者,用,分割
	第四列:组成员,如果有多个成员,用,号分割
$ /var/spool/mail/ # 用户邮箱目录
$ /etc/skel/ # 用户模版目录

用户和组相关命令

添加用户

$ useradd [选项] 用户名
	-u: # 用指定UID创建用户
	-g: # 指定初始组,尽量不要手动指定 (组名要已经存在的)	
	-d: # 手动指定家目录,目录不需要事先创建(指定缺省值/home)
	-s: # 指定用户是否能登录系统、/sbin/nologin 	/bin/bash
	-r: # 创建系统用户,一般和-s 结合使用,(UID为1-499或1-999)不为用户创建家目录
# useradd 创建用户时会参考两个配置文件,分别是/etc/default/useradd和/etc/login.defs
$ /etc/default/useradd
	GROUP=100
		#新创建用户时默认初始组的GID号(公有组机制)	
		#现在使用的是私有组机制(根据创建用户名称创建组)
	HOME=/home
		#新创建用户的家目录的默认位置
	INACTIVE=-1
		#密码过期后宽限天数(过期停权),用天数表示:0 代表密码到期立刻失效;正数代表密码到期后的宽限天数;-1 表示密码永不失效。inactive
	EXPIRE=
		#密码失效时间,此处写时间戳,到达时间戳时间后立刻失效,不填写表示用户密码永不过期。expire
	SHELL=/bin/bash
		#此选项是创建用户时默认的shell类型,/bin/bash 表示可以登录系统SKEL=/etc/skel
		#此选项是创建用户时使用的模板目录,/etc/skel中的文件在用户创建时都会被复制到用户家目录下。
	CREATE_MAIL_SPOOL=yes
		#此选项是是否给新用户创建邮件缓冲(即新邮箱)
$ /etc/login.defs
	MAIL_DIR	/var/spool/mail
		#指定新用户的默认邮箱位置。比如xdl用户的邮箱目录位置:/var/spool/mail/root
	PASS_MAX_DAYS   99999
		#这行指定的是密码的有效期,也就是/etc/shadow文件的第五字段。代表多少天之后必须修改密码,默认值是99999
	PASS_MIN_DAYS   0
		#这行指定的是两次密码的修改间隔时间,也就是/etc/shadow文件的第四字段。代表第一次修改密码之后,几天后才能再次修改密码。默认值是0
	PASS_MIN_LEN    5
		#这行代表密码的最小长度,默认不小于5位。但是我们现在用户登录时验证已经被PAM模块取代,所以这个选项并不生效
	PASS_WARN_AGE   7
		#这行代表密码修改到期前的警告天数,也就是/etc/shadow文件的第六字段。代表密码到底有效期前多少天开始进行警告提醒,默认值是7天
	UID_MIN       1000
		#创建普通用户的时候默认的起始UID号
	UID_MAX      60000
		#创建普通用户,不用 -u 指定时,默认最大的UID号。
注:假如有一个用户创建时通过 –u 指定了 UID 为 1050,那么下一次不指定-u 时,则起始UID 变成从1051开始,1000-1049之间的那些会跳过不使用。
	GID_MIN       1000
		#创建组的时候默认的起始GID号
	GID_MAX       60000
		#创建组的时候默认的最大的GID号
	CREATE_HOME     yes
		#创建用户时是否创建用户家目录	默认 yes 创建
	UMASK           077
		#这行指定的是建立的用户家目录的默认权限,因为umask值是077,所以新建的用户家目录的权限是700
	USERGROUPS_ENAB yes
		#这行指定的是使用命令userdel删除用户时,是否删除用户的初始组,默认是删除ENCRYPT_METHOD SHA512
		#这行指定Linux用户的密码使用SHA512散列模式加密,这是新的密码加密模式,原先的Linux只能用DES或MD5方式加密

设置和修改密码

$ passwd 用户名 # 第一次对用户使用时是为此用户创建密码,第二次使用时是修改密码。
	-l : # 锁定用户的密码,使之无法登录到系统lock
	-u : # 解锁用户密码unlock
	-S : # 查看用户帐号的状态(是否被锁定)
# root身份执行passwd
	1、可以给任何用户设置或修改密码
	2、在进行密码修改时不需要提供原始密码
# 普通用户执行passwd
	1、默认只能给自己修改密码(命令后不需写任何字符串)
	2、给自己修改密码时需要提供用户的当前密码
	3、需要遵循密 码各项原则(长度、复杂)
# 非交互式密码设置:
	$ echo	“123123”	| passwd --stdin 用户名

用户信息修改

$ usermod [选项] 用户名 # 必须是已经存在的用户
	-u : # 修改用户的指定UID
	-f : # 修改用户的指定初始组(尽量不修改)
	-d : # 结合 -m 选项直接对源家目录进行改名实现修改家目录
	-s : # 修改用户的登录shell类型
	-L : # 锁定用户的密码
	-U : # 解锁用户密码
	-l 新用户名 旧用户名 # 修改用户名
$ group -n 新组名 旧组名 # 修改组名

删除用户

$ userdel [选项] 用户名
	-r : # 删除用户时,连带家目录一起删

添加和删除组

$ groupadd 组名 # 添加组
$ groupdel 组名 # 删除组(被删除的组尽量是空组)

向组内添加成员

$ gpasswd [选项] 用户名 组名
	-a # 向指定组内添加一个成员
	-d # 把指定用户从组内删除
	-M # 定义组内成员列表,用户之间用,分隔	(覆盖式)
	-r # 清除组密码

其他相关命令

$ id 用户名 # 显示用户的UID、初始组、附加组列表
$ su 用户名 # 切换用户身份
	su - 用户名 # 连带环境变量一起切换

组的划分

# 有效组:
	用户的初始组就是默认的有效组
	当用户创建文件时,该文件的所属组就是有效组
	有效组决定了用户创建文件时的文件所属组
	$ newgrp 组名 # 临时为指定用户切换有效组
   $ exit  # 退回原来的有效组

权限管理

权限的意义

# 文件的介绍
-rw-------. 1 root root  1245 1月 1 2015 anaconda-ks.cfg
	第一列:类型和文件权限(下面章节详细讲)
	第二列:引用计数,文本类文件的数值代表该文件有n-1个硬链接;目录文件的数值代表该目录下有多少个子目录数量
	第三列:文件所有者(属主),文件属于哪个用户所有,默认情况谁创建的文件就属于谁
	第四列:文件所属组(属组),一般情况下,该组是文件创建者所在的组
	第五列:文件大小,默认以字节为单位显示,可使用-h选项显示为最合适单位
	第六列:文件最后一次修改时间(内容修改时间)
	第七列:文件名	
# 文件类型
	-:普通文件,普通文件类型下的子类型仍然有很多,比如压缩文件,文本文件,脚本文件等等,可以使用file命令查看
	d:目录文件,Linux中一切接文件~
	l:软链接文件,此处代表该文件为软链接,软链接是独立文件有自己的文件类型
	b:块设备文件,存储类设备在Linux中的保存后的文件类型
	c:字符设备文件,一般指用来进行数据传输的设备,输入输出设备等
	s:套接字文件,一般用来实现两个进程之间通信的文件
	p:管道文件,一般用来处理多个进程对同一个文件存取先后顺序问题
	注意:设备类文件的详细信息中,文件大小位置显示的不是大小,而是主从设备号,主设备号代表着设备类型,从设备号代表着该类型设备的第几个。
# 权限的类型
	# 文本类文件:
		r:内容查看权限
		w:内容编写权限
		x:执行权限
	# 目录类文件:
		r:文件:查看目录下文件列表权限
		w:文件:目录内文件创建删除权限
		x:文件:进入目录权限
	# 用数字表示权限位:
		r:4
		w:2
		x:1
例如:rw-r--r-- 的权限用数字表示就是 644{分别是所有者、所属组、其他人的权限}

权限的修改

$ file # 查看文件具体详细类型的命令 
$ chmod # 修改文件指定位置的rwx权限
		-R:将设置的权限递归到该目录下的子文件上(一般针对目录使用)
		chmod	[augo]	[+-=]	[rwx]	file
		chmod	644	file
$ chown # 修改文件的所有者或所属组
		命令格式:chown user:group 文件或目录名
		-R:将设置的递归到该目录下的子文件上
		:是分隔符可以用.代替
$ chgrp # 仅修改文件所属组
		chgrp	group	file
		-R:将设置的递归到该目录下的子文件上(一般针对目录使用)
$ umask # 查看或设置文件的权限掩码值
		umask:以八进制的数值显示文件的权限掩码值
		umask 002:按照给定的八进制数值覆盖掉原有的掩码值
		文件默认权限的计算方式(对位相减)
			目录类文件:777-掩码=默认权限
			文件类文件:666-掩码=默认权限
			管理员用户:umask为:022
			普通用户: umask为002

ACL权限

ACL权限的定义

ACL(Access Control Lists)访问控制列表,能够为单一的用户或者组设置对文件或者目录的独立rwx权限,对于有些特殊需求非常有帮助。

开启ACL权限

# 检查指定分区是否支持ACL权限功能
	# Centos 7.X
		$ dmesg | grep ACL
   # Centos 6.X
   	  $ dumpe2fs -h 分区名 | grep acl
   	  # 手动开启ACL(只针对CentOS 6)
   	  		$ mount -o remount,acl /(根分区) # 重新挂载/分区,并加入ACL权限
   	  		# 永久开启需修改/etc/fstab文件(defaults,acl)

ACL权限的使用

$ getfacl 文件或目录 # 查看ACL权限
$ setfacl [选项] 文件或目录 # 设置ACL权限
	-m	:为指定用户、组添加ACL权限
	-x	:删除指定用户、组的ACL权限
	-b	:清空指定文件上的所有ACL权限
	-R	:对目录设置ACL权限时,一并将ACL权限递归到所有已存在的子文件上
	-d	:对目录设置默认ACL权限,该权限不对目录生效,仅对在目录下新建的子文件生效
	-k	:清除指定目录的默认ACL权限
# 注意:在具有默认ACL权限的目录下创建新目录时,新目录不仅继承ACL权限,还会继承默认权限	
# 为用户添加ACL权限
	$ setfacl -m u:用户名:权限 文件名
# 删除指定用户的ACL权限
	$ setfacl -x  u:用户名:权限 文件名
# 清空指定文件上的所有ACL权限
	$ setfacl -b 文件名
# 对目录设置ACL权限时,一并将ACL权限递归到所有已存在的子文件上
	$ setfacl -R -m u:用户名:权限 目录名
# 对目录设置默认ACL权限,该权限不对目录生效,仅对在目录下新建的子文件生效
	$ setfacl -d -m u:用户名:权限 目录名
# 设置最大有效权限mask
	$ setfacl -m  m:rx 目录名
# mask生效的机制:基础权限的优先级大于acl权限
	1.	若给了文件所属组较大权限,则mask会跟随所属组权限,即便后续设置了新的基础acl权限,mask也不会被改变{基础权限的优先级大于acl权限}
	2.	设置新的acl权限时,acl权限小于组权限时,acl权限的mask不会跟随acl设置;当acl权限大于组权限时,acl的mask就会跟随acl权限生效
	3.	mask最后可以使用手动设置的方式进行最终修改

image-20210308114136333

sudo授权管理

sudo意义

sudo是Linux中用来进行'命令授权'的管理工具,可以通过授权的方式让某些'普通用户执行只有管理员'才能执行的命令,比如关机、重启等等,这样可以'减少root身份的持有者','减少root的登录次数',以此来'保证服务器的安全性'。

sudo工作流程

# 超级管理员:
$ visudo或 vim /etc/sudoers来对某用户授权
# 普通用户
1.当执行root授权的命令时,系统查询/etc/sudoers文件中是否有root对用户的授权
2.当查询普通用户已拥有授权后,需要输入普通用户的密码来确认用户身份
3.若密码输入成功后,则可以借用root身份来执行已经授权的命令,命令执行完成后,授权结束

sudo相关命令和配置文件

"命令":visudo
# 元素含义:
	root:# 被授权用户,或是组,组要在前面加%表示
	ALL	:# 来源主机地址
	ALL	:# 被授予身份,默认是任意用户,ALL > root
	ALL	:# 被授予命令,多条命令用,隔开(必须写命令绝对路径)
	User_Alias:# 被授权用户集合别名,类似于用户组
	Cmnd_Alias:# 被授予命令集合别名,省去多个用户授予同样的命令时重复填写

sudo相关实例

# 给laow用户赋予root的所有命令权限
	laow  ALL=(root)  ALL
# 授权zhangsan用户可以重启服务器
	zhangsan  ALL=(root)  /sbin/shutdown -r now
# 授权www用户可以管理web服务器
	1.可以使用Apache管理脚本
		www ALL=(root) /etc/rc.d/init.d/httpd reload,/etc/rc.d/init.d/httpd configtest
		# reload 重新加载配置文件使之生效;configtest 检查配置文件是否有语法错误。
	2.可以修改Apache的配置文件
		www	192.168.110.39=(root)	/bin/vi /etc/httpd/conf/httpd.conf
		#sudo不仅仅能授权超级管理员的命令,还能授权普通命令以及详细选项和参数。
	3.可以更新网页文件
		#可以通过给/var/www/html目录设置ACL权限,让www用户对/var/www/html有w权限即可。
# 授权pdd用户可添加普通用户并能修改密码
	pdd	ALL=/usr/sbin/useradd
	#让pdd用户可以添加普通用户
	pdd  ALL=(root)  /usr/bin/passwd,!/usr/bin/passwd root,!/usr/bin/passwd "",!/usr/bin/passwd--stdin root
	#让pdd用户可以给新添加用户修改密码,不允许修改root用户的密码
# 注意:sudo授权尽量遵循具体授权原则,普通用户需要什么权限就授予什么权限,要具体到命令,选项,参数等等,否则会出现权限溢出的问题,从而导致服务器安全性降低。

# su的优缺点:
优点:平时使用普通用户管理操作系统,降低误操作几率,需要时su切换到root。
缺点:su用户身份的切换,普通管理员要使用root的权限必须知道root的密码,这样会造成很多普通用户需要知道root的密码,导致系统的安全性降低。
# sudo的优缺点:
优点:sudo可以为普通用户赋予一定权限,使普通用户能使用一些root才能执行的命令和操作,来完成正常的服务器管理工作。这种按需分配权限的方式可以让我们工作在一个相对安全的环境下,并且普通用户不需要知道root的密码。
缺点:需要提前做好用户管理规划,权限规划等等

文件特殊权限

SetUID

当一个具有执行权限的文件设置SetUID权限后,用户执行这个文件时将以文件所有者的身份执行
特点:
* 只有可以执行的二进制程序才能设定SUID权限
* 命令执行者要对该程序拥有x(执行)权限
* 命令执行者在执行该程序时获得该程序文件属主的身份(在执行程序的过程中灵魂附体为文件的属主)
* SetUID权限只在该程序执行过程中有效,也就是说身份改变只在程序执行过程中有效

image-20210309094106498

SetGID权限(文件和目录)

1) 针对文件的作用:
* 只有可执行的二进制程序才能设置SGID权限
* 命令执行者要对该程序拥有x(执行)权限
* 命令执行在执行程序的时候,组身份升级为该程序文件的属组
* SetGID权限同样只在该程序执行过程中有效,也就是说组身份改变只在程序执行过程中有效
# 当普通用户lamp执行locate命令时,会发生如下事情:
*/usr/bin/locate是可执行二进制程序,可以赋予SGID   
*执行用户lamp对/usr/bin/locate命令拥有执行权限
*执行/usr/bin/locate命令时,组身份会升级为slocate组,而slocate组对/var/lib/mlocate/mlocate.db数据库拥有r权限,所以普通用户可以使用locate命令查询mlocate.db数据库
*命令结束,lamp用户的组身份返回为lamp组
2) 针对目录的作用:
*普通用户必须对此目录拥有r和x权限,才能进入此目录
*普通用户在此目录中的有效组会变成此目录的属组
*普通用户对此目录拥有w权限时,新建的文件的默认属组是这个目录的属组

Sticky BIT 权限

# Sticky BIT粘着位,也简称为SBIT。SBIT目前仅针对目录有效,它的作用如下:
*粘着位目前只对目录有效
*普通用户对该目录拥有w和x权限,即普通用户可以在此目录拥有写入权限
*如果没有粘着位,因为普通用户拥有w权限,所以可以删除此目录下所有文件,包括其他用户建立的文件。一但赋予了粘着位,除了root可以删除所有文件,普通用户就算拥有w权限,也只能删除自己建立的文件,但是不能删除其他用户建立的文件。

SetUID、SetGID、SBIT 权限的命令使用方法

SUID:4
SGID:2
SBIT:1

文件系统属性

命令介绍

# chattr 是专门用来修改文件系统属性的命令,并且只有root才能使用,该权限的优先级高于普通rwx及扩展ACL权限等权限。

# 格式:chattr [+-] [选项] 文件或目录
# 选项:
	"i"如果对文件设置i属性,那么不允许对文件进行删除、改名,也不能添加和修改数据;如果对目录设置i属性,不允许建立和删除文件
	"a"如果对文件设置a属性,那么只能在文件中增加数据,但是不能删除也不能修改数据;如果对目录设置a属性,那么只允许在目录中建立新文件,但是不允许删除和修改文件名
	"e"Linux中绝大多数的文件都默认拥有e属性。表示该文件是使用ext文件系统进行存储的,而且不能使用“chattr -e”命令取消e属性
# 查看文件系统属性
# 格式:lsattr	选项	文件名
# 选项:
	-a	# 显示所有文件和目录(显示隐藏文件)
	-d	# 若目标是目录,仅列出目录本身属性
posted @ 2020-04-09 10:01  候你已久  阅读(387)  评论(0)    收藏  举报