Linux 用户管理

Ø  简介

本文主要介绍 Linux 的用户管理,包括如下内容:

1.   用户配置文件

2.   用户管理命令

3.   用户组管理命令

4.   批量添加用户

5.   用户授权

6.   检测密码强度

 

n  注意事项

1)   root 是超自然用户,也是超级管理员,任何文件或命令即便没有权限,同样也可以操作(读、写、执行);

2)   root 的用户 ID 0

 

1.   用户配置文件

1)   用户信息文件:/etc/passwd

/etc/passwd 保存了系统中每一个用户的信息。

# cat /etc/passwd      #/etc/passwd 文件格式

root:x:0:0:root:/root:/bin/bash

abeam:x:1000:1000:Jingle abeam:/home/abeam:/bin/bash

下面以 root 用户举例说明(包含7部分信息):

名称

含义

备注

root

用户名

用户登录系统的用户名

建议不要超过8位,不要使用特殊符号或数字

x

密码

密码位(并没有真实的存放密码,因为密码存放在该文件中并不安全)

建议8位以上,大小字母+数字的组合

0

UID

用户标识号

参考用户类型

0

GID

用户缺省组标识号

参考用户组

root

描述信息

例如存放用户全称等信息

建议添加用户描述

/root

宿主目录

用户登录系统后的缺省目录

每个用户必须有个宿主目录,创建完用户后系统会在 /home/ 目录下创建一个与用户名相同的目录,用户登录系统后缺省的就是该目录。

/bin/bash

命令解释器

用户使用的 Shell,默认为 bash

bash 用的较多

wc -l /etc/passwd      #统计有多少个用户

45 /etc/passwd

 

1)   用户类型(分为三类)

n  超级用户

系统的超级用户为 root(UID=0)用户,具有操作系统的所有权限。如果将任意一个用户的 UID 改为0,那么他也将成为超级用户。

n  伪用户

是为了方便管理系统,满足相应的系统进程文件属主的要求,不能登录系统。UID 1-999

n  普通用户

对操作系统的是有限的。UID 1000-6000

 

2)   伪用户

Linux 系统安装完成后,就会自动创建这些伪用户(或特殊用户)。因为在 Linux 中任何一个操作都需要由一个用户来完成,在执行一些特殊操作时就会调用伪用户来执行,起到安全的作用。

1.   伪用户与系统和程序服务相关

n  bindaemonshutdownhalt 等,任何 Linux 系统默认都有这些伪用户。操作系统在进行一些操作(如:关机、重启等),就会调用这些伪用户来完成;

n  mailnewsgamesapacheftpmysql sshd 等,与 Linux 系统的进程相关。比如启动了 apache 进程,它也要对一个用户(伪用户)身份。

2.   伪用户通常不需要或无法登陆系统

3.   可以没有宿主目录

 

3)   用户组

n  每个用户都至少属于一个用户组,也可以属于多个用户组;

n  每个用户组可以包含多个用户;

n  同一用户组的用户享有该组共有的权限。

 

2)   密码文件:/etc/shadow

# cat /etc/shadow

root:$6$qHdvLD8rTbvRb5AB$qvhMzK7WaZbav64BlRw3wM7GX7umOuswLATWB4BMUMOtCiPYwnEiIUEmcsli8q4ob3A7CujzxQ7j9eJ6JDHvc.::0:99999:7:::

abeam:$6$vlGBridFq362UuwH$lLK4gqBU68WkenXW7YUdX07miU/KQcz0HhtdDqsK10GYok0.CFUbyZcOWagQGkb91JPpV0LcOYctd1cLEsYQm/::0:99999:7:::

下面以 root 用户举例说明(包含9部分信息):

名称

含义

备注

root

用户名

用户登录系统的用户名

 

$6$qHd…

密码

加密的密码

用户的真实密码,如果将该信息为空,表示用户登录时可以不需要输入密码;如果!!,表示禁止登录(或未设置密码)。

最后修改时间

用户最后一次修改密码的天数

man 5 shadow

0

最小时间间隔

两次修改密码之间的最小天数

man 5 shadow

99999

最大时间间隔

密码保持有效的最多天数

多少天后强制用于修改密码

7

警告时间

从系统刚开始警告到密码失效的天数

