Notes of Basic Linux Part-4 User Management
see also jlevy/the-art-of-command-line (multi-language)
Organised 2017 March.
Notes from 2012 April.
多年前(2012)写的“鸟哥的 Linux 私房菜”学习笔记。- Chapters 14 & 17 -ing
原网站: 繁体 linux.vbird.org or 简体 cn.linux.vbird.org 。
第十四章、Linux 账号管理与 ACL 权限配置 #
Linux 的账号与群组 #
使用者标识符: UID 与 GID #
UID是0时,代表这个账号是『系统管理员』! 所以当你要让其他的账号名称也具有 root 的权限时,将该账号的 UID 改为 0 即可。
1~499 (系统账号).除了 0 之外,其他的 UID 权限与特性并没有不一样。默认 500 以下的数字让给系统作为保留账号只是一个习惯。
我们希望启动的服务使用较小的权限去运行,所以这些系统账号通常是不可登陆的, 所以才会有 /bin/false ; /usr/sbin/nologin. 比如用来作为pop邮件使用者的shell
1~99:由 distributions 自行创建的系统账号.
100~499:若用户有系统账号需求时,可以使用的账号 UID。
500~65535 (可登陆账号). linux 核心 (2.6.x 版)已经可以支持到 4294967295 (2^32-1).
使用者账号:/etc/passwd 文件结构, /etc/shadow 文件结构 #
/etc/passwd 第5部分,见finger: chfn
/etc/shadow
userName:pass:
lastChange:minAvailable:maxAvailable:
alertBeforeOutOfDate:extentionAfterOutOfDate:
accountExpireDate:reserved
忘记root密码:
*重新启动进入单人维护模式, 自动获得root权限
*LiveCD 中挂载 / , 手动修改 shadow
关于群组: /etc/group 文件结构, 有效与初始群组, groups, newgrp, /etc/gshadow #
有效群组(effective group)与初始群组(initial group);
通常有效群组的作用是在新建文件.
newgrp: 有效群组的切换. OBS:此命令会进入新的bash
账号管理 #
adduser (suggested, interactive), useradd (ZZZ traditional), passwd, chage, usermod, userdel #
suggested: adduser
adduser userName (will be ased for fullname, passwords etc.)
[useradd deprecated!]
useradd [-u UID] [-g 初始群组] [-G 次要群组] [-m(普通用户默认)M(root默认)] [-c 说明栏] [-d /home/solo] [-s /bin/bash] 使用者账号名
-d:指定家目录。务必使用绝对路径!
-r:创建一个系统的账号,这个账号的 UID 会有限制 (参考 /etc/login.defs)
-e:Expire date
useradd -D
可以修改 /etc/default/useradd 内容来修改默认shell, 默认home, 默认参考目录等.
SKEL=/etc/skel, 创建用户时候的参考(复制)
userdel [-r(delete the home)] userName
chsh: CHange SHell
chfn: CHange FiNger
id userName
Ex:强制第一次登录修改密码
useradd agetest
echo "agetest" | passwd --stdin agetest #not all distributions support '--stdin'
chage -d 0 agetest
usermod -aG sudo userName # modify a user, add to the group sudo (sudoers)
用户功能:finger, chfn, chsh, id #
groupadd, groupmod, groupdel, gpasswd #
账号管理实例 #
主机的细部权限规划:ACL 的使用 #
什么是 ACL #
Access Control List
如何启动 ACL #
[root@www ~]# vi /etc/fstab
LABEL=/1 / ext3 defaults,acl 1 1
#need reboot or remount
[root@www ~]# mount
/dev/hda2 on / type ext3 (rw,acl) #测试结果:成功
setfacl, getfacl #
setfacl -m u:solo:rx fileName
set File acl, Modify, User, with permission: Read and eXecute.
setfacl -m d:u:solo:6 dirName
set File acl, Modify, Default with inherit, User, with permission: 6.
setfacl -b
remove all the extented acl control information
使用者身份切换 Switch-User #
su #
注意: 发行版的命令参数有不同
例如, 'su' vs. 'su -' vs. 'su -l'
sudo: sudo 命令, visudo (/etc/sudoers) ( 账号, 群组, 限制命令, 别名, 时间间隔, 配合 su ) #
sudo [-u solo] sh -c "echo 'hello' > index.html"
注意,我们无法使用『 su - sshd 』去切换系统账号 (因为系统账号的 shell 是 /sbin/nologin), 这个时候 sudo 真是他 X 的好用了!
visudo
使用 visudo 修改 sudoers, 在结束离开修改画面时,系统会去检验 /etc/sudoers 的语法。
format: 账号/%组 登陆来源主机名=(允许的目标身份) 允许的命令的*绝对路径*
eg:
vbird1 ALL=(ALL) ALL
%groupName ALL=(ALL) NOPASSWD:ALL # 不需要密码.#不过如果使用了公钥登录, 还是让输入密码做保险吧
myuser1 ALL=(root) !/usr/bin/passwd, /usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd root
可以运行『 passwd 任意字符』,但是『 passwd 』与『 passwd root 』这两个命令例外!
可以具有 root 的能力帮助你修改其他用户的口令, 而且也不能随意改变 root 的口令!很有用处的!
常用case:
User_Alias ADMINS = pro1, pro2, pro3, myuser1
ADMINS ALL=(root) /bin/su -
特殊的 shell; PAM 等 #
特殊的 shell :/sbin/nologin, nologin.txt #
/etc/nologin.txt #useful for real users with effective passwords who are not allowed to log in.
PAM 简介(Pluggable Authentication Modules, 嵌入式模块) #
PAM 配置:验证类别(type)、控制标准(flag)、模块与参数 #
eg:anm-server(/etc/pam.d/common-password)
password sufficient pam_ldap.so
password required pam_unix.so nullok obscure min=4 max=8 md5
验证类别 控制标准 PAM模块与该模块的参数
types:
authentication; account(authorization); session; password.
flags:
required; requisit(必要); sufficient(充分); optional.
常用模块简介: secure-tty, nologin, pam_cracklib, login 流程 #
pam_securetty.so:root 只能够从安全的 (secure) 终端机登陆 # 见文件 /etc/securetty
pam_nologin.so: 若/etc/nologin存在,所有一般使用者无法登陆,终端机会将该文件的内容显示出来!对root以及已登陆账号没有影响。
pam_selinux.so: 由于 SELinux 会影响到用户运行程序的权限,因此我们利用 PAM 模块,将 SELinux 暂时关闭,等到验证通过后, 再予以启动!
pam_console.so: for 特殊的终端接口 (例如 RS232 ), 帮助处理一些文件权限的问题.
pam_loginuid.so: 一般账号 UID 均大于 500 才合理.
pam_env.so: 如果你有需要额外的环境变量配置,可以参考 /etc/security/pam_env.conf
pam_unix.so: 复杂且重要, 常丰富的功能! 这个模块在早期使用得相当频繁喔!
pam_cracklib.so: 来检验口令的强度, 多次尝试失败断线.很重要!
login 的 PAM 验证机制流程: http://bit.ly/linuxPamProcess
其他相关文件: limits.conf, #
limits.conf # 也可以用 ulimit 在 ~/.bashrc中配置
/var/log/secure, /var/log/messages
主机上的用户信息传递 #
有谁: w, who, last, lastlog #
对谈: write, mesg, wall #
write vbird1 pts/2
mesg n #拒收消息
mesg y
wall "I will shutdown my linux server..."
信箱: mail #
手动新增使用者 #
工具:pwck, grpck; pwconv, grpconv; pwunconv, chpasswd #
PassWord ChecK: 检查 /etc/passwd,比对 /etc/passwd /etc/shadow 的信息是否一致
GRouP ChecK.
PassWord Convert: 『将 /etc/passwd 内的账号与口令,移动到 /etc/shadow 当中!』.
若 /etc/passwd 内存在的账号并没有对应的 /etc/shadow 口令时,则 pwconv 会去 /etc/login.defs 取用相关的口令数据,并创建该账号的 /etc/shadow 数据;
若 /etc/passwd 内存在加密后的口令数据时,则 pwconv 会将该口令栏移动到 /etc/shadow 内,并将原本的 /etc/passwd 内相对应的口令栏变成 x .
pwunconv: 『将 /etc/shadow 内的口令栏数据写回 /etc/passwd 当中, 并且删除 /etc/shadow 文件。』
chpasswd: 『读入未加密前的口令,并且经过加密后, 将加密后的口令写入 /etc/shadow 当中。』
echo "solo:abcdefg" | chpasswd -m # 默认DES,-m: MD5. # 即使paswd未提供 --stdin 选项, 也可以用此命令批量修改密码
特殊账号,如纯数字账号的手工创建 #
大量建置账号模板(适用 passwd –stdin 选项) #
大量建置账号的范例(适用于连续数字,如学号) #
重点回顾 9. 本章习题 10. 参考数据与延伸阅读 #
11. 针对本文的建议:http://phorum.vbird.org/viewtopic.php?t=23887
== 第十四章end ==
第十七章、程序管理与 SELinux 初探 #
什么是程序 (Process) #
在 Linux 系统当中:『触发任何一个事件时,系统都会将他定义成为一个程序,并且给予这个程序一个 ID ,称为 PID,同时依据启发这个程序的使用者与相关属性关系,给予这个 PID 一组有效的权限配置。』
程序与程序 (process & program): 子程序与父程序, fork-and-exec, 系统服务 #
Linux 的多人多工环境 #
其实在 Linux 底下运行一个命令时,系统会将相关的权限、属性、程序码与数据等均加载内存, 并给予这个单元一个程序识别码 (PID),最终该命令可以进行的任务则与这个 PID 的权限有关。
工作管理 (job control) #
什么是工作管理 #
我们无法以 job control 的方式由 tty1 的环境去管理 tty2 的 bash !即使root也不能这样管理别人的job.
假设我们只有一个终端,因此, 出现提示字节让你操作的环境就称为前景(foreground),其他工作可以放入背景(background)去暂停或运行。
在背景里面的工作状态又可以分为『暂停 (stop)』与『运行中 (running)』。
注意,背景工作想要运行时,不能够与使用者互动(不能等待terminal的input)。例:vim 不能在背景里运行(running),因为没有输入数据他就不会跑啊!
背景工作是不可以使用 [ctrl]+c 来终止的』,可使用 bg/fg 呼叫该工作.
job control 的管理:&, [ctrl]-z, jobs, fg, bg, kill #
perl phase1_server.pl >output.txt 2>&1 &
find / -print ; <C-z> ; 输出为: [2]+ Stopped find / -print
* +: 最近一个被丢进背景的工作,且默认会被fg取用.
* -: 倒数第二个被丢进bg的工作.
* Stopped: 目前这个工作的状态。//默认的情况下,<C-z>的工作都是『暂停(stop)』的状态喔!
fg %jobNumber ; or: fg jobNumber
kill -l #list all available signals
eg. 2 == <C-c>(interupt), 9 == SIGKILL(KILL), 15 == SIGTERM(terminate)
kill %3 #kill a bash job
离线管理问题: nohup #
nohup perl phase1_server.pl & # output is redirected to 'nohup.out' file.
程序管理与系统监视 #
程序的观察: ps (ps -l, ps aux, zombie), top, pstree #
ps aux; ps -lA; ps axj.
选项:
-A:All.与-e具有同样的效用;
-a:All.但是不与terminal相关
-u:有效使用者 (effective user) 相关的 process ;
x:通常与 a 这个参数一起使用,可列出较完整资讯。
规定输出格式:
l:Long:较长、较详细
j:Jobs format工作的格式
-f:做一个更为完整的输出。程序树 //Father
-l格式化的输出:
F: Flag
1:此子程序仅进行复制(fork)而没有实际运行(exec)。
4:此程序的权限为 root ;
S:STAT
R:Running.
S:Sleeping:正在睡眠(idle),但可以被唤醒(signal)。
D:Dying.睡眠, 不可被唤醒,通常这支程序可能在等待 I/O 的情况(ex>列印)
T:sTop:可能是在工作控制(背景暂停)或除错(traced)状态;
Z:Zombie:僵尸状态,程序已经终止但却无法被移除至内存外。
PPID: Parent PID.
C: Cpu usage, in percent.
PRI/NI:PRIority/NIce. 数值越小优先级越高。
u格式化的输出:
%MEM:该 process 所占用的实体内存百分比;
VSZ :该 process 使用掉的虚拟内存量 (Kbytes)
RSS :占用的固定的内存量 (Kbytes)
TTY :是在那个终端机上面运行
? :与终端机无关
tty:本地登陆者程序
pts:(Pseudo Terminal master and Slave)表示远程登录的。
STAT:该程序目前的状态,状态显示与 'ps -l' 的 S 旗标相同 (R/S/T/Z)
START:被触发启动的时间;
TIME :实际使用CPU运行时间。
COMMAND:实际命令
top [-d 数字] | top [-bnp]
选项:
-d:Display frequency, 后面可以接秒数,就是整个程序画面升级的秒数。默认是 5 秒;
-b:Batch, 以批量的方式运行 top ,还有更多的参数可以使用喔!通常会搭配数据流重导向来将批量的结果输出成为文件。
-n:Number,与 -b 搭配: 需要进行 top 输出的次数。
-p:Pid, 指定某些个PID
运行中的按键命令: #选项也都可以作为按键命令
?: help menu.
O/F:Order by Field.
P:Percent of cpu资源 排序;
M:Memory资源排序;
N:PID排序;
T:Time+ : CPU 时间累积 (TIME+) 排序。
k:给予某个 PID 一个讯号 (signal)
r:Renice pid priority.
q:Quit.
第1行:load average 不应该高于内核数量。
第2行:注意zobie应该为0.
第3行: // man top: line 361 2c.CPU states
‘1’切换整体和多核分别显示,
us: USer time, time spent running non-kernel code.
sy: SYstem time. kernel code.
ni: NIced, running user's processes that have been niced.
hi: Hardware Irq.
si: Software Irq.
id: IDle. Prior to (before) Linux 2.5.41, this includes IO-wait time.
wa: WAiting i/o. Prior to Linux 2.5.41, included in idle.
st: STolen from this virtual machine. Prior to Linux 2.6.11, unknown.
第6行:top命令行。
pstree [-A|U] [-up]
-A:以ASCII连接;
-U:以UTF连接。在某些终端介面下可能会有错误
-p:同时列出Pid;
-u:同时列出所属User。
程序的管理: signal, kill, killall #
signal(常用的信号):
1:SIGHUP:启动被终止的程序,可让该 PID 重新读取自己的配置档,类似重新启动
9:SIGKILL:强制中断
15:SIGTERM:正的结束。如果程序已经发生问题(无法使用正常方法终止),这个signal也是没用的。
kill -signalName PID | kill -signalName %jobNumber
killall [-iIe] [commandName]
-i:Interactive, 若需要删除,提示使用者;
-I:Insensitive, 命令名(含参数)忽略大小写。
-e:Exact,『后面接的 command name 要一致』
commandName:不能超过 15 个字节。
eg1:强制终止所有以 httpd 启动的程序
[root@www ~]# killall -9 httpd
eg2:
[root@www ~]# killall -i -9 bash
Kill bash(16905) ? (y/N) n <==这个不杀!
Kill bash(17351) ? (y/N) y <==这个杀掉!
关於程序的运行顺序: priority, nice, renice #
priority:
PRI值由核心动态调整, 使用者无法直接调整;
PRI(new) = PRI(old) + nice, 最终PRI要由系统分析后决定。
nice 值可调整的范围为-20~19(root);一般使用者0 ~ 19.
新程序的nice值:nice
调整已存在的PID的nice值:renice
子程序会继承nice值。
nice [-n 数字] commandName.
renice [number] PID.
系统静态基本信息: #
hostnamectl
uname -a == cat /proc/version
gcc --version
网络网卡静态基本信息 #
lspci | grep -i net
系统资源的观察: free, uname, uptime, netstat, dmesg, vmstat #
free [-b|-k|-m|-g] [-t]
单位默认KB, 可用 B,MB,GB
-t:Total,另外显示实体内存与swap的合并统计。
uptime 可以显示出 top 画面的最上面一行!
netstat -[aovpntul]
-t:Tcp
-u:Udp
-l:toggle display type: Listening or not
-a:All: 连线、监听、Socket数据都列出来
-o:timeOut. include information related to networking timers.
-v: Verbose.
-p:Pid & Program name.
-n:Number, instead of name of domain|port.
netstat的internet connetction输出:
Recv-Q:非由使用者程序连结到此 socket 的复制的总 bytes 数;
Send-Q:非由远程主机传送过来的 acknowledged 总 bytes 数;
State :主要有ESTABLISED,LISTEN;
netstat的unix socket输出:
RefCnt:连接到此 socket 的程序数量;
Type :主要有 确认连线的 STREAM 与不需确认的 DGRAM 两种;
State :若为 CONNECTED 表示多个程序之间已经连线创建。
Path :连接到此 socket 的相关程序的路径!或者是相关数据输出的路径。
dmesg: kernel ring buffer #// Detection stage MESsaGe of booting
dmesg | grep -i hd
dmesg | grep -i eth
vmstat: Virtual Memory STATistics
vmstat (vm mode, default)
proc-s:
r: number of processes waiting for Run time.
b: number of processes in uninterruptible sleep. // Bad
memory: # >> 'free' cmd
swpd: SWaPpeD: 已使用swp量
free:未使用内存量
buff:用於缓冲内存量;
cache:用於高速缓存量。//空闲内存经常被cache占满,很正常。
swap:
si: amount of memory Swapped Into ram from disk /s.
so: amount of memory Swapped Out of ram to disk /s.
io: I/O of block devices //主要是硬盘
bi: amount of Blocks receIved from a block device (blocks/s).
bo: amount of Blocks sent tO a block device (blocks/s).
system: //体现了系统与外设通信频繁程度,周边设备包括磁碟、网卡、时钟等。
in: INterrupts /s, including the clock.
cs: Context Switches (事件切换) /s.
cpu:
>> 3.1 top
vmstat -d (Disk mode)
vmstat -p (Partion mode)
通过执行以下命令,可以在 1 分钟内对系统资源使用情况有个大致的了解。
```sh
uptime
dmesg | tail
vmstat 1
mpstat -P ALL 1
pidstat 1
iostat -xz 1
free -m
sar -n DEV 1
sar -n TCP,ETCP 1
top
htop
sudo nethogs
```
特殊文件与程序 #
具有 SUID/SGID 权限的命令运行状态 #
[vbird1@www ~]$ pstree -u
init-+-acpid
....(中间省略)....
|-sshd---sshd---sshd(vbird1)---bash-+-more
| |-passwd(root)
| `-pstree
....(底下省略)....
查询整个系统的 SUID/SGID 的文件: find / -perm +6000 # >> ch7.5.2
/proc/* 代表的意义 #
/proc/$pid/:
cmdline:启动所用的命令,含参数;
environ:程序的环境变量。
/proc/: 与系统相关的参数
/proc/cmdline 加载 kernel 时所下达的相关参数!查阅此文件,可了解系统是如何启动的!
/proc/cpuinfo "lm": Long Module: 64bit.
/proc/devices 这个文件记录了系统各个主要装置的主要装置代号,与 mknod 有关呢!
/proc/filesystems 目前系统已经加载的文件系统罗!
/proc/interrupts 目前系统上面的 IRQ 分配状态。
/proc/ioports 目前系统上面各个装置所配置的 I/O 位址。
/proc/kcore 内存同样大小!好大对吧!但是不要读他啦!
/proc/loadavg 'top'以及'uptime'上头的三个平均数值就是记录在此!
/proc/meminfo 'free'
/proc/modules 已经加载的模块列表,也可以想成是驱动程序啦!
/proc/mounts 'mount' // kubuntu 未发现此文件
/proc/swaps 到底系统挂加载的内存在哪里?呵呵!使用掉的partition就记录在此啦! #???
/proc/partitions 'fdisk -l /dev/sda' 会出现目前所有的partition在这个文件当中也有纪录喔!
/proc/pci 在 PCI 汇流排上面,每个装置的详细情况!可用 lspci 来查阅!//kubuntu 11.10在./bus/下
/proc/uptime == 'uptime'
/proc/version == 'uname -a'
/proc/bus/* 一些汇流排的装置,还有 U盘 的装置也记录在此喔!
查询已开启文件或已运行程序开启之文件: fuser, lsof, pidof #
fuser [-muv] [-k[i] -15] fileName|dirName #File USER
参数:
-m:Mounted filesystem. 上提到后面接的那个档名到对应的文件系统的最顶层. #对umount 不成功很有效!???
-u:User, 同时列出该程序的拥有者;
-v:Verbose, 可以列出每个文件与程序还有命令的完整相关性!
-k:Kill, 找出使用该文件/目录的PID,并试图以SIGKILL 这个讯号给予该PID;
-i:Interactive, kill前询问!
-signal:-1,-15等,默认SIGKILL(9)罗!
输出的ACCESS flags: #???
f:被开启的文件;F:文件被开启了,但是在等待回应;
r:Root directory;
c:此程序在当前的目录下(非次目录);
e:可被触发为运行状态;
m:可能为分享的动态函式库;
lsof [-aUu] [+d] #LiSt Open Files.
参数:
-a :And logic for parameters. #default or logic ???
-U :仅Unix-like系统的socket文件类型;
-u :User,仅该User/相关程序所开启的文件;
+d :Dir,找出某个目录底下已经被开启的文件!
范例1:系统所有已经被开启的文件与装置:
lsof
范例2:关於root的所有程序开启的socket文件
lsof -u root -a -U
范例3:系统所有的被启动的周边装置
lsof +d /dev
范例4:秀出属於root的bash这支程序所开启的文件
lsof -u root | grep bash
pidof [-sx] programName
参数:
-s :仅列出一个 PID 而不列出所有的 PID
-x :同时列出该 program name 可能的 PPID 那个程序的 PID #不起作用??? '可能'???
eg1: pidof init syslogd
1 4286 # 理论上,应该会有两个 PID 才对。上面的显示也是出现了两个 PID 喔。
SELinux 初探 #
* 什么是 SELinux: 目标, DAC, MAC
* SELinux 的运行模式: 组件, 安全性本文, domain/type
* SELinux 的启动、关闭与观察: getenforce, sestatus, 启动与关闭, setenforce
* SELinux 网络服务运行范例: 启动 (ps -Z), 错误情况, 解决 (chcon, restorecon)
* SELinux 所需的服务: setroubleshoot, sealert, auditd, audit2why
* SELinux 的政策与守则管理: seinfo, sesearch, getsebool, setsebool, semanage