Bonky Zhu
If someone is able to show me that what I think or do is not right, I will happily change, for I seek the truth, by which no one was ever truly harmed. It is the person who continues in his self-deception and ignorance who is harmed.

Linux 之账号管理 – 基本管理

账号和群组

UID 和 GID

注意!注意!注意!UID 不能乱改~ 如果你修改了自己的 UID,但是文件的权限仍然记录的是你以前的 UID,所以你无法访问你拥有的文件。但不过,我们也可以明白修改自己的用户名是完全OK的~

系统的登录流程

  1. 先找寻 /etc/passwd 里面是否有你输入的账号?如果没有则跳出,如果有的话则将该账号对应的 UID 与 GID (在 /etc/group 中) 读出来,另外,该账号的家目录与 shell 设定也一并读出;
  2. 再来则是核对密码表啦!这时 Linux 会进入 /etc/shadow 里面找出对应的账号与 UID,然后核对一下你刚刚输入的密码与里头的密码是否相符?
  3. 如果一切都 OK 的话,就成功进入 Shell

账号

/etc/passwd 文件

$ head -n 4 /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


我们可以发现,每个属性项由分号隔开,第一个是账号的名称,第二个是密码,但是因为这个文件所有的程序都能够读取,这样一来很容易造成密码被窃取, 因此后来就将这个字段的密码数据给他改放到 /etc/shadow 中了。所以这里只有一个 x 。

第三个是 UID,一般来说 UID 有以下限制:

image-20200119122139247

第四个是 GID,群组的更多信息可以在 /etc/group 找到。第五个是用户信息说明栏,用来解释当前用户的作用。可以通过 chfn 修改,主要是表示当前用户的一些个人信息:

$ chfn 
Changing finger information for root.
Name [root]: root
Office []: Apple Inc.
Office Phone []: 85893366
Home Phone []: 8888888

Finger information changed.
$ head -5 /etc/passwd
root:x:0:0:root,Apple Inc.,85893366,8888888:/root:/bin/bash
......


然后我们可以利用 finger 指令查询一些其他用户的一些信息:

$ finger root
Login: root                             Name: root
Directory: /root                        Shell: /bin/bash
Office: Apple Inc., 85893366            Home Phone: 888-8888
On since Sun Jan 19 20:30 (CST) on pts/0 from 119.28.22.215
   7 seconds idle
No mail.
No Plan.


然后第六个是家目录,第七个是指定的用户的 shell,然后有个东西我们需要注意,那就是 /sbin/nologin

/sbin/nologin 文件

一般来说系统账号的shell使用 /sbin/nologin,此时无法登陆系统,即使给了密码也不行。

无法登陆指的仅是这个用户无法使用bash或其他shell来登陆系统而已,并不是说这个账号就无法使用系统资源。比如 www 服务器有 apache 这个账号管理,他们都可以进行系统程序的工作,但就是无法登陆主机而已。

另外,如果我想要让某个具有 /sbin/nologin 的用户知道,他们不能登陆主机时,可以新建 /etc/nologin.txt 这个文件,在文件内面写上不能登陆的原因,当用户登录时,屏幕上就会出现这个文件里面的内容。

/etc/shadow 文件

以前其实所有的密码账号也都是保存在/etc/passwd 中的,但是因为 /etc/passwd 的权限是 644 所以说任何程序都可以读取(为什么不把他权限设置为 000 是因为整个系统的文件的权限控制都要用到 /etc/passwd 所以必须要给读),所以把密码分开到 /etc/shadow 中,/etc/shadow 的权限是000。文件内容是下面这样子的:

$ head -n 4 /etc/shadow 
root:加密后的密码...:16559:0:99999:7:::
.......


第一栏是账号名称,需要与 /etc/passwd 相同。第二个显然是密码,一般是通过 SHA 加密。第三个是最近修改密码的日期,16559 代表从 1970.1.1 来的累计日期。

第四个字段是密码不可改动的天数。第五个字段是密码需要重新变更的天数。第六个是变更前的警告天数。(剩下的自行查表)

群组

/etc/group 文件

$ head -n 4 /etc/group 
root:x:0: 
bin:x:1: 
....


第一个记录的是组名。第二个记录的是群组管理员的密码(好像没什么用)。第三个是GID。第四个是组的成员,如果需要加入组的话,直接在后面加入账号名称即可(如:root,bonky ),注意不能有空格,然后逗号隔开。可以让用户加入多个群组。

有效群组和初始群组