用户密码到期前多少天提示用户

账号闲置时间

账号闲置时间

用户多久没有登录了,空表是没有闲置

失效时间

密码失效的绝对天数

密码失效多长时间了

标志

一般不使用(保留字段)

 

 

问题:Linux 中为什么密码需要存在另一个文件(/etc/shadow)中?其实是为了安全考虑,以下是两个文件的权限:

# ls -l /etc/passwd

-rw-r--r--. 1 root root 2355 1  12 18:38 /etc/passwd

# ls -l /etc/shadow

----------. 1 root root 1385 3  22 13:30 /etc/shadow

可以看到 passwd 文件每个用户都有读权限,而 shadow 只有 root 才有读和写权限,这样就保证了密码文件的安全性。

当创建用户或修改密码时,首先依然是将密码写入 passwd 文件中,然后再将密码转换到 shadow 文件中,最后将 passwd 中的密码采用 x 密码位替换掉。而这个步骤都是有系统去完成的,对用户是不可见的。

Linux 中有两个命令,有两个命令(pwunconvpwconv)完成密码的转换,例如:

pwunconv 将密码转到 passwd 文件中,并将 shadow 文件删除;

pwdconv 将密码转到 shadow 文件中,并将 passwd 密码改为密码位(x)

 

n  手动创建新用户

掌握了 passwdshadow 文件后,其实我们可以手动编辑这两个文件,完成用户的创建,例如(创建一个 user2 用户):

1.   编辑 /etc/passwd 文件,添加一个用户:

# vi /etc/passwd

2.   创建宿主目录

# mkdir /home/user2

3.   更改所有者

因为是 root 用户创建的,要所有者改为 user2,所属组就先不改了。

# chown user2 /home/user2

4.   编辑 /etc/shadow 文件,添加用户的密码:

# vi /etc/shadow

5.   尝试登陆 user2 用户

6.   解决登陆后提示符的问题

其实当添加新用户后,还需要添加环境变量和一些配置文件,也就是 /etc/skel 中的文件,这些文件是隐藏文件,我们只需要将这些文件拷贝到新用户的宿主目录下即可。

[root@localhost skel]# cp -rf . /home/user2

7.   再次登录系统

说明:因为组 ID 不存在而导致。

 

3)   用户组文件:/etc/group

cat /etc/group

root:x:0:

下面以 root 用户举例说明(包含4部分信息):

名称

含义

备注

root

组名

用户登录时所在的组

建议不要超过8位,有意义的组名称

x

组密码

组密码位

一般不使用。用于不是组中的成员时,如果知道组密码的情况下,可以登录改组享有该组的权限。

0

GID

组标识号

 

组内用户列表

所属组该组的所有用户列表(不包含缺省组为该组的用户)

用户之间以(,)逗号分隔

 

4)   用户组密码文件:/etc/gshadow

# cat /etc/gshadow

root:::

mygroup5:$6$nhMqq/yV2OVjCk3t$3hRvAdlz7qb/Wq2eFM8EkhU4BWNXjPeopcxd26/OO6W5jueOHc5H0e4gi/7kV6LmadGaq0tfK6KWRlFcvSIs20:myuser4:myuser4

下面以 mygroup5 用户举例说明(包含4部分信息):

名称

含义

备注

mygroup5

组名

必须是系统中已经存在的有效组

 

$6$nhM…

组密码

加密了的密码

 

myuser4

管理员

管理员可以更改组密码和成员

 

myuser4

组内用户列表

属于该组的所有用户列表

用户之间以(,)逗号分隔

 

5)   用户配置文件:

1.   /etc/login.defs

MAIL_DIR        /var/spool/mail     #邮件存放的位置

PASS_MAX_DAYS   99999              #shadow 中最大时间间隔的默认值

PASS_MIN_DAYS   0                  #shadow 中最小时间间隔的默认值

PASS_MIN_LEN    5                  #密码的最小长度

PASS_WARN_AGE   7                  #shadow 中警告时间的默认值

UID_MIN         1000               #普通用户最小UID

UID_MAX         60000              #普通用户最大UID

GID_MIN         1000               #用户组最小GID

GID_MAX         60000              #用户组最大GID

CREATE_HOME     yes                #添加用户后是否自动创建宿主目录

