Linux的账号与用户组
用户标识符:UID与GID
核心: Linux是通过UID和GID来辨别用户和相应权限问题.
知识点:
- UID和GID相关文件: /etc/passwd
用户账号
知识点:
- 用户账号与/etc/passwd和/etc/shadow两个文件有关
/etc/passwd:
[root@kuaicdn ~]# cat /etc/passwdroot:x:0:0:root:/root:/bin/bashbin:x:1:1:bin:/bin:/sbin/nologindaemon:x:2:2:daemon:/sbin:/sbin/nologinadm:x:3:4:adm:/var/adm:/sbin/nologinlp:x:4:7:lp:/var/spool/lpd:/sbin/nologinsync:x:5:0:sync:/sbin:/bin/syncshutdown: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
账号管理示例
- 增加一组用户具有以下功能: | 账号名称 | 账号全名 | 支持次要用户组 | 是否可以登录主机 | 密码 | | —- | —- | —- | —- | —- | | 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
- 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 />
<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的执行流程:
- 执行sudo, 系统与/etc/sudoers文件中查找该用户是否有执行sudo的权限
- 若用户具有可执行sudo权限, 用户输入自己的密码确认
- 密码输入成功, 执行后续命令
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举例)
- 用户执行passwd并输入密码
- passwd调用PAM模块验证
- PAM模块查找passwd命令的配置文件
- 根据/etc/pam.d/passwd内设置, 调用相关的PAM模块逐步进行验证
- 返回验证结果给passwd
- 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模块进行程序的验证.