每个用户在 /etc/passwd 里面的第四栏的 GID 就是所谓的初始群组 (initial group)。(在刚开始登录的时候初始组就是有效群组)。创建文件或者目录取决于有效群组,我们可以通过 newgrp 临时修改有效群组(登录出失效):

image-20200119133403092

$ touch test1
$ ll test1
-rw-r--r-- 1 root root 0 Jan 19 21:29 test1
$ newgrp user
$ touch test2
$ ll test2
-rw-r--r-- 1 root user 0 Jan 19 21:29 test2


查看有效群组的一个方法是利用 groups 指令,它会列出用户所有的群组,第一个就是有效群组。

管理工具

用户管理

这里基本上都是系统管理员才可使用的指令:

添加用户 useradd

$ useradd [-u UID] [-g 初始群组] [-G 次要群组] [-mM] [-c 说明栏] [-d 家目录绝对路径] [-s shell] 使用者账号名 
选项与参数: 
-u :设定 UID
-g :设置初始群组。 (默认和用户名同名)
-G :后面接的组名则是这个账号还可以加入的群组。会修改 /etc/group 
-M :强制!不要建立用户家目录!(系统账号默认值) 
-m :强制!要建立用户家目录!(一般账号默认值) 
-c :这个是 /etc/passwd 的第五栏的说明内容 
-d :指定某个目录成为家目录,请使用绝对路径!然后没有话会默认为 /home/用户名
-r :建立一个系统的账号,这个账号的 UID 会有限制
-s :后面接一个 shell ,若没有指定则预设是 /bin/bash 的啦~ 
-f :指定密码是否会失效。0 为立刻失效,-1 为永远不失效(一般用于先设置个初始密码,等用户登陆的时候再修改)


默认值可以通过 -D 选项查看:

$ useradd -D
GROUP=100 # 但其实 CentOS 会创建与用户同名的
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes


我们可以注意到,上面有一个目录 /etc/skel,这个是 home 目录的模板文件,当创建一个新的用户时候,默认会拷贝下面 /etc/skel 下的文件到用户的 home 下:

$ touch /etc/skel/zhuziquan
$ useradd bonkys
$ ls /home/bonkys
zhuziquan


其中更多的信息我们可以查看 /etc/login.defs

MAIL_DIR        /var/spool/mail  # 用户默认邮件信箱放置目录 

PASS_MAX_DAYS   99999    # /etc/shadow 内的第 5 栏,多久需变更密码日数 
PASS_MIN_DAYS   0        # /etc/shadow 内的第 4 栏,多久不可重新设定密码日数
PASS_MIN_LEN    5        # 密码最短的字符长度,已被 pam 模块取代,失去效用!
PASS_WARN_AGE   7        # /etc/shadow 内的第 6 栏,过期前会警告的日数 

UID_MIN          1000    # 使用者最小的 UID,意即小于 1000 的 UID 为系统保留
UID_MAX         60000    # 使用者能够用的最大 UID 
SYS_UID_MIN       201    # 保留给用户自行设定的系统账号最小值 UID 
SYS_UID_MAX       999    # 保留给用户自行设定的系统账号最大值 UID 
GID_MIN          1000    # 使用者自定义组的最小 GID,小于 1000 为系统保留 
GID_MAX         60000    # 使用者自定义组的最大 GID 
SYS_GID_MIN       201    # 保留给用户自行设定的系统账号最小值 GID 
SYS_GID_MAX       999    # 保留给用户自行设定的系统账号最大值 GID 

CREATE_HOME     yes      # 在不加 -M 及 -m 时,是否主动建立用户家目录? 
UMASK           077      # 用户家目录建立的 umask ,因此权限会是 700 
USERGROUPS_ENAB yes      # 使用 userdel 删除时,是否会删除初始群组
ENCRYPT_METHOD SHA512    # 密码加密的机制使用的是 sha512 这一个机制!


注意,创建完成后我们一定要使用 passwd 添加密码~

修改密码 passwd

注意 passwd 是改变自己的密码,passwd 用户名是改变别人的密码。有个好用的选项是 --stdin,可以不要再重新手动输入了(方便与写脚本)。

echo "sahdlfksahflaskghas" | passwd --stdin bonky


修改密码信息 chage

输入 chage 指令会进入一个交互界面,然后你可以根据提示进行密码信息的修改:

$ chage bonky
Changing the aging information for bonky
Enter the new value, or press ENTER for the default

        Minimum Password Age [0]: 0
        Maximum Password Age [99999]: 9999
        Last Password Change (YYYY-MM-DD) [2020-01-19]: 1970-01-01          
        Password Expiration Warning [7]: 1000 
        Password Inactive [-1]: -1
        Account Expiration Date (YYYY-MM-DD) [-1]: 2030-10-01


