Linux的账号与用户组


用户标识符:UID与GID


核心: Linux是通过UID和GID来辨别用户和相应权限问题.

知识点:

  • UID和GID相关文件: /etc/passwd

用户账号


知识点:

  • 用户账号与/etc/passwd和/etc/shadow两个文件有关

/etc/passwd:

  1. [root@kuaicdn ~]# cat /etc/passwd
  2. root:x:0:0:root:/root:/bin/bash
  3. bin:x:1:1:bin:/bin:/sbin/nologin
  4. daemon:x:2:2:daemon:/sbin:/sbin/nologin
  5. adm:x:3:4:adm:/var/adm:/sbin/nologin
  6. lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
  7. sync:x:5:0:sync:/sbin:/bin/sync
  8. shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown

可以看出文件由这几部分组成:

  • 用户名
  • 密码
  • UID
    • 0 : 系统管理员
    • 1-999 : 系统账号
    • 1000-60000 : 可登录账号
  • GID
  • 用户信息说明
  • 家目录
  • shell

/etc/shadow


suyisong:$6$h5XK5vHq$O0VeCBgFU4CdAyTz8crUkWERio8R.SGHU4DagAWvI0Adh2XfUuuLgWEH.UtsFl8Gz3YEJjOGh5mrvES6XRto71:18942:0:99999:7:::
  • 账号名称
  • 密码
  • 最近修改密码的日期: 从1970-1-1作为1而累加的日期
  • 密码不可修改的天数
  • 密码需要重新修改的天数
  • 密码需要修改期限前的警告天数
  • 密码过期后的账号宽限时间
  • 账号失效日期
  • 保留

查看加密算法:

authconfig --test | grep hashing

root密码忘记的修复策略:

重启进入单人维护模式, 使用passwd修改密码. 使用Live CD启动后挂载根目录修改/etc/shadow

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


/etc/group

该文件记录GID与组名的信息:

[root@kuaicdn ~]# cat /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
adm:x:4:

组成:

  • 组名
  • 用户组密码
  • GID
  • 用户组支持账号名称

注意, 一个用户可以支持多个用户组, /etc/passwd保存着用户的初始用户组, /etc/group中第四个字段记录着用户的其它用户组.

有效用户组与初始用户组


有效用户组指用户创建文件时文件的用户组.
初始用户组指用户登录时/etc/passwd指定的默认GID
其它用户组指用户拥有的权限.

添加用户的用户组:

usermod -a -G users dmstsai

groups : 有效与支持用户组的查看


root用户查看其它用户的用户组:

groups user # 显示的第一个组为有效用户组

查看自己的用户组:

groups

newgrp : 有效用户组的切换


核心: 该命令只能被用户组管理员或者root用户执行, 且执行原理是提供另外一个shell来提供该功能, 退出shell后有效用户组又还原为初始用户组.

要求:

  • 切换的有效用户组必须是该用户支持的用户组

添加组方式:

  • root执行usermod命令
  • 用户组管理员执行gpasswd命令
newgrp user # 切换为user用户组

/etc/gshadow


该文件最大的用处就是设置用户组管理员.

slocate:!::
suyisong:!::
tmp_user:!::suyisong
  • 组名
  • 密码, !表示没有, 无用户组管理员
  • 用户组管理员账号
  • 加入该用户组支持的账号

账号管理


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


useradd新增用户

语法:

useradd [-u UID] [-g 初始化用户组] [-G 次要用户组] [-mM] [-c 说明栏] [-d 家目录绝对路径] \
[-s shell] 账号名
选项:
-m : 强制建立家目录
-M : 强制不建立家目录

建立用户的默认行为

[root@kuaicdn ~]# useradd student
您在 /var/spool/mail/root 中有新邮件
[root@kuaicdn ~]# grep student /etc/passwd /etc/shadow /etc/group
/etc/passwd:student:x:1011:1011::/home/student:/bin/bash
/etc/shadow:student:!!:18943:0:99999:7:::
/etc/group:student:x:1011:
[root@kuaicdn ~]# ll -d /home/student/
drwx------ 2 student student 62 11月 12 12:30 /home/student/

可以看出, 建立用户时会在/etc/passwd, /etc/shadow. /etc/group中新建用户信息, 并在/home下建立相关家目录.
默认新用户密码没有账户被锁定需要通过passwd设置密码

如果想要指定一些配置选项可以使用useradd加选项完成

建立系统账户

