-
Notifications
You must be signed in to change notification settings - Fork 15
/
13、Linux 的账号管理和 ACL 权限设置
796 lines (449 loc) · 24.4 KB
/
13、Linux 的账号管理和 ACL 权限设置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
Linux 的文件属性里只记录了 UID(user id) 和 GID(group id)
系统通过查询 /etc/passwd 将 UID 和 GID 对应的 用户名 与 群组名 显示出来
/etc/passwd 和 /etc/shadow 的详细信息可以通过 man 5 passwd 和 man 5 shadow 获取
/etc/passwd 的文件结构
eg.
[passwd 文件第一行 root 相关信息]
root:x:0:0:root:/root:/bin/bash
第 1 栏:账号名称
第 2 栏:原密码位,现已保存至 /etc/shadow 中,此位使用 x 占位
第 3 栏:UID
UID 的分配
0 系统管理员 UID (也即 root 级别)
1 ~ 999 系统内部使用的 UID
* 1 ~ 200 系统发布者自行使用的 UID
* 201 ~ 999 使用者需要系统账号时可使用的 UID
1000 ~ 60000 一般使用者的 UID , Linux Kernel 3.10.x 中 UID 最多可以开启 2^32-1 个
第 4 栏:initial GID(账户登录时即获得该群组权限)
第 5 栏:账户说明
第 6 栏:账户主目录路径
第 7 栏:账户使用的 Shell
若想让某个账户不可以登录 shell ,可以修改这栏为 /sbin/nologin
当一个具有 /sbin/nologin 的账号登录 shell 时,系统会提示该账号不可用
可以创建 /etc/nologin.txt 来书写自定义的提示
/etc/shadow 的文件结构
eg.
[shadow 文件第一行 root 相关信息]
root:<BlahBlahBlah>::0:99999:7:::
第 1 栏:账号名称
第 2 栏:经过加密的密码,CentOS7 常用的加密手段是 SHA ,若该栏以感叹号 ! 开头,则该账户的密码是无效的,该账户也将被锁定
查询加密手段: authconfig --test | grep "hashing"
第 3 栏:最近一次密码修改的日期距离 1970 年 1 月 1 日 的天数
第 4 栏:密码在最近一次更改之后,在多少天之内不可再次更改密码
第 5 栏:密码在最近一次更改之后,在多少天之后必须重新设定密码
若不重新设定,则账号密码将会 变为过期特性
此时用户可以登录并取得 shell ,但登录后必须立刻修改密码才能继续使用
第 6 栏:密码在需要变更的几天前,系统会开始提醒用户变更密码
第 7 栏:在超过密码过期日几天之后,仍未做修改,此账号将变为无法登陆的状态
第 8 栏:账号在距离 1970 年 1 月 1 日 多少天后,将彻底失效,无法使用
第 9 栏:目前留用
/etc/group 的文件结构
[group 文件第一行 root 相关信息]
root:x:0:
第 1 栏:群组名称
第 2 栏:群组密码(很少使用),使用 x 占位
真实密码加密存储在 /etc/gshadow 文件中
第 3 栏:GID
第 4 栏:可加入这个群组的账户名
书写方法:冒号后紧跟账户名,账户名和账户名之间仅用逗号 , 隔开,不加空格
eg. root:x:0:eP,ep
注意,一个群组中可以包含多个账户,一个账户也可以加入多个群组
有效群组(effective group)和初始/主要群组(initial/primary group)
/etc/passwd 的第四栏中的 GID 对应的就是初始/主要群组,也即使用者登录系统就获取的群组
查看用户所在群组
groups [<UserName>]
返回值的第一个即为当前的有效群组
若不输入用户名,则返回当前用户所在的群组
有效群组即为当前用户在当下真实生效的群组
有效群组的切换/登录到一个新群组
newgrp [-] [<GroupName>]
- 重新创建新的环境变量,不指定的话就沿用当前的环境变量
这个命令的本质是创建一个新的 shell ,在这个 shell 中,用户具有指定的 group
能够切换的群组必须是用户已经加入群组
/etc/gshadow 的文件结构
[gshadow 文件第一行 root 相关信息]
root:::
第 1 栏:群组名称
第 2 栏:群组管理员密码,若为 ! 或为空时,则无群组管理员
第 3 栏:群组管理员账号
第 4 栏:群组包含的账户,与 /etc/group 中指定的相同
账户管理的相关命令
用户的新增
useradd [-u <UID>] [-g <初始/主要群组>] [-G <补充/次要群组>] [-m|M] [-c <说明>] [-d <主目录绝对路径>] [-s <使用的 shell>] <新账户名>
注意!在使用 useradd 添加用户之后,用户默认是被封锁的,因为还没有设定账户密码
-u, --uid<UID> 用户指定一个 UID
-g, --gid<GID或GroupName> 用户指定的初始/主要群组,这里可以使用 GID 或 群组名
-G, --groups<Group1>[,<Group2>...] 指定用户需要加入的补充/次要群组,可以使用 GID 或 群组名,多个群组之间用逗号隔开
-m, --create-home 为新用户创建目录(一般账号的默认动作)
-M 不为新用户创建目录(系统账号的默认动作)
-c, --comment<Comment> 用户的简短描述,目前标示为完整用户名
-d, --home<主目录绝对路径> 设置主目录的绝对路径
-s, --shell<SHELL> 设置该账户将启动的 shell 程序
-r 创建系统账户
-e, --expiredate<YYYY-MM-DD> 指定账户的过期日期
-f, --inactive<密码过期时间> 指定账户的密码过期天数,0 为立刻失效,-1 为永不失效
useradd 默认行为的参考文件
/etc/default/useradd
显示 useradd 的默认行为
useradd -D
-D, --defaults 查看默认行为
# 返回
GROUP=100
HOME=/home
INACTIVE=-1
EXPIRE=
SHELL=/bin/bash
SKEL=/etc/skel
CREATE_MAIL_SPOOL=yes
(1) GROUP 代表初始/主要群组的 GID 为 100,表示 users 这个群组
但这个设置在 CentOS 中已经失效了, CentOS 默认以用户名新建一个群组,且将用户的主目录权限设置为 700
(2) HOME 代表主目录的 基准目录(BASE DIR),将在这个目录之下新建一个以账户名为名称的目录,作为使用者的主目录
(3) INACTIVE 代表密码的过期天数, 0 为立刻失效, -1 为永不失效
(4) EXPIRE 代表账户过期日期
(5) SHELL 代表使用的 shell
(6) SKEL 代表创建主目录时,要从何处拷贝初始文件至主目录中(aka.skeleton)
(7) CREATE_MAIL_SPOOL 代表是否创建邮箱
创建账户时 UID/GID/权限 等默认行为的参考文件
/etc/login.defs
文件内容
MAIL_DIR /var/spool/mail
PASS_MAX_DAYS 99999
PASS_MIN_DAYS 0
PASS_MIN_LEN 5
PASS_WARN_AGE 7
UID_MIN 1000
UID_MAX 60000
SYS_UID_MIN 201
SYS_UID_MAX 999
GID_MIN 1000
GID_MAX 60000
SYS_GID_MIN 201
SYS_GID_MAX 999
CREATE_HOME yes
UMASK 077
USERGROUPS_ENAB yes
ENCRYPT_METHOD SHA512
(1) MAIL_DIR 邮箱所在目录
(2) PASS_{MAX,MIN}_DAYS 密码最长、最短使用天数,对应 /etc/shadow 的 第 5 栏 / 第 6 栏
(3) PASS_MIN_LEN 密码的最短长度,现已被 PAM 模块替代,本参数已失效
(4) PASS_WARN_AGE 过期前几天开始提醒,对应 /etc/shadow 的 第 6 栏
(5) {SYS}_{UID,GID}_{MIN,MAX} 系统预留的 UID、SYS_UID、GID 的最大最小值
在自动选取 UID GID 时,系统会搜索已经使用的 UID 和 GID,在其后加 1 ,若这个数没有超过 预留范围,则使用这个值作为 UID GID
(6) CREATE_HOME 是否创建主目录
(7) UMASK 主目录的 umask
(8) USERGROUPS_ENAB 若一个群组中不含任何一个用户,则删除这个群组;而创建新用户时,将创建一个同名的群组
(9) ENCRYPT_METHOD 密码加密手段
所以在新建一个账户的时候,系统至少会参考以下几个文件
/etc/default/useradd
/etc/login.defs
/etc/skel/*
设定或修改密码
passwd [-l|<u [-f]>] [-d] [--stdin] [-S] [-n <最少使用天数>] [-x <最多使用天数>] [-w <提前几天警告密码过期>] [-i <密码过期天数>]
--stdin 新密码来自 StdIn 或者 pipe
-l, --lock 为密码加锁,也就是为 /etc/shadow 的第 2 栏添加感叹号,此时账户就不可在本地端登录了
-u, --unlock 为密码解锁,也就是为 /etc/shadow 的第 2 蓝去除感叹号。
但若 /etc/shadow 的第 2 栏只有感叹号,则不会被去除
此时可以通过 -f, --force 来强制去除感叹号,以创建一个无密码的账户
-d, --delete 删除一个账户的密码,使之成为无密码账号
-n, --minimum 密码可使用的最小天数,在该天数之内密码不可修改
-x, --maximum 密码可使用的最大天数,在该天数之后密码必须修改
-w, --warning 提前几天提示用户密码必须修改
-i, --inactive 密码最终过期日,过了这个时间密码就完全过期,账户也应被关闭
-S, --status 罗列指定账户的密码信息
注意在 root 的权限下,密码的修改不需要输入旧密码,而且会无视 PAM 模块对密码强度的限制
在非 root 的权限下,密码修改需要输入旧密码,也必须通过 PAM 模块对密码强度的限制
eg.
passwd -S eP
# 返回
eP PS 1969-12-31 0 99999 7 -1 (Password set, SHA512 crypt.)
上述内容对应
账户名 密码可用状态 最近修改日期 最短使用天数 最长使用天数 提前几天提醒 密码过期天数 (密码设定状态, 加密方式.)
密码可用状态 PS 可用 LK 锁定
密码的详细参数读取与修改
chage [-ldEImMW] <账户名>
(aka. change age)
-l, --list 显示账号的各种天数信息
-d, --lastday <YYYY-MM-DD或天数> 设置上一次密码修改的日期,或者距离 1970.1.1 的天数
设置为 0 则强制要求在下次登录时修改密码
-E, --expiredate <YYYY-MM-DD或天数> 设置密码的最终过期日期,或者距离 1970.1.1 的天数
设置为 -1 则永不过期
-I, --inactive <锁定天数> 设置密码的在最长使用天数后的几天还未修改时,将锁定账号
-m, --mindays <最小使用天数> 密码在修改后,几天之内不可再次被修改
-M, --maxdays <最大使用天数> 密码在修改之后,几天之前必须被修改
-W, --warndays <提前提醒日期> 在密码必须被修改之前的几天提醒用户修改密码
修改用户账户的属性
usermod [-cefgls] [-d[m]] [-G[a]] [-u[o]] [-L|U] <账户名>
-c, --comment <comment> 账户的简单备注,现被当做用户全名来使用
-e, --expiredate <YYYY-MM-DD> 设置账户何时不在可以使用,若后面不跟任何时间,则取消账户失效时间设定
-f, --inactive <延期天数> 在密码到期后,还有多少天可以来修改密码,若不修改,则冻结账号
-g, --gid <GID或群组名> 指定账户的初始/主要群组,主目录下的群组将会自动修改,其他地方的群组需要手动修复
-l, --login <新用户名> 仅修改 用户名,而不会修改主目录名
-s, --shell <shell> 指定用户登录后使用的 shell,若不指定路径则使用系统默认定义的 shell
-d, --home <主目录绝对路径> 将现有的主目录路径修改至指定路径
若用户不存在主目录路径,则不会新建主目录路径
使用 -m, --move-home 将主目录内的文件移动至新主目录下
-G, --groups <Group1>[,<Group2>...] 为用户指定补充群组,可指定 GID 或 群组名
可使用 -a, --append 将指定命令变为增添命令
-u, --uid <UID> 指定新的 UID,系统会自动修改 主目录 和 邮箱 的 UID,其他文件的 UID 需自行修复
一般来说 UID 必须唯一,但可以使用 -o, --non-unique 使多个账号名指向同一个 UID
这个操作不会参考 /etc/login.defs 的 {SYS}_UID_{MIN,MAX} 设置
删除账户
userdel [-r] <账户名>
-r, --remove 连同用户的主目录和邮件目录一同删除
id [-gGu] [-n] [-r] [<userName>/<UID>]
-g, --group 仅显示用户的有效群组 ID
-G, --groups 显示用户所在所有群组的 ID
-u, --user 仅显示有效用户(比如 su root 之后,有效用户就是 root)
-n, --name 输出名字,而非号码
-r, --real 显示账户初始的/首要的/本来的 UID 或 GID
群组的设置
群组的增加
groupadd [-g[o] <GID>] [-r] <新群组名>
-g, --gid <GID> 设置新群组的 GID,
一般 GID 必须唯一,若要将新群组指定为以前有的 GID ,可以使用 -o, -non-unique 来强制指定
-r, --system 将新群组设置为系统群组
群组的修改
groupmod [-g[o] <GID>] [-n <新群组名>] <原群组名>
-g, --gid <GID> 设置新 GID,以该群组为 主要群组 的用户的 GID 将会自动跟新,其他用户则不会
可以使用 -o, --non-unique 将不同群组名指向同一个 GID
该设置不会参考 /etc/logins.defs 的设置
-n, --new-name <新群组名> 指定新的群组名
群组的删除
groupdel <群组名>
注意删除群组前,先确定该群组不是任何一个用户的 主要群组,否则该群组就无法删除
群组管理员
# root 账户的设置项目
gpasswd <群组名>
gpasswd [-A user1,user2...] [-M user3,user4...] <群组名>
gpasswd [-rR] <群组名>
若没有任何参数代表设置群组管理员密码
-A, --administrators 设置群组管理员,一个群组可以有多个管理员
-M, --member 设置群组成员
-r, --remove-password 删除群组密码,仅有群组成员可以使用 newgrp 命令切换至该群组(默认状态)
-R, --restrict 限制状态,只有具有群组密码的群组成员可以使用 newgrp 命令切换至该群组
# 群组管理员账户的设置项目
gpasswd [-ad] <user> <群组名>
-a, --add 将指定用户添加至群组中
-d, --delete 将指定用户从群组中删除
ACL 详细的权限规划
ACL 既 Access Control List
ACL 可以针对 单一用户 单一文件/目录 进行 rwx 权限设置
ACL 可以设置的权限类型
1、针对使用者的权限设置
2、针对群组的权限设置
3、针对新建文件/目录时的预设权限设置
一般当前的 Linux 系统都会加载 ACL
可以使用以下命令查看当前文件系统对 ACL 的支持情况
dmesg | grep -i "acl"
ACL 基础概念
(1) 每个文件的 ACL 都有一系列 Access Entry 组成
(2) 每个 Access Entry(ACL 条目) 被表示为以下形式:
<Entry tag type>:[qualifier]:<permission>
(2.1) Entry tag 可以包含的内容:
ACL_USER_OBJ 代表该行定义 文件所有者 的权限(被写作 user 或 u)
ACL_USER 代表该行定义 指定用户 的权限(被写作 user 或 u)
ACL_GROUP_OBJ 代表该行指定 文件群组 的权限(被写作 group 或 g)
ACL_GROUP 代表该行指定 指定群组 的权限(被写作 group 或 g)
ACL_MASK 代表 ACL_{USER, GROUP_OBJ, GROUP} 能获取的最大权限(被写作 mask 或 m)
ACL_OTHER 代表 未出现 在该文件的 任何 Access Entry 的 用户 或 群组 的权限(被写作 other 或 o)
# 在权限检查的时候
# Effective UID 会用于 ACL_{USER_OBJ, USER} 条目的判定
# Effective GID 和 Supplementary GID 会用户 ACL_{GROUP_OBJ, GROUP} 的检查
(2.2) qualifier 只有 ACL_{USER, GROUP} 才能在此处添加内容
指定非文件 拥有者 或 群组 的 用户 或 群组
(2.3) permission 定义该条目定义的 用户 或 群组 具有的权限(rwx)
ACL 的设定与查看
ACL 的设定
setfacl [-bkRd] [[-m|x] <Access 条目>] [[-M|X] <ACL 参数文件>] <file1> <file2> ...
-m, --modify 为 文件/目录 设置指定的 ACL 条目
-M, --modify-file 为 文件/目录 设置指定的 ACL 条目, ACL 条目来自指定文件的内容,或者 getfacl 的输出(管道输入)
-x, --remove 为 文件/目录 移除指定的 ACL 条目
-X, --remove-file 为 文件/目录 移除指定的 ACL 条目, ACL 条目来自指定文件的内容,或者 getfacl 的输出(管道输入)
-b, --remove-all 移除所有的 ACL 条目,但基础的 所有者、群组、其他 权限都保留
-k, --remove-default 移除所有的 默认 ACL 条目,若不含有 默认 ACL 条目,则提出警告
--restore=<ACL 备份文件> 从备份文件中复原文件 ACL 条目
若命令中有 所有者 和 群组 设置,则复原参数指定的设置
若有 SUID SGID SBIT 设置,则复原参数指定的设置
--test 只输出可能的最终结果,而不真是改变文件属性状态
-R, --recurisive 遍历所有子目录和子文件
-d, --default 修改 默认 ACL 条目。该条目只对目录有效,在此目录建立的文件默认都将继承该目录的 默认 ACL 条目
# 在设置 默认 ACL 条目的时候,可以在 ACL 条目前加上 d: 或 default: 来指定
eg.
setfacl u:user1:rw ./testfile
setfacl g:group1:rx ./testfile
setfacl d:u:user1:rw ./testdir
注意!设置了 ACL 权限之后, ls -l 命令会在设置了 ACL 权限的权限后加上一个加号 + ,此时文件的记录的实际权限和显示的权限不相同
ACL 的查看
getfacl <文件>
将会按照一条 Access Entry 一行的形式返回 文件 ACL 内容
su 切换使用者(substitude user)
su [-l|m] [-c "<命令>"] [用户名]
-, -l, --login 使用 login-shell 的方式切换用户
此动作包含 <1> 清除除 TERM 之外所有的环境变量
<2> 初始化环境变量 HOME, SHELL, USER, LOGNAME, PATH
<3> 进入目标用户的主目录
<4> 将 arg[0] 设置为 - 来模拟 login-shell 的状态
-m, -p, --preserve-environment 使用 non-login-shell 的方式切换用户:保持所有的环境变量
-c "<cmmand>", --command="<command>" 将 <command> 传入新的 shell,注意引号的使用
sudo 使用其他用户来执行命令
sudo [-b] [-u <{username, \#UID}>] <需执行的命令>
-b 在后台执行这条命令
-u 切换至的使用者,默认切换至 root ,可以指定 用户名 或 \#UID
一个账户是否可以执行 sudo,需要查看 /etc/sudoers 来决定
visudo 专门用于修改 /etc/sudoers 文件的 vim 编辑器
直接执行 visudo 即修改 /etc/sudoers 文件
注意!修改 /etc/sudoers 之后,需要重新登录使之起效
/etc/sudoers 记录了 sudo 的各种规范事项,在用户设定区,以以下的方式表示
root ALL=(ALL) ALL
分别代表
使用者账户 登陆者来源的主机名=(可以被切换至的身份) 可以下达的命令
1、若 使用者账户 以百分号 % 开头,则表示群组名
%wheel ALL=(ALL) ALL
2、免除密码输入
%wheel ALL=(ALL) NOPASSWD: ALL
3、限制可切换至的账户
myuser1 ALL=(root) ALL
4、限制可执行的命令(必须使用绝对路径)
myuser1 ALL=(ALL) /usr/bin/passwd
5、限制传入参数(感叹号 ! 表示不可执行的命令,多个命令条目用逗号 , 隔开,支持 EBNF 匹配)
myuser1 ALL=(ALL) /usr/bin/passwd [A-Za-z]+, !/usr/bin/passwd root
6、/etc/sudoers 的别名设置
sudoers 可设置四类别名,分别为 User_Alias, Runas_Alias, Host_Alias, Cmnd_Alias
语法
<别名种类> <别名> = <原名1>[, <原名2>, <原名3> ...]
7、修改 sudo 需要密码的时间间隔
修改 Defaults env_reset 为
Defaults env_reset,timestamp_timeout=<所需分钟数>
# 支持小数
PAM 模块
Pluggable Authentication Modules 可嵌入认证模块
统一的认证机制,提供 API 给任何程序以认证账户
PAM 是一系列模块的合称,其中有不同的模块负责不同的工作
PAM 与 其他程序的互动流程
以 passwd 为例
1、用户调用 passwd 程序,并输入密码
2、passwd 调用 PAM 模块进行验证
3、PAM 搜寻 /etc/pam.d/ 下与 passwd 同名的设置文件
4、依据 /etc/pam.d/passwd 的内容,调用相关的模块进行验证分析
5、将验证结果传回 passwd
6、passwd 依据返回结果执行操作(eg. 通过验证/要求重新输入密码)
/etc/pam.d/ 下的文件内容
以 /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 模块与模块的参数
第 1 栏位:验证类型(Type)
(1) auth
认证,根据选定的验证机制,验证使用者身份
(2) account
授权,根据系统设定,给予使用者相应权限
(3) session
会话,处理使用者登录后使用前/使用后登出前,需要处理的事项
(4) password
密码,修改认证使用的 token
第 2 栏位:控制标准(Control)
(1) required
验证成功,则返回 success;验证失败,则返回 failure;无论成功失败,都继续执行后续操作
(2) requisite
验证成功,则返回 success,并执行后续操作;验证失败,则返回 failure,并立刻结束当前验证流程
(3) sufficient
当前验证成功,且前序 required 未出现 failure,则返回 success,并立刻结束当前验证流程;验证失败,则忽视该行,进行下方的验证
(4) optional
大多用户显示信息
(5) include
将指定的 验证文件 在 主验证 中逐条执行,若 验证文件 出现了 立刻结束当前验证流程 的状态,则结束整个验证
(6) substack
将指定的 验证文件 作为 子验证 执行,若 验证文件 出现了 立刻结束当前验证流程 的状态,则结束 子验证,并将结果返回至主验证中
常用的 PAM 模块 存放的位置及作用
所有 PAM 模块均存储在 /lib64/security/ 目录下
pam_securetty.so
root 用户 只能从被认为 安全的 终端登录。安全终端的列表存储在 /etc/securetty 文件里
pam_nologin.so
该模块限制非 root 用户的登录,若 /etc/nologin 或 /var/run/nologin 存在,当非 root 用户登录时,显示 nologin 文件内容,并阻止用户登录
pam_selinux.so
设置默认的 SELinux 行为
pam_console.so
设置物理终端的是否可以取得相应的权限
pam_loginuid.so
将使用者的 UID 赋予启动的进程
pam_env.so
设定/释放 环境变量,默认使用的设置文件为 /etc/security/pam_env.conf
pam_unix.so
早期 密码验证机制
pam_pwquality.so
密码质量检测,默认使用的设置文件为 /etc/security/pwquality.conf
pam_limits.so
系统最大用量设置,设置文件为 /etc/security/limits.conf
login 程序的 PAM 验证流程
1、验证阶段
<1> 调用 pam_securetty.so ,若用户为 root ,参考 /etc/securetty 的设置
<2> 调用 pam_env.so 设置环境变量
<3> 调用 pam_unix.so 验证密码
<3.1> 若成功则返回 login 程序
<3.2> 若不成功则通过 pam_succeed_if.so 验证 UID 是否大于 1000
<3.2.1> 若 UID 小于 1000 则返回失败
<3.2.2> 若 UID 大于 1000 则条用 pam_deny.so 拒绝连线
2、授权阶段
<1> 调用 pam_nologin.so 判断 /etc/nologin 是否存在,若存在则阻止 非 root 用户登录
<2> 调用 pam_unix.so 和 pam_localuser.so 进行账号管理
<3> 调用 pam_succeed_of.so 判断 UID 是否小于 1000 ,小于 1000 则不记录登录信息
<4> 调用 pam_permit.so 允许账号登录
3、密码阶段
<1> 调用 pam_pwquality.so 设定密码只能尝试 3 次
<2> 调用 pam_unix.so 通过 sha256、shadow 等功能进行密码校验
<2.1> 若通过则返回 login 程序
<2.2> 若不通过则调用 pam_deny.so 拒绝登录
4、会话阶段
<1> 调用 pam_selinux.so 暂时关闭 SELinux
<2> 通过 pam_limits.so 设置好使用者的可以使用的系统资源
<3> 登录成功后记录相关信息在登录文件中
<4> 调用 pam_loginuid.so 设置不同 UID 的不同权限
<5> 调用 pam_selinux.so 重启 SELinux
/etc/security/limits.conf 系统级别的用户资源分配配置
eg.
# {用户, @群组}名 限制强度 限制项目 限制值
该设置文件会反映在 ulimit -a 上
/var/log/secure
/var/log/messages
存储 PAM 错误的地方,可以用于debug
w, who, last, lastlog 查询使用者
w 命令返回的内容
eg.
17:19:54 up 20 min, 1 user, load average: 0.00, 0.04, 0.10
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
eP pts/0 192.168.0.176 17:03 2.00s 0.21s 0.00s w
17:19:54 当前时间
up 20 min 启动后运行时间
1 user 当前登录总用户数
load average: 0.00, 0.04, 0.10 CPU平均负载 1分钟 5分钟 15分钟
USER 用户名
TTY 登录设备
FROM 登录位置
LOGIN@ 登录时间
IDLE 空闲时间
JCPU 用户占用CPU时钟
PCPU 当前进程占用CPU时钟
WHAT 当前进程
who 命令返回内容
root pts/0 2016-09-12 17:24 (192.168.0.176)
root 当前用户名
pts/0 登录设备
2016-09-12 17:24 (192.168.0.176) 登录时间及位置
write, mesg, wall 与当前登录的用户对话
write <用户账号> [用户所在的终端设备]
write 使用 EOF 作为传送命令的结束标志
mesg 是否接受 write 发来的消息
mesg [y/n]
wall 广播信息
wall ["<消息内容>"]
mail 使用者之间的邮件通信
mail <someone>[@<somehost>]
账号的检测
pwck 检查 /etc/passwd 的内容是否与主目录匹配。是否与 /etc/shadow 中的匹配
grpck 类似 pwck 检测群组问题
pwconv 将 /etc/passwd 中的密码转移至 /etc/shadow 中
pwuconv pwconv 的逆向操作