引:管理员的工作中,相对重要的一环就是“账号管理”。因为整个系统都是你在管理,并且所有的一般用户的账号申请必须要通过你的协助才行。所以我们必须要知道如果管理好一个服务器主机的账号!
账号与用户组
在管理Linux账号时,我们必须要先了解一下Linux到底是如何辨别每一个用户的。
用户表示符:UID与GID
虽然我们登录Linux主机的时候,输入的是我们的账号,但是其实Linux主机并不会直接认识你的账号,它仅认识ID,而你的ID域账号的对应关系就在/etc/passwd当中。
每一个文件都具有所有者与所属用户组的属性,所以每个登录的用户至少会取得两个ID,一个是用户ID(UID),一个是用户组ID(GID)。
用户账号
Linyx系统上面的用户如果需要登录主机以取得shell的工作环境,它必须要在计算机前面利用tty1~tty7的终端机提供的login接口,并输入账号与密码后才能登录。当我们输入账号密码后,系统主要做了如下工作:
- 先寻找/etc/passwd里面是否有你输入的帐号?如果没有则跳出,如果有的话则将该帐号对应的UID与GID(在/etc/group中)读出来,另外,该帐号的主文件夹与shell设定也一并读出。
- 再来则是核对密码表啦!这是Linux会进入/etc/shadow里面找出对应的帐号与UID,然后核对一下你刚刚输入的密码与里面的密码是否相符。
- 如果一切都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 rexchfn(change finger),用于修改一些相关信息,范例如下:
1
2
3
4
5
6chfn rex
Changing finger information for rex.
名称 []: rex
办公 []: 123456
办公电话 []: 123456
住宅电话 []: 123456chsh(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的设置技巧
- getfacl:取得某个文件/目录的ACL设置项目
- 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是最简单的身份切换命令了,它可以进行任何身份的切换。但是下面有几点比较重要:
- 若要完整切换到新用户的环境,必须要使用“su -username” 或 “su -|username”,才会连同PATH/USER/MAIL等变量都转成新用户的环境。如果只是使用“su”切换到root用户,PATH/USER/MAIL等变量都没有变,会导致很多命令执行不了。
- 如果仅想执行一次root命令,可以利用“su - -c “命令串””d的方式来处理。
- 使用root切换成为任何用户时,并不需要输入新用户的密码。
虽然使用su很方便,但是会导致root密码外流。所以很多情况下我们通过sudo来处理。
sudo
sudo的执行仅需要自己的密码即可!甚至可以设置不需要密码即可执行sudo,由于sudo可以让你以其他用户身份执行命令(通常是使用root的身份来执行命令),因此不是所有人都能够执行sudo,而是仅有/etc/sudoers内的用户才能够执行sudo这个命令。
sudo的命令用法
1
2
3
4sudo [-u 新用户账号]
// 范例,以sshd的身份在/tmp下面新建一个名为mysshd的文件
sudo -u sshd touch /tmp/mysshdsudo的执行流程
- 当用户执行sudo时,系统在/etc/sudoers文件中查找该用户是否有执行sudo的权限;
- 若用户具有可执行sudo的权限后,便让用户输入用户自己的密码来确认;
- 若密码输入成功,便开始进行sudo后面接的命令(root执行sudo不需要输入密码)
- 若欲切换的身份与执行者的身份相同,也不需要输入密码
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 -
参考
- 《鸟哥的Linux私房菜》