useradd -r system
[root@kuaicdn ~]# grep system: /etc/passwd /etc/shadow /etc/group
/etc/passwd:system:x:996:992::/home/system:/bin/bash
/etc/shadow:system:!!:18943::::::
/etc/group:system:x:992:
[root@kuaicdn ~]# ll -d /home/system
ls: 无法访问/home/system: 没有那个文件或目录

系统账户UID在1000以下且不会建立Home目录

useradd的配置文件

使用useradd新建用户时默认的行为如何更改? 使用配置文件.

查看配置信息

[root@kuaicdn ~]# useradd -D
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

[root@kuaicdn ~]# cat /etc/default/useradd 
# useradd defaults file
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes

配置项:

  • GROUP=100 : 表示新建账户的初始GID为100. 但CentOS的useradd命令的默认行为时新建一个与用户同名的用户组, 这与用户组的两种不同的机制相关.
    • 私有用户组机制 : 新建一个同名用户组并家目录权限设置为700
    • 公共用户组机制: 将GID=100的用户组作为新建账户的初始用户组
  • HOME=/home : 默认家目录的父目录
  • INACTIVE=-1 : 密码过期后是否失效. -1代表密码永远不会失效, 0代表密码过期后立刻失效
  • EXPIRE= : 账号失效的日期
  • SHELL=/bin/bash : 默认使用的shell, 不允许用户登录时可以设置为/sbin/nologin
  • SKEL=/etc/skel: 用户家目录的基准目录, 创建家目录时会将该目录下的文件复制
  • CREATE_MAIL_SPOOL=yes : 创建邮箱

查看用户UID/GIF的密码参数的配置文件

/etc/login.defs

[root@kuaicdn ~]# cat /etc/login.defs  | egrep -v '^#|^$'
MAIL_DIR    /var/spool/mail                 #邮箱路径
PASS_MAX_DAYS    99999                                # 密码需要重新修改的天数
PASS_MIN_DAYS    0                                        # 密码不可修改的天数
PASS_MIN_LEN    5                                        # 密码最短的字符长度, 已被pam模块替换, 已弃用该参数
PASS_WARN_AGE    7                                        # 密码失效前提醒的天数
UID_MIN                  1000            # 使用者最小的UID, 小于1000为系统保留
UID_MAX                 60000            # 使用者最大的UID
SYS_UID_MIN               201            # 系统用户UID最小者
SYS_UID_MAX               999            # 系统用户UID最大值
GID_MIN                  1000            # 使用者GID最小值
GID_MAX                 60000            # 使用者GID最大值
SYS_GID_MIN               201            # 系统用户组GID最小值
SYS_GID_MAX               999            # 系统用户组GID最大值
CREATE_HOME    yes                                        # 默认建立家目录
UMASK           077                                # 家目录的umask
USERGROUPS_ENAB yes                                # 使用userdel删除时是否会删除初始用户组
ENCRYPT_METHOD SHA512                            # 加密方式

passwd修改用户密码


语法:

passwd [--stdin] [账号名称]
passwd [-l] [-u] [--stdin] [-S] [-n 日数] [-x 日数] [-w 日数] [-i 日数] 账户
选项与参数:
--stdin : 可搭配管道脚本设置用户密码
-l : lock锁住
-u : unlock解锁
-S : 列出密码参数
-n : 多久不可修改密码天数
-x : 多久必须要修改密码参数
-w : 密码过期前的报警天数
-i : 密码失效日期

一般修改密码

[root@kuaicdn ~]# passwd student
更改用户 student 的密码 。
新的 密码:
无效的密码: 密码包含用户名在某些地方
重新输入新的 密码:
抱歉,密码不匹配。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。

密码验证模块

CentOS7采用新的pam模块来管理密码, 相关文件: /etc/pam.d/passwd

[root@kuaicdn ~]# cat /etc/pam.d/passwd
#%PAM-1.0
auth       include    system-auth
account    include    system-auth
password   substack    system-auth
-password   optional    pam_gnome_keyring.so use_authtok
password   substack    postlogin

pam_gnome_keyring.so 负责密码的测试验证, 并且替换/etc/login.defs的PASS_MIN_LEN设置

脚本中更改用户密码

echo "123456" | passwd --stdin vbird2

暂时锁定账号无法登陆:

passwd -l student
passwd -S student # 查看用户状态
passwd -u student # 解锁

chage : 更详细的密码参数显示功能


语法:

