Linux 帐号管理

季凡
2023-12-01



1. Linux 帐号与用户组


 

 

2. Linux 帐号管理


 


2.1 新增与删除用户:useradd, useradd 相关配置文件, passwd, chage, usermod, userdel


 

 
 ■ 使用 useradd 新建用户帐号



 useradd - 创建一个新用户或更新默认新用户信息
 
 用法:
  useradd [-u UID] [-g 初始用户组] [-G 次要用户组] [-mM] [-c 说明栏] [-d 主文件夹绝对路径] [-s shell] 用户账号名
  
 选项与参数:
  -u :后面接的是 UID ,是一组数字。直接指定一个特定的 UID 给这个账号;
  -g :后面接的那个组名就是 initial group 。该群组的 GID 会被放置到 /etc/passwd 的第四个字段。
  -G :后面接的组名是这个账号还可以加入对用户组。这个参数会修改 /etc/group 内的相关数据。
  -M :强制!不要建立用户主目录(系统账号默认值)。
  -m :强制!要建立用户主目录(一般账号默认值)。
  -c :这个就是 /etc/passwd 第五栏的说明内容,可以随便设置。
  -d :指定某个目录为主目录,而不要使用默认值。务必使用绝对路径。
  -r :建立一个系统账号,这个账号的 UID 会有限刢 (参考 /etc/login.defs)。
  -s :后面接一个 shell ,若没有指定则默认是 /bin/bash 。
  -e :后面接一个日期,格式为 “YYYY-MM-DD” ,此项目可写入 shadow 第八字段, 即帐号失效日期的设置选项。
  -f :后面接 shadow 的第七字段选项,指定密码是否会失效。0为立刻失效, -1 为永远不失效(密码只会过期而强制登录时重新设置) 。
 
 范例:
  [root@online ~]# useradd git
  [root@online ~]# ll -d /home/git
  drwx------. 3 git git 78 4月  22 17:55 /home/git

 

  [root@online ~]# grep git /etc/passwd /etc/shadow /etc/group
  /etc/passwd:git:x:1001:1001::/home/git:/bin/bash
  /etc/shadow:git:!!:17643:0:99999:7:::
  /etc/group:git:x:1001: <== 默认会建立一个与帐号完全一样的用户组

 

 其实系统已经帮我们设置好非常多的默认值了,所以我们可以简单地使用 “useradd 账号” 来创建用户即可。CentOS 这些默认值主要会帮我们处理几个项目:
  
  ● 在 /etc/passwd 里面建立一行与帐号相关的数据,包括建立 UID/GID/主目录等;
  ● 在 /etc/shadow 里面将此帐号的密码相关参数填入,但是尚未有密码;
  ● 在 /etc/group 里面加入一个与帐号名称完全一样的组名;
  ● 在 /home 下建立一个与帐号同名的目录作为用户主目录,且权限为 700
  
 由于在 /etc/shadow 内只会有密码参数而不会有加密过的密码数据,因此在建立用户帐号时,还需要使用 “passwd 帐号” 来设置密码才算是完成用户建立流程。 
  
 如果有特殊需要而改变用户帐号的默认参数,就要使用命令选项参数来改变帐号创建过程。

 

 范例:
  useradd -u 700 -g users git2
 
 范例:建立一个系统帐号
  useradd -r git3
  ll -d /home/git3 
  ls: /home/git3: No such file or directory <==不会建立主目录
  
 系统帐号的 UID/GID 小于 1000。同时,由于系统账号主要是用来运行系统所需服务, 所以系统账号默认都不会主动创建主目录。 
 
 
 
 ■ useradd 参考文件
 -----------------------------------------------------------------------------------------------------------------------------------------
 useradd 的默认值可以使用下面的方法显示出来:
 
 [root@online ~]# useradd -D
 GROUP=100  <==默认的用户组
 HOME=/home  <==默认主目录的基准目录(basedir)
 INACTIVE=-1  <==密码失效日期, shadow 内第七列
 EXPIRE=   <==帐号失效日期, shadow 内第八列
 SHELL=/bin/bash <==默认的 shell
 SKEL=/etc/skel <==用户主目录的内容数据参考目录
 CREATE_MAIL_SPOOL=yes <==是否创建用户邮箱

 

 

 

 ■ passwd
 -----------------------------------------------------------------------------------------------------------------------------------------
 使用 useradd 建立帐号之后,默认情况下,该帐号暂时被封锁,也就是说,该帐号无法登录。需要设置密码方能使用。

 

 用法:
  passwd [--sdtin] <==所有人均可使用来改自己的密码
  
  passwd [-l] [-u] [--sdtin] [-S] [-n 天数] [-x 天数] [-w 天数] [-i 日期] 账号 <==root 功能

 

 选项与参数:
  --stdin :可以通过来自于一个标准输入,作为密码,对 shell script 有帮助
  -l :是 Lock 的意思,会将 /etc/shadow 第二列最前面加上 ! 使密码失效;
  -u :与 -l 相对,是 Unlock 的意思。
  -S :列出密码相关参数,即 shadow 文件的大部分信息。
  -n :后面接天数,shadow 的第 4 字段,多少天不可修改密码
  -x :后面接天数,shadow 的第 5 字段,多少天内必须修改密码
  -w :后面接天数,shadow 的第 6 字段,密码过期前的警告天数
  -i :后面接日期,shadow 的第 7 字段,密码失效日期

 

 范例:root 给 git 设置密码
 
  [root@online ~]# passwd git
  
 通过 root 设置密码, root 可以设置各式各样的密码,系统几乎一定会接受!
 
 范例:给自己设置密码
 
  [git@online ~]$ passwd   <==后面不接帐号
  
 
 要注意的是,一般账号给自己设置密码,要经过检验,不合规范通不过。密码规范是非常严格,尤其新的 distributions 大多使用 PAM 模块进行密码检验,
 包括太短、密码与帐号相同、密码为字典常见字符串等,都会被 PAM 模块检查出来从而拒绝修改。
 这个管理机制写在 /etc/pam.d/passwd 中。该文件与密码有关的检验模块使用 pam_cracklib.so,这个模块会检验密码相关的信息,并取代
 /etc/login.defs 内的 PASS_MIN_LEN 的设置。
 
 
 范例:使用 standard input 修改用户密码
 
  [root@online ~]# echo "abc543CC" | passwd --stdin git
 
 
 
 ■ chage - 更改用户密码过期信息
 -----------------------------------------------------------------------------------------------------------------------------------------
 用法:
  [root@online ~]# chage [-ldEImMW] 帐号
  
 选项与参数:
  -l :列出该帐号的详绅密码参数;
  -d :后面接日期,修改 shadow 第三字段(最近一次更改密码的日期),格式 YYYY-MM-DD
  -E :后面接日期,修改 shadow 第八字段(账号失效日期),格式 YYYY-MM-DD
  -I :后面接天数,修改 shadow 第七字段(密码失效天数)
  -m :后面接天数,修改 shadow 第四字段(密码最短保留天数)
  -M :后面接天数,修改 shadow 第五字段(密码多久需要修改)
  -W :后面接天数,修改 shadow 第六字段(密码过期前警告天数)
 
 chage 有一个很不错的功能,如果想要 “用户在第一次登入时,强制他们一定要更改密码后才能够使用系统资源”,可以使用如下方法处理。
 
 范例:建立一个名为 agetest 的帐号,该帐号第一次登录时使用默认密码,但必须要更改密码后,使用新密码登录系统后才能使用 bash 环境
 
 [root@online ~]# useradd agetest
 [root@online ~]# echo "agetest" | passwd --stdin agetest
 [root@online ~]# chage -d 0 agetest
 
 
 
 ■ usermod - 修改一个用户账户
 ----------------------------------------------------------------------------------------------------------------------------------------- 
 用法:
  [root@online ~]# usermod [-cdegGlsuLU] username
 
 选项与参数:
  -c :后面接帐号的说明,即 /etc/passwd 第五栏的说明列,可以加入一些帐号说明;
  -d :后面接帐号的主目录,即修改 /etc/passwd 的第六列;
  -e :后面接日期,格式是 YYYY-MM-DD 也就是在 /etc/shadow 内的第八个字段数据。
  -f :后面接天数,为 shadow 的第七字段;
  -g :后面接初始用户组,修改 /etc/passwd 的第四个字段,即 GID 字段;
  -G :后面接次要用户组,修改这个用户能够支持的用户组,修改的是 /etc/group ;
  -a :不 -G 合用,可增加次要用户组的支持而非设置;
  -l :后面接帐号名称。即修改帐号名称, /etc/passwd 第一栏;
  -s :后面接 Shell 的实际文件名,例如 /bin/bash 或 /bin/csh 等等;
  -u :后面接 UID 数字,即 /etc/passwd 第三列的资料;
  -L :暂时将用户密码冻结,让他无法登录。其实仅改 /etc/shadow 密码列。
  -U :将 /etc/shadow 密码列的 ! 拿掉,解冻。
 
 
 ■  userdel - 删除用户账户和相关文件
 -----------------------------------------------------------------------------------------------------------------------------------------
 用法:
  userdel [-r] username
  
 选项与参数:
  -r : 用户主目录中的文件将随用户主目录和用户邮箱一起删除。在其它文件系统中的文件必须手动搜索并删除。

 

 
 
