Linux用户权限管理
用户管理
前言
在Linux系统中各种会存多个用户。我们的使用者靠用户名来区分各自登录的账号
如果我们的用户想要使用系统资源,就必须在系统中拥有合法的账号。在系统多个文件中保存了用户身份相关信息
用户相关配置文件
1. /etc/passwd(用户信息配置文件)
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
在/etc/passwd文件中用:当作分隔符,一共有7列,每列的内容是:
第一列:用户名
第二列:密码占位符 (真正密码在/etc/shadow)。取消密码占位符可以实现免密码登录
第三列:用户ID(UID)
0是超级用户的ID,
在用户ID中1-999都是系统用户的范围
作用就是系统服务或命令在运行时会对这些账号进行调用。
系统用户账号的话分为两种
1000-65535是普通用户使用,创建新用户UID从1000开始,最大到60000
第四列:初始组ID(GID)(初始组:用户创建时默认加入的组)
创建用户时如果不指定用户的初始组,会自动创建和用户名相同的组,初始组只能有一个。
总结的话就是用户登录系统,就立马有了这个用户组的相关权限
有效组是后续添加的组,每个用户可以属于多个有效组,用groups命令来查看当前的初始组和有效组。newgrp 组名 的格式用来切换当前的有效组。
第五列:用户描述信息(登录Linux系统时,显示的信息默认在这列,如果没有就显示第一列,
优先级就是第五列->第一列)
第六列:用户家目录
第七列:用户的shell类型
用户会取得shell与系统的内核通信以进行用户的操作系统
/bin/bash: shell类型为bash,bash shell 是最常用的一种shell(能正常登录系统)
/sbin/nologin: 不能登录系统,可以使用系统资源
2. /etc/shadow(是passwd的影子文件,设置用户密码信息文件)
root:$6$Ird5M4Fop3f/oo8P$j3zt4jwoyFgY26kxszznR/1xEjpZSPfhg.tx6G2uwSeRPKJOfTpliVeq6ISl9IqwZoUHadrQdrd54MSlnwhuC/::0:99999:7:::
bin:*:17834:0:99999:7:::
daemon:*:17834:0:99999:7:::
adm:*:17834:0:99999:7:::
lp:*:17834:0:99999:7:::
第一列:用户名
第二列:加密密码
$6$开头是使用SHA-512加密
新建用户密码是 !! 或 * 代表没有密码
不能登录(我们可以在密码前加入一个 ! 或者 *,加入后不能登录)
第三列:密码最近修改时间,是从1970年1月1日作为标准时间计算
第四列:密码不可被更改的天数
是数字0的话表示密码可以随时被修改
是数字5的话需要五天后去修改
第五列:密码最长有效期(与第三列相比)
默认99999(273年)表示为近似永久
第六列:密码到期前的警告天数
第七列:密码过期后的宽限天数
预留几天时间给用户修改密码
写入0:表示密码设置完就过期
写入5:表示密码五天后过期
写入-1:表示密码永久不会失效
第八列:账号失效日期
第九列:保留
3. /etc/group(用户组信息文件)
root:x:0:
bin:x:1:
daemon:x:2:
wheel:x:10:
cdrom:x:11:
mail:x:12:postfix
man:x:15:
第一列:用户组名称(默认组成员)
第二列:组密码占位符
第三列:组ID号
第四列:组内成员列表
添加两种方式:临时、永久
临时:root用户设置组密码,把密码发给加入组的用户。通过newgrp命令切换到组内。这种方法重新登录就失效了
永久:写入/etc/group的方式。
使用root用户给组添加管理员(gpasswd -A 管理员 组名)
然后使用管理员用户将用户添加到组内(gpasswd -a 用户名 组名)。
这种添加重新登录就不会失效
4. /etc/gshadow(用户组密码信息文件)
stapdev:!::
yang:!!::yang
apache:!::
第一列: 用户组
第二列: 用户组密码
第三列: 用户管理者
第四列: 组成员 (如果有多个成员用,隔开)
组密码的作用:非本用户组的用户切换到本地用户组身份时,可以通过密码来确保安全。
输入密码正确,直接添加至该组。
5. /etc/login.defs(用户创建时规则文件)
MAIL_DIR /var/spool/mail #当用户创建时,会在该目录下创建一个用户mail文件
#MAIL_FILE .mail
PASS_MAX_DAYS 99999 #密码有效指定最大天数
PASS_MIN_DAYS 0 #密码修改间隔天数
PASS_MIN_LEN 5 #密码最小长度
PASS_WARN_AGE 7 #提示密码到期还有多长时间提醒
#
# Min/max values for automatic uid selection in useradd
#
UID_MIN 1000 #指定UID最小为1000
UID_MAX 60000 #指定UID最大为60000
# System accounts
SYS_UID_MIN 201 #指定系统用户最小为201
SYS_UID_MAX 999 #指定系统用户最大为999
GID_MIN 1000
GID_MAX 60000
# System accounts
SYS_GID_MIN 201
SYS_GID_MAX 999
CREATE_HOME yes #是否创建用户家目录
# The permission mask is initialized to this value. If not specified,
# the permission mask will be initialized to 022.
UMASK 077 #创建用户家目录权限默认掩码值
# This enables userdel to remove user groups if no members exist.
#
USERGROUPS_ENAB yes #表示userdel删除用户时,如果用户组为空,连用户组一起删除
# Use SHA512 to encrypt password.
ENCRYPT_METHOD SHA512 #使用SHA加密方式
6. /etc/default/useradd (useradd默认设置文件来源)
# useradd defaults file #创建用户的默认文件
GROUP=100 #新创建用户时默认初始组的GID号,
HOME=/home #home表示用户家目录的位置
INACTIVE=-1 #表示账号是否过期禁用,-1表示不启用
EXPIRE= #表示账号过期,不设置表示不启用
SHELL=/bin/bash #指定创建shell类型
SKEL=/etc/skel #指定用户家目录中默认文件的来源
CREATE_MAIL_SPOOL=yes #表示是否创建邮箱缓存
7. /etc/skel/(定义新建用户在主目录的默认配置文件)
[root@localhost skel]# ls -a
. .. .bash_logout .bash_profile .bashrc .mozilla
创建新用户后,会看到以上文件等
/etc/skel目录定义了新建用户在主目录的默认配置文件,更改此目录下的内容下就可以改变新建用户默认主目录的配置文件信息
用户管理相关命令
1. useradd [选项]用户名
-u:uid用户标识号,此必须唯一
-g:group指定新用户登录时所属的默认组(初始组)
-G:指定用户的附加组,必须是已经存在的组。附加组对于默认组而言,当一个用户同时是多个组中的成员时,登录时默认组称主组,其他组称为附加组
-d:home指定新建用户的默认家目录,如果不指定系统会在/etc/default/useradd文件中定义的shell作为新用户的默认shell
-c:comment对新建用户添加说明信息
-f:inactive指定账号过期多长时间会永久停用。当值为0时账号立刻停用。当值为-1时则关闭此功能
-M:创建时不生成用户家目录
-r:自动将用户UID和GID指定到1000以内,不在/home下创建用户家目录
2. usermod [选项] 用户名
-u UID 修改用户的指定UID
-g 组名 修改用户的指定初始组(尽量不修改)
-G 组名 修改用户的附加组(不管之前设置了多少附加组,都替换掉)加上-a选项可不替换
-c 说明 修改用户的描述信息
-d 目录 结合 -m选项直接对源家目录进行改名实现修改家目录
3. userdel [选项] 用户名
-r 删除用户时,连带家目录一起删除
4. passwd [选项] 用户名
-l 用户名 #锁定用户名
-u 用户名 #解锁用户密码
-S 用户名 #查看用户账号状态
非交互式密码和交互式密码的区别:
交互式的密码可以保证密码的准确性,缺点的话使用history可以历史命令查看密码
非交互式密码可以完成大批量设置密码,可以保证密码的安全性
设置:echo “123” | passwd --stdin user1
#--stdin:接收密码
5. groupadd [选项] GID 组名
-g:指定新建用户组的GID,该GID必须唯一,不能重复
-o:表示新用户组的GID可以与系统中已有的用户组的GID相同
6. gpasswd [选项] 用户名 组名
-A:向指定组添加一个管理员
-a:向指定组添加一个成员
-d:把指定用户从组内删除
-M:定义组内成员列表,用户之间用,分割(覆盖式)
7. newgrp 组名
如果一个用户同时属于多个用户组,那么用户可以在用户组之间切换,以便具有其他用户权限,
newgrp主要用于在多个用户组之间进行切换,可以使用exit退出
[root@localhost ~]$ useradd feng
[root@localhost ~]$ passwd feng
[root@localhost ~]$ gpasswd -a feng root
[feng@localhost ~]$ newgrp root
[feng@localhost ~]$ id
uid=1007(feng) gid=0(root) 组=0(root),1007(feng) 环境 =unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
#这样做的好处就是可以让用户临时使用root管理权限,重新登录、id、exit都可以退出root权限使用,
#管理员可以随时掐断root权限使用
8. groupdel 组名
groupdel用于删除用户组,如果该用户组中扔包括某些用户,则应确认组成员正常权限的前提下进行删除
9. groups
查询用户所属哪些组
[root@localhost ~]# groups user1
user1 : user1
其他相关命令
1. id 用户名
显示用户的UID、初始组、附加组列表
[yang@localhost ~]$ id
uid=1000(yang) gid=1000(yang) 组=1000(yang)
环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
2. su 用户名
切换用户身份
su - 用户名
su 用户名和su - 用户名本质最大的区别:
前者只是切换root身份,它会显示在普通用户家目录;后者连用户和家目录一块切换。
3. finger:查看用户详细信息
[root@localhost ~]# finger user1
Login: user1 Name:
Directory: /home/user1 Shell: /bin/csh
Last login 五 5月 10 00:22 (CST) on pts/5
No mail.
No Plan.
[root@localhost ~]#
权限管理
1.文件和目录权限区别
字符 | 数字 | 目录 | 文件 |
R | 4 | 查看目录下的文件与目录属性 | 查看文件内容 |
W | 2 | 在目录下增、删、改文件与目录名称 | 修改文件内容 |
X | 1 | 可以用cd命令进入该目录 | 可执行,一般为脚本文件或程序 |
文件权限
r--:可以查看文件内容,不能修改,不能执行。
rw-:可以查看文件内容,可以修改文件,不能执行。
rwx:可以查看文件内容,可以修改文件,可以执行。
r-x:可以查看文件内容,不能修改文件,可以执行。
---:不能查看,不能修改,不能执行。
--x:不能查看,不能修改,不能执行。
-w-:不能查看,可以强制保存将会以覆盖的方式写入,不能执行。
-wx:不能查看,可以强制保存将会以覆盖的方式写入,不能执行。
目录权限
rwx:可以查看目录下一级子文件子目录,可以在目录下创建或修改子文件子目录名称,可以cd切换到目录中。并且,可以强制修改子文件,在修改后强制保存退出后文件所有者所属组会变为当前用户。
r-x:可以查看目录下一级子文件子目录,不能在目录下创建或修改子文件子目录名称,可以cd切换到目录中。
-wx:不能查看目录下子文件子目录,可以在目录下创建子文件子目录,可以cd切换到目录中。
r--:查看会有报错,详细无法查看。不能在目录中创建子文件子目录,不能cd切换到目录中。
rw-:查看会有报错,详细无法查看。不能在目录中创建子文件子目录,不能cd切换到目录中。
-w-:不能查看,不能创建,不能切换。
--x:不能查看,不能创建,可以cd切换到目录中。
---:不能查看,不能创建,不能切换。
2.文件目录权限的修改
命令:chmod #改变文件或目录权限
语法: chmod [选项] 权限 文件或目录
选项:-R #递归将权限应用于该目录下的子目录和子文件
chmod命令参数中,u代表所有者,g代表所属组、o代表其他用户,a代表所有人
3.文件归属修改
chown #修改文件或目录的所有者和所属组
chown [选项] [所有者] [所属组] 文件或目录
选项:-R #递归将权限应用于该目录下的子目录和子文件
4.文件隐藏属性
Linux下的文件还有一些隐藏属性,使用lsattr来查看
lsattr #查看文件系统属性
用法: lsattr 选项 文件名
-a:#显示所有文件和目录
-d:#若目标是目录,仅列出目录本身属性
chattr(超级用户可用) #修改文件隐藏属性
用法:chattr [+-=] [选项] 文件或目录
选项:
i:文件设置i属性,不许对文件进行删除、改名、添加和修改数据;
目录设置i属性,只能修改目录下文件的数据,不许新建和删除文件
a:文件设置a属性,只能在文件添加数据,不能删除和修改数据
目录设置a属性,只允许在目录中新建和修改文件(echo追加覆盖),不许删除
e:Linux中绝大多数的文件都默认有e属性。意思是该文件由ext文件系统进行存储,
不能使用“chatter -e”命令取消e属性
5.文件特殊权限
在多用户多任务的Linux系统中,每个进程的运行都与运行的用户和组相关联。
除了进程识别号(PID)以外,每个进程还有4个用户和用户组相关的识别号。
实际用户识别号(real user ID,RUID)
实际组识别号(real group ID,RGID)
有效用户识别号(effect user ID,EUID)
有效用户组识别号(effect group ID,EGID)
EUID和EGID的作用:
在于确定一个进程对其访问的文件的权限和优先权。
通常情况下说EUID与EGID和RGID相同。设置了SUID和SGID情况除外
SUID权限
作用:
当一个具有执行权限的文件设置SUID权限后,用户执行这个文件时将以文件所有者的身份执行
特点:
只有可以执行的二进制程序文件才能设定SUID权限
命令执行者要对该程序拥有x执行权限
命令执行在执行该程序时获得该程序文件所有者的身份
SUID权限只在该程序执行过程中有效,就是说身份的改变只在执行过程中有效。
可执行文件/usr/bin/passwd所属用户是root(UID为0),此文件被设置了SUID权限。
当一个UID为1000、GID为1000的用户执行此命令时,产生的进程RUID和RGID分别是1000和1000,EUID是0、EGID是1000.
添加或删除SUID的命令格式
[root@localhost ~]# chmod u-s /usr/bin/passwd
[root@localhost ~]# ll /usr/bin/passwd
-rwxr-xr-x. 1 root root 27856 4月 1 2020 /usr/bin/passwd
[root@localhost ~]# chmod u+s /usr/bin/passwd
[root@localhost ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27856 4月 1 2020 /usr/bin/passwd
[root@localhost ~]#
SGID权限
SGID权限的功能和SUID类似。
如果某个二进制文件的用户组权限设置了SGID权限。
则执行该文件时,用户获得该文件所属组的权限。
SGID可以对文件和目录生效。
在设置了SGID权限的目录下建立文件时,新创建的文件的所属组会继承上级目录的所属组。
[root@localhost ~]# ll /usr/bin/locate
-rwx--s--x. 1 root slocate 40520 4月 11 2018 /usr/bin/locate
[root@localhost ~]#
可以看到locate本身具有SGID权限
总结:
目录:
普通用户必须对此目录拥有r和x权限才能进入此目录
普通用户在此目录中的有效组会编程此目录的属组
普通用户对此目录拥有w权限时,新建的文件的默认属组是这个目录的属组
文件:
只有可执行的二进制程序才能设置SGID权限
命令执行者要对程序拥有x(执行)权限
程序在执行过程中,程序的组会改变成程序文件的属组
SGID权限同样只在该程序执行过程中有效,也就是说组身份的转变在程序执行过程中有效
添加或删除SGID的命令格式为
[root@localhost ~]# chmod g+s /usr/bin/passwd
[root@localhost ~]# ll /usr/bin/passwd
-rwsr-sr-x. 1 root root 27856 4月 1 2020 /usr/bin/passwd
[root@localhost ~]# chmod g-s /usr/bin/passwd
[root@localhost ~]# ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 27856 4月 1 2020 /usr/bin/passwd
[root@localhost ~]#
Stickey BIT权限
sticky权限只能用于设置在目录上,设置这种权限的目录;
只有该文件的创建者、目录的拥有者和root可以删除自己的文件。
在RedHat或Centos系统中/tmp目录就拥有sticky权限
添加或删除SBIT权限
[root@localhost ~]# chmod o+t /tmp/
drwxrwxrwt. 31 root root 4096 5月 11 03:41 tmp
[root@localhost ~]# chmod o-t /tmp/
drwxrwxrwx. 31 root root 4096 5月 11 03:41 tmp
ACL权限
ACL(access control list)访问控制列表,可以对单一的用户或者组设置对文件或目录的独立rwx权限
开启ACL权限
ACL是传统的Unix-like操作系统权限的额外支持项目,因此要使用ACL必须要有文件系统的支持才行。目前大部分的文件系统都支持ACL,包含ext3、4、JFS、XFS
centos7现在都是XFS文件系统默认开启
[root@localhost ~]# dmesg | grep -i "acl"
[ 1.080417] systemd[1]: systemd 219 running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN)
[ 2.185473] SGI XFS with ACLs, security attributes, no debug enabled
[20942.030310] XFS (dm-0): unknown mount option [acl].
#第一条说明了:系统在219运行系统模式,其中包括了ACL
#第二条说明:具有ACL、安全属性、没有启用调试的SGI XFS
ACL权限的使用
描述:设置访问控制列表
用法:setfacl [选项] {u:username:rwx} 文件或目录
选项:
-b:删除所有ACL条目
-m:添加ACL条目
-x:删除指定用户的ACL权限
-R:实现目录上的ACL权限递归
-d:设置默认ACL权限(对目录生效)
-k:删除默认ACL权限
[root@localhost ~]# setfacl -m u:yang:rwx anaconda-ks.cfg
[root@localhost ~]# getfacl anaconda-ks.cfg
# file: anaconda-ks.cfg
# owner: root
# group: root
user::rw-
user:yang:rwx
group::---
mask::rwx
other::---
[root@localhost ~]# setfacl -x u:yang anaconda-ks.cfg
[root@localhost ~]# getfacl anaconda-ks.cfg
# file: anaconda-ks.cfg
# owner: root
# group: root
user::rw-
group::---
mask::---
other::---
[root@localhost ~]# setfacl -R -m u:yang:rwx /root/ol
[root@localhost ~]# getfacl /root/ol
getfacl: Removing leading '/' from absolute path names
# file: root/ol
# owner: root
# group: root
user::rw-
user:yang:rwx
group::r--
mask::rwx #mask:有效权限。用户或用户组的权限必须在mask的权限范围值才能生效。
other::r--
6.执行命令权限
1. sudo 命令
通常情况来说的话我们普通用户要执行root权限,因为root用户权限最大,我们的第一步骤肯定就是执行su root或者su - root,在root下去执行这条命令。
这样做的缺点就是为了执行几条命令就切换root用户,不大值当,还得去问管理员密码,再加上如果是在工作的过程中,身为工程师我们要确保服务器的安全,要定期修改root密码,由此来保证服务器中数据的不被泄露,当然这只是手段之一。接下来说下使用
命令格式:sudo [常见参数] 命令
常见参数
-l | 查询当前用户来源主机名以及可用的命令 |
-S | 非交互式执行sudo |
-h | 帮助,查询sudo命令选项 |
配置文件 /etc/sudoers
sudo执行过程:当用户在执行sudo命令时,系统会在/etc/sudoers文件查询是否有执行sudo的权限。
用户在具有执行sudo权限时,系统会让输入自己的密码进行确认。
密码输入成功,开始进行sudo后续的命令。(root用户执行sudo不需要输入密码)
##
## Allow root to run any commands anywhere
#格式:用户账号 登陆者来源主机名 = (可切换的用户身份) 可执行的命令
root ALL=(ALL) ALL
yang ALL=(ALL) ALL
#我现在就给我自己的账号设置执行sudo权限
## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
# %sys ALL = NETWORKING, SOFTWARE, SERVICES, STORAGE, DELEGATING, PROCESSES, LOCATE, DRIVERS
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL
## Same thing without a password
# %wheel ALL=(ALL) NOPASSWD: ALL
[yang@localhost opt]$ touch po
touch: 无法创建"po": 权限不够
[yang@localhost opt]$ sudo touch po
我们信任您已经从系统管理员那里了解了日常注意事项。
总结起来无外乎这三点:
#1) 尊重别人的隐私。
#2) 输入前要先考虑(后果和风险)。
#3) 权力越大,责任越大。
[sudo] yang 的密码:
yang 不在 sudoers 文件中。此事将被报告。
#在这里可以看到我们在普通用户无法创建文件,即使在sudo的情况下也无法创建,因为这时候我没有把yang加进/etc/sudoers文件中
#现在我把yang加进去配置文件执行的结果
[yang@localhost opt]$ sudo touch po
[sudo] yang 的密码:
[yang@localhost opt]$ ls
ld po rh to
[yang@localhost opt]$
这样执行的的确很爽,这样的话会有一个隐藏的BUG。
来,上实验!
[yang@localhost opt]$ sudo su -
上一次登录:五 5月 10 22:08:44 CST 2024pts/1 上
[yang@localhost ~]# sudo passwd root
更改用户 root 的密码 。
新的 密码:
无效的密码: 密码少于 8 个字符
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[yang@localhost ~]#
原因就是:之前我在配置文件中设置权限过大,在工作中这样的情况是不允许的,
这就需要我们在配置文件中去限制相关权限
修改配置文件
[
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
yang ALL=(ALL) !/usr/bin/passwd"",!/usr/bin/passwd root,!/usr/bin/su -"root"
## Allows members of the 'sys' group to run networking, software,
## service management apps and more.
#注意命令需要写绝对路径,使用,号将命令绝对路径隔开
]
[yang@localhost root]$ sudo passwd root
[sudo] yang 的密码:
对不起,用户 yang 无权以 root 的身份在 localhost.localdomain 上执行 /bin/passwd root。
[yang@localhost root]$ sudo su -
对不起,用户 yang 无权以 root 的身份在 localhost.localdomain 上执行 /bin/su -。
[yang@localhost root]$ sudo su -root
对不起,用户 yang 无权以 root 的身份在 localhost.localdomain 上执行 /bin/su -root。