chage [-ldEImMW] 账号名
选项与参数:
-l : 列出账号的详细密码参数
-d : 接日期, 修改shadow(最近一次修改密码的日期), 格式YYYY-MM-DD
-E : 修改账号失效号, 格式YYYY-MM-DD
-I : 天数, 修改 密码失效日期
-m : 天数, 修改 密码最短保留天数
-M : 天数, 密码多久需要进行修改
-W : 天数, 修改密码过期前警告日期

显示密码参数

[root@kuaicdn ~]# chage -l student
最近一次密码修改时间                    :11月 12, 2021
密码过期时间                    :从不
密码失效时间                    :从不
帐户过期时间                        :从不
两次改变密码之间相距的最小天数        :0
两次改变密码之间相距的最大天数        :99999
在密码过期之前警告的天数    :7

用户第一次登录时, 强制修改密码


chage -d 0 student
chage -l student

usermod进行账号的微调


语法:

usermod [-cdegGlsuLU] username
选项与参数:
-c : 接账号说明
-d : 接账号的home目录
-e : 日期, YYYY-MM-DD , 账号失效日期
-f : 天数, 密码过期后的账号失效时间
-g : 初始用户组, GID
-G : 次要用户组, GID
-a : 与-G何用, 增加次要用户组
-l : 修改账号名称
-s : shell
-u : 接用户UID
-L : lock
-U : unlock

userdel 删除用户


语法:

userdel [-r] username
-r : 同时删除home目录

用户功能


一些简单的查看用户信息和修改用户数据命令.
一般用户可以修改/etc/passwd文件是通过这些命令的SUID功能实现的.

id[常用]


用法:

[root@kuaicdn ~]# id [username]
uid=0(root) gid=0(root) 组=0(root),994(docker)

finger


CentOS新版本需要通过yum安装.

其本质是读取/etc/passwd中的内容组合.

语法:

finger [-s] username
-s : 列出选项字段的集合

用法:

[root@kuaicdn ~]# finger
Login     Name       Tty      Idle  Login Time   Office     Office Phone   Host
root      su root    tty1      14d  Oct 29 17:22 123        x1231         
root      su root    pts/0          Nov 13 12:16 123        x1231          (192.168.2.18)

[root@kuaicdn ~]# finger root
Login: root                       Name: su root
Directory: /root                        Shell: /bin/bash
Office: 123, x1231            Home Phone: 111
On since 五 10月 29 17:22 (CST) on tty1    14 days 19 hours idle
On since 六 11月 13 12:16 (CST) on pts/0 from 192.168.2.18
   2 seconds idle
New mail received 五 11月 12 20:30 2021 (CST)
     Unread since 四 7月  1 15:30 2021 (CST)
No Plan.

chfn


修改finger

本质: 修改/etc/passwd文件.

语法:

chfn [-foph] [账号名]
-f : 接账号名
-o : Office Room 号码
-p : Office 号码
-h : Home 号码

chfn不带选项则全部修改

chsh


修改用户的默认shell

语法:

chsh [-ls]
-l : 列出系统可用shell
-s : 设置修改自己的shell
[root@kuaicdn ~]# chsh -l
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash

新增与删除用户组


用户组的内容与两个文件有关: /etc/group, /etc/gshadow

groupadd


语法:

groupadd [-g gid] [-r] 用户组名称
-r : 建立系统用户组

groupmod


语法:

groupmod [-g gid] [-n group_name] 用户组名
-n 修改用户组名称

groupdel


删除用户组

语法:

groupdel [groupname]
# 存在用户的用户组无法删除

示例1 : 用户组的新增,修改,删除


[root@kuaicdn ~]# groupadd group1
您在 /var/spool/mail/root 中有新邮件
[root@kuaicdn ~]# grep group1 /etc/group /etc/gshadow
/etc/group:group1:x:1002:
/etc/gshadow:group1:!::
[root@kuaicdn ~]# groupmod -g 201 -n mygroup group1
[root@kuaicdn ~]# grep group1 /etc/group /etc/gshadow
[root@kuaicdn ~]# grep mygroup /etc/group /etc/gshadow
/etc/group:mygroup:x:201:
/etc/gshadow:mygroup:!::
[root@kuaicdn ~]# groupdel mygroup

gpasswd : 用户组管理员功能


建立用户组管理员进行管理,
语法:

gpasswd groupname
gpasswd [-A user1,...] [-M user3, ...] groupname
gpasswd [-rR] groupname
不带参数 : 设置groupname密码
-A : 将group的管理权交给user1
-M : 将某些账号加入到用户组中
-r : 删除groupname的密码
-R : 让groupname的密码失效