2.2 用户功能
---------------------------------------------------------------------------------------------------------------------------------------------

 


 ■  finger — 用户信息查找程序
 -----------------------------------------------------------------------------------------------------------------------------------------
 用法:
  finger [-s] username
  
 选项与参数:
  -s :仅列出用户的帐号、全名、终端机代号与登入时间等等;

 

 范例:
  [root@online ~]# finger git
  Login: git                              Name:
  Directory: /home/git                    Shell: /bin/bash
  Last login 日 4月 22 18:50 (CST) on pts/0
  No mail.
  No Plan.

 

  
  
 ■  chfn - 改变自己的 finger 信息
 -----------------------------------------------------------------------------------------------------------------------------------------
 用法:
  chfn [-foph] [账号名]
  
 选项与参数:
  -f :后面接完整名;
  -o :办公室房间号码;
  -p :办公室的电话号码;
  -h :家里的电话号码。
 

 

 范例:
  [git@online ~]$ chfn
  Changing finger information for git.
  名称 []:

 

  
 ■  chsh - 改变登录 shell
 -----------------------------------------------------------------------------------------------------------------------------------------
 用法:
  chsh [-ls]
  
 选项与参数:
  -l :列出当前系统上可用的 shell ,其实就是 /etc/shells 的内容
  -s :修改自己的 Shell
 
 范例:
  [git@online ~]$ chsh -l
  /bin/sh
  /bin/bash
  /sbin/nologin
  /usr/bin/sh
  /usr/bin/bash
  /usr/sbin/nologin
  /bin/tcsh
  /bin/csh
 
 
 ■  id - 显示真实和有效的 UID 和 GID
 -----------------------------------------------------------------------------------------------------------------------------------------
 用法:
 
  id [username]
  
 
  
