awk和OpenSSL第17天
1:gnu awk
文本处理三工具:grep, sed, awk
grep, egrep(也可以使用grep -E,效果同egrep), fgrep:文本过滤工具;pattern
sed: 行编辑器,在模式空间和保持空间折腾数据,可以搞出许多花样
awk:报告生成器,格式化文本输出;
AWK: Aho, Weinberger, Kernighan --> New AWK, NAWK
GNU awk:简称gawk,这是linux上使用的awk
gawk - pattern scanning and processing language
模式扫描和处理语言
基本用法:gawk [options] 'BEGIN{action;...} program END{action;...}' FILE ...
program的格式是 PATTERN{ACTION STATEMENTS} 多个语句之间用分号分隔,比如print,printf等语句,PATTERN表示模式定界,用来选取某些行
awk的原理:从输入文件中每次读取一行,读取的这一行让-F指定的分隔符切割成多片,每一片由awk内建的变量保存,分别是$1,$2,$3...$n等,而$0则表示这一行
选项 options:
-F:指明输入时用到的字段分隔符;
-v var=value: 自定义变量
1:print action详解
print item1,item2
注意点:
(1):多个item之间使用逗号分隔开
(2):输出的各item可以是字符串,也可以是数值;当前记录的字段、变量或awk的表达式;
(3): 如省略item,相当于print $0;
例如 tail -3 /etc/fstab | awk '{print "hello",$2,$4}'
2、变量,支持内建变量和自定义变量
2.1 内建变量
FS:input field seperator,默认为空白字符;-v FS=':'
OFS:output field seperator,默认为空白字符;-v OFS=':'
例子 awk -v FS=':' -v OFS='---' '{print $1,$3}' /etc/passwd
RS:input record seperator,输入时的换行符;很少用
ORS:output record seperator,输出时的换行符;很少用
NF:number of field,字段数量 例如: {print NF}, {print $NF}
NR:number of record, 行数;awk '{print NR}' /etc/fstab
FNR:各文件分别计数;行数;awk '{print FNR}' /etc/fstab /etc/passwd
FILENAME:当前文件名;
ARGC:命令行参数的个数;
ARGV:数组,保存的是命令行所给定的各参数;
例如:awk 'BEGIN{print ARGC}' /etc/fstab /etc/passwd
2.2 自定义变量
(1) -v var=value 变量名区分字符大小写;
(2) 变量也可以在program中直接定义,例如 awk 'BEGIN{test="hello gawk";print test}'
3、printf命令(有格式符和修饰符)
printf命令可以格式化输出:printf FORMAT_STRING, item1, item2, ...
(1) FORMAT必须给出;
(2) 不会自动换行,需要显式给出换行控制符,\n
(3) FORMAT中需要分别为后面的每个item指定一个格式化符号;
格式符:可以使用如下的形式
%c: 显示字符的ASCII码;
%d, %i: 显示十进制整数;
%e, %E: 科学计数法数值显示;
%f:显示为浮点数;
%g, %G:以科学计数法或浮点形式显示数值;
%s:显示字符串;
%u:无符号整数;
%%: 显示%自身;
例如 awk -F: '{printf "UserName: %s,UID: %d\n",$1,$3}' /etc/passwd
修饰符:放在%s这2个字符的中间,用来修饰格式
#[.#]:第一个数字控制显示的宽度;第二个#表示小数点后的精度;例如%3.1f
-: 左对齐
+:显示数值的符号
例子:awk -F: '{printf "UserName: %-15s,UID: %d\n",$1,$3}' /etc/passwd
4:操作符号
算术操作符:
x+y, x-y, x*y, x/y, x^y, x%y
-x
+x: 转换为数值;
字符串操作符:没有符号的操作符,字符串连接
赋值操作符:
=, +=, -=, *=, /=, %=, ^=
++, --
比较操作符:
>, >=, <, <=, !=, ==
模式匹配符:
~:是否匹配
!~:是否不匹配
逻辑操作符:
&&
||
!
函数调用:
function_name(argu1, argu2, ...)
条件表达式:
selector?if-true-expression:if-false-expression
# awk -F: '{$3>=1000?usertype="Common User":usertype="Sysadmin or SysUser";printf "%15s:%-s\n",$1,usertype}' /etc/passwd
5、PATTERN 主要的作用是定界
(1) empty:空模式,匹配每一行;
(2) /regular expression/:仅处理能够被此处的模式匹配到的行;
(3) relational expression: 关系表达式;结果有“真”有“假”;结果为“真”才会被处理,才会处理这一行
真:结果为非0值,非空字符串;
例子
awk -F: '$3>=1000{print $1,$3}' /etc/passwd
awk -F: '$NF=="/bin/bash"{print $1, $NF}' /etc/passwd
awk -F: '$NF~/bash$/{print $1, $NF}' /etc/passwd
(4) line ranges:行范围,
startline,endline:/pattern1/,/pattern2/
注意: 不支持直接给出数字的格式
~]# awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd
(5) BEGIN/END模式
BEGIN{}: 仅在开始处理文件中的文本之前执行一次;
END{}:仅在文本处理完成之后执行一次;
6、常用的action
(1) Expressions
(2) Control statements:if, while等;
(3) Compound statements:组合语句;
(4) input statements
(5) output statements
7、控制语句,有如下的形式
if(condition) {statments} 如果statments只有1句,可以省略花括号
if(condition) {statments} else {statements}
while(conditon) {statments}
do {statements} while(condition)
for(expr1;expr2;expr3) {statements}
break
continue
delete array[index]
delete array
exit
{ statements }
7.1 if-else
语法:if(condition) statement [else statement]
~]# awk -F: '{if($3>=1000) {printf "Common user: %s\n",$1} else {printf "root or Sysuser: %s\n",$1}}' /etc/passwd
~]# awk -F: '{if($NF=="/bin/bash") print $1}' /etc/passwd
~]# awk '{if(NF>5) print $0}' /etc/fstab
~]# df -h | awk -F[%] '/^\/dev/{print $1}' | awk '{if($NF>=20) print $1,$NF}'
以%分割,以为/dev开头的,则输出$1,
使用场景:对awk取得的整行或某个字段做条件判断;
7.2 while循环
语法:while(condition) {statement}
条件“真”,进入循环;条件“假”,退出循环;
使用场景:对一行内的多个字段逐一类似处理时使用;对数组中的各元素逐一处理时使用;
~]# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {print $i,length($i); i++}}' /etc/grub2.cfg
~]# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=7) {print $i,length($i)}; i++}}' /etc/grub2.cfg
7.3 do-while循环
语法:do {statement} while(condition)
意义:至少执行一次循环体
7.4 for循环
语法:for(expr1;expr2;expr3) {statement}
for(variable assignment;condition;iteration process) {for-body}
~]# awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}' /etc/grub2.cfg
特殊用法:
能够遍历数组中的元素;
语法:for(var in array) {for-body}
7.5 switch语句
语法:switch(expression) {case VALUE1 or /REGEXP/: statement; case VALUE2 or /REGEXP2/: statement; ...; default: statement}
7.6 break和continue
break [n]
continue
7.7 next 控制awk的内生循环
提前结束对本行的处理而直接进入下一行;
~]# awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd
8、array
关联数组:array[index-expression]
index-expression: 可以有如下2种形式
(1) 可使用任意字符串;字符串要使用双引号;
(2) 如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串”;
若要判断数组中是否存在某元素,要使用"index in array"格式进行;
若要遍历数组中的每个元素,要使用for循环;
for(var in array) {for-body}
~]# awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for(i in weekdays) {print weekdays[i]}}'
注意:var会遍历array的每个索引;
例子:统计每种状态的连接数量
state["LISTEN"]++
state["ESTABLISHED"]++
~]# netstat -tan | awk '/^tcp\>/{state[$NF]++}END{for(i in state) { print i,state[i]}}'
例子:统计每个IP访问的资源数量
~]# awk '{ip[$1]++}END{for(i in ip) {print i,ip[i]}}' /var/log/httpd/access_log
练习1:统计/etc/fstab文件中每种文件系统类型出现的次数;
~]# awk '/^UUID|^\/dev/{fs[$3]++}END{for(i in fs) {print i,fs[i]}}' /etc/fstab
练习2:统计指定文件中每个单词出现的次数;
~]# awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count) {print i,count[i]}}' /etc/fstab
9、函数
9.1 内置函数
数值处理:rand():返回0和1之间一个随机数;
字符串处理:
length([s]):返回指定字符串的长度;
sub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其第一次出现替换为s所表示的内容;
gsub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其所有出现均替换为s所表示的内容;
split(s,a,[r]):以r为分隔符切割字符s,并将切割后的结果保存至a所表示的数组中;此时a数组的下标从1开始计算。
~]# netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for (i in count) {print i,count[i]}}'
9.2 自定义函数
《sed和awk》
Linux Services and Security
OpenSSL
OpenSSH
dns: bind
web: http, httpd(apache), php, mariadb(mysql)
lamp
nginx(tengine), lnmp;
file server: ftp, nfs, samba
dhcp, pxe
iptables
网络协议工作原理:客户端在应用协议层比如http层,封装http头部,然后数据包传输到内核,内核中的tcp/ip协议会在数据包上封装传输层首部(源端口,目的端口),再下一层数据包传输到互联网层,此时在数据包中封装源ip和目的ip,再下一层就是在数据包中封装数据链路层信息,然后数据就可以在链路层传输,通过路由协议在互联网上传输,最终到达目的主机,目的主机取得数据包之后,按相反方向解包。问题:为什么要如此复杂的对数据包进行封包解包?
http是明文传输的。
数据的安全:
保密性:数据保密性 隐私性
完整性:数据完整性 系统完整性,数据未被修改
可用性
安全攻击:
被动攻击:窃听
主动攻击:伪装、重放、消息篡改、拒绝服务
安全机制:
加密、数字签名、访问控制、数据完整性、认证交换、流量填充、路由控制、公证
安全服务:
认证:双方身份认证
访问控制
数据保密性
连接保密性
无连接保密性
选择域保密性
流量保密性
数据完整性
不可否认性
密码算法和协议:
对称加密
公钥加密,属于非对称加密
单向加密
认证协议
密码算法一般由数学科学家创造出来,由程序员开发实现的,即便密码算法精妙,无懈可击,但是实现该算法的程序依然可能有漏洞,通过该漏洞可能也会造成数据的泄露。
Linux系统:OpenSSL, gpg(pgp) gpg是pgp的实现
加密算法和协议:
对称加密:加密和解密使用同一个密钥;
将数据和密钥通过某种算法进行运算,算出密文,然后传输密文。解密的时候使用将密文和密钥进行运算,算出原来的数据。
对称加密的实现有:
DES:Data Encryption Standard 使用56bit密钥,已被破解
3DES:
AES:Advanced Encryption Standard (128bits, 192bits, 258, 384, 512bits)
Blowfish
Twofish
IDEA
RC6
CAST5
对称加密的特性:
1、加密、解密使用同一个密钥;
2、将原始数据分割成固定大小的块,逐个进行加密;
对称加密的缺陷:
1、密钥过多;
2、密钥分发;
公钥加密:密钥是成对出现的
公钥:公开给所有人;pubkey
私钥:自己留存,必须保证其私密性;secret key
特点:用公钥加密的数据,只能使用与之配对儿的私钥解密;反之亦然;
公钥加密的功能,有如下3个:
数字签名:主要在于让接收方确认请求方身份;
比如:bob和alice双发要进行通信。首先bob对要通信的数据进行信息摘要计算,提取出来指纹,使用私钥对指纹进行加密,将通信数据和加密过的指纹发送给alice。alice这边使用bob的配对的公钥解密,如果能解密成功说明这些数据就来自于bob,此时就还原出来bob发送的指纹,alice对通信数据也使用同样的单向算法提取其指纹,如果该指纹和bob发送的指纹是一样的,就说明数据是完整的,没有被篡改过。
问题是,alice如何可靠的获取bob的公钥?
引入CA Certificate Authority 数字证书认证机构
密钥交换:请求方用对方的公钥对一个对称密钥进行加密,并将该加密之后的密文发送给对方,对方使用自己配对的私钥解密出来这个对称密钥。
数据加密:
公钥加密的算法实现有:
RSA
DSA
ELGamal
单向加密:只能加密,不能解密;提取数据指纹;
特性:定长输出、雪崩效应;
算法实现有:
md5: 128bits
sha1: 160bits
sha224
sha256
sha384
sha512
功能:保证数据的完整性;
密钥交换的加密方式有如下2中:
公钥加密:
DH (Deffie-Hellman):
DH原理:假设A用户和B用户要交换密钥,他们双方先预设2个数据,其中一个是大质数p,另一个假设为g,这两个数据是双方都知道的。A用户自己设置一个私密数据x,B用户自己设置一个私密数据y。A用户计算p^x%g的值发送给B用户,B用户计算p^y%g的值发送给A用户。B用户获取p^x%g的值,计算p^x%g^y的值。A用户获取p^y%g的值,计算p^y%g^x的值。p^x%g^y和p^y%g^x这2个值是等同的,这就是密钥。所以A,B用户交换密钥不需要在网络上传输密钥。
PKI: Public Key Infrastructure
公开密钥基础建设(英语:Public Key Infrastructure,缩写:PKI),又称公开密钥基础架构、公钥基础建设、公钥基础设施、公开密码匙基础建设或公钥基础架构,是一组由硬件、软件、参与者、管理政策与流程组成的基础架构,其目的在于创造、管理、分配、使用、存储以及撤销数字证书。
PKI包含以下:
签证机构:CA
注册机构:RA
证书吊销列表:CRL
证书存取库
X.509:定义了证书的结构以及认证协议标准,包含以下内容:
版本号
序列号
签名算法ID
发行者名称
有效期限
主体名称:比如 magedu.com
主体公钥 证书里是有公钥的
发行者惟一标识
主体的惟一标识
扩展
发行者签名:就是证书发行者的签名,也就是上述的版本号,序列号,签名算法ID,发行者名称等等信息的摘要经过CA的私钥加密之后的密文。(这样方便客户端认证该证书的合法性:具体步骤如下:首先客户端的浏览器在受信任的证书机构列表里CA自己的证书(不是CA给其他主体发布的证书),并且浏览器从该证书中提取公钥,然后用公钥解密发行者签名。如果能解密说明CA的身份得到认证,之后,就可得到信息摘要)
SSL: Secure Socket Layer
TLS: Transport Layer Security
1995:SSL 2.0, Netscape
1996: SSL 3.0
1999: TLS 1.0
2006: TLS 1.1 RFC 4346
2008:TLS 1.2
2015: TLS 1.3
在应用层是传输层之间加入半层SSL/TLS,http如果调用了SSL/TLS类库,就是https协议。
SSL/TLS本身也是分层设计的:分层结构如下:
1、最低层:基础算法原语的实现,aes, rsa, md5
2、向上一层:各种算法的实现
3、再向上一层:组合算法实现的半成品
4、用各种组件拼装而成的种种成品密码学协议/软件:tls, ssh,
OpenSSL:开源项目
OpenSSL的三个组件:
openssl: 多用途的命令行工具;实现了单向加密,对称加密,公钥加密等等
libcrypto: 公共加密库;
libssl: 库,实现了ssl及tls;
SSL会话详解:
1:TCP完成3次握手之后,服务器端发送证书给客户端,客户端通过公钥(服务器端的公钥,客户端从证书里提取的)解密证书里的发行者签名,能解密成功,就说明证书发行者得到认证,再一步,检查证书的主体名称,检查证书的信息是否完整,还要检查证书是否在证书吊销列表中,来判断证书是否有效。
2:接下来客户端和服务器端要真正通信了,必须协商双方使用的对称密钥。按照如下方法:
客户端生成一个对称密钥,并且用服务器端的公钥进行加密,发送给服务器端,服务器端接收之后,使用私钥解密,就可以得到客户端生成的对称密钥。(这一步就叫做基于公钥加密的密钥交换)。然后使用这个对称密钥加密通信数据。这个对称密钥是临时性的,一次性的。
有没有服务器端要求验证客户端的证书的情况??
有,比如在线网银转账的时候要验证客户端的证书,U盾里面就保存了银行发布给客户端的证书。
openssl命令详解:
openssl version:程序版本号
openssl help 查看帮助信息
openssl有标准命令、消息摘要命令、加密命令
标准命令:enc, ca, req, ...
使用openssl实现对称加密:
工具:openssl enc, gpg
支持的算法:3des, aes, blowfish, twofish等
例子:enc 用于对称加密解密,-e用于加密,-d用于解密,-des3表示使用des3加密算法
加密:~]# openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext
解密:~]# openssl enc -d -des3 -a -salt -in fstab.ciphertext -out fstab
提示:openssl help命令显示结果的Cipher commands (see the `enc' command for more details)这一段里的加密算法都可以
使用openssl实现单向加密:
工具:md5sum, sha1sum, sha224sum, sha256sum,..., 或者openssl dgst
例子:
openssl dgst -md5 /etc/fstab -out fstab.md5
提示:openssl help命令显示结果的 Message Digest commands (see the `dgst' command for more details) 这一段里的加密算法都可以
单向加密的MAC机制: Message Authentication Code,单向加密的一种延伸应用,用于实现在网络通信中保证所传输的数据的完整性;CBC-MAC和HMAC(使用md5或sha1算法)
使用openssl生成用户密码:
passwd命令
例子:
openssl passwd -1 -salt amz_goog -1表示使用md5算法
使用openssl生成随机数:
openssl rand -base64|-hex NUM
NUM: 表示字节数;-hex时,每个字符4位,出现的字符数为NUM*2;
例子:
openssl rand -base64 6
openssl rand -hex 6
使用openssl公钥加密:
加密工具:gpg和openssl rsautl(rsautl:rsa utility)
数字签名:算法有RSA, DSA, ELGamal
密钥交换:算法有dh,工具有openssl dh
DSA: Digital Signature Algorithm
DSS:Digital Signature Standard
RSA:
使用openssl生成密钥对儿:
工具:openssl genrsa
openssl genrsa -out /PATH/TO/PRIVATEKEY.FILE NUM_BITS NUM_BITS表示生成的密钥位数
例子:
openssl genrsa -out rsakey.private 2048 生成2048位数的私钥保存到rsakey.private文件
openssl rsa -in rsakey.private -pubout 从私钥中提取公钥并输出
# (umask 077; openssl genrsa -out key.pri 2048)
随机数生成器:
/dev/random:仅从熵池返回随机数;随机数用尽,阻塞;
/dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机数;非阻塞;
文本处理三工具:grep, sed, awk
grep, egrep(也可以使用grep -E,效果同egrep), fgrep:文本过滤工具;pattern
sed: 行编辑器,在模式空间和保持空间折腾数据,可以搞出许多花样
awk:报告生成器,格式化文本输出;
AWK: Aho, Weinberger, Kernighan --> New AWK, NAWK
GNU awk:简称gawk,这是linux上使用的awk
gawk - pattern scanning and processing language
模式扫描和处理语言
基本用法:gawk [options] 'BEGIN{action;...} program END{action;...}' FILE ...
program的格式是 PATTERN{ACTION STATEMENTS} 多个语句之间用分号分隔,比如print,printf等语句,PATTERN表示模式定界,用来选取某些行
awk的原理:从输入文件中每次读取一行,读取的这一行让-F指定的分隔符切割成多片,每一片由awk内建的变量保存,分别是$1,$2,$3...$n等,而$0则表示这一行
选项 options:
-F:指明输入时用到的字段分隔符;
-v var=value: 自定义变量
1:print action详解
print item1,item2
注意点:
(1):多个item之间使用逗号分隔开
(2):输出的各item可以是字符串,也可以是数值;当前记录的字段、变量或awk的表达式;
(3): 如省略item,相当于print $0;
例如 tail -3 /etc/fstab | awk '{print "hello",$2,$4}'
2、变量,支持内建变量和自定义变量
2.1 内建变量
FS:input field seperator,默认为空白字符;-v FS=':'
OFS:output field seperator,默认为空白字符;-v OFS=':'
例子 awk -v FS=':' -v OFS='---' '{print $1,$3}' /etc/passwd
RS:input record seperator,输入时的换行符;很少用
ORS:output record seperator,输出时的换行符;很少用
NF:number of field,字段数量 例如: {print NF}, {print $NF}
NR:number of record, 行数;awk '{print NR}' /etc/fstab
FNR:各文件分别计数;行数;awk '{print FNR}' /etc/fstab /etc/passwd
FILENAME:当前文件名;
ARGC:命令行参数的个数;
ARGV:数组,保存的是命令行所给定的各参数;
例如:awk 'BEGIN{print ARGC}' /etc/fstab /etc/passwd
2.2 自定义变量
(1) -v var=value 变量名区分字符大小写;
(2) 变量也可以在program中直接定义,例如 awk 'BEGIN{test="hello gawk";print test}'
3、printf命令(有格式符和修饰符)
printf命令可以格式化输出:printf FORMAT_STRING, item1, item2, ...
(1) FORMAT必须给出;
(2) 不会自动换行,需要显式给出换行控制符,\n
(3) FORMAT中需要分别为后面的每个item指定一个格式化符号;
格式符:可以使用如下的形式
%c: 显示字符的ASCII码;
%d, %i: 显示十进制整数;
%e, %E: 科学计数法数值显示;
%f:显示为浮点数;
%g, %G:以科学计数法或浮点形式显示数值;
%s:显示字符串;
%u:无符号整数;
%%: 显示%自身;
例如 awk -F: '{printf "UserName: %s,UID: %d\n",$1,$3}' /etc/passwd
修饰符:放在%s这2个字符的中间,用来修饰格式
#[.#]:第一个数字控制显示的宽度;第二个#表示小数点后的精度;例如%3.1f
-: 左对齐
+:显示数值的符号
例子:awk -F: '{printf "UserName: %-15s,UID: %d\n",$1,$3}' /etc/passwd
4:操作符号
算术操作符:
x+y, x-y, x*y, x/y, x^y, x%y
-x
+x: 转换为数值;
字符串操作符:没有符号的操作符,字符串连接
赋值操作符:
=, +=, -=, *=, /=, %=, ^=
++, --
比较操作符:
>, >=, <, <=, !=, ==
模式匹配符:
~:是否匹配
!~:是否不匹配
逻辑操作符:
&&
||
!
函数调用:
function_name(argu1, argu2, ...)
条件表达式:
selector?if-true-expression:if-false-expression
# awk -F: '{$3>=1000?usertype="Common User":usertype="Sysadmin or SysUser";printf "%15s:%-s\n",$1,usertype}' /etc/passwd
5、PATTERN 主要的作用是定界
(1) empty:空模式,匹配每一行;
(2) /regular expression/:仅处理能够被此处的模式匹配到的行;
(3) relational expression: 关系表达式;结果有“真”有“假”;结果为“真”才会被处理,才会处理这一行
真:结果为非0值,非空字符串;
例子
awk -F: '$3>=1000{print $1,$3}' /etc/passwd
awk -F: '$NF=="/bin/bash"{print $1, $NF}' /etc/passwd
awk -F: '$NF~/bash$/{print $1, $NF}' /etc/passwd
(4) line ranges:行范围,
startline,endline:/pattern1/,/pattern2/
注意: 不支持直接给出数字的格式
~]# awk -F: '(NR>=2&&NR<=10){print $1}' /etc/passwd
(5) BEGIN/END模式
BEGIN{}: 仅在开始处理文件中的文本之前执行一次;
END{}:仅在文本处理完成之后执行一次;
6、常用的action
(1) Expressions
(2) Control statements:if, while等;
(3) Compound statements:组合语句;
(4) input statements
(5) output statements
7、控制语句,有如下的形式
if(condition) {statments} 如果statments只有1句,可以省略花括号
if(condition) {statments} else {statements}
while(conditon) {statments}
do {statements} while(condition)
for(expr1;expr2;expr3) {statements}
break
continue
delete array[index]
delete array
exit
{ statements }
7.1 if-else
语法:if(condition) statement [else statement]
~]# awk -F: '{if($3>=1000) {printf "Common user: %s\n",$1} else {printf "root or Sysuser: %s\n",$1}}' /etc/passwd
~]# awk -F: '{if($NF=="/bin/bash") print $1}' /etc/passwd
~]# awk '{if(NF>5) print $0}' /etc/fstab
~]# df -h | awk -F[%] '/^\/dev/{print $1}' | awk '{if($NF>=20) print $1,$NF}'
以%分割,以为/dev开头的,则输出$1,
使用场景:对awk取得的整行或某个字段做条件判断;
7.2 while循环
语法:while(condition) {statement}
条件“真”,进入循环;条件“假”,退出循环;
使用场景:对一行内的多个字段逐一类似处理时使用;对数组中的各元素逐一处理时使用;
~]# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {print $i,length($i); i++}}' /etc/grub2.cfg
~]# awk '/^[[:space:]]*linux16/{i=1;while(i<=NF) {if(length($i)>=7) {print $i,length($i)}; i++}}' /etc/grub2.cfg
7.3 do-while循环
语法:do {statement} while(condition)
意义:至少执行一次循环体
7.4 for循环
语法:for(expr1;expr2;expr3) {statement}
for(variable assignment;condition;iteration process) {for-body}
~]# awk '/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}' /etc/grub2.cfg
特殊用法:
能够遍历数组中的元素;
语法:for(var in array) {for-body}
7.5 switch语句
语法:switch(expression) {case VALUE1 or /REGEXP/: statement; case VALUE2 or /REGEXP2/: statement; ...; default: statement}
7.6 break和continue
break [n]
continue
7.7 next 控制awk的内生循环
提前结束对本行的处理而直接进入下一行;
~]# awk -F: '{if($3%2!=0) next; print $1,$3}' /etc/passwd
8、array
关联数组:array[index-expression]
index-expression: 可以有如下2种形式
(1) 可使用任意字符串;字符串要使用双引号;
(2) 如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值初始化为“空串”;
若要判断数组中是否存在某元素,要使用"index in array"格式进行;
若要遍历数组中的每个元素,要使用for循环;
for(var in array) {for-body}
~]# awk 'BEGIN{weekdays["mon"]="Monday";weekdays["tue"]="Tuesday";for(i in weekdays) {print weekdays[i]}}'
注意:var会遍历array的每个索引;
例子:统计每种状态的连接数量
state["LISTEN"]++
state["ESTABLISHED"]++
~]# netstat -tan | awk '/^tcp\>/{state[$NF]++}END{for(i in state) { print i,state[i]}}'
例子:统计每个IP访问的资源数量
~]# awk '{ip[$1]++}END{for(i in ip) {print i,ip[i]}}' /var/log/httpd/access_log
练习1:统计/etc/fstab文件中每种文件系统类型出现的次数;
~]# awk '/^UUID|^\/dev/{fs[$3]++}END{for(i in fs) {print i,fs[i]}}' /etc/fstab
练习2:统计指定文件中每个单词出现的次数;
~]# awk '{for(i=1;i<=NF;i++){count[$i]++}}END{for(i in count) {print i,count[i]}}' /etc/fstab
9、函数
9.1 内置函数
数值处理:rand():返回0和1之间一个随机数;
字符串处理:
length([s]):返回指定字符串的长度;
sub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其第一次出现替换为s所表示的内容;
gsub(r,s,[t]):以r表示的模式来查找t所表示的字符中的匹配的内容,并将其所有出现均替换为s所表示的内容;
split(s,a,[r]):以r为分隔符切割字符s,并将切割后的结果保存至a所表示的数组中;此时a数组的下标从1开始计算。
~]# netstat -tan | awk '/^tcp\>/{split($5,ip,":");count[ip[1]]++}END{for (i in count) {print i,count[i]}}'
9.2 自定义函数
《sed和awk》
练习:获取服务器的ip4地址
ip addr | grep -E 'inet .*/' -o | sed 's#/##' | awk '{print $2}'
ip addr | awk -F '[[:space:]/]+' '/inet /{print $3}'
Linux Services and Security
OpenSSL
OpenSSH
dns: bind
web: http, httpd(apache), php, mariadb(mysql)
lamp
nginx(tengine), lnmp;
file server: ftp, nfs, samba
dhcp, pxe
iptables
网络协议工作原理:客户端在应用协议层比如http层,封装http头部,然后数据包传输到内核,内核中的tcp/ip协议会在数据包上封装传输层首部(源端口,目的端口),再下一层数据包传输到互联网层,此时在数据包中封装源ip和目的ip,再下一层就是在数据包中封装数据链路层信息,然后数据就可以在链路层传输,通过路由协议在互联网上传输,最终到达目的主机,目的主机取得数据包之后,按相反方向解包。问题:为什么要如此复杂的对数据包进行封包解包?
http是明文传输的。
数据的安全:
保密性:数据保密性 隐私性
完整性:数据完整性 系统完整性,数据未被修改
可用性
安全攻击:
被动攻击:窃听
主动攻击:伪装、重放、消息篡改、拒绝服务
安全机制:
加密、数字签名、访问控制、数据完整性、认证交换、流量填充、路由控制、公证
安全服务:
认证:双方身份认证
访问控制
数据保密性
连接保密性
无连接保密性
选择域保密性
流量保密性
数据完整性
不可否认性
密码算法和协议:
对称加密
公钥加密,属于非对称加密
单向加密
认证协议
密码算法一般由数学科学家创造出来,由程序员开发实现的,即便密码算法精妙,无懈可击,但是实现该算法的程序依然可能有漏洞,通过该漏洞可能也会造成数据的泄露。
Linux系统:OpenSSL, gpg(pgp) gpg是pgp的实现
加密算法和协议:
对称加密:加密和解密使用同一个密钥;
将数据和密钥通过某种算法进行运算,算出密文,然后传输密文。解密的时候使用将密文和密钥进行运算,算出原来的数据。
对称加密的实现有:
DES:Data Encryption Standard 使用56bit密钥,已被破解
3DES:
AES:Advanced Encryption Standard (128bits, 192bits, 258, 384, 512bits)
Blowfish
Twofish
IDEA
RC6
CAST5
对称加密的特性:
1、加密、解密使用同一个密钥;
2、将原始数据分割成固定大小的块,逐个进行加密;
对称加密的缺陷:
1、密钥过多;
2、密钥分发;
公钥加密:密钥是成对出现的
公钥:公开给所有人;pubkey
私钥:自己留存,必须保证其私密性;secret key
特点:用公钥加密的数据,只能使用与之配对儿的私钥解密;反之亦然;
公钥加密的功能,有如下3个:
数字签名:主要在于让接收方确认请求方身份;
比如:bob和alice双发要进行通信。首先bob对要通信的数据进行信息摘要计算,提取出来指纹,使用私钥对指纹进行加密,将通信数据和加密过的指纹发送给alice。alice这边使用bob的配对的公钥解密,如果能解密成功说明这些数据就来自于bob,此时就还原出来bob发送的指纹,alice对通信数据也使用同样的单向算法提取其指纹,如果该指纹和bob发送的指纹是一样的,就说明数据是完整的,没有被篡改过。
问题是,alice如何可靠的获取bob的公钥?
引入CA Certificate Authority 数字证书认证机构
密钥交换:请求方用对方的公钥对一个对称密钥进行加密,并将该加密之后的密文发送给对方,对方使用自己配对的私钥解密出来这个对称密钥。
数据加密:
公钥加密的算法实现有:
RSA
DSA
ELGamal
单向加密:只能加密,不能解密;提取数据指纹;
特性:定长输出、雪崩效应;
算法实现有:
md5: 128bits
sha1: 160bits
sha224
sha256
sha384
sha512
功能:保证数据的完整性;
密钥交换的加密方式有如下2中:
公钥加密:
DH (Deffie-Hellman):
DH原理:假设A用户和B用户要交换密钥,他们双方先预设2个数据,其中一个是大质数p,另一个假设为g,这两个数据是双方都知道的。A用户自己设置一个私密数据x,B用户自己设置一个私密数据y。A用户计算p^x%g的值发送给B用户,B用户计算p^y%g的值发送给A用户。B用户获取p^x%g的值,计算p^x%g^y的值。A用户获取p^y%g的值,计算p^y%g^x的值。p^x%g^y和p^y%g^x这2个值是等同的,这就是密钥。所以A,B用户交换密钥不需要在网络上传输密钥。
PKI: Public Key Infrastructure
公开密钥基础建设(英语:Public Key Infrastructure,缩写:PKI),又称公开密钥基础架构、公钥基础建设、公钥基础设施、公开密码匙基础建设或公钥基础架构,是一组由硬件、软件、参与者、管理政策与流程组成的基础架构,其目的在于创造、管理、分配、使用、存储以及撤销数字证书。
PKI包含以下:
签证机构:CA
注册机构:RA
证书吊销列表:CRL
证书存取库
X.509:定义了证书的结构以及认证协议标准,包含以下内容:
版本号
序列号
签名算法ID
发行者名称
有效期限
主体名称:比如 magedu.com
主体公钥 证书里是有公钥的
发行者惟一标识
主体的惟一标识
扩展
发行者签名:就是证书发行者的签名,也就是上述的版本号,序列号,签名算法ID,发行者名称等等信息的摘要经过CA的私钥加密之后的密文。(这样方便客户端认证该证书的合法性:具体步骤如下:首先客户端的浏览器在受信任的证书机构列表里CA自己的证书(不是CA给其他主体发布的证书),并且浏览器从该证书中提取公钥,然后用公钥解密发行者签名。如果能解密说明CA的身份得到认证,之后,就可得到信息摘要)
SSL: Secure Socket Layer
TLS: Transport Layer Security
1995:SSL 2.0, Netscape
1996: SSL 3.0
1999: TLS 1.0
2006: TLS 1.1 RFC 4346
2008:TLS 1.2
2015: TLS 1.3
在应用层是传输层之间加入半层SSL/TLS,http如果调用了SSL/TLS类库,就是https协议。
SSL/TLS本身也是分层设计的:分层结构如下:
1、最低层:基础算法原语的实现,aes, rsa, md5
2、向上一层:各种算法的实现
3、再向上一层:组合算法实现的半成品
4、用各种组件拼装而成的种种成品密码学协议/软件:tls, ssh,
OpenSSL:开源项目
OpenSSL的三个组件:
openssl: 多用途的命令行工具;实现了单向加密,对称加密,公钥加密等等
libcrypto: 公共加密库;
libssl: 库,实现了ssl及tls;
SSL会话详解:
1:TCP完成3次握手之后,服务器端发送证书给客户端,客户端通过公钥(服务器端的公钥,客户端从证书里提取的)解密证书里的发行者签名,能解密成功,就说明证书发行者得到认证,再一步,检查证书的主体名称,检查证书的信息是否完整,还要检查证书是否在证书吊销列表中,来判断证书是否有效。
2:接下来客户端和服务器端要真正通信了,必须协商双方使用的对称密钥。按照如下方法:
客户端生成一个对称密钥,并且用服务器端的公钥进行加密,发送给服务器端,服务器端接收之后,使用私钥解密,就可以得到客户端生成的对称密钥。(这一步就叫做基于公钥加密的密钥交换)。然后使用这个对称密钥加密通信数据。这个对称密钥是临时性的,一次性的。
有没有服务器端要求验证客户端的证书的情况??
有,比如在线网银转账的时候要验证客户端的证书,U盾里面就保存了银行发布给客户端的证书。
openssl命令详解:
openssl version:程序版本号
openssl有标准命令、消息摘要命令、加密命令
标准命令:enc, ca, req, ...
使用openssl实现对称加密:
工具:openssl enc, gpg
支持的算法:3des, aes, blowfish, twofish等
例子:enc 用于对称加密解密,-e用于加密,-d用于解密,-des3表示使用des3加密算法
加密:~]# openssl enc -e -des3 -a -salt -in fstab -out fstab.ciphertext
解密:~]# openssl enc -d -des3 -a -salt -in fstab.ciphertext -out fstab
提示:openssl help命令显示结果的Cipher commands (see the `enc' command for more details)这一段里的加密算法都可以
使用openssl实现单向加密:
工具:md5sum, sha1sum, sha224sum, sha256sum,..., 或者openssl dgst
例子:
openssl dgst -md5 /etc/fstab -out fstab.md5
提示:openssl help命令显示结果的 Message Digest commands (see the `dgst' command for more details) 这一段里的加密算法都可以
单向加密的MAC机制: Message Authentication Code,单向加密的一种延伸应用,用于实现在网络通信中保证所传输的数据的完整性;CBC-MAC和HMAC(使用md5或sha1算法)
使用openssl生成用户密码:
passwd命令
例子:
openssl passwd -1 -salt amz_goog -1表示使用md5算法
使用openssl生成随机数:
openssl rand -base64|-hex NUM
NUM: 表示字节数;-hex时,每个字符4位,出现的字符数为NUM*2;
例子:
openssl rand -base64 6
openssl rand -hex 6
使用openssl公钥加密:
加密工具:gpg和openssl rsautl(rsautl:rsa utility)
数字签名:算法有RSA, DSA, ELGamal
密钥交换:算法有dh,工具有openssl dh
DSA: Digital Signature Algorithm
DSS:Digital Signature Standard
RSA:
使用openssl生成密钥对儿:
工具:openssl genrsa
openssl genrsa -out /PATH/TO/PRIVATEKEY.FILE NUM_BITS NUM_BITS表示生成的密钥位数
例子:
openssl genrsa -out rsakey.private 2048 生成2048位数的私钥保存到rsakey.private文件
openssl rsa -in rsakey.private -pubout 从私钥中提取公钥并输出
# (umask 077; openssl genrsa -out key.pri 2048)
随机数生成器:
/dev/random:仅从熵池返回随机数;随机数用尽,阻塞;
/dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机数;非阻塞;
评论
发表评论