#用户组管理员的操作:
gpasswd [-ad] user groupname
选项与参数:
-a : 将user添加到group中
-d : 删除

示例:

[root@kuaicdn ~]# groupadd testgroup
[root@kuaicdn ~]# gpasswd testgroup
正在修改 testgroup 组的密码
新密码:
请重新输入新密码:
[root@kuaicdn ~]# cat /etc/passwd | grep user1
[root@kuaicdn ~]# gpasswd -A user1 testgroup
gpasswd:用户“user1”不存在
[root@kuaicdn ~]# useradd  user1
[root@kuaicdn ~]# gpasswd -A user1 testgroup
[root@kuaicdn ~]# grep testgroup /etc/group /etc/gshadow
/etc/group:testgroup:x:1002:
/etc/gshadow:testgroup:$6$jp9h2/WyFr/uIaAg$qvp6iiuieEbjYwEU9aFOHAECFAbrhdwVcSgt624JZ.NNDV.GGPUTVJ1rTpWtuVc0zrapLwTWgKgaDwIaHdTp4.:user1:

[root@kuaicdn ~]# passwd user1
更改用户 user1 的密码 。
新的 密码:
重新输入新的 密码:
passwd:所有的身份验证令牌已经成功更新。
[root@kuaicdn ~]# su user1
[user1@kuaicdn root]$ id
uid=1002(user1) gid=1003(user1) 组=1003(user1)
[user1@kuaicdn root]$ gpasswd -a tmp_user testgroup
正在将用户“tmp_user”加入到“testgroup”组中
[user1@kuaicdn root]$ gpasswd -a user1 testgroup
正在将用户“user1”加入到“testgroup”组中
[user1@kuaicdn root]$ grep testgroup /etc/group
testgroup:x:1002:tmp_user,user1

账号管理示例


  1. 增加一组用户具有以下功能: | 账号名称 | 账号全名 | 支持次要用户组 | 是否可以登录主机 | 密码 | | —- | —- | —- | —- | —- | | myuser1 | 1st user | mygroup1 | 可以 | passwd | | myuser2 | 2nd user | mygroup1 | 可以 | passwd | | myuser3 | 3rd user | 无额外支持 | 不可以 | passwd |
groupadd mygroup1
useradd -G mygroup1 -c '1st user' myuser1
useradd -G mygroup1 -c '2nd user' myuser2
useradd -c '3rd user' -s /sbin/nologin myuser3

#修改密码
echo "passwd" | passwd --stdin myuser1
echo "passwd" | passwd --stdin myuser2
echo "passwd" | passwd --stdin myuser3
  1. pro1, pro2, pro3共同开发一个项目, 三个用户在同一个目录下面工作, 用户拥有的自己的Home目录和基本的私有用户组. 假设在/srv/projecta下开发. ```shell groupadd projecta useradd -G projecta -c “projecta user” pro1 useradd -G projecta -c “projecta user” pro2 useradd -G projecta -c “projecta user” pro3

echo “passwd” | passwd —stdin pro1 echo “passwd” | passwd —stdin pro2 echo “passwd” | passwd —stdin pro3

mkdir /srv/projecta chgrp projecta /srv/projecta chmod 2770 /srv/projecta ll -d /srv/projecta

> 修改权限为2770时是让用户在该目录下的有效用户组伪projecta

新的问题? 增加一个助理myuser1, 可以查看目录的内容的不同修改目录中的数据.<br />**针对特定账户提供专属权限**!


<a name="MP0GW"></a>
## 使用外部身份认证系统

---

目的:

- Linux主机不同主机使用同一组账号密码

执行authconfig-tui进入外部验证界面<br />![image.png](https://cdn.nlark.com/yuque/0/2021/png/12973334/1636781727537-157eee5f-eb3a-4d00-a6d3-145ea7dccd6b.png#clientId=ue2493a7f-cbcb-4&from=paste&height=637&id=u85c29dfa&margin=%5Bobject%20Object%5D&name=image.png&originHeight=637&originWidth=965&originalType=binary&ratio=1&size=33381&status=done&style=none&taskId=u65ec2861-0f29-4e36-816f-b14ba15a34d&width=965)

<a name="mdYVx"></a>
# 主机的详细权限规划:ACL的使用

---


指定某文件特定于用户或用户组的权限.

<a name="MmF8O"></a>
## 什么是ACL与如何支持启动ACL

---

ACL: Access Control List, 访问控制列表. 

作用: 可以针对单一用户和用户组进行rwx的权限设置.

作用对象:

- 用户
- 用户组
- 默认属性:在目录下新建文件时, 文件的默认属性

查看ACL是否启动?
```shell
[root@kuaicdn tmp]# dmesg | grep -i acl
[    0.425266] systemd[1]: systemd 219 running in system mode. (+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 -SECCOMP +BLKID +ELFUTILS +KMOD +IDN)
[    1.804298] SGI XFS with ACLs, security attributes, no debug enabled