2.3 新增与删除用户组
---------------------------------------------------------------------------------------------------------------------------------------------

 


 ■   groupadd - 创建一个新的用户组
 -----------------------------------------------------------------------------------------------------------------------------------------
 用法:
  [root@online ~]# groupadd [-g gid] [-r] 组名
  
 选项与参数:
  -g :后面接某个特定的 GID ,用于直接指定某个 GID;
  -r :建立系统用户组,与 /etc/login.defs 内的 GID_MIN 有关。

 

  
 范例:
  [root@online ~]# groupadd group1

 


 ■  groupmod - modify a group definition on the system
 -----------------------------------------------------------------------------------------------------------------------------------------
 用法:
  [root@online ~]# groupmod [-g gid] [-n group_name] 群组名
  
 选项与参数:
  -g :修改既有的 GID 数字
  -n :修改既有的组名
  
 
 ■  groupdel - 删除一个用户组
 -----------------------------------------------------------------------------------------------------------------------------------------  
 用法:
  [root@online ~]# groupdel [groupname]
  
  
 ■  gpasswd:群组管理员功能
 -----------------------------------------------------------------------------------------------------------------------------------------
 # 系统管理员(root)做的操作:
 用法:
  [root@online ~]# gpasswd groupname
  [root@online ~]# gpasswd [-A user1,...] [-M user3,...] groupname
  [root@online ~]# gpasswd [-rR] groupname

 

 选项与参数:
     :若没有任何参数,表示给 groupname 设置密码(/etc/gshadow)
  -A :将 groupname 的主控权交由后面的用户管理(该组的管理员)
  -M :将某些帐号加入这个组中
  -r :将 groupname 的密码移除
  -R :让 groupname 的密码失效

 

  
 # 组管理员(Group administrator)做操作:
 用法:
  [someone@www ~]$ gpasswd [-ad] user groupname
  
 选项与参数:
  -a :将某用户加入到 groupname 这个组中
  -d :将某用户移出 groupname 这个组。

 


