Linux是一个多用户、多任务的操作系统,多用户主要体现在用户角色的多样性,不同的用户所分配的权限不同,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统,这也是Linux系统比Windows系统更为安全的本质所在。
在Linux操作系统中,每个文件、目录和进程,都归属于某一个用户,没有用户许可其它普通用户是无法操作的。系统默认安装时,系统用户名和UID是一对一的对应关系,一个UID 对应一个用户。而Linux系统也正是通过用户的LoginName所对应的UID来确认用户身份的。UID是系统确认用户身份及所拥有权限的唯一标识,相同UID的用户具有相同的身份和权限。
UID一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问,另一方面也可以为用户提供安全性保护。每个用户账号都拥有一个惟一的UID和各自的Password。当一个用户在登录系统时,操作系统会通过比对用户登录时输入的用户名是否在/etc/password中存在,及用户输入的密码是否与/etc/shadow中通过借助于salt随机数及SHA512单向加密算法加密后存储的密码一致,来判断是否允许用户进行登录。用户如果在登录时键入正确的用户名和口令后,就能够进入系统和自己的主目录。
在Linux系统中,系统是通过UID来区分用户权限级别的,而UID为0的用户被系统约定为是具有超级权限的root用户。我们可以通过/etc/passwd来查看UID为0的用户是root,而且只有root对应的UID为0。对于root用户来说,普通用户无法执行的操作,root用户都能完成,所以也被称之为超级管理用户,从这一点来看,root用户在系统中是无可替代的至高地位和无限制权限。
root用户的特权性还表现在root用户在系统正常的许可范围内,可以超越任何用户和用户组来对对任何文件进行读取、修改、删除等操作;对可执行程序或进程的执行、终止等;对硬件设备的添加、创建和移除等;也可以对文件和目录进行属主和权限进行修改,以适合系统管理的需要。但值得注意的是,这种操作是在系统正常许可范围内的操作,有些操作就是具有超级权限的root也无法完成;比如/proc 目录,/proc是用来反应系统运行的实时状态信息的,因此即便是root用户也无能为力。
与超级管理员root用户所相对的就是普通用户,普通用户一般都是受限用户,我们为了保证服务器的安全,并完成特定的系统任务,就必须为其创建相对应权限的普通用户,而普通用户又分为:
1、系统用户
在CetnOS系统6之前一般的系统普通用户的UID范围为:1-499,而从CentOS7开始系统普通用户的UID范围更改为1-999。
系统用户一般主要供系统服务使用,一般默认不允许进行系统登陆。
2、登录用户
在CetnOS6系统之前一般的普通登录用户的UID范围为:500-60000,而从CentOS7开始普通登录用户的UID范围更改为1000-60000。
登录用户一般是由操作系统超级管理员root用户根据实际业务需求添加并分配相应权限等。
普通用户与root共用一个UID是非常危险的一件事情,比如我们把普通用户xlogin的UID改为0,事实上这个普通用户就具有了超级管理员权限,他的权限就和root用户一样;这事实上就造成了系统管理权限存在的安全隐患的风险。
基于root具有至高无上的系统权限,root用户一般也只是被用来管理和维护系统时使用,所以日常运维工作中,建议一般使用普通用户身份进行登录和完成相关操作,如果确实必须使用用root权限才可以完成的工作,建议可以通过su或sudo来实现;切不可随意让一个用户和root分享同一个UID!
实现用户账号的管理,要完成的工作主要有如下几个方面:
1、用户账号UID的添加、删除与修改。
2、用户口令Password的管理。
3、用户组GID的管理。
1、用户账号UID的添加、修改与删除。
添加用户账号就是在系统中创建一个新的用户账号,然后为新账号分配用户号、用户组、对用户进行描述、指定家目录和登录Shell等资源。
添加新用户帐号使用useradd或者adduser命令,二者实际上是一个命令。adduser是useradd的链接文件。常用参数如下:
useradd [选项] 登录名 -u, --uid UID:指定UID; -g, --gid GROUP:指定基本组ID,此组得事先存在; -G, --groups GROUP1[,GROUP2,...[,GROUPN]]]:指明用户所属的附加组,多个组之间用逗号分隔; -c, --comment COMMENT:指明注释信息; -d, --home HOME_DIR:以指定的路径为用户的家目录;通过复制/etc/skel此目录并重命名实现;指定的家目录路径如果事先存在,则不会为用户复制环境配置文件; -s, --shell SHELL:指定用户的默认shell,可用的所有shell列表存储在/etc/shells文件中; -r, --system:创建系统用户; 注意:创建用户时的诸多默认设定配置文件为/etc/login.defs
这里我以新建普通登录用户xlogin为例,指定UID为1100,GID为1200,其附加组为magedu,注释信息为Admin,家目录为/data/xlogin,shell为/sbin/nologin.
[root@xlogin ~]# groupadd magedu [root@xlogin ~]# groupadd -g 1200 cetos [root@xlogin ~]# tail -2 /etc/group magedu:x:1000: cetos:x:1200: [root@xlogin ~]# useradd -u 1100 -g 1200 -G magedu -c "Admin" -d /data/xlogin -s /sbin/nologin xlogin [root@xlogin ~]# tail -1 /etc/passwd xlogin:x:1100:1200:Admin:/data/xlogin:/sbin/nologin [root@xlogin ~]# id xlogin uid=1100(xlogin) gid=1200(cetos) 组=1200(cetos),1000(magedu)
useradd -D:显示创建用户的默认配置;
useradd -D 选项: 修改默认选项的值,修改的结果保存于/etc/default/useradd文件中;
更改默认值 只带 -D 选项使用时,useradd 将显示当前的默认值。-D 和其它选项配合使用时,useradd 将为指定的选项更新默认值。有效的“更改默认值”选项有: -b, --base-dirBASE_DIR 新用户主目录的路径前缀。如果创建新账户时,没有使用 -d 选项,用户的名称将会缀在 BASE_DIR 的后边形成新用户的主目录名。 这个选择在 /etc/default/useradd 中设置 HOME 选项。 -e, --expiredateEXPIRE_DATE 禁用此用户账户的日期。 此选项在 /etc/default/useradd 中设置 EXPIRE 变量。 -f, --inactiveINACTIVE 密码过期到账户被禁用之前的天数。 这个选项在 /etc/default/useradd 中设置 INACTIVE 变量。 -g, --gidGROUP 新用户初始组的组名或 ID (使用了 -N/--no-user-group 或者 /etc/login.defs 中的变量 USERGROUPS_ENAB 设置为 no 时)。给出的组必须存在,并且数字组 ID 必须有一个已经存在的项。 这个选项在 /etc/default/useradd 中设置 GROUP 变量。 -s, --shellSHELL 新用户的登录 shell 名。 这个选项在 /etc/default/useradd 设置 SHELL 变量。 注意: 系统管理员负责将默认的用户文件放在 /etc/skel/ 目录中(或者命令行上、/etc/default/useradd 中指定的任何其它目录)。
[root@xlogin ~]# useradd -D GROUP=100 HOME=/home #把用户的家目录建在/home中; INACTIVE=-1 #是否启用帐号过期停权,-1表示不启用; EXPIRE= #帐号终止日期,不设置表示不启用; SHELL=/bin/bash #新建登录用户的默认使用SHELL的类型; SKEL=/etc/skel #默认添加用户的目录默认文件存放位置;也就是说,当我们用adduser添加用户时,用户家目录下的文件,都是从这个目录中复制过去的; CREATE_MAIL_SPOOL=yes [root@xlogin ~]# cat /etc/default/useradd # useradd defaults file GROUP=100 HOME=/home INACTIVE=-1 EXPIRE= SHELL=/bin/bash SKEL=/etc/skel CREATE_MAIL_SPOOL=yes
usermod命令:修改用户属性
usermod [选项] 登录 -u, --uid UID:修改用户的ID为此处指定的新UID; -g, --gid GROUP:修改用户所属的基本组; -G, --groups GROUP1[,GROUP2,...[,GROUPN]]]:修改用户所属的附加组;原来的附加组会被覆盖; -a, --append:与-G一同使用,用于为用户追加新的附加组; -c, --comment COMMENT:修改注释信息; -d, --home HOME_DIR:修改用户的家目录;用户原有的文件不会被转移至新位置; -m, --move-home:只能与-d选项一同使用,用于将原来的家目录移动为新的家目录; -l, --login NEW_LOGIN:修改用户名; -s, --shell SHELL:修改用户的默认shell; -L, --lock:锁定用户密码;即在用户原来的密码字符串之前添加一个"!"; -U, --unlock:解锁用户的密码; -e, --expiredate EXPIRE_DATE 设定帐户过期的日期为 EXPIRE_DATE -f, --inactive INACTIVE 过期 INACTIVE 天数后,设定密码为失效状态
以修改用户xlogin的用户名为redhat为例,UID为1200,GID为1100,附加组改为ubuntu后,并新增附加组为fedora,修改注释信息为Linux,将原来的家目录/home/xlogin移动为新的家目录/data/redhat,默认shell为/bin/bash。并锁定用户redhat。
[root@xlogin ~]# groupadd ubuntu [root@xlogin ~]# groupadd -g 1100 linux [root@xlogin ~]# usermod -l redhat -u 1200 -g 1100 -G ubuntu xlogin [root@xlogin ~]# groupadd -g 1110 fedora [root@xlogin ~]# usermod -a -G fedora -c "Linux" -m -d /data/redhat redhat [root@xlogin ~]# id redhat uid=1200(redhat) gid=1100(linux) 组=1100(linux),1201(ubuntu),1110(fedora)
2、用户口令Password的管理。
passwd命令: passwd [-k] [-l] [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin] [username] (1) passwd:修改用户自己的密码; (2) passwd USERNAME:修改指定用户的密码,但仅root有此权限; -l:锁定用户; -u:解锁用户; -d:清除用户密码串; -e: 强制用户下次登录时修改密码; -i DAYS:非活动期限; -n DAYS:密码的最短使用期限; -x DAYS:密码的最长使用期限; -w DAYS:警告期限; --stdin: echo "PASSWORD" | passwd --stdin USERNAME
/etc/passwd:用户的信息库
用户名:X占位符或加密的密码:用户UID:GID:注释信息:用户家目录:登录时默认shell程序
[root@xlogin ~]# echo "linux" | passwd --stdin redhat #通过标准输入的方式更改redhat用户密码为linux 更改用户 redhat 的密码 。 passwd:所有的身份验证令牌已经成功更新。
测试过程中,发现使用usermod -L和passwd -l功能相同,都是在shadow文件中用户密码前加了个叹号,而且无论是使用usermod -L还是passwd -l锁定的用户,都可以使用passwd -u或者usermod -U进行解锁。
[root@xlogin ~]# passwd xlogin 更改用户 xlogin 的密码 。 新的 密码: 无效的密码: 密码少于 8 个字符 重新输入新的 密码: passwd:所有的身份验证令牌已经成功更新。 [root@xlogin ~]# grep xlogin /etc/shadow xlogin:!$6$3DmNUcUd$d0X/F9lKRDsGN55FPA.7NMyI6tsZ/gflJRQTXfaGF1VgNUxqNHVoKJtpkRihm/MPjcsxXBiRsPIt6616P/YMQ0:16781:0:99999:7::: [root@xlogin ~]# passwd -d xlogin 清除用户的密码 xlogin passwd: 操作成功 [root@xlogin ~]# grep xlogin /etc/shadow xlogin::16781:0:99999:7::: [root@xlogin ~]# usermod -L redhat [root@xlogin ~]# passwd -l redhat 锁定用户 redhat 的密码 。 passwd: 操作成功 [root@xlogin ~]# grep redhat /etc/shadow redhat:!!$6$PxHvSbEt$5KdCgVZCYOSMbfKULSy8/2AWqzReWvqcixxPzGhZh3/GAghcl39r9lFF5vEUiTunrUTJbgz9w9CsDagOEP5wS1:16781:0:99999:7::: [root@xlogin ~]# usermod -U redhat [root@xlogin ~]# grep redhat /etc/shadow redhat:!$6$PxHvSbEt$5KdCgVZCYOSMbfKULSy8/2AWqzReWvqcixxPzGhZh3/GAghcl39r9lFF5vEUiTunrUTJbgz9w9CsDagOEP5wS1:16781:0:99999:7::: [root@xlogin ~]# passwd -u redhat 解锁用户 redhat 的密码。 passwd: 操作成功 [root@xlogin ~]# grep redhat /etc/shadow redhat:$6$PxHvSbEt$5KdCgVZCYOSMbfKULSy8/2AWqzReWvqcixxPzGhZh3/GAghcl39r9lFF5vEUiTunrUTJbgz9w9CsDagOEP5wS1:16781:0:99999:7::: [root@xlogin ~]#
/etc/shadow:用户密码
[root@xlogin ~]# grep redhat /etc/shadow redhat:$6$2JL5HiTd$/Rrz00GfvTeRs62r2bjlReN.q2ZB5c/:16781:10:20:5:9:: 每一行给一个特殊帐户定义密码信息,每个字段用 : 隔开。 用户名:加密的密码:密码被修改的天数(自1/1/1970至今):密码最短使用期限:密码最长使用期限:密码变更前提前几天警告:过期期限:保留字段 字段 1 定义与这个 shadow 条目相关联的用户帐户。 字段 2 用户加密后的密码 字段 3 自 1/1/1970 起,密码被修改的天数 字段 4 密码将被允许修改之前的天数(0 表示“可在任何时间修改”) 字段 5 系统将强制用户修改为新密码之前的天数(1 表示“永远都不能修改”) 字段 6 密码过期之前,用户将被警告过期的天数(-1 表示“没有警告”) 字段 7 密码过期之后,系统自动禁用帐户的天数(-1 表示“永远不会禁用”) 字段 8 该帐户被禁用的天数(-1 表示“该帐户被启用”) 字段 9 保留供将来使用
通过修改系统时间来观察密码被修改的天数变化,以及通过使用passwd相关命令,更改用户密码的最短使用期限为10天,密码的最长使用期限为20天,警告期限为5天。
[root@xlogin ~]# tail -1 /etc/shadow redhat:$6$/Jp.z.c4$ndzgQX8.W4DlVKTJUNAFXaWjr1PczXVy2ZRFA3Mnb5w5Tf4Ca5RNIIcqj20gUd7IriOEEHQU.fSihbhMQzTOM/:16781:0:99999:7::: [root@xlogin ~]# date 1212201520.30 2020年 12月 12日 星期六 20:15:30 CST [root@xlogin ~]# passwd redhat 更改用户 redhat 的密码 。 新的 密码: 无效的密码: 密码少于 8 个字符 重新输入新的 密码: passwd:所有的身份验证令牌已经成功更新。 [root@xlogin ~]# tail -1 /etc/shadow redhat:$6$t5O9CWSY$sPUt4PCJseGYIOJl9HfchXv3V/K35jsoaUSHibukzPv2UCmiY6Z/8lQQy/QvRVgnDHaB1QVpttud47JkhPJ1T/:18608:0:99999:7::: [root@xlogin ~]# tail -1 /etc/shadow redhat:$6$t5O9CWSY$sPUt4PCJseGYIOJl9HfchXv3V/K35jsoaUSHibukzPv2UCmiY6Z/8lQQy/QvRVgnDHaB1QVpttud47JkhPJ1T/:18608:0:99999:7::: [root@xlogin ~]# passwd -n 10 -x 20 -w 5 redhat 调整用户密码老化数据redhat。 passwd: 操作成功 [root@xlogin ~]# tail -1 /etc/shadow redhat:$6$t5O9CWSY$sPUt4PCJseGYIOJl9HfchXv3V/K35jsoaUSHibukzPv2UCmiY6Z/8lQQy/QvRVgnDHaB1QVpttud47JkhPJ1T/:18608:10:20:5::: [root@xlogin ~]# passwd -e redhat 正在终止用户 redhat 的密码。 passwd: 操作成功 [root@xlogin ~]# tail -1 /etc/shadow redhat:$6$t5O9CWSY$sPUt4PCJseGYIOJl9HfchXv3V/K35jsoaUSHibukzPv2UCmiY6Z/8lQQy/QvRVgnDHaB1QVpttud47JkhPJ1T/:0:10:20:5:::
passwd -e redhat命令,强制redhat用户在下次登录时必须修改密码。而且修改后的密码不能与之前的密码相同!但是如果root用户直接通过passwd redhat方式为用户修改修改密码的话,则修改后的密码可以与之前的密码相同。
Connecting to 172.16.200.10:22... Connection established. To escape to local shell, press 'Ctrl+Alt+]'.WARNING! The remote SSH server rejected X11 forwarding request. You are required to change your password immediately (root enforced) Last login: Sat Dec 12 20:57:38 2015 from 172.16.200.1 WARNING: Your password has expired. You must change your password now and login again! 更改用户 redhat 的密码 。 为 redhat 更改 STRESS 密码。 (当前)UNIX 密码:
[root@xlogin ~]# passwd -i 9 redhat 调整用户密码老化数据redhat。 passwd: 操作成功 [root@xlogin ~]# tail -1 /etc/shadow redhat:$6$qB4EMVrt$oSkRK5lJFynrqlTwZLrqOd66DLyLGalQyuIOicyQsrdOGiUetM28QVzGIkfb2UsloI.R5uv3PkVvNCmbPYT3d.:16781:10:20:5:9::
需要关注的文件: /etc/login.defs:
[root@xlogin ~]# cat /etc/login.defs |grep -v '^#\|^$' MAIL_DIR /var/spool/mail #创建新用户时所创建的相对应的mail文件目录; PASS_MAX_DAYS 99999 #用户密码使用的最长天数; PASS_MIN_DAYS 0 #密码修改之间最小的天数; PASS_MIN_LEN 5 #用户密码的最小长度; PASS_WARN_AGE 7 #密码过期之前7天开始提示; UID_MIN 1000 #新建普通登录用户最小UID为1000; UID_MAX 60000 #新建普通登录用户最大UID为60000; SYS_UID_MIN 201 SYS_UID_MAX 999 GID_MIN 1000 GID_MAX 60000 SYS_GID_MIN 201 SYS_GID_MAX 999 CREATE_HOME yes UMASK 077 USERGROUPS_ENAB yes ENCRYPT_METHOD SHA512
userdel命令:删除用户 userdel [选项] 登录 -r:删除用户时一并删除其家目录; [root@xlogin ~]# tail -1 /etc/group magelinux:x:1203: [root@xlogin ~]# tail -1 /etc/gshadow magelinux:!:: [root@xlogin ~]# ll -d /data/magedu/ drwx------. 3 magelinux magelinux 74 12月 13 08:56 /data/magedu/ [root@xlogin ~]# userdel -r magelinux [root@xlogin ~]# ll -d /data/magedu/ ls: 无法访问/data/magedu/: 没有那个文件或目录 [root@xlogin ~]# tail -1 /etc/gshadow centos:$6$FpLaakgRKbxBFU1$fjZ8eluskwj5qIPkYz1QXB24vc9kDVJnAVFLL9NjVAZLog9H29fIeMaGGNZ5v7Hj0wum4pkSNbViogiSr/pnL1:: [root@xlogin ~]# tail -1 /etc/group centos:x:1202: [root@xlogin ~]# tail -1 /etc/shadow linux:!!:16781:0:99999:7::: [root@xlogin ~]# tail -1 /etc/passwd linux:x:1201:1100::/home/linux:/bin/bash
groupdel:删除用户组 groupdel [选项] GROUP 修改系统账户文件,删除与 GROUP 相关的所有项目。给出的组名必须存在。 不能移除现有用户的主组。在移除此组之前,必须先移除此用户。 需要手动检查所有文件系统,以确保没有遗留的属于此组的文件。 相关文件 /etc/group 组账户信息。 /etc/gshadow 安全组账户信息。 [root@xlogin ~]# id redhat uid=1200(redhat) gid=1100(linux) 组=1100(linux),1201(ubuntu),1110(fedora) [root@xlogin ~]# grep ubuntu
gpasswd命令: 组密码文件:/etc/gshadow gpasswd [选项] group -a USERNAME:向组中添加用户 -d USERNAME:从组中移除用户 newgrp命令:临时切换指定的组为基本组; newgrp [-] [group] -: 会模拟用户重新登录以实现重新初始化其工作环境; [root@xlogin ~]# groupadd centos [root@xlogin ~]# gpasswd centos 正在修改 centos 组的密码 新密码: 请重新输入新密码: [root@xlogin ~]# grep centos /etc/gshadow centos:$6$FpLaakgRKbxBFU1$fjZ8eluskwj5qIPkYz1QXB24vc9kDVJnAVFLL9NjVAZLog9H29fIeMaGGNZ5v7Hj0wum4pkSNbViogiSr/pnL1:: [redhat@xlogin ~]$ whoami redhat [redhat@xlogin ~]$ id uid=1200(redhat) gid=1100(linux) 组=1100(linux),1110(fedora),1201(ubuntu) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 [redhat@xlogin ~]$ touch linux [redhat@xlogin ~]$ ll 总用量 0 -rw-r--r--. 1 redhat linux 0 12月 12 21:38 linux [redhat@xlogin ~]$ newgrp fedora [redhat@xlogin ~]$ touch fedora [redhat@xlogin ~]$ ll 总用量 0 -rw-r--r--. 1 redhat linux 0 12月 12 21:38 linux -rw-r--r--. 1 redhat fedora 0 12月 12 21:39 fedora [redhat@xlogin ~]$ exit exit [redhat@xlogin ~]$ newgrp centos 密码: [redhat@xlogin ~]$ id uid=1200(redhat) gid=1202(centos) 组=1100(linux),1110(fedora),1201(ubuntu),1202(centos) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023 [redhat@xlogin ~]$ touch centos [redhat@xlogin ~]$ ll 总用量 0 -rw-r--r--. 1 redhat centos 0 12月 12 21:41 centos -rw-r--r--. 1 redhat linux 0 12月 12 21:38 linux -rw-r--r--. 1 redhat fedora 0 12月 12 21:39 fedorachage命令:更改用户密码过期信息 chage [选项] 登录名 -d:密码的上一次修改期限 -E:过期日期 -I:非活动期限 -W:最长使用期限 -m:最短使用期限 -W:警告信息 id命令:显示用户的真实和有效ID; id [OPTION]... [USER] -u: 仅显示有效的UID; -g: 仅显示用户的基本组ID; -G:仅显示用户所属的所有组的ID; -n: 显示名字而非ID; [redhat@xlogin ~]$ id -G -n redhat linux ubuntu fedora
su命令:switch user 登录式切换:会通过读取目标用户的配置文件来重新初始化 su - USERNAME su -l USERNAME 非登录式切换:不会读取目标用户的配置文件进行初始化 su USERNAME 注意:管理员可无密码切换至其它任何用户; -c 'COMMAND':仅以指定用户的身份运行此处指定的命令; [root@xlogin ~]# su - redhat -c 'whoami' redhat [root@xlogin ~]# whoami root