ACL的设置与查看: getfacl, setfacl


getfacl查看文件的ACL设置选项, setfacl用于设置ACL权限.

setfacl语法及简单使用 [ u:账号:权限 ]

语法:

setfacl [-bkRd] [{-m|-x} acl参数] 目标文件名
选项与参数:
-m : 设置后续的ACL参数, 不可与-x合用
-x : 删除后续的ACL参数
-b : 删除所有的ACL设置参数
-k : 删除默认的ACL参数
-R : 递归设置ACL
-d : 设置默认ACL参数
[root@kuaicdn tmp]# touch acl_test1
[root@kuaicdn tmp]# ll acl_test1 
-rw-r--r-- 1 root root 0 11月 13 13:41 acl_test1
[root@kuaicdn tmp]# setfacl -m u:suyisong:rx acl_test1 
[root@kuaicdn tmp]# ll acl_test1 
-rw-r-xr--+ 1 root root 0 11月 13 13:41 acl_test1
[root@kuaicdn tmp]# setfacl -m u::rwx acl_test1  # 不带用户表示设置所属用户权限
[root@kuaicdn tmp]# ll acl_test1 
-rwxr-xr--+ 1 root root 0 11月 13 13:41 acl_test1
[root@kuaicdn tmp]# chmod 750 acl_test1 
[root@kuaicdn tmp]# ll acl_test1 
-rwxr-x---+ 1 root root 0 11月 13 13:41 acl_test1

# 切换为suyisong用户可以查看acl_test1文化部

getfacl命令用法

语法:

getfacl filename
[root@kuaicdn tmp]# getfacl acl_test1 
# file: acl_test1
# owner: root
# group: root
user::rwx
user:suyisong:r-x # 特定用户的权限
group::r--
mask::r-x
other::---

特定的单一用户组的权限设置: [ g:[用户组列表]:[rwx] ]

[root@kuaicdn tmp]# setfacl -m g:mygroup1:rx acl_test1
[root@kuaicdn tmp]# getfacl acl_test1
# file: acl_test1
# owner: root
# group: root
user::rwx
user:suyisong:r-x
group::r--
group:mygroup1:r-x
mask::r-x
other::---

针对有效权限设置: [ m:权限 ]

使用getfacl命令时其中的mask配置代表有效权限, 使用setfacl设置权限时, 只有在mask的范围内的权限才会满足

[root@kuaicdn tmp]# setfacl -m m:r acl_test1
[root@kuaicdn tmp]# getfacl acl_test1
# file: acl_test1
# owner: root
# group: root
user::rwx
user:suyisong:r-x        #effective:r--
group::r--
group:mygroup1:r-x        #effective:r--
mask::r--
other::---

使用默认权限设置目录子文件的ACL权限集成 [ d:[u|g]:[user|group]:权限 ]

默认新建文件时ACL权限会丢弃:

[root@kuaicdn tmp]# setfacl -m m:r acl_test1
[root@kuaicdn tmp]# getfacl acl_test1
# file: acl_test1
# owner: root
# group: root
user::rwx
user:suyisong:r-x        #effective:r--
group::r--
group:mygroup1:r-x        #effective:r--
mask::r--
other::---

[root@kuaicdn tmp]# cd project
[root@kuaicdn project]# touch abc1
[root@kuaicdn project]# mkdir abc2
[root@kuaicdn project]# ll
总用量 0
-rw-r--r-- 1 root root 0 11月 13 14:06 abc1
drwxr-xr-x 2 root root 6 11月 13 14:06 abc2


[suyisong@kuaicdn project]$ ll
总用量 0
-rw-r--r-- 1 root root 0 11月 13 14:06 abc1
drwxr-xr-x 2 root root 6 11月 13 14:06 abc2

设置默认权限:

[root@kuaicdn tmp]# setfacl -m d:u:suyisong:rx project
[root@kuaicdn tmp]# getfacl project
# file: project
# owner: root
# group: root
user::rwx
user:suyisong:r-x
group::r-x
mask::r-x
other::---
default:user::rwx
default:user:suyisong:r-x
default:group::r-x
default:mask::r-x
default:other::---