4. 使用者身份切换
---------------------------------------------------------------------------------------------------------------------------------------------
可能有如下几个原因:

 

 ● 安全考虑:使用一般帐号,日常操作的好习惯。尽量以一般身份使用者来操作 Linux 日常作业,等到需要设置系统环境时,才变换身份 root 来进行系统
    管理,相对安全。
 
 ● 用较低权限启动系统服务:相对于系统安全,有时必须以某些系统帐号来进行程序的执行。例如, apache 服务器 httpd, 以 apache 用户启动,这样,
    如果系统被攻破,也只是拥有 apache 用户权限,系统不至于损坏。
 
 ● 软件本身的限制:如 telnet 程序,该程序默认不允许以 root 身份登录。 ssh 也可设置为拒绝 root 用户登录。
 
由于上述考虑,所以使用一般帐号登录系统,在需要时才转换为 root 帐户操作。

 

主要有两种方式:

 

 □ su - :命令直接将身份变成 root 帐户,这个命令需要 root 密码
 □ sudo command:执行 root 的命令串,需要用户密码
 

 

 
4.1 su 命令
---------------------------------------------------------------------------------------------------------------------------------------------
语法格式:

 

 su [-lm] [-c 指令] [username]
 
 选项与参数:
 ------------------------------------------------------------------------------------------------------------------------------------------
  -  :单纯使用 - 如『 su - 』代表使用 login-shell 的环境变量读取方式登录系统;若 username 没有加上去,则代表切换为 root 身份。
  -l  :与 - 类似,但后面需要加欲切换的用户账号!也是 login-shell 方式。
  -m :-m 与 -p 是一样,表示『使用当前的环境变量设置,而不读取用户的配置文件』
  -c :仅进行一次指令,所以 -c 后面可以加上指令
 
 su命令与用户名之间用一个减号(-),这意味着完全切换到新的用户,即把环境变量信息也变更为新用户的相应信息,而不是保留原始的信息。
 单纯使用『 su 』切换为 root 身份,读取环境变量方式为 non-login shell 。这种方式很多原来的变量不会给改变。
 
 切换为其他用户身份后,如果想退出该身份,需要使用 exit 命令。
 如果只想执行一次指令,执行完毕之后恢复本来身份,可以使用 -c 选项,其后跟要执行的指令。

 


4.2 sudo 命令
---------------------------------------------------------------------------------------------------------------------------------------------
sudo 的执行仅需要自己的密码,甚至可以设定不需要密码执行 sudo. 由于 sudo 以其他用户的身份执行命令(通常使用 root 身份执行),因此并非所有的用户都
能执行 sudo, 而只有规范到 /etc/sudoers 文件内的用户才能执行 sudo .

 