UMASK           077                #创建用户和文件的缺省权限

ENCRYPT_METHOD SHA512              #密码的加密方式

 

2.   /etc/default/useradd

GROUP=100                  #添加用户未指定组时的缺省组

HOME=/home                 #指定默认的宿主目录

INACTIVE=-1                #用户是否被禁用,-1未禁用,其他为禁用

EXPIRE=                    #账号的失效时间

SHELL=/bin/bash            #缺省的 Shell/etc/shells 可以查看系统中的所有 Shell

SKEL=/etc/skel             #新添加用户的配置文件目录

CREATE_MAIL_SPOOL=yes      #创用户后是否创建于用户同名的,用于保存邮件的目录(也就是在 /etc/login.defs 中的 MAIL_DIR 指定的目录下创建)

 

6)   新用户信息文件:/etc/skel

保存了创建新用户后需要拷贝到 /home 目录下所需的环境变量和配置文件。

提示:因为每当创建用户后,都会拷贝该目录中的文件到用户宿主目录中,所以可将一些通用或说明性的文件放在该目录下。

 

7)   登录信息:/etc/motd

用于设置用户登录系统后显示给用户的提示信息,该文件默认为空。可以编辑该文件:

# vi /etc/motd

very good! 欢迎帅哥李登录,可以在/etc/motd中编辑我噢~~

 

8)   禁止用户登录:/etc/nologin

该文件默认不存在,如果在 etc 目录下创建该文件(不需要任何内容),则可以禁止除了 root 以外的其他用户登录系统。

 

2.   用户管理命令

1)   useradd / adduser

功能描述

添加用户

语法

useradd [选项] [用户名] -D 查看缺省参数

    -u UID

    -g 缺省所属用户组GID

    -G 指定用户所属多个组

    -d 宿主目录

    -s 命令解释器Shell

    -c 描述信息

    -e 指定用户失效时间

示例:

# useradd user3     #使用缺省参数

说明:未指定组名时,将创新一个与用户名同名的组

# useradd -u 888 -g mygroup2 -G mygroup1,sys -d /backup -s /bin/bash -c "添加用户(显示指定参数)" -e 2020-04-01 user4     #显示指定参数

# grep user /etc/passwd

# grep mygroup /etc/group

drwx------.   3 user4 mygroup2   78 3  22 21:11 backup   #宿主目录

 

2)   usermod

功能描述

修改用户信息

语法

usermod [选项] [用户名] -D 查看选项

    -l 修改用户名

    -L(lock) 锁定用户(密码前加了一个!

    -U(unlock) 解锁用户(删除密码前的!

    其他选项与 useradd 类似

示例1:修改用户名、宿主目录、缺省组

# grep user3 /etc/passwd

user3:x:1003:1003::/home/user3:/bin/bash

# usermod -l myuser3 -d /home/myuser3 -g mygroup4 user3

# grep user3 /etc/passwd

myuser3:x:1003:1004::/home/myuser3:/bin/bash

 

示例2:将用户添加到指定的组

# usermod -G mygroup1,mygroup2 myuser3

# grep group /etc/group

mygroup1:x:1002:user4,myuser3

mygroup2:x:123:myuser3

mygroup4:x:1004:       #注意:用户的缺省组为改组的用户不会显示在里面

 

3)   userdel

功能描述

删除用户和相关文件

语法

userdel [选项] [用户名]

    -r 同时删除宿主目录、邮箱、组信息等,其他文件必须手动搜索删除。

示例:

# userdel user5         #只会删除 /etc/passwd/etc/shadow 中的内容

# userdel -r myuserr4   #同时删除宿主目录和邮件

注意:但不会删除所有者为该用户的文件,用户删除后这些文件的所有者将变为该用户的 UID,例如:

 

手工删除:

1.   删除前注意备份用户相关目录,以及确认用户宿主目录;

2.   删除宿主目录;

3.   删除用户相关目录(使用 find 命令查找属于某个用户或用户组的文件,find 选项 -user-uid-group-gid),例如:

# find /home -user myuser3      #查找所有者为该用户的文件和目录

# find /home -uid 1003 -ok rm {} \;     #根据 UID 查找,并删除确认

4.   修改 /etc/passwd/etc/shadow/etd/group/etc/gshadow 文件(删除用户数据);

 

4)   passwd

