【Linux命令】《鸟哥Linux基础》第十三章 Linux账号管理与ACL权限设置

第十三章 Linux账号管理与ACL权限设置

13.1 Linux的账号与用户组

13.1.1 用户标识符:UID与GID

人一般容易记忆账号,但是Linux主机只认识ID,账号与ID的对应关系写在/etc/passwd中。

每个登录的用户都至少会获取两个ID:用户ID(UID)、用户组ID(GID)。
文件通过UIDGID判别它的拥有者和用户组。要求显示文件属性时,系统根据/etc/passwd/etc/group的内容找到UIDGID对应的账号与组名,显示出来。

重要内容:

/etc/passwd文件以冒号分隔开,共分7个字段,分别是【账号名称、密码、UID、GID、全名、家目录、shell】;

/etc/group文件以冒号为分隔符,共分9个字段,分别是【账号名称、加密密码、密码修改日期、密码最小可变动日期、密码最大需变动日期、密码过期前警告日数、密码失效天数、账号失效日、保留未使用】。

13.1.2 用户账号

Linux系统上的用户如果需要登录主机以获取shell的环境来工作,首先要用tty1-tty6的终端共的登录接口,并输入账号与密码后才能登录。

如果是通过网络登录以获取shell环境,那么就要用到ssh这个功能。

输入账号和密码后,系统做了如下工作:

  1. 查找/etc/passwd里面是否有你输入的账号?如果没有就退出;如果有,将账号对应的UID和GID读取出来,另外,该账号的家目录和shell设置一并读出
  2. 核对密码表。Linux会进入/etc/shadow里找出对应的账号与UID,然后核对密码是否正确
  3. 如果一切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建立用户账号时,
至少会参考:

  1. /etc/default/useradd
  2. /etc/login.defs
  3. /etc/skel/*

至少会修改:

  1. 用户账号与密码:/etc/passwd 、/etc/shadow
  2. 用户用户组:/etc/group、/etc/gshadow
  3. 用户家目录:/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的权限设置,对于需要特殊权限的使用状况很有用。

主要应用:

  1. 用户(user):可以针对用户来设置权限
  2. 用户组(group):针对用户组为对象来设置其权限
  3. 默认属性(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命令后:

  1. 用户开始执行/usr/bin/passwd这个程序,并输入密码
  2. passwd调用PAM模块进行验证
  3. PAM模块会到/etc/pam.d/找寻与程序passwd同名的配置文件
  4. 根据/etc/pam.d/passwd内的设置,引用相关的PAM模块逐步进行验证分析
  5. 将验证结果(成功or失败or其他信息)返回个passwd这个程序
  6. 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.soSELinux是针对程序来进行详细管理权限的功能,先利用PAM模块将其暂时关闭,验证通过后再开启
pam_console.so系统出问题或者需要使用特殊的终端接口(如RS232之类的终端设备)登录主机时用的
pam_loginuid.so验证用户的UID是否是所需要的数值,一般账号UID应大于1000
pam_env.so设置额外环境变量的一个模块
pam_unix.so很复杂很重要的模块,可以用在验证阶段的认证功能、授权阶段的账号许可证管理、会话阶段的日志文件记录、密码更新阶段的检验
pam_pwquality.so检验密码强度,看密码是否在字典中、密码输入几次都失败就断掉此次连接等
pam_limits.soulimit的功能

登录系统所需要的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

登录流程:

  1. 验证阶段(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拒绝连接。
  2. 授权阶段(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允许该账号登录。
  3. 密码阶段(password):(a)以pam_pwquality.so设置密码仅能尝试3次;(b)以pam_unix.so通过sha512、shadow等功能进行密码检验,若通过返回login程序;若不通过(c)以pam_deny.so拒绝登录。
  4. 会话阶段(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
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值