[root@kuaicdn tmp]# cd project/
[root@kuaicdn project]# mkdir abc3
[root@kuaicdn project]# ll
总用量 0
-rw-r--r--  1 root root 0 11月 13 14:06 abc1
drwxr-xr-x  2 root root 6 11月 13 14:06 abc2
drwxr-x---+ 2 root root 6 11月 13 14:11 abc3

用户身份的切换


前提: 由于各种原因, 使用root用户操作Linux会有很大的风险, 一般情况下都有一般账户进行操作, 但特殊的操作又需要切换成root用户进行操作, 所以进行用户身份切换具有一定的必要性.

目前可以通过su和sudo进行用户身份的切换.

su


su可以进行任何身份的切换.

缺点: 多人共用主机时, 使用su来切换root需要密码可能会导致root密码泄露.

语法:

su [-lm] [-c 命令] [username]
选项与参数:
- : [ su - ]表示切换为root身份, [su root]同样也是切换root身份, 前者使用Login-shell的变量文件读取方式来登录系统, 后者为non-login-shell.
-l : 与-类似, 适用于一般账号.
-m : 与-p一样, 代表使用目前的环境设置而不读取使用者的配置文件.
-c : 以username身份执行一次命令然后退出.

注意: [su -]与[su root]的区别.

sudo

sudo一般用于一般账号以root身份执行命令.

语法:

sudo [-b] [-u 使用者账号]
选项与参数:
    -b : 后接命令让命令在后台执行
  -u : 切换的用户

sudo的执行流程:

  1. 执行sudo, 系统与/etc/sudoers文件中查找该用户是否有执行sudo的权限
  2. 若用户具有可执行sudo权限, 用户输入自己的密码确认
  3. 密码输入成功, 执行后续命令

sudo的配置文件: /etc/sudoers

sudo的配置控制用户可以切换的身份和执行的命令.

[root@kuaicdn tmp]# cat /etc/sudoers | egrep -v '^#|^$'
User_Alias ADMPW = myuser2,myuser3
Cmnd_Alias ADMPWCOM = !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
ADMPW ALL=(root) NOPASSWD:ADMPWCOM, /bin/su -
Defaults   !visiblepw
Defaults    always_set_home
Defaults    match_group_by_gid
Defaults    always_query_group_plugin
Defaults    env_reset
Defaults    env_keep =  "COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS"
Defaults    env_keep += "MAIL PS1 PS2 QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE"
Defaults    env_keep += "LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES"
Defaults    env_keep += "LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE"
Defaults    env_keep += "LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET XAUTHORITY"
Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin
root    ALL=(ALL)     ALL
suyisong    ALL=(ALL)    NOPASSWD:ALL
myuser1    ALL=(ALL)    NOPASSWD:!/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
%wheel    ALL=(ALL)    ALL
您在 /var/spool/mail/root 中有新邮件

一般格式为:

使用者账号        登录者的来源主机名称=(可切换的身份)        可执行的命令
  root                ALL=(ALL)                                                    ALL

ALL表示全部

编辑修改配置文件

修改配置文件使用visudo命令来修改.

修改的场合:

单一用户可使用root所有命令

visudo命令, 可添加:

user        ALL=(ALL)        ALL

用户组免密码执行命令

visudo

%group        ALL=(ALL) NOPASSWD:ALL

NOPASSWD表示不需要密码

限制用户执行的命令

visudo

user1         ALL=(root) /usr/bin/passwd

危险, 这会导致用户可修改root的密码

可修改为

user1         ALL=(root) !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root

通过别名创建visudo

这样的好处是对多个用户进行批量操作方便

User_Alias ADMPW=user1,user2
Cmnd_Alias ADMPWCOM = !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
ADMPW        ALL=(root) NOPASSWD:ADMPWCOM, /bin/su -

sudo的时间间隔问题

一般用户在执行sudo时第一次需要输入密码, 然后再5分钟内不需要输入密码

sudo搭配su切换root身份

user ALL=(ALL) /bin/su -

用户的特殊shell与PAM模块


特殊的shell, /sbin/nologin

某些用户无法登陆shell, 这时候在新建用户时就需要指定shell=/sbin/nologin表示该用户无法登陆.

非法用户登录的提示信息: /etc/nologin.txt

PAM模块简介

PAM(Pluggable Authentication Modules, 插入式验证模块), 它提供一系列API用于进行登录的验证,

PAM用来进行验证的数据称为模块.

PAM模块设置语法

程序调用PAM模块流程:(拿执行passwd举例)

  1. 用户执行passwd并输入密码
  2. passwd调用PAM模块验证
  3. PAM模块查找passwd命令的配置文件
  4. 根据/etc/pam.d/passwd内设置, 调用相关的PAM模块逐步进行验证
  5. 返回验证结果给passwd
  6. passwd程序根据结果进行下一步操作

    注意每个程序的PAM模块配置文件与该程序同名

配置文件分析

分析/etc/pam.d/passwd

[root@kuaicdn ~]# cat /etc/pam.d/passwd
#%PAM-1.0
auth       include    system-auth
account    include    system-auth
password   substack    system-auth
-password   optional    pam_gnome_keyring.so use_authtok
password   substack    postlogin
验证类别        控制标准     调用模块
  • 验证类别, 主要分四种, 这几个阶段存在顺序
    • auth : 认证阶段, 检验用户的身份
    • account : 授权阶段, 检验用户权限
    • session : 会话阶段, 给予环境设置, 通常用于记录用户登录与注销的信息. [ session open]和[ session close ]
    • password : 修改密码阶段
  • 控制标准, 验证通过的标识
    • required : 此验证成功则带有sucess的标志, 否则failure; 执行完成后会继续执行下一步, 可以用于记录日志
    • requisite : 验证失败返回failure, 并终止退出; 否则返回success继续验证.
    • sufficient : 验证成功返回success, 终止后续验证; 否则返回failure继续验证.
    • optional : 显示信息.

常用模块简介

这里讲解的主要是login中需要使用的模块.

看下login的配置文件和使用的PAM模块:

[root@kuaicdn ~]# cat /etc/pam.d/login
#%PAM-1.0
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth       substack     system-auth
auth       include      postlogin
account    required     pam_nologin.so
account    include      system-auth
password   include      system-auth
# pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
session    optional     pam_console.so
# pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open
session    required     pam_namespace.so
session    optional     pam_keyinit.so force revoke
session    include      system-auth
session    include      postlogin
-session   optional     pam_ck_connector.so


[root@kuaicdn ~]# cat /etc/pam.d/system-auth
#%PAM-1.0
# This file is auto-generated.
# User changes will be destroyed the next time authconfig is run.
auth        required      pam_env.so
auth        required      pam_faildelay.so delay=2000000
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        required      pam_deny.so

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     required      pam_permit.so

password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so

可以看出用到了很多模块, 那么这些模块和用到的文件在哪? 下述:

  • /etc/pam.d/* : PAM配置文件
  • /lib64/security/* : PAM模块文件的时机放置目录
  • /etc/security/* : 其它PAM环境的配置文件
  • /usr/share/doc/pam-*/ : 详细的PAM说明文件

模块过多, 这里仅介绍重要的模块:

  • pam_securetty.so : 限制root可以安全登录的终端, 相关文件 /etc/securetty.
  • pam_nologin.so : 限制一般用户是否可以登录主机. 相关文件 /etc/nologin.
  • pam_console.so : 可以登录的特殊终端接口.
  • pam_loginuid.so : 用户的UID>1000, 合理
  • pam_env.so : 设置额外的环境变量, 相关文件/etc/security/pam_env.conf
  • pam_unix.so : 密码验证
  • pam_pwquality.so : 验证密码强度等.
  • pam_limits.so : 用户限制, 相关文件/etc/security/limits.conf.

了解一下login的登录流程:

一句话描述就是: /etc/pam.d/login先执行auth阶段, 调用system_auth也仅执行auth阶段; 下一步执行account阶段, 依次直到执行完成.

其它相关文件


这里举例的是limits.conf, 该文件影响[ ulimit -a ]中显示的限制用户的情况.

Linux主机用户信息交流


查询用户: w, who, last, lastlog

直接看下命令的效果:

[root@kuaicdn ~]# w
 14:25:41 up 5 days, 17:02,  3 users,  load average: 0.09, 0.07, 0.02
USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
root     tty1                      2910月21 19days  0.01s  0.01s -bash
root     pts/0    192.168.2.29     12:39    2.00s  0.93s  0.00s w
suyisong pts/1    192.168.2.29     14:02   26.00s  0.04s  0.04s -bash

[root@kuaicdn ~]# who
root     tty1         2021-10-29 17:22
root     pts/0        2021-11-18 12:39 (192.168.2.29)
suyisong pts/1        2021-11-18 14:02 (192.168.2.29)