功能描述

设置或修改用户密码

语法

passwd [选项] [用户名]

    -d 删除密码

    -l(lock) 锁定用户(密码前加了两个!!

    -u(unlock) 解锁用户(删除密码前的!!

    -S 显示密码相关信息(最后登录时间、状态)

    -x 设置密码的有效期

    --stdin 指示密码可以从管道中获取。

示例:

# passwd user3          #设置或修改用户密码

# passwd -d user3       #其实就是删除了 /etc/shadow 中的密码内容

# passwd -l user3       #其实就是更改了 /etc/shadow 中的内容

更改后的内容(密码前加了两个!!

# passwd -u user3       #解锁用户密码

# passwd -S user1       #查看用户密码状态(实际就是提取 /etc/shadow 的信息)

echo $pwd | /usr/bin/passwd --stdin $username   #从管道获取密码

 

5)   id

功能描述

显示真实和有效的 UID GID

语法

id [选项] [用户名]

    -g 只显示组ID

    -G 只显示附加组

    -u 只显示用户ID

示例:

[abeam@localhost root]$ id

uid=1000(abeam) gid=1000(abeam) =1000(abeam),10(wheel) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

 

6)   pwck

功能描述

检查密码文件的完整性

语法

pwck [选项] [passwd [ shadow ]]

说明:当用户不能登录可以检查以上文件。

示例:

# pwck /etc/passwd      #检查 passwd 文件

# pwck /etc/shadow      #检查 shadow 文件

 

7)   vipw

功能描述

编辑用户信息、密码文件

说明: vi 命令唯一的区别是,当 A 用户编辑文件时会锁住该文件,B用户只能等 A 用户退出编辑后才能进行编辑。

语法

vipw [选项]

    -p 编辑 /etc/passwd 文件

    -s 编辑 /etc/shadow 文件

示例:

# vipw -p       #编辑 /etc/passwd 文件

# vipw -s       #编辑 /etc/shadow 文件

 

8)   chage

功能描述

更改用户密码或过期信息(UNIX 不支持)

语法

chage [选项] [用户名]

    -l 查看用户密码设置

    -m 密码修改的最小天数

    -M 密码修改的最大天数

    -d 密码最后修改的时间

    -I 密码过期后,锁定账户的天数

    -E 密码过期日期,如果为0,表示密码立即过期;如果为-1,表示密码永不过期

    -W 密码过期前,开始警告的天数

示例:

# chage -l user2        #查看 user2 密码设置

# chage -m 55 user2     #设置 user2 修改密码的最小天数

 

9)   finger

功能描述

查看用户相关信息,如:宿主目录、启动 Shell、登录时间等。

语法

finger [-lmsp] [user ...] [user@host ...]

示例:

# finger            #查看当前用户登录信息

# finger user2      #查看 user2 用户的信息

 

10)  su

功能描述

切换用户

语法

su [选项] [-] [用户名]

注意事项:

1.   表示同时切换环境变量,否则不会切换;

2.   root 切换到普通用户不需要输入密码,而普通用户切换到 root 或者其他用户必须输入密码。

示例:

# su user1      #不切换环境变量

# su - user1    #切换环境变量

错误:su: 鉴定故障。采用 sudo su 命令即可。

 

11)  who

功能描述

查看系统登录用户信息

用户信息包括:用户名、登录终端、登录IP、登录时间等。

语法

who [选项]

示例:

# who           #查看系统登录用户信息

user2    :0           2020-03-26 09:46 (:0)

root     pts/0        2020-03-26 10:26 (192.168.1.1)

 

12)  启用或停用 shadow 功能

1.   pwconv: 将用户密码转换到 /etc/shadow 文件中(新增、修改密码时调用);

2.   pwunconv: 将用户密码回写到 /etc/passwd 文件中,并删除 /etc/shadow文件(UNIX 不支持);

3.   grpconv: 将用户组密码转换到 /etc/gshadow 文件中(新增、修改密码时调用);;

4.   grpunconv: 将用户组密码会回写到 /etc/group 文件中,并删除 /etc/gshadow文件(UNIX 不支持);

5.   authconfig/etc/sysconfig/authconfig

# authconfig       #查看 authconfig 所有选项(例如:--enableshadow--enablemd5 等)

# vi /etc/sysconfig/authconfig  #编辑 authconfig 配置文件

注意:authconfig 命令的修改是临时有效的,/etc/sysconfig/authconfig 是永久有效的(例如:USESHADOW=yes)

6.   system-config-users(图形工具管理用户)

# system-config-users      #图形化用户管理

# system-config-date       #设置日期

# system-config-display     #设置显卡

# system-config-network     #设置网络

# system-config-           #查看其他设置(system-config-xxx)

 

13)  思考:为什么 passwdshadow 文件普通用户没有写权限,也可以修改密码?这是因为 passwd 的执行权限为s, 也就是 SetUID

# ls -l `which passwd`

-rwsr-xr-x. 1 root root 27832 6  10 2014 /usr/bin/passwd

以上可见 passwd 的所有者是 root,那么将以 root 去执行 passwd 这个命令,所以每个用户都可以修改自己的密码了。

n  示例:

1.   touch 命令授予 SetUID 权限,看是什么情况?

# ls -l `which touch`

-rwxr-xr-x. 1 root root 62568 10 31 2018 /usr/bin/touch  #755

$ touch file1       #普通用户创建一个文件

$ ls -l file1       #所有者为当前用户(abeam)

-rw-rw-r--. 1 abeam abeam 0 3  22 17:27 file1

 

现在将 touch 命令授予 SetUID 权限,再次创建文件

# chmod u+s /bin/touch      #s 表示 SetUID 权限

或者

# chmod 4755 /bin/touch     #SetUID 的数字标识为4

# ls -l /bin/touch         #查看 touch 权限

-rwsr-xr-x. 1 root root 62568 10 31 2018 /bin/touch      #4755

$ touch file2       #普通用户在创建一个文件

$ ls -l file2       #所有者为当前用户(root)

-rw-rw-r--. 1 root abeam 0 3  22 17:47 file2

注意:

1)   如果将以上 touch 的权限设置为 6755,即同时有 SetUID SetGID,调用该命令后,创建的文件所属组也会为 touch 的所属组(root)

2)   以上修改的 /usr/bin/touch /bin/touch 为硬链接,所以示例得以成功。

 

2.   vi 命令被授予了 SetUID 权限

此时,普通用户就可以修改任意的文件,比如:/etc/passwd 等。这是非常危险的,所以尽量避免将系统的命令授予 SetUID SetGID.

 

3.   查找授予了 SetUID SetGID 的命令/程序

# find / -perm -4000 -o -perm -2000

说明:权限选项为[-perm],根据权限数字查找 SetUID SetGID

 

注意事项:在安装完系统后,可以将设置了 SetUID SetGID 的程序写入到文件里面。再写一个 Shell 脚本,定义跟当前设置了 SetUID SetGID 的程序列表进行比较,就知道新增的设置了 SetUIDSetGID 的程序了。可以在安全性上得到更好的保障。

 

3.   用户组管理命令

1)   groupadd

功能描述

添加用户组

语法

groupadd [选项] [组名]

    -g 指定组的GID

示例:

# groupadd mygroup1            #自动分配GID

# groupadd -g 123 mygroup2      #显示指定GID

# grep mygroup /etc/group

mygroup1:x:1002:

mygroup2:x:123:

 

2)   grougmod

功能描述

修改指定组的定义

语法

groupmod [选项] [组名]

    -g 修改组ID

    -n 修改组名称

示例:

# groupmod -g 1888 mygroup5         #修改组ID

# groupmod -n group5 mygroup5       #修改名称为 group5

 

3)   groupdel

功能描述

删除一个用户组和相关文件

语法

groupdel [选项] [组名]

示例:

# groupdel group6   #删除后 /etc/group/etc/gshadow 和所属该组的用户的组都会删除

注意:如果存在用户为该组的用户,则不能删除。

 

4)   gpasswd

功能描述

设置组密码以及管理组内的成员

语法

gpasswd [选项] [组名]

    -a 添加用户到用户组

    -d 从用户组中删除用户

    -A 设置用户组管理员

    -r 删除用户组密码

    -R 禁止用户切换为改组

示例1

# gpasswd -a myuser3 mygroup5       #将用户添加到组里

# gpasswd -d myuser3 mygroup5       #将用户从组里删除

 

示例2:设置用户组管理员(管理员可以对组里添加、删除成员)

# gpasswd mygroup5                 #设置组密码

# gpasswd -a myuser3 mygroup5       #添加用户 myuser3

# gpasswd -a myuser4 mygroup5       #添加用户 myuser4

# gpasswd -A myuser4 mygroup5       #设置管理员

[myuser4@localhost root]$ gpasswd -d myuser3 mygroup5   #管理员删除用户

# gpasswd -r mygroup5              #删除组的密码

 

提示:当设置密码后,同样与 /etc/shadow 一样,也会在 /etc/gshadow 文件中写入用户组的密码。

用户密码一样,同样有两个命令(grpunconvgrpconv)用于转换用户组的密码。并且 gpasswd passwd 命令一样,也是具有 SetUID

# ls -l `which gpasswd`

-rwsr-xr-x. 1 root root 78272 10 31 2018 /usr/bin/gpasswd

 

5)   groups

功能描述

显示用户所属的所有组(包括缺省组)

注:显示的第一个组为缺省组

语法

groups [选项] [用户名]

示例:

# groups           #查看当前用户所属的组

# groups myuser4    #查看指定用户所属的组

myuser4 : mygroup4 mygroup5

 

6)   grpck

功能描述

检查组文件的完整性

语法

grpck [选项] [group [ shadow ]]

示例:

# grpck /etc/group      #检查 group 文件

# grpck /etc/gshadow    #检查 gshadow 文件

 

7)   vigr

功能描述

编辑用户组、密码文件

说明: vi 命令唯一的区别是,当 A 用户编辑文件时会锁住该文件,B用户只能等 A 用户退出编辑后才能进行编辑。

语法

vipw [选项]

    -g 编辑 /etc/group 文件

    -s 编辑 /etc/gshadow 文件

示例:

# vigr -g       #编辑 /etc/group 文件

# vigr -s       #编辑 /etc/gshadow 文件

 

8)   newgrp

功能描述

登录到一个新组

语法

newgrp [组名]

输入组密码进行登录

注意:登录只是临时的,下一次登录用户会还原到原来的组,因为没有写入配置文件中

示例1

[abeam@localhost root]$ id

uid=1000(abeam) gid=1005(mygroup5) =1005(mygroup5),10(wheel),1000(abeam) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

[abeam@localhost root]$ newgrp mygroup5     #登录到新组(必须有组密码)

密码:

[abeam@localhost root]$ groups             #查看当前用户所属的组

mygroup5 wheel abeam

[abeam@localhost root]$ id                 #查看 UID GID

uid=1000(abeam) gid=1005(mygroup5) =1005(mygroup5),10(wheel),1000(abeam) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

 

4.   批量添加用户

1)   第一种方式(手工编写用户、密码文件批量导入)

1.   创建用户文件

# vi newusers.info

2.   生成用户信息

# newusers < newusers.info     #导入用户

导入用户完成了2件事情:

# grep buser /etc/passwd /etc/shadow    #1.导入了用户信息

# ls -l /home | grep buser             #2.创建了宿主目录

# ls -a /home/buser2    #但是没有拷贝用户环境变量和配置文件

.  ..

3.   创建密码文件

# vi passwd.info

4.   生成密码信息

# pwunconv                 #关闭 shadow 功能

# chpasswd < passwd.info    #导入密码

# tail -3 /etc/passwd      #查看 passwd

# pwconv                    #开启 shadow 功能

5.   拷贝用户环境变量与配置文件

# cp -r /etc/skel/. /home/buser1    #拷贝 skel 中的所有文件到宿主目录

 

2)   第二种方式(使用 Shell 脚本批量添加)

 

5.   用户授权

1)   用户组授权

# mkdir dir6        #创建目录

# ls -ld dir6       #默认权限为755,所以非root 组的用户是没有写权限的(创建、删除文件)

drwxr-xr-x. 2 root root 6 3  24 17:38 dir6

# useradd user5     #创建用户user5

$ id               #如果未指定用户组,默认会创建一个与用户名同名的组