语法格式:

 

 sudo [-b] [-u 新用户帐号]

 

 选项与参数:
 ------------------------------------------------------------------------------------------------------------------------------------------
  -b : 将后续的指令放到后台运行,而不对当前 shell 产生影响
  -u : 后面可接欲切换的用户帐号,若无此项,则代表切换为 root 身份。
  
  -h  列出帮助信息
  -l  列出当前用户可执行的命令
  -k  清空密码的有效时间,下次执行sudo时需要再次进行密码验证
  -p  更改询问密码的提示语
 
 
 
 ◆ visudo 与 /etc/sudoers
 ------------------------------------------------------------------------------------------------------------------------------------------
 除了 root 之外的帐号,若要使用 sudo 执行属于 root 权限的命令,则 root 需要先使用 visudo 修改 /etc/sudoers ,让该帐号能够使用全部或部分 root
 的指令功能。为什么要使用 visudo 呢,因为 /etc/sudoers 是有设置语法的,如果设置语法错误会造成无法使用 sudo 的不良后果。使用 visudo 修改,在
 退出编辑器时,系统会检验 /etc/sudoers 的语法是否正确。
 
  Ⅰ 单一用户可执行所有 root 指令, sudoers 文件语法:
  ------------------------------------------------------------------------------------------------------------------------------------- 
   [root@online ~]# visudo
  
   ....(前面省略)....
   root ALL=(ALL) ALL <==找到这一行,大约在 92 行左右
   devalone ALL=(ALL) ALL <==这一行是新增的
   ....(后面省略)....
  
   语法说明:
   
   使用者帐号 登录者的来源主机名=(可切换的身份帐号) 可执行的指令
   root ALL=(ALL) ALL <==这是默认值
   
   四个字段含义:
    ① 使用者帐号:系统的哪个账户可以使用 sudo 命令。默认只有 root 。
    
    ② 登录者的来源主机名:使用者可以从哪部主机登录到这部 Linux 主机,ALL 表示可以来自任何一部网络主机
    
    ③ 可切换的身份帐号:这个使用者帐号可以切换为哪个帐户来执行命令, ALL 表示可以切换成任何帐户。
    
    ④ 可执行的指令:可用该身份执行什么命令,务必使用绝对路径填写命令路径。 ALL 表示可以执行任何命令。
   
    ALL 是个特殊的关键字,代表任何身份,任何主机,任何命令。
   
  Ⅱ 利用分组以及免密码功能处理 visudo:
  -------------------------------------------------------------------------------------------------------------------------------------
   [root@online ~]# visudo
   
   ....(前面省略)....
   %wheel ALL=(ALL) ALL <==大约在 100 行左右
   # 在最左边加上 % ,代表后面接的是一个『用户组』,改完保存退出。
   ....(后面省略)....
   
   上面的定义表示任何加入 wheel 用户组的帐户都可以使用 sudo 切换任何身份执行任何命令。
   可以使用 usermod 修改用户支持的组。
   
   设置无密码登录:
   
    %devalone ALL=(ALL) NOPASSWD: ALL <==大约在 103 行左右
  
  
  
  Ⅲ 有限的指令操作:
  -------------------------------------------------------------------------------------------------------------------------------------
  如果想要让用户只能执行部分系统任务,比如让 myuser1 只能以 root 身份修改其他用户密码,可以这样做:
  
  [root@online ~]# visudo
  
  myuser1 ALL=(root) /usr/bin/passwd <==最后的命令务必使用绝对路径
  这条指令 myuser1 能改变所有人的密码,包括 root 密码,这是不应该的。
  
  修改如下:
  myuser1 ALL=(root) !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root <== ! 表示不可执行。 
  
  含义是:myuser1 用户可以执行『 passwd 任意字符』, 但是『 passwd 』与『 passwd root 』这两个指令例外。如此一来 myuser1 就无法改变 root
  密码了。
  
  
  Ⅳ 通过别名设置 visudo
  -------------------------------------------------------------------------------------------------------------------------------------
  visudo 的别名可以是:指令别名、帐户别名、主机别名等。
  
  假设 pro1, pro2, pro3 与 myuser1, myuser2 要加入上述的密码管理员 sudo 列表中,可以建立一个帐户别名 ADMPW, 然后将这个名称处理一下即可。
  命令别名为 ADMPWCOM, 处理方式如下:
  
  [root@online ~]# visudo <==注意是 root 身份
  
  User_Alias ADMPW = pro1, pro2, pro3, myuser1, myuser2
  Cmnd_Alias ADMPWCOM = !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
  
  ADMPW ALL=(root) ADMPWCOM
  
  通过 User_Alias 建立新帐号,帐号名称一定使用大写。包括 Cmnd_Alias(命令别名)、Host_Alias(来源主机名别名) 都需要使用大写字符。
  ADMPW 代表后面接的实际帐号,ADMPWCOM 后面接的是实际执行的命令。

 

 

 

  Ⅴ sudo 的时间间隔问题:
  -------------------------------------------------------------------------------------------------------------------------------------
  如果使用同一帐号在短时间内重复操作 sudo 来运行命令,在第二次执行 sudo 时,并不需要输入密码, sudo 会正确执行。两次执行 sudo 的间隔
  在 5 分钟内,那么再次执行 sudo 时不需要再次输入密码。如果两次 sudo 操作的间隔时间超过 5 分钟,需要重新输入一次密码。

 

  
  Ⅵ sudo 搭配 su 的使用方式:
  -------------------------------------------------------------------------------------------------------------------------------------
  sudo 搭配 su , 将身份转换为 root, 并且使用自己的密码。
  可以这样做:
  
  [root@online ~]# visudo
  
  User_Alias ADMINS = pro1, pro2, pro3, myuser1
  ADMINS ALL=(root) /bin/su -
  
  上述 pro1, pro2, pro3, myuser1  四个人,只要输入:

   sudo su -
  
  并输入自己的密码后,立刻变成 root 身份。

 类似资料: