走进Linux_账号管理

引:管理员的工作中,相对重要的一环就是“账号管理”。因为整个系统都是你在管理,并且所有的一般用户的账号申请必须要通过你的协助才行。所以我们必须要知道如果管理好一个服务器主机的账号!

账号与用户组

在管理Linux账号时,我们必须要先了解一下Linux到底是如何辨别每一个用户的。

用户表示符:UID与GID

虽然我们登录Linux主机的时候,输入的是我们的账号,但是其实Linux主机并不会直接认识你的账号,它仅认识ID,而你的ID域账号的对应关系就在/etc/passwd当中。

每一个文件都具有所有者与所属用户组的属性,所以每个登录的用户至少会取得两个ID,一个是用户ID(UID),一个是用户组ID(GID)。

用户账号

Linyx系统上面的用户如果需要登录主机以取得shell的工作环境,它必须要在计算机前面利用tty1~tty7的终端机提供的login接口,并输入账号与密码后才能登录。当我们输入账号密码后,系统主要做了如下工作:

  1. 先寻找/etc/passwd里面是否有你输入的帐号?如果没有则跳出,如果有的话则将该帐号对应的UID与GID(在/etc/group中)读出来,另外,该帐号的主文件夹与shell设定也一并读出。
  2. 再来则是核对密码表啦!这是Linux会进入/etc/shadow里面找出对应的帐号与UID,然后核对一下你刚刚输入的密码与里面的密码是否相符。
  3. 如果一切都OK的话,就进入Shell控管的阶段咯!
  • /etc/passwd文件结构如下:

    这个文件的构造是这样的:每一行代表一个帐号,有几行就代表有几个帐号在你的系统中!不过需要特别留意的是,里头很多帐号本身就是系统正常运作所必须要的,我们可以简称为系统帐号,如bin,daemon,adm,nobody等。

    我们先来看一下每个Linux系统都会有的第一行,就是root这个系统管理员那一行好了,你可以明显的看出来,每一行使用:分隔,共有七个字段,分别是

字段号 字段含义
1 账号名称
2 密码,被该放到/etc/shadow文件中,以x代替
3 UID,0为系统管理员,可以多个账号的UID为0,但不建议。1~99为发现版自建系统账号,100~499为用户使用的系统账号,500~*为一般用户可登录账号
4 密码,GID,与/etc/group有关
5 用户信息说明
6 主文件夹
7 shell
  • /etc/shadow文件结构如下:

    文件构造基本与/etc/passwd一样,但是它有9个字段,分别是:

字段号 字段含义
1 账号名称,需要与/etc/passwd对应
2 密码,但是被加密过的
3 最近更改密码的日期,以1970年1月1号作为1而累加的日期
4 密码不可被更动的日期
5 密码需要重新更改的天数
6 密码需要更改期限前的警告天数
7 密码过期后的账号宽限时间(密码失效日)
8 账号失效日期
9 保留,用于以后扩展

有效与初始用户组:groups,newgrp

  • /etc/group文件结构如下:

    文件构造基本与/etc/passwd一样,但是它有4个字段,分别是:

字段号 字段含义
1 用户组名称
2 用户组密码,以x代替
3 GID,/etc/passwd第四个字段使用的GID对应的用户组名就是由这里来的
4 用户组支持的账号名称,多用户以”,”分割
我们知道用户可以同时加入多个用户组,那么我们在执行工作时,到底是以哪个用户组为准呢?,这就需要引入有效用户组的概念。    
  • /etc/gshadow文件结构如下:

    文件构造基本与/etc/group一样,它有4个字段,分别是:

字段号 字段含义
1 用户组名称
2 用户组密码,开头为!表示无合法密码,所以无用户组管理员
3 用户组管理员的账号,用户组管理员能够将账号添加到自己管理的用户组中
4 该用户组的所属账号(与/etc/group内容相同)
  • 有效用户组与初始用户组
    • 初始用户组:就是/etc/passwd里面的第四列的GID,当用户登录系统,立刻就拥有这个用户组的相关权限。
    • 有效用户组:就是利用groups命令看到的第一个用户组,可以利用newgrp命令更改有效用户组,newgrp命令更改目前用户的有效用户组是以另一个shell来提供这个功能的,如果要回到原来的用户组只要输入exit即可。

账号管理

管理账号主要是新增、删除与更改用户的相关信息。

新增与删除用户

账号可以使用useradd命令来新建用户,密码的给予则是使用passwd命令。下面是范例:(里面有很多参数,自己可以去了解)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 新增
useradd leonard
ll -d /home/leonard/
# 默认会创建用户主文件夹,且权限为700,这是重点
# drwx------ 2 leonard leonard 4096 3月 31 09:36 /home/leonard/

grep leonard /etc/passwd /etc/shadow /etc/group
# /etc/passwd:leonard:x:1001:1001::/home/leonard:/bin/bash
# /etc/shadow:leonard:!!:17621:0:99999:7:::
# /etc/group:leonard:x:1001:

# 不加账号,默认修改自己的密码
passwd leonard

# 显示账号的相关信息
chage leonard

# 修改账号的相关信息
usermod leonard

# 删除账号,-r:连主文件夹一起删除
userdel leonard

其实系统已经帮我们设置好了非常多的默认值,所以我们可以简单的使用“useradd 账号”来创建用户,Centos这些默认值主要会帮我们处理下面几个项目:

  • 在/etc/passwd 里面创建一行与账号相关的数据,包括创建UID/GID/主文件夹等;
  • 在/etc/shadow里面将此账号的密码相关参数填入,但是尚未有密码;
  • 在/etc/group里面加入一个与账号名称一模一样的组名;
  • 在/home下面创建一个与账号同名的目录作为用户的主文件夹,且权限为700

用户功能

不论是useradd、usermod还是userdel,那都是系统管理员能够使用的命令,下面我们就介绍一些一般身份用户常用的账号数据更改与查询命令

  • finger,可以查阅很多用户相关的信息,大部分都是/etc/passwd这个文件的信息。范例如下:

    1
    2
    3
    4
    5
    // 我的linux默认没有装finger,可以利用下面的命令安装
    yum install finger

    // 查阅用户信息,若不跟没有用户,则查询当前用户
    finger rex
  • chfn(change finger),用于修改一些相关信息,范例如下:

    1
    2
    3
    4
    5
    6
    chfn rex
    Changing finger information for rex.
    名称 []: rex
    办公 []: 123456
    办公电话 []: 123456
    住宅电话 []: 123456
  • chsh(change shell),用于修改shell。

  • id,用于查询自己或某人的相关UID/GID等信息。

新增与删除用户组

基本上,用户组的内容都与这两个文件有关:/etc/group,/etc/gshadow。下面是一些相关命令使用的范例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 新建一个用户组,名称为hd
groupadd hd

# 修改用户组的相关参数 -g:修改既有GID,-n:修改既有组名
groupmod -g 201 -n myhd hd

# 删除用户组名
groupdel myhd

# 用户组管理员相关命令
# 给用户组设置一个密码
gpasswd hd
# 加入用户组管理员为rex
gpasswd -A rex hd
# 让rex登录系统,增加leonard为hd成员
gpasswd -a leonard hd

主机的具体权限规划:ACL的使用

什么是ACL

ACL是Access Control List的缩写,主要的目的是提供传统的owner、group、others的read、write、execute权限之外的具体权限设置。ACL可以针对单一用户、单一文件或目录进行r、w、x的权限设置,对于需要特殊权限的使用状况非常有帮助。

ACL主要可以针对下面几方面来设置控制权限:

  • 用户:可以针对用户来设置权限
  • 用户组:可以针对用户组来设置权限
  • 默认属性(mask):还可以在该目录下新建文件目录设置新数据的权限、

ACL的设置技巧

  1. getfacl:取得某个文件/目录的ACL设置项目
  2. setfacl:设置某个文件/目录的ACL规定

下面是范例:

1
2
3
4
5
6
7
8
9
10
11
12
13
// 取得某个文件/目录的ACL设置项目
getfacl rootfile

// 输出
# file: rootfile
# owner: root
# group: root
user::rw-
group::r--
other::r--

// 设置某个文件/目录的ACL规定
setfacl -m u:rex:rwx rootfile

用户身份切换

在Linux系统中是需要做身份的变换的,主要有以下几个原因:

  • 使用一般账号:系统平日操作的好习惯(不然你就有机会从删库到跑路了)
  • 用较低的权限启动系统服务
  • 软件本身的限制

根据上面的考虑,我们都是使用一般账号登录系统的,等有需要进行系统维护或软件更新时才转为root身份来操作。从一般用户转变为root主要有下面两种方式:

  • “su -”:需要root用户密码
  • “sudo命令”:sudo需要输入用户自己的密码

su

su是最简单的身份切换命令了,它可以进行任何身份的切换。但是下面有几点比较重要:

  1. 若要完整切换到新用户的环境,必须要使用“su -username” 或 “su -|username”,才会连同PATH/USER/MAIL等变量都转成新用户的环境。如果只是使用“su”切换到root用户,PATH/USER/MAIL等变量都没有变,会导致很多命令执行不了。
  2. 如果仅想执行一次root命令,可以利用“su - -c “命令串””d的方式来处理。
  3. 使用root切换成为任何用户时,并不需要输入新用户的密码。

虽然使用su很方便,但是会导致root密码外流。所以很多情况下我们通过sudo来处理。

sudo

sudo的执行仅需要自己的密码即可!甚至可以设置不需要密码即可执行sudo,由于sudo可以让你以其他用户身份执行命令(通常是使用root的身份来执行命令),因此不是所有人都能够执行sudo,而是仅有/etc/sudoers内的用户才能够执行sudo这个命令。

  1. sudo的命令用法

    1
    2
    3
    4
    sudo [-u 新用户账号]

    // 范例,以sshd的身份在/tmp下面新建一个名为mysshd的文件
    sudo -u sshd touch /tmp/mysshd
  2. sudo的执行流程

    • 当用户执行sudo时,系统在/etc/sudoers文件中查找该用户是否有执行sudo的权限;
    • 若用户具有可执行sudo的权限后,便让用户输入用户自己的密码来确认;
    • 若密码输入成功,便开始进行sudo后面接的命令(root执行sudo不需要输入密码)
    • 若欲切换的身份与执行者的身份相同,也不需要输入密码
  3. visudo与/etc/sudoers

    我们一般不直接去修改/etc/sudoers文件,而是利用visudo命令去修改,因为这个命令会在结束离开的时候去检验/etc/sudoers的语法,下面是他的用法案例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    // 1. 单一用户可以执行root的所有命令与sudoers文件语法
    // 四个参数含义为(1).用户账号,(2).登陆者的来源主机,(3).(可切换的身份),(4).可执行的命令
    root ALL=(ALL) ALL //文件中原有
    rex ALL=(ALL) ALL //新增

    // 2. 利用用户组以及免密码的功能处理visudo
    # %wheel ALL=(ALL) NOPASSWD: ALL //文件中原有,需要将#去掉,文件中的%表示后面接一个用户组
    usermod -a -G wheel rex //将rex加入wheel组中

    // 3. 有限制的命令操作,通过更改可执行的命令一栏的数据,就可以控制具体操作的安全性
    rex ALL=(ALL) !/usr/bin/passed //不让rex可以修改密码

    // 4. 通过别名设置visudo
    User_Alias ADMPW(大写) = rex1,rex2
    Cmnd_Alias ADMPWCOM(大写) = !/usr/bin/passwd, /usr/bin/passed [A-Za-z]
    ADMPW ALL=(root) ADMPWCOM

    // 5. sudo搭配su的使用方式,让用户用自己的密码变成root
    User_Alias ADMPW(大写) = rex1,rex2
    ADMPW ALL=(root) /bin/su -

参考

  1. 《鸟哥的Linux私房菜》