uid=1005(user5) gid=1006(user5) =1006(user5) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023

# passwd user5      #设置 user5 的密码

# useradd user6     #创建用户user6

# passwd user6      #设置 user6 的密码

# su user5          #切换为 user5

[user5@localhost dir6]$ touch file1     #无法创建文件

touch: 无法创建"file1": 权限不够

 

# groupadd group6           #创建组group6

# usermod -G group6 user5   #组中添加用户user5

# gpasswd -a user6 group6   #组中添加用户user6

# grep user /etc/group      #查看group6

group6:x:1008:user5,user6  #已经包含了user5user6 用户了

# chgrp group6 ./dir6       #改变 dir6 所属组

# chmod g+w ./dir6          #授予组写权限

# ls -ld ./dir6            #所属组已改变

drwxrwxr-x. 2 root group6 6 3  24 17:38 ./dir6

[user5@localhost dir6]$ touch file1     #创建成功

[user6@localhost dir6]$ rm -f file1     #删除成功

 

2)   限制用户 su root

原理:修改 su 命令的默认权限,将 rwsr-xr-x(4755) 改为 rwsr-xr--,这样就只有所有者(root)和所属组的用户可以执行该命令了。新建一个用户组,将允许执行该命令的用户添加到该组中,并将 su 命令所属组设置为该组即可。

# ls -li /bin/su /usr/bin/su

说明:su 默认权限为 4755/bin/su /usr/bin/su 为硬链接文件,所以改任何一个文件都可以。

# groupadd subgroup            #添加一个新租

# usermod -G sugroup buser1     #将允许执行 su 的用户加入组中

# chgrp sugroup /bin/su         #改变 su 的所属组

# chmod 4750 /bin/su           #权限改为 rwsr-x---

注意:经测试,chgrp 会将已存在的 SetUID 去掉,所以 chomd 需要在后面执行;并且必须保证权限存在 SetUID 权限,否则 su 将出现错误:su: 鉴定故障。

 

[buser4@localhost ~]$ su – root    #普通用户切换 root

-bash: /bin/su: 权限不够        #普通用户权限不够

注意:以上设置是直接设置所有普通用户都不能使用 su 命令,并不仅限于切换为 root 用户。

 

3)   使用 sudo 代替 su 切换为 root 的才能实现功能(如:执行命令)

相比 su 切换为 root 的优点:

l  在执行 sudo 命令时,临时成为 root

l  不会泄露 root 口令;

l  仅向用户提供有限的命令使用权限。

 

1.   sudo 相关文件介绍

# rpm -ql sudo

/etc/sudoers           #sudo 的配置文件

/usr/bin/sudo          #普通用户使用的命令

/usr/sbin/visudo       #管理员(root)使用的配置文件编辑命令

注意:/etc/sudoers 配置文件必须使用 visudo 命令,且必须为 root 用户才能编辑。

 

2.   示例:授权普通用户可以添加用户(useradd)

# which useradd

/usr/sbin/useradd      #useradd 的绝对路径

# hostname             #查看主机名

localhost.localdomain

# visudo               #编辑 sudoers 配置文件

buser1  localhost.localdomain=/usr/sbin/useradd,/usr/sbin/userdel

说明:

1)   在文件末尾加入以上内容(多个命令以","逗号分隔);

2)   如果对用户组授权,需要在组名前加%,例如:%mygroup1 192.168.1.150=/usr/sbin/useradd

3)   如果授予用户或组可以执行 root 所有命令,可以这样设置:

%mygroup1 192.168.1.150=(ALL)ALL

格式:用户名(%组名) 主机名(或IP地址)=命令(绝对路径)

 

$ sudo useradd suser1   #普通用户执行 useradd 命令

说明:命令对用户或组授权,不代表该用户或组可以随意执行该命令,执行时必须以 sudo + 命令的方式。

[sudo] buser1 的密码:  #第一次(每次会话)需要输入密码

 

3.   sudo

功能描述

可以使普通用户或组以管理员(root)的身份执行命令,也就是说,经由 sudo 所执行的指令就好像是 root 亲自执行。

可执行的用户或组以及命令:必须在 /etc/sudoers 中定义,且使用 visudo 编辑和 root 用户。

语法

sudo [选项] [命令]

