Notes of Basic Linux Part-4 User Management

Notes of Basic Linux Part-4 User Management

2012-03-03. Category & Tags: Vbird, Linux, Commands, 鸟哥

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

重点回顾 7. 本章习题 8. 参考数据与延伸阅读 #

针对本文的建议 #