第十三章 Linux账号管理与ACL权限设置
13.1 Linux的账号与用户组
13.1.1 用户标识符:UID与GID
人一般容易记忆账号,但是Linux主机只认识ID,账号与ID的对应关系写在/etc/passwd
中。
每个登录的用户都至少会获取两个ID:用户ID(UID
)、用户组ID(GID
)。
文件通过UID
和GID
判别它的拥有者和用户组。要求显示文件属性时,系统根据/etc/passwd
和/etc/group
的内容找到UID
和GID
对应的账号与组名,显示出来。
重要内容:
/etc/passwd
文件以冒号分隔开,共分7个字段,分别是【账号名称、密码、UID、GID、全名、家目录、shell】;
/etc/group
文件以冒号为分隔符,共分9个字段,分别是【账号名称、加密密码、密码修改日期、密码最小可变动日期、密码最大需变动日期、密码过期前警告日数、密码失效天数、账号失效日、保留未使用】。
13.1.2 用户账号
Linux系统上的用户如果需要登录主机以获取shell
的环境来工作,首先要用tty1-tty6
的终端共的登录接口,并输入账号与密码后才能登录。
如果是通过网络登录以获取shell
环境,那么就要用到ssh
这个功能。
输入账号和密码后,系统做了如下工作:
- 查找
/etc/passwd
里面是否有你输入的账号?如果没有就退出;如果有,将账号对应的UID和GID读取出来,另外,该账号的家目录和shell设置一并读出 - 核对密码表。Linux会进入
/etc/shadow
里找出对应的账号与UID,然后核对密码是否正确 - 如果一切OK,进入shell管理的阶段
/etc/passwd
文件结构与/etc/shadow
的文件结构,每个字段代表含义需要了解:
head -n 4 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
head -n 4 /etc/shadow
root:$6$lIgUfTM59LhVnU17$lhE8MxUXv.PQsW.7SW5JetXLVOvShLJCSTFV4ipcZk7CjB0gGGlRYdMbYAWa/mbVArLxxGlgzgrmV1TsOGNvW1::0:99999:7:::
bin:*:17834:0:99999:7:::
daemon:*:17834:0:99999:7:::
adm:*:17834:0:99999:7:::
计算某个日期的累计日期(1970年1月1日是1,1970年1月2日是2):
echo $(($(date --date="2020/06/08" +%s)/86400+1))
输出:
18421
了解当前的加密方式:
authconfig --test | grep hashing
输出:
password hashing algorithm is sha512
忘记密码如何挽回:
忘记一般用户的密码,让root管理员通过passwd修改该用户密码即可。
忘记root管理员密码,两种方法:
①重启进入单人维护模式,系统会主动给予root权限的bash接口,此时再以passwd修改密码即可;
②以Live CD启动后挂载根目录去修改/etc/shadow,讲礼貌的root密码字段清空,再重新启动后,root无需密码直接登录,登录后再立即用passwd命令设置新的root密码。
13.1.3 关于用户组:有效与初始用户组,groups,newgr
head -n 4 /etc/group
root:x:0:
bin:x:1:
daemon:x:2:
sys:x:3:
将普通用户dj、alex加入root管理员:
root:x:0:dj,alex
对于已经存在的文件,用户所在的3个组拥有哪些权限,该用户就拥有哪些权限。
对于该用户建立的新文件,要看新文件的用户组是谁,需要检查当时的有效用户组。
[root@study ~] usermod -a -G users dj 只有管理员有权限改组(为避免注释显示,把]右侧的井号键删除了)
[root@study ~] su dj 回到dj用户
[dj@study root]$ groups 查看dj所属的组
dj wheel users 属于这三个组,第一个输出的用户组是有效用户组
[dj@study root]$ touch test
touch: 无法创建"test": 权限不够
[dj@study root]$ cd ~
[dj@study ~]$ touch test
[dj@study ~]$ ll test
-rw-rw-r--. 1 dj dj 0 6月 9 08:41 test 此时建立的文件所属组是有效用户组,有效用户组的作用主要在于新建文件
有效用户组的切换:只能切换成当前所属的用户组
newgrp users 更改有效用户组
groups 查看当前所属组
输出:
users wheel dj
touch test2 此时新建文件
ll test2
输出:
-rw-r--r--. 1 dj users 0 6月 9 08:45 test2 新文件的所属组是users了
用户组管理员:
head -n 4 /etc/gshadow
输出:
root::: 第一个字段是组名
bin::: 第二个字段是密码,如果是!或者空,表明该用户组没有管理员
daemon::: 第三个字段是用户组管理员的账号
sys::: 第四个字段是加入该用户组支持的所属账号
13.2 账号管理
13.2.1 新增与删除用户:useradd、相关配置文件、passwd、usermod、userdel
useradd [-u UID] [-g 初始用户组] [-G 次要用户组] [-mM] [-c 说明栏] [-d 家目录绝对路径] [-s shell] 使用者账号名
-u UID 直接指定一个特定的UID给这个账号
-g 初始用户组 该用户组的GID会被放到/etc/passwd的第四个栏位
-G 次要用户组 会修改/etc/group内的内容、
-M 强制,不要建立使用者的家目录(系统账号默认值)
-m 强制,要建立使用者的家目录(一般账号默认值)
-c 是/etc/passwd第五栏的说明内容
-d 指定某个用户成为家目录,而不要使用默认值,务必是绝对路径
-s shell 默认是/bin/bash
-e 日期 【YYYY-MM-DD】可设置shadow的第8栏位,即账号失效日的设置选项
-f 接shadow的第7栏位 指定密码是否会失效,0为立刻失效,-l为永不失效
-D 查看默认值
建立一般账号:
[root@study ~] useradd vbird1
[root@study ~] ll -d /home/vbird1 默认建立使用者家目录,且权限700
drwx------. 3 vbird1 vbird1 78 6月 9 09:04 /home/vbird1
grep vbird1 /etc/passwd /etc/shadow /etc/group 查看相关信息
/etc/passwd:vbird1:x:1001:1001::/home/vbird1:/bin/bash
/etc/shadow:vbird1:!!:18422:0:99999:7:::
/etc/group:vbird1:x:1001:
[root@study ~] useradd -u 1500 -g users vbird2 建立UID=1500,属于users组的用户vbird2
[root@study ~] ll -d /home/vbird2
drwx------. 3 vbird2 users 78 6月 9 09:10 /home/vbird2
[root@study ~] grep vbird2 /etc/passwd /etc/shadow /etc/group 查看相关信息
/etc/passwd:vbird2:x:1500:100::/home/vbird2:/bin/bash
/etc/shadow:vbird2:!!:18422:0:99999:7:::
建立系统账号:系统账号主要是用来执行系统所需服务的权限设置,所以系统账号默认都不会主动建立家目录。
[root@study ~] useradd -r vbird3
[root@study ~] ll -d /home/vbird3
ls: 无法访问/home/vbird3: 没有那个文件或目录 不会主动建立家目录
[root@study ~] grep vbird3 /etc/passwd /etc/shadow /etc/group
/etc/passwd:vbird3:x:988:982::/home/vbird3:/bin/bash
/etc/shadow:vbird3:!!:18422::::::
/etc/group:vbird3:x:982:
用useradd建立用户账号时,
至少会参考:
- /etc/default/useradd
- /etc/login.defs
- /etc/skel/*
至少会修改:
- 用户账号与密码:/etc/passwd 、/etc/shadow
- 用户用户组:/etc/group、/etc/gshadow
- 用户家目录:/home/账号名称
[root@study ~] useradd -D 查看useradd命令的默认值
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
passwd [--stdin] [账号名称] 所有人都可以用来修改自己的密码
passwd [-l] [-u] [--stdin] [-S] [-n 日数] [-x 日数] [-w 日数] [-i 日期] 账号 只能root用
--stdin 通过来自前一个管道的数据,作为密码输入
-l Lock的意思,会将/etc/shadow第二栏最前面加上!使密码失效
-u 与-l相对,Unlock
-S 列出密码相关参数,即shadow文件内的大部分信息
-n shadow的第4栏位,多少天内不可修改密码
-x shadow的第5栏位,多少天内必须修改密码
-w shadow的第6栏位,密码过期前的警告天数
-i shadow的第7栏位,密码失效日期
[root@study ~] echo "vbird2passwd" | passwd --stdin vbird2 可以在/root/.bash_history中找到这个密码
更改用户 vbird2 的密码 。
passwd:所有的身份验证令牌已经成功更新。
passwd -l vbird2 让这个用户失效
passwd -u vbird2 让这个用户恢复
查看某个用户的密码的详细参数:
passwd -S vbird2
chage -l vbird2
这个agetest用户第一次登录密码与账号同名,但是一登录就被要求修改密码,修改完毕后被踢出系统,使用新密码登录:
useradd agetest
echo "agetest" | passwd --stdin agetest
chage -d 0 agetest
添加完用户后,对账号信息进行微调:
usermod [-cdegGlsuLU] username
删除用户的相关数据:
userdel [-r] username
-r 连同用户家目录一起删除
慎用!!
用之前,先找到整个系统内书序username的文件:
find / -user username
通常删除一个账号,可以手动将/etc/passwd和/etc/shadow里的该账号取消。
如果该账号只是暂时不启用的话,那么将/etc/shadow里的账号失效日期(第8字段)设置为0,就可以让该账号无法使用,但是所有和该账号有关的数据都会留下来。
13.2.2 用户功能
一般用户常用的账号数据修改和查询命令。
id [username]
[root@study ~] id
uid=0(root) gid=0(root) 组=0(root) 环境=unconfined_u:unconfined_r:unconfined_t:s0-s0:c0.c1023
[root@study ~] id vbird2
uid=1500(vbird2) gid=100(users) 组=100(users)
finger 由于命令有点危险,系统默认不安装这个软件,需要自行安装软件
finger [-s] username 检查用户信息
chfn和chsh都能让一般用户修改/etc/passwd这个系统文件,所以,
这两个命令的权限都是SUID。在执行过程中拥有了/etc/passwd文件所有者root的权限。
chfn [-foph] [账号名称] 像是change finger的缩写
chsh [-ls] 像是change shell的缩写
chsh -s /bin/csh 修改shell环境为/bin/csh
13.2.3 新增与删除用户组
groupadd [-g gid] [-r] 用户组名称
-g 后面接某个特定GID,用来直接设置某个GID
-r 建立系统用户组
groupmod 这个命令我觉得自己1年之内不会用,暂时不写了。
gpasswd groupname 设置组groupname的密码
gpasswd -A vbird1 groupname 将vbird1这个用户设置为groupname组的管理员
gpasswd -a user groupname 添加用户user到组groupname
gpasswd -d user groupname 从组groupname中删除用户user
13.2.4 账号管理实例
用户pro1、pro2、pro3是同一个项目的开发人员,要让这三个用户在同一个目录下工作,但这3个用户拥有自己的家目录与基本的私有用户组。假设要让这个项目在/srv/projecta目录下开发:
groupadd projecta 创建用户组projecta
useradd -G projecta -c "projecta user" pro1 创建3个用户
useradd -G projecta -c "projecta user" pro2
useradd -G projecta -c "projecta user" pro3
echo "password" | passwd --stdin pro1 给这3个用户设置密码
echo "password" | passwd --stdin pro2
echo "password" | passwd --stdin pro3
mkdir /srv/projecta 创建工作目录文件夹/srv/projecta
chgrp projecta /srv/projecta 将文件夹/srv/projecta的所属组修改为projecta
chmod 2770 /srv/projecta 修改文件夹/srv/projecta的权限是2770,为了让3个用户能够互相修改对方的文件,这个SGID必须要存在
此时有个问题,myuser1是projecta的项目助理,不希望他能修改任何内容,处理方式可以使用ACL机制:
setfacl -m u:myuser1:rx /srv/projecta
取消用户权限:
setfacl -x u:myuser1 /srv/projecta 取消myuser1用户的权限
setfacl -x d:u:myuser1 /srv/projecta 取消myuser1用户的权限,设置默认的ACL参数
setfacl -m u:pro3:- /srv/projecta 开始让用户无法使用该目录
13.2.5 使用外部身份认证系统
Windows下的一个很有名的身份验证系统:活动目录AD
Linux为了使不同主机使用同一组账号密码,会用到LDAP和NIS等服务器提供的身份验证。
13.3 主机的详细权限规划:ACL的使用
ACL概念,如何支持启动ACL
ACL,访问控制列表,主要目的是提供传统的属主、所属群组、其他人的读、写、执行权限之外的详细权限设置。
ACL可以针对单一用户、单一文件或目录来进行r、w、x的权限设置,对于需要特殊权限的使用状况很有用。
主要应用:
- 用户(user):可以针对用户来设置权限
- 用户组(group):针对用户组为对象来设置其权限
- 默认属性(mask):还可以针对在该目录下建立新文件/目录时,规范新数据的默认权限
应用场景:
有一个目录,需要给一堆人用,每个人或每个组所需要的权限并不相同时,传统的Linux三种身份三种权限无法做到,因为只能针对一个用户、一个用户组、非此用户组的其他人设置权限,无法针对单一用户设置权限,而ACL可以解决这个问题。
查询是否支持ACL:
dmesg | grep -i acl
xfs文件系统时支持ACL的:
[root@study ~] dmesg | grep -i acl
[ 1.401820] 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)
[ 3.548645] SGI XFS with ACLs, security attributes, no debug enabled
13.3.2 ACL的设置技巧:getfacl、setfacl
setfacl [-bkRd] [{-m|-x} acl 参数] 目标文件名
-m 设置后续的ACL参数给文件用,不可与-x合用
-x 删除后续的ACL参数,不可与-m合用
-b 删除【所有的】ACL参数
-k 删除【默认的】ACL参数
-R 递归设置ACL,即包括子目录都会被设置起来
-d 设置【默认ACL参数】,只对目录有效,在该目录新建的数据会引用此默认值
设置1:
ACL设置: 【u:用户:权限】,-m
[root@study ~] touch acl_test2
[root@study ~] ll acl_test2
-rw-r--r--. 1 root root 0 6月 9 10:54 acl_test2
[root@study ~] setfacl -m u:vbird1:rx acl_test2
[root@study ~] ll acl_test2
-rw-r-xr--+ 1 root root 0 6月 9 10:54 acl_test2
[root@study ~] setfacl -m u::rwx acl_test2
[root@study ~] ll acl_test2
-rwxr-xr--+ 1 root root 0 6月 9 10:54 acl_test2
[root@study ~] getfacl acl_test2 查看真实的文件权限
# file: acl_test2
# owner: root
# group: root
user::rwx
user:vbird1:r-x
group::r--
mask::r-x
other::r--
特定的单一用户组的权限:【g:用户组名:权限】
设置文件acl_test2针对mygroup1的权限规范为rx
[root@study ~] setfacl -m g:mygroup1:rx acl_test2
[root@study ~] getfacl acl_test2 查看权限
# file: acl_test2
# owner: root
# group: root
user::rwx
user:vbird1:r-x
group::r--
group:mygroup1:r-x
mask::r-x
other::r--
针对有效权限的设置:【m:权限】
[root@study ~] setfacl -m m:r acl_test2 用mask规范最大允许的权限,从而避免不小心开放某些权限给其他用户或用户组
[root@study ~] getfacl acl_test2 查看权限
# file: acl_test2
# owner: root
# group: root
user::rwx
user:vbird1:r-x #effective:r--
group::r--
group:mygroup1:r-x #effective:r--
mask::r--
other::r--
使用默认权限设置目录未来文件的ACL权限继承:【d:[u|g]:[user|group]:权限】
setfacl -m d:u:myuser1:rx /srv/projecta 让myuser1在/srv/projecta下面一直具有rx的默认权限
13.4 用户身份切换
普通用户切换成root用户身份,两种方法
方法一:切换成root环境
su - 需要输入管理员密码才能切换
exit
方法二:
sudo command 需要输入用户自己的密码
su - 切换为root身份
su -l dj 切换回dj身份,会连同PATH、USER、MAIL等变量转成新用户的环境
su - dj
su dj
su - -c "head -n 3 /etc/shadow" 执行一个只有root才能执行的命令,且执行完毕就回复原本的身份
并非所有人都可以用sudo,仅有规范到/etc/sudoers内的用户才能够执行sudo命令。
而可以使用sudo者是通过输入自己的密码来执行后续命令串。
sudo [-b] [-u 新使用者账号]
-b 将后续的命令放到后台中,让系统自动执行,而不语目前的shell产生影响
-u 后面接欲切换的使用者,若无此项则代表切换身份为root
sudo -u sshd touch /tmp/mysshd 想要以sshd的身份在/tmp文件夹下建立一个名为mysshd的文件
ll /tmp/mysshd
输出:
-r--r--. 1 sshd sshd 0 6月 9 12:47 /tmp/mysshd
[root@study ~] sudo -u vbird1 sh -c "mkdir ~vbird1/www;cd ~vbird1/www;echo 'This is index.html file' > index.html"
[root@study ~] ll -a ~vbird1/www
总用量 4
drwxr-xr-x. 2 vbird1 vbird1 24 6月 9 12:49 .
drwx------. 4 vbird1 vbird1 89 6月 9 12:49 ..
-rw-r--r--. 1 vbird1 vbird1 24 6月 9 12:49 index.html
通过visudo去编辑/etc/sudoers文件
visudo
修改,使得某个用户具备root权限:
## Allow root to run any commands anywhere
root ALL=(ALL) ALL
在这下面添加以下语句后,则dj拥有和root相同的权限(很可怕)
dj ALL=(ALL) ALL
修改,使得某个用户组具备root权限:
## Allows people in group wheel to run all commands
%wheel ALL=(ALL) ALL 取消这行的注释后,所有加入到wheel组的用户都具备root权限
usermod -a -G wheel pro1 将pro1加入wheel的支持,这样,pro1就有root权限
修改,使得wheel用户组使用sudo时无需密码:
## Same thing without a password
%wheel ALL=(ALL) NOPASSWD: ALL
修改,让用户只能够帮助root修改用户密码,其他的不能做:
myuser1 ALL=(root) /usr/bin/passwd 用户myuser1只能切换成root用户使用passwd命令。这里命令必须用绝对路径
刚才那个命令太危险,容易修改root用户密码,改成下面的命令进行约束,除了passwd和passwd root两个命令不可以使用,其他命令可以使用
myuser1 ALL=(root) !/usr/bin/passwd,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root
用别名简化批量设置:
User_Alias ADMPW=pro1,pro2,pro3,myuser1,myuser2
Cmnd_Alias ADMPWCOM=!/usr/bin/passwd,/usr/bin/passwd [A-Za-z]*,!/usr/bin/passwd root
ADMPW ALL=(root) ADMPWCOM
sudo的时间间隔问题:两次sudo时间间隔在5分钟以内,不需要重复输入密码
使用用户自己的密码,用sudo搭配su,将身份转成root:
User_Alias ADMPW=pro1,pro2,pro3,myuser1,myuser2
ADMPW ALL=(root) /bin/su -
改完后,那5个人,使用sudo su - 输入自己的密码后就立刻变成root身份。
不但root密码不外流,用户管理也边方便。但这5个人必须是值得信任的人。
13.5 特殊的shell与PAM模块
13.5.1 特殊的shell,/sbin/nologin
无法使用bash或其他的shell来登录系统。不代表这个账号无法使用其他的系统资源。
IP账号管理打印作业;apache账号管理www服务,它们都可以进行系统程序的工作,但是就是无法登录主机获取交互的shell而已。
vim /etc/nologin.txt
cat /etc/nologin.txt
输出:
This account is system account or mail account.
Please DONOT use this account to login my Linux server.
[root@study ~] su - mail 想要切换到mail的shell中去,会提醒上述输入信息
This account is system account or mail account.
Please DONOT use this account to login my Linux server.
13.5.2 PAM模块简介
PAM,插入式验证模块,是一套应用程序编程接口API,提供一连串的验证机制,只要用户将验证阶段的需求告知PAM,PAM就能返回用户验证的结果(成功or失败)。
PAM用来进行验证的数据成为模块,每个PAM模块的功能都不太相同。
13.5.3 PAM模块设置语法
执行passwd命令后:
- 用户开始执行/usr/bin/passwd这个程序,并输入密码
- passwd调用PAM模块进行验证
- PAM模块会到/etc/pam.d/找寻与程序passwd同名的配置文件
- 根据/etc/pam.d/passwd内的设置,引用相关的PAM模块逐步进行验证分析
- 将验证结果(成功or失败or其他信息)返回个passwd这个程序
- passwd这个程序会根据PAM返回的结果决定下一个操作(重新输入密码或通过验证)
[root@study ~] cat /etc/pam.d/passwd
#%PAM-1.0 PAM版本说明
auth include system-auth 每行都是一个验证过程
account include system-auth
password substack system-auth
-password optional pam_gnome_keyring.so use_authtok
password substack postlogin
验证类别 控制标准 PAM模块与该模块的参数
第一个字段:验证类别:auth、account、session、password
第二个字段:验证的控制标识:required、requisite、sufficient、optional
13.5.4 常用模块简介
常用PAM模块 | 简介 |
---|---|
pam_securetty.so | 限制系统管理员root只能从安全的终端登录 |
pam_nologin.so | 限制了一般用户是否能够登录主机,如果/etc/nologin文件存在,则否,不影响root和已经登录的一般用户 |
pam_seLinux.so | SELinux是针对程序来进行详细管理权限的功能,先利用PAM模块将其暂时关闭,验证通过后再开启 |
pam_console.so | 系统出问题或者需要使用特殊的终端接口(如RS232之类的终端设备)登录主机时用的 |
pam_loginuid.so | 验证用户的UID是否是所需要的数值,一般账号UID应大于1000 |
pam_env.so | 设置额外环境变量的一个模块 |
pam_unix.so | 很复杂很重要的模块,可以用在验证阶段的认证功能、授权阶段的账号许可证管理、会话阶段的日志文件记录、密码更新阶段的检验 |
pam_pwquality.so | 检验密码强度,看密码是否在字典中、密码输入几次都失败就断掉此次连接等 |
pam_limits.so | ulimit的功能 |
登录系统所需要的PAM流程:
[root@study ~] 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
system-auth模块:
[root@study ~] 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_fprintd.so
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
登录流程:
- 验证阶段(auth):(a)经过pam_securetty.sp判断,如果用户是root,会参考/etc/securetty的设置;(b)经过pam_env.so设置外的环境变量;(c)通过pam_unix.so检验密码,若通过返回login程序;若不通过,则(d)继续往下以pam_succeed_if.so判断UID是否大于1000,若小于1000返回失败,否则再往下(e)以pam_deny.so拒绝连接。
- 授权阶段(account):(a)先以pam_nologin.so判断/etc/nologin是否存在,若存在则不许一般用户登录;(b)以pam_unix.so和pam_localuser.so进行账号管理;(c)以pam_succeed_if.so判断UID是否小于1000,若小于1000不记录登录信息;(d)最后以pam_permit.so允许该账号登录。
- 密码阶段(password):(a)以pam_pwquality.so设置密码仅能尝试3次;(b)以pam_unix.so通过sha512、shadow等功能进行密码检验,若通过返回login程序;若不通过(c)以pam_deny.so拒绝登录。
- 会话阶段(session):(a)以pam_selinux.so暂时关闭SELinux;(b)使用pam_limits.so设置好用户能够操作的系统资源;(c)登录成功后开始记录相关信息在日志文件中;(d)以pam_loginuid.so规范不同的UID权限;(e)开启pam_selinux.so功能。
13.5.5 其他相关文件
/etc/secutity/limits.conf
/var/log/secure
/var/log/messages
13.6 Linux主机上的用户信息传递
应用场景:当你在Linux上面操作时,刚好有其他用户也登录主机,你想和他交谈。
13.6.1 查询用户:w、who、last、lastlog
查询目前登录在系统上的用户:
[root@study ~] w
15:48:20 up 17:40, 2 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
dj :0 :0 一10 ?xdm? 17:23 0.73s /usr/libexec/gnome-session-binary --session gnome-classic
dj pts/0 :0 一10 4.00s 4.52s 2:04 /usr/libexec/gnome-terminal-server
lastlog 能获取每个用户最近的登录时间,读取/var/log/lastlog文件
13.6.2 用户对谈:write、mesg、wall
一对一:
write 使用者账号 [使用者所在终端界面]
who 如果查询到root永和和dj用户在线
write dj pts/2 回车后输入要显示的信息,完成后回车,信息会立刻发送给dj用户
dj用户如果正在查数据,这些信息会立刻终端dj用户原本的任务。所以dj不想接受任何信息,执行:
mesg n 设置为不接受信息,但是这对于root传过来的信息没有阻止能力
mesg y 重新启用接收信息
一对多:对所有系统上面的用户发送广播:
wall "I will shutdown my Linux Server..."
13.6.3 用户邮箱:mail
mailbox都会放置在/var/spool/mail里面,一个账号一个mailbox(文件)。
dj用户就有/var/spool/mail/dj
这个mailbox。
发送邮件:
mail -s "邮件标题" username@localhost 本机发送不需要@localhost
mail -s "nice to meet you" dj 编辑一段话发给dj用户
输入想说的话
. 最后输入一个小数点表示结束输入
mail -s "nice to meet you" dj < filename 把文件发给dj用户
ls -al ~ | mail -s "mylife" dj 把家目录下的内容发给dj用户
接收邮件:
[dj@study ~]$ mail
Heirloom Mail version 12.5 7/5/10. Type ? for help.
"/var/spool/mail/dj": 3 messages 3 new
>N 1 root Tue Jun 9 18:14 18/619 "nice to meet you"
N 2 root Tue Jun 9 18:18 29/762 "bashrc file content"
N 3 dj Tue Jun 9 18:19 52/2457 "myfile"
& s 3 ~/mailmyfile.txt 将第三封信存成文件
"/home/dj/mailmyfile.txt" [New file] 54/2477 表示已经存好
& h 再次查看一下,发现3左边的N变成了*
>N 1 root Tue Jun 9 18:14 18/619 "nice to meet you"
N 2 root Tue Jun 9 18:18 29/762 "bashrc file content"
* 3 dj Tue Jun 9 18:19 52/2457 "myfile"
& 1 查看邮件内容,直接输入编号就行
Message 1:
From root@study.centos.vbird Tue Jun 9 18:14:01 2020
Return-Path: <root@study.centos.vbird>
X-Original-To: dj
Delivered-To: dj@study.centos.vbird
Date: Tue, 09 Jun 2020 18:14:00 +0800
To: dj@study.centos.vbird
Subject: nice to meet you
User-Agent: Heirloom mailx 12.5 7/5/10
Content-Type: text/plain; charset=us-ascii
From: root@study.centos.vbird (root)
Status: R
if you see this,it means i success. 真正的内容只有这句话
13.7 CentOS 7环境下大量创建账号的方法
13.7.1 一些账号相关的检查工具
pwck 可以用来检查输入是否正确,系统账号不需要有家目录,有时会报一些正常的错误
grpck 相对应的用户组检查
pwconv 将/etc/passwd中的账号和密码,移动到/etc/shadow中
pwunconv 将/etc/shadow中的账号和密码,移动到/etc/passwd中
chpasswd 读入未加密前的密码,加密后,将加密后的密码写入/etc/shadow中
echo "vbird3:abcdefg" | chpasswd
13.7.2 大量创建账号模板(适用passwd --stdin选项)
cat accountadd.sh
输出:
#!bin/bash
#Program:
# This shell script will create amount of Linux login accounts for you.
# 1.check the "accountadd.txt" file exist?you must create that file manually.
# one account name one line in the "accountadd.txt" file.
# 2.use openssl to create users password.
# 3.User must change his password in his first login.
#History:
#2020/06/09 dj First relese
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
# 0.userinput
usergroup=""
pwmech="openssl"
homeperm="no"
# 1.check the accountadd.txt file
action="${1}"
if [ ! -f accountadd.txt ] ; then
echo "There is no accountadd.txt file,stop here."
exit 1
fi
[ "${usergroup}" != "" ] && groupadd -r ${usergroup}
rm -f outputpw.txt
usernames=$(cat accountadd.txt)
for username in ${usernames}
do
case ${action} in
"create")
[ "${usergroup}" != "" ] && usegrp=" -G ${usergroup} " || usegrp=""
useradd ${usegroup} ${username}
[ "${pwmech}" == "openssl" ] && usepw=$(openssl rand -base64 6) || usepw=${username}
echo ${usepw} | passwd --stdin ${username}
chage -d 0 ${username}
echo "username=${username},password=${usepw}" >> outputpw.txt
;;
"delete")
echo "deleting ${username}"
userdel -r ${username}
;;
*)
echo "Usage:$0 [create|delete]"
;;
esac
done
首先要手动创建一个accountadd.txt文件:
cat accountadd.txt
输出:
std01
std02
std03
std04
std05