注意:sudo 可以将可使用的命令细化到选项,或者参数。

示例:

$ sudo userdel suser1   #普通用户使用 sudo 执行 userdel 命令

$ sudo -l               #查看当前用户 sudo 可以执行的命令

(root) /usr/sbin/useradd, /usr/sbin/userdel

$ sudo -h               #查看帮组(命令选项)

 

概念:

1)   sudo 可以让普通用户以 root 身份执行任何命令,并不只是 root 可以执行的命令;

2)   sudo 执行的命令可以精确化,例如:

buser1 192.168.1.150=/usr/sbin/shutdown -h now      #表示当 buser1 使用 shutdown 命令时,只能使用该选项,不能使用其他选项。

 

4)   精确化示例:sudo 实现用户管理某个服务(例如:Apache

1.   权限分析:

1)   可编辑 Apache 配置文件;

2)   可管理 Apache 的服务;

3)   可更新网页(站点文件等)

 

2.   可编辑 Apache 配置文件(三种方法)

1)   设置 Apache 所有目录、配置文件的所有者;

2)   设置 Apache 所有目录、配置文件的所属组,授予组相应的权限,并将用户加入组中;

3)   使用 sudo 实现,编辑 visudo 文件,例如:

buser1 192.168.1.150=/bin/vi /etc/http/conf/httpd.conf

说明:表示 buser1 用户可以以 root 身份执行 vi,编辑 httpd.conf 文件。

$ sudo /bin/vi /etc/httpd/conf/httpd.conf   #buser1 编辑该文件

 

3.   可管理 Apache 的服务

使用 sudo 实现,编辑 visudo 文件,例如:

buser1 192.168.1.150=/etc/rc.d/init.d/httpd start, /etc/rc.d/init.d/httpd reload, /etc/rc.d/init.d/httpd fullstatus, /etc/rc.d/init.d/httpd configtest    #分别可以执行(启动、使配置生效、查看服务状态、监测语法错误)

$ sudo /etc/rc.d/init.d/httpd start     #buser1 启动 Apache

$ sudo /etc/rc.d/init.d/httpd stop      #但不能执行其他操作(未授权)

 

4.   可更新网页(站点文件等)

# grep DocumentRoot /etc/httpd/confi/httpd.conf     #查找网站存放的位置

然后,对该目录修改权限(所有者为 buser1,或者使用用户组管理)。

 

6.   检测密码强度

1)   安装 john 软件包

1.   第一步:下载源代码包

下载地址:https://www.openwall.com/john/

 

2.   第二步:下载后上传至系统 /home/abream/learn 目录下

/home/abream/learn/john-1.9.0.tar.gz

 

3.   第三步:解压缩到当前目录

# tar -xzvf john-1.9.0.tar.gz

 

4.   第四步:进入到解压目录

# cd john-1.9.0

# ls                #发现并不是一个标准的源代码安装包

doc  run  src

# ls -l ./doc       #查找 README/INSTALL

-rw-------. 1 root root  5825 4  12 2019 README

# cat ./doc/INSTALL #查看 INSTALL

 

5.   安装

[root@localhost src]# make

# make linux-x86-64

安装完成后,会在 run 目录下创建相关命令。

 

提示:如果不是标准的源代码包,一定有相应的安装说明,比如:README 或在 INSTALL

 

2)   检查、破解密码

1.   buser1 用户信息输出到 buser1.passwd 文件中

# grep buser1 /etc/passwd > ./buser1.passwd

 

2.   buser1 密码输出到 buser1.shadow 文件中

# grep buser1 /etc/shadow > ./buser1.shadow

 

3.   buser1.passwdbuser1.shadow 和成为一个文件

# ./john-1.9.0/run/unshadow ./buser1.passwd ./buser1.shadow > buser1.john

# cat buser1.john

说明:其实合成后的 buser1.john 文件内容,就是 pwunconv 后的 /etc/passwd 中的格式和内容。

 

4.   检查、破解密码

# ./john-1.9.0/run/john buser1.john

提示:可以尝试“黑客字典”来破解,其实“黑客字典”只是将常见的密码写进去了。

posted @ 2021-10-16 23:04  Abeam  阅读(484)  评论(0编辑  收藏  举报