然后利用 chage -l 用户名,我们可以查看设置的密码信息。我们还可以利用 chage 让用户在第一次登录时, 强制修改密码。

$ chage -d 0 agetest 
$ chage -l agetest | head -n 3 
Last password change                : password must be changed 
Password expires                    : password must be changed 
Password inactive                   : password must be changed 
# 此时此账号的密码建立时间会被改为 1970/1/1 ,所以会有问题!  


修改用户信息 usermod

$ usermod [-cdegGlsuLU] username


基本上和 useradd 参数的含义差不多,唯一要注意两个参数:

  • -L:暂时冻结用户,让其无法登录(Lock)
  • -U:解冻用户。(Unlock)

删除用户 userdel

$ userdel [-r] username 
选项与参数: 
-r :连同用户的家目录也一起删除 


用户功能

这些功能普通用户也可以使用

pwck 检查创建的账号是否有错误

主要检查 /etc/passwd 的信息,然后与 /etc/shadow 比对

$ pwck
user 'saslauth': directory '/run/saslauthd' does not exist
user 'pulse': directory '/var/run/pulse' does not exist
user 'gnome-initial-setup': directory '/run/gnome-initial-setup/' does not exist
user 'oprofile': directory '/var/lib/oprofile' does not exist
invalid user name '25'
user 'gluster': directory '/run/gluster' does not exist
no matching password file entry in /etc/passwd
delete line 'wuyanxia:$6$p7NPK/bSW$.PX.VdHR1Wt4Cxad6/5uFv1vwddKncQx/sPFIMHJY7QK2fmei5YCjSvqP4jErd15uLcHwQyf43TllqBP5gNVc0:17997:0:99999:7:::'? 



根据用户名查看信息 id

$ id [username] # 没有填写的话就是查询自己


其他有用的指令

  • chsh:改变默认终端
  • fingerchfn :查询和修改用户详细信息

群组管理

添加群组 groupadd

$ groupadd [-g gid] [-r] 组名 
选项与参数: 
-g :后面接某个特定的 GID
-r :建立系统群组


修改群组 groupmod

$ groupmod [-g 改后的id] [-n 改后的名字] 原来的群组名 


删除群组 groupdel

$ groupdel [groupname] 


群组管理员功能 gpasswd

系统管理员 (root) 可以做的操作如下:

$ gpasswd groupname 
$ gpasswd [-A user1,...] [-M user3,...] groupname 
$ gpasswd [-rR] groupname 
选项与参数:     
   :若没有任何参数时,表示给予 groupname 一个密码(/etc/gshadow) 
-A :将 groupname 的主控权交由后面的使用者管理(该群组的管理员) 
-M :将某些账号加入这个群组当中! 
-r :将 groupname 的密码移除 
-R :让 groupname 的密码栏失效 


组管理员可以进行的操作如下:

$ gpasswd [-ad] user groupname 
选项与参数: 
-a :将某位使用者加入到 groupname 这个群组当中
-d :将某位使用者移除出 groupname 这个群组当中


一个简单的例子

有三个用户 pro1, pro2, pro3,我想要让这三个用户在同一个目录底下工作, 但这三个用户还是拥有自己的家目录与基本的私有群组。思路如下

  1. 先建立三个公共的群组
  2. 创建用户(如果已创建可以利用 gpasswd -a 或者 usermod -G 加入到某个群组)
  3. 设置目录的所拥有的群组和权限(一般770)

下面是具体代码:

$ groupadd projecta 

$ useradd -G projecta -c "projecta user" pro1 
$ useradd -G projecta -c "projecta user" pro2 
$ useradd -G projecta -c "projecta user" pro3 
$ echo "password" | passwd --stdin pro1 
$ echo "password" | passwd --stdin pro2 
$ echo "password" | passwd --stdin pro3 

$ mkdir /srv/projecta 
$ chgrp projecta /srv/projecta 
$ chmod 2770 /srv/projecta 
$ ll -d /srv/projecta 
drwxrws---. 2 root projecta 6 Jul 20 23:32 /srv/projecta 


外部身份认证

就是不同主机能够使用同一套账号密码(有点类似于第三方账号登录),一般来说会使用到 LDAP, NIS 等服务器提供的身份验证。

CentOS 提供了 authconfig-tui 指令进行配置:

image-20200119145816650

Share

You may also like...

发表评论