[root@kuaicdn ~]# last | tail
root     tty1                          Wed Jun 30 16:26 - 16:06 (30+23:40)  
reboot   system boot  5.4.102-1.el7.el Thu Jul  1 00:26 - 16:08 (30+15:42)  
root     pts/0        192.168.2.54     Sun Mar  7 15:27 - down   (00:09)    
root     tty1                          Sun Mar  7 15:26 - 15:36  (00:09)    
reboot   system boot  5.4.102-1.el7.el Sun Mar  7 15:26 - 15:36  (00:10)    
root     pts/0        192.168.2.54     Sun Mar  7 15:21 - crash  (00:05)    
root     tty1                          Sun Mar  7 15:21 - 15:26  (00:05)    
reboot   system boot  3.10.0-1160.el7. Sun Mar  7 15:21 - 15:36  (00:15)    

wtmp begins Sun Mar  7 15:21:01 2021

[root@kuaicdn ~]# lastlog
用户名           端口     来自             最后登陆时间
root             pts/1    192.168.2.29     四 11月 18 14:00:42 +0800 2021
bin                                        **从未登录过**
daemon                                     **从未登录过**
adm                                        **从未登录过**
lp                                         **从未登录过**
sync                                       **从未登录过**
shutdown                                   **从未登录过**
halt                                       **从未登录过**
mail                                       **从未登录过**
operator                                   **从未登录过**
games                                      **从未登录过**
ftp                                        **从未登录过**
nobody                                     **从未登录过**
systemd-network                            **从未登录过**
dbus                                       **从未登录过**
polkitd                                    **从未登录过**
sshd                                       **从未登录过**
postfix                                    **从未登录过**
chrony                                     **从未登录过**
rpc                                        **从未登录过**
rpcuser                                    **从未登录过**
nfsnobody                                  **从未登录过**
ntp                                        **从未登录过**
apache                                     **从未登录过**
mysql                                      **从未登录过**
suyisong         pts/1    192.168.2.29     四 11月 18 14:02:50 +0800 2021
myuser1          pts/0                     三 11月 17 15:29:07 +0800 2021
myuser2          pts/0                     三 11月 17 15:39:47 +0800 2021
myuser3          pts/0                     三 11月 17 17:07:16 +0800 2021
sytem_user                                 **从未登录过**

可以看出w和who可以查看当前系统登录的用户信息; last和lastlog可以查看历史信息.

用户对谈 : write, mesg, wall


适合于线上用户之间通信, 搭配w和who命令使用

write命令

write命令就是发送消息

语法:

write user [终端]

输入的消息需要使用ctrl+d表示发送

有几个注意点:

  • 用户可能不具有使用write的权限
  • 接收方可以使用mesg接收, root是发送方除外

mesg

是否接收消息

mesg n # 拒绝接收write
mesg y # 允许

wall

广播发送消息

wall "mesg"

自己也会接收消息

用户邮箱

用户邮箱的用处在于可以给离线用户发送消息.

发送邮件:

mail -s "title" user@localhost
###
content
.

注意content以.结尾

可以重定向发送邮件

接收邮件:

mail #进入交互界面
? # 查看所有命令

常用交互命令:

  • s : 存储成文件
  • q : 保存退出
  • exit : 退出

CentOS7大量创建账号的方法

核心在于修改密码:

echo "passwd" | passwd --stdin user

账号检查的工具:

  • pwck : 检查/etc/passwd账号配置文件的信息
  • pwconv : 将/etc/passwd内的账号与密码移动到/etc/shadow中
  • pwunconv : 将/etc/shadow的密码栏数据协会/etc/shadow, 删除/etc/shadow
  • chpasswd : 读取为加密前的密码, 加密后写入/etc/shadow

    其用法在其它系统上可以修改密码

重点:

  • 用户组的查看与有效用户组的切换分别为groups和newgrp命令
  • useradd命令功能的参考文件由/etc/default/useradd, /etc/login.defs, /etc/skel等
  • 查看用户详细的密码参数, 可以使用 [ chage -l 账号 ]
  • 用户自行修改参数的命令有chsh, chfn, 查看命令有Id, finger
  • CentOS7默认支持ACL
  • ACL可以进行单一或用户组的权限管理, 但ACL的启动需要文件系统的支持
  • ACL的设置setfacl, 查看getfacl
  • 身份切换使用su和sudo, 但使用sudo需要使用visudo来设置可使用的命令
  • PAM模块进行程序的验证.