第八周

总结

awk -F: -v var=mage -f scriptfile ‘pattern{action}’
位置变量
FS
OFS
RS
ORS
NF
NR
FNR
FILENAME
ARGC
ARGV
awk控制语句
  { statements;… } 组合语句
  if(condition) {statements;…}
  if(condition) {statements;…} else {statements;…}
  while(conditon) {statments;…}
  do {statements;…} while(condition)
  for(expr1;expr2;expr3) {statements;…}
  break
  continue
  delete array[index]
  delete array
  exit
awk控制语句if-else
  语法:if(condition){statement;…}[else statement]
if(condition1){statement1}else if(condition2){statement2}
else{statement3}
   使用场景:对awk取得的整行或某个字段做条件判断
   示例:
awk -F: ‘{if($3>=1000)print $1,$3}’ /etc/passwd
awk -F: ‘{if($NF==”/bin/bash”) print $1}’ /etc/passwd
awk ‘{if(NF>5) print $0}’ /etc/fstab
awk -F: ‘{if($3>=1000) {printf “Common user: %s\n”,$1} else {printf “root or Sysuser: %s\n”,$1}}’  {}是多条语句时使用
/etc/passwd
awk -F: ‘{if($3>=1000) printf “Common user: %s\n”,$1; else printf “root or Sysuser: %s\n”,$1}’     一条语句可以省略{}
/etc/passwd
df -h|awk -F% ‘/^\/dev/{print $1}’|awk ‘$NF>=80{print $1,$5}‘
awk ‘BEGIN{ test=100;if(test>90){print “very good“}else if(test>60){ print “good”}else{print “no pass”}}’
[root@CENTOS7 ~]#awk -v FS=: ‘{if($3>=1000)print $1,$3}’ /etc/passwd
nfsnobody 65534
wang 1000
lele 1001
mage 1002
git 1003
xixx 1004
xxxxxxxx 1005
yyyyyyyyyyyyyy 1006
echo 1007
a 1008
[root@CENTOS7 ~]#awk -v FS=: ‘{if($NF == “/bin/bash”)print $1,$NF}’ /etc/passwd
root /bin/bash
wang /bin/bash
lele /bin/bash
mage /bin/bash
git /bin/bash
xixx /bin/bash
xxxxxxxx /bin/bash
yyyyyyyyyyyyyy /bin/bash
echo /bin/bash
a /bin/bash
[root@CENTOS7 ~]#awk ‘{if(NF >= 5)print $0}’ /etc/fstab
# Created by anaconda on Tue Mar 27 17:53:47 2018
# Accessible filesystems, by reference, are maintained under ‘/dev/disk’
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
UUID=0a1bc23e-06e5-4210-9b32-0edbff09ca1a /                       xfs     defaults        0 0
UUID=4d8d9214-eeed-4758-8c34-f05492b9ea73 /boot                   xfs     defaults        0 0
UUID=fb669d84-551f-4a70-a11e-f61deec0fd86 /data                   xfs     defaults        0 0
UUID=906330a5-2af1-4bf4-8b2d-9337eaf92250 swap                    swap    defaults        0 0
[root@CENTOS7 ~]#awk -v FS=: ‘{if($3>=1000){printf “common user:%s\n”,$1}else {printf “root or sysuser:%s\n”,$1}}’ /etc/passwd
root or sysuser:root
root or sysuser:bin
root or sysuser:daemon
root or sysuser:adm
root or sysuser:lp
root or sysuser:sync
root or sysuser:shutdown
[root@CENTOS7 ~]#df | awk -F% ‘/^\/dev\/sd/{print $1}’ | awk ‘{if($5>=8)print $1,$5}’
/dev/sda2 8
/dev/sda1 16
awk控制语句
  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)>=10) {print
$i,length($i)}; i++}}’ /etc/grub2.cfg
[root@CENTOS7 ~]#awk ‘BEGIN{print length(“123456789woinasnf”)}’
17
[root@CENTOS7 ~]#awk ‘/^[[:space:]]*linux16/{i=1;while(i<=NF){print $i,length($i);i++}}’ /etc/grub2.cfg   while是对字段做循环,对于awk来说,不需要对行做循环
linux16 7
/vmlinuz-3.10.0-693.el7.x86_64 30
root=UUID=0a1bc23e-06e5-4210-9b32-0edbff09ca1a 46
ro 2
crashkernel=auto 16
rhgb 4
quiet 5
net.ifnames=0 13
linux16 7
/vmlinuz-0-rescue-d9b2c489cdf948f8b487e98005c15e1c 50
root=UUID=0a1bc23e-06e5-4210-9b32-0edbff09ca1a 46
ro 2
crashkernel=auto 16
rhgb 4
quiet 5
net.ifnames=0 13
[root@CENTOS7 ~]#cat /etc/grub2.cfg | awk ‘/^[[:space:]]*linux16/{i=1;while(i<=NF){if(length($i)>=10){print $i,length($i)};i++}}’
/vmlinuz-3.10.0-693.el7.x86_64 30
root=UUID=0a1bc23e-06e5-4210-9b32-0edbff09ca1a 46
crashkernel=auto 16
net.ifnames=0 13
/vmlinuz-0-rescue-d9b2c489cdf948f8b487e98005c15e1c 50
root=UUID=0a1bc23e-06e5-4210-9b32-0edbff09ca1a 46
crashkernel=auto 16
net.ifnames=0 13
awk控制语句
  do-while循环
  语法:do {statement;…}while(condition)
  意义:无论真假,至少执行一次循环体
  示例:
  awk ‘BEGIN{ total=0;i=0;do{ total+=i;i++;}while(i<=100);print total}’
[root@CENTOS7 ~]#awk ‘BEGIN{sum=0;i=0;do{sum+=i;i++;}while(i<=100)print sum}’
5050
[root@CENTOS7 ~]#awk ‘BEGIN{i=1;sum=0;while(i<=100){sum+=i;i++};print sum}’  除了while固定语句形式,;等价{}
5050
awk控制语句
  for循环
  语法:for(expr1;expr2;expr3) {statement;…}
  常见用法:
for(variable assignment;condition;iteration process)
{for-body}
  特殊用法:能够遍历数组中的元素
语法:for(var in array) {for-body}
  示例:
awk ‘/^[[:space:]]*linux16/{for(i=1;i<=NF;i++) {print $i,length($i)}}’
/etc/grub2.cfg
[root@CENTOS7 ~]#awk ‘BEGIN{for(i=1;i<=100;i++){sum+=i};print sum}’这些命令和变量只是局限在awk中跟shell无关
5050
[root@CENTOS7 ~]#awk ‘BEGIN{for(i=1;i<=100;i++){sum+=i}{print sum}}’
5050
[root@CENTOS7 ~]#for ((i=1,sum=0;i<=100;i++));do let sum+=i;done;echo $sum
5050
[root@CENTOS7 ~]#time `for ((i=1,sum=0;i<=1000000;i++));do let sum+=i;done;echo $sum`
bash: 500000500000: command not found…
real 0m6.539s
user 0m6.138s
sys 0m0.312s
[root@CENTOS7 ~]#awk ‘BEGIN{for(i=1;i<=100;i++){sum+=i};print sum}’
5050
[root@CENTOS7 ~]#time `awk ‘BEGIN{for(i=1;i<=1000000;i++){sum+=i};print sum}’`
bash: 500000500000: command not found…
real 0m0.095s
user 0m0.085s
sys 0m0.007s
[root@CENTOS7 ~]#time `seq -s + 1000000 | bc`
bash: 500000500000: command not found…
real 0m0.572s
user 0m0.405s
sys 0m0.035s
awk控制语句
  switch语句
  语法:switch(expression) {case VALUE1 or /REGEXP/: statement1; case
VALUE2 or /REGEXP2/: statement2; …; default: statementn}
  break和continue
  awk ‘BEGIN{sum=0;for(i=1;i<=100;i++)
{if(i%2==0)continue;sum+=i}print sum}‘
  awk ‘BEGIN{sum=0;for(i=1;i<=100;i++)
{if(i==66)break;sum+=i}print sum}‘
[root@CENTOS7 ~]#awk ‘BEGIN{for(i=1;i<=100;i++){if(i%2==0){sum+=i}};print sum}’
2550
[root@CENTOS7 ~]#awk ‘BEGIN{for(i=1;i<=100;i++){if(i%2==0){continue}{sum+=i}};print sum}’
2500
awk控制语句
  break [n]
  continue [n]
  next:
提前结束对本行处理而直接进入下一行处理(awk自身循环)
awk -F: ‘{if($3%2!=0) next; print $1,$3}’ /etc/passwd
[root@CENTOS7 ~]#awk -v FS=: ‘{if($3%2!=0){next}{print $1,$3}}’ /etc/passwd
root 0
daemon 2
lp 4
shutdown 6
mail 8
games 12
ftp 14
systemd-network 192
libstoragemgmt 998
[root@CENTOS7 ~]#awk -F: ‘{if($3>=10){print $1,$3}{if($3<=100){print $1,$3}}}’ /etc/passwd    或者的关系
root 0
bin 1
daemon 2
adm 3
[root@CENTOS7 ~]#awk -F: ‘{if($3>=10&&$3<=100){print $1,$3}}’ /etc/passwd
operator 11
games 12
ftp 14
nobody 99
dbus 81
rpc 32
tss 59
rpcuser 29
radvd 75
awk数组
  关联数组:array[index-expression]
  index-expression:
  (1) 可使用任意字符串;字符串要使用双引号括起来
  (2) 如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值
初始化为“空串”
  若要判断数组中是否存在某元素,要使用“index in array”格式进行遍历
  示例:
  weekdays[“mon”]=”Monday“
  awk ‘BEGIN{weekdays[“mon”]=”Monday”;
weekdays[“tue”]=”Tuesday”;print weekdays[“mon”]}‘
  awk ‘!arr[$0]++’ dupfile
  awk ‘{!arr[$0]++;print $0, arr[$0]}’ dupfile
[root@CENTOS7 ~]#awk ‘BEGIN{name[“a”]=”wang”;name[“b”]=”liu”;print name[“a”]}’
wang
[root@CENTOS7 ~]#awk ‘BEGIN{name[“a”]=”wang”;name[“b”]=”liu”;print name[“b”]}’
liu
[root@CENTOS7 ~]#awk ‘BEGIN{{name[“a”]=”wang”}{name[“b”]=”liu”}{print name[“b”]}}’
liu
[root@CENTOS7 ~]#awk ‘BEGIN{{name[“a”]=”wang”}{name[“b”]=”liu”}{print name[“a”]}}’
wang
[root@CENTOS7 ~]#cat > f1
111
222
333
111
222
333
[root@CENTOS7 ~]#awk ‘!i[$0]++’ f1    去重复的行
111
222
333
[root@CENTOS7 ~]#awk ‘!++i[$0]’ f1
[root@CENTOS7 ~]#
[root@CENTOS7 ~]#sort -u f1      去除重复的行
111
222
333
333
[root@CENTOS7 ~]#awk ‘!a[$0]++{print $0,a[$0]}’ f1
111 1
222 1
333 1
[root@CENTOS7 ~]#awk ‘{!a[$0]++;print $0,a[$0]}’ f1
111 1
222 1
333 1
111 2
222 2
333 2
awk数组
  若要遍历数组中的每个元素,要使用for循环
  for(var in array) {for-body}
  注意:var会遍历array的每个索引
  示例:
  awk ‘BEGIN{weekdays[“mon”]=”Monday”;weekdays[“tue”]
=”Tuesday”;for(i in weekdays) {print weekdays[i]}}‘
  netstat -tan | awk ‘/^tcp/{state[$NF]++}END
{for(i in state) { print i,state[i]}}’
  awk ‘{ip[$1]++}END{for(i in ip) {print i,ip[i]}}’ /var/log/httpd/access_log
[root@CENTOS7 ~]#awk ‘BEGIN{name[“a”]=”wang”;name[“b”]=”liu”;name[“c”]=”zhang”;for(i in name){print i,name[i]}}’
a wang
b liu
c zhang
[root@centos6 ~]#ab -c 100 -n 2000 http://172.20.109.255:80/   并发访问
[root@CENTOS7 html]#netstat -nat | awk ‘/^tcp/{state[$NF]++}END{for(i in state){print i,state[i]}}’
LISTEN 9
ESTABLISHED 1
TIME_WAIT 2001
[root@CENTOS7 html]#cat /var/log/httpd/access_log | awk ‘{ip[$1]++}END{for(i in ip){print i,ip[i]}}’
172.20.102.175 4013
拒绝ip地址172.20.0.100的访问,将ip172.20.0.100加入到防火墙里
iptables -A INPUT -s 172.20.0.100 -j REJECT
将访问次数大于1000的放入防火墙中拒绝其访问
for i in `awk ‘{ip[$1]++}END{for(i in ip){if(ip[i])>1000)print i}}’ /var/log/httpd/access_log`; do iptables -A INPIT -s $i -j REJECT ; done
cat /var/log/httpd/access_log | awk ‘{ip[$1]++}END{for(i in ip){if(ip[i]>1000)print i}}’|while read line ;do iptables -A INPIT -s $line -j REJECT ;done
iptables -vnl    查看防火墙中被进制访问的ip
[root@CENTOS7 ~]#cat /var/log/httpd/access_log | awk ‘{ip[$1]++}END{for(i in ip){print i,ip[i]}}’ | sort -k2 (第二列)-nr |head   取前10个访问次数最多的ip地址
统计/etc/fstab文件中单词重复出现的个数。
[root@CENTOS7 ~]#cat /etc/fstab | awk ‘{for(i=1;i<=NF;i++){word[$i]++}}END{for(j in word){print j,word[j]}}’
Tue 1
Mar 1
man 1
and/or 1
UUID=0a1bc23e-06e5-4210-9b32-0edbff09ca1a 1
[root@CENTOS7 ~]#cat f1
name  score  sex
wang  100    m
zhang 99     m
bai   90     f
li    100    f
求男生女生平均成绩
[root@CENTOS7 ~]#cat f1 | awk ‘{if($3==”m”){sm++;sms+=$2;}else{sf++;smf+=$2;}}END{printf “m:%.2f\nf:%.2f\n”,sms/sm,smf/sf,smf,sf}’
m:99.50
f:63.33
[root@CENTOS7 ~]#cat f1 | awk ‘{if($3==”m”){sm++;sms+=$2;}else if($3==”f”){sf++;smf+=$2;}}END{print sms/sm,smf/sf,smf,sf}’
99.5 95 190 2
[root@CENTOS7 ~]#cat f1 | awk ‘{mun[$NF]++;sum[$NF]+=$2}END{for(i in mun){print i,sum[i]/mun[i]}}’
m 99.5
f 95
awk数组
  关联数组:array[index-expression]
  index-expression:
  (1) 可使用任意字符串;字符串要使用双引号括起来
   (2) 如果某数组元素事先不存在,在引用时,awk会自动创建此元素,并将其值
初始化为“空串”
  若要判断数组中是否存在某元素,要使用“index in array”格式进行遍历
  示例:
  weekdays[“mon”]=”Monday“
  awk ‘BEGIN{weekdays[“mon”]=”Monday”;
weekdays[“tue”]=”Tuesday”;print weekdays[“mon”]}‘
  awk ‘!arr[$0]++’ dupfile
  awk ‘{!arr[$0]++;print $0, arr[$0]}’ dupfile
awk数组
  若要遍历数组中的每个元素,要使用for循环
  for(var in array) {for-body}
  注意:var会遍历array的每个索引
  示例:
  awk ‘BEGIN{weekdays[“mon”]=”Monday”;weekdays[“tue”]
=”Tuesday”;for(i in weekdays) {print weekdays[i]}}‘
  netstat -tan | awk ‘/^tcp/{state[$NF]++}END
{for(i in state) { print i,state[i]}}’
  awk ‘{ip[$1]++}END{for(i in ip) {print i,ip[i]}}’ /var/log/httpd/access_log
awk函数
   数值处理:
rand():返回0和1之间一个随机数
awk ‘BEGIN{srand(); for (i=1;i<=10;i++)print int(rand()*100) }’
   字符串处理:
  length([s]):返回指定字符串的长度
  sub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并将第一个匹配的内容替换为s
echo “2008:08:08 08:08:08” | awk ‘sub(/:/,“-“,$1)’
  gsub(r,s,[t]):对t字符串进行搜索r表示的模式匹配的内容,并全部替换为s所表示的内容
echo “2008:08:08 08:08:08” | awk ‘gsub(/:/,“-“,$0)’
  split(s,array,[r]):以r为分隔符,切割字符串s,并将切割后的结果保存至array所表示的数组中,
第一个索引值为1,第二个索引值为2,…
netstat -tan | awk ‘/^tcp\>/{split($5,ip,”:”);count[ip[1]]++}
END{for (i in count) {print i,count[i]}}’
[root@CENTOS7 ~]#awk ‘BEGIN{srand();print rand()}’
0.943459
[root@CENTOS7 ~]#awk ‘BEGIN{srand();print rand()}’
0.367979
[root@CENTOS7 ~]#awk ‘BEGIN{srand();print rand()}’
0.867989
[root@CENTOS7 ~]#awk ‘BEGIN{srand();print int(rand()*100)}’
63
[root@CENTOS7 ~]#awk ‘BEGIN{srand();print int(rand()*100)}’
3
[root@CENTOS7 ~]#awk ‘BEGIN{srand();for(i=1;i<=5;i++){print int(rand()*100)}}’
1
75
58
65
48
[root@CENTOS7 ~]#awk ‘BEGIN{for(i=1;i<=5;i++){srand();print int(rand()*100)}}’   srand()必须放到BEGIN后面
26
26
26
26
26
[root@CENTOS7 ~]#echo “2008:08:08 08:08:08″ | awk ‘sub(/:/,”-“,$1)’
2008-08:08 08:08:08
[root@CENTOS7 ~]#echo “2008:08:08 08:08:08″ | awk ‘gsub(/:/,”-“,$1)’
2008-08-08 08:08:08
[root@CENTOS7 ~]#echo “2008:08:08 08:08:08″ | awk ‘gsub(/:/,”-“,$0)’
2008-08-08 08-08-08
[root@CENTOS7 ~]#cat /etc/passwd | head -n1 | awk ‘{split($0,arr,”:”)}END{for(i in arr){print i,arr[i]}}’
4 0
5 root
6 /root
7 /bin/bash
1 root
2 x
3 0
[root@CENTOS7 ~]#netstat -tan | awk ‘/^tcp\>/{split($5,ip,”:”);ccount[ip[1]]++}END{for(i in ccount){print i,ccount[i]}}’
192.168.30.1 1
0.0.0.0 4
awk函数
   自定义函数
   格式:
function name ( parameter, parameter, … ) {
statements
return expression
}
   示例:
cat fun.awk
function max(v1,v2) {
v1>v2?var=v1:var=v2
return var
}
BEGIN{a=3;b=2;print max(a,b)}
awk –f fun.awk
[root@CENTOS7 ~]#vim fun.awk
function max(v1,v2){     v1和v2是实参
v1>v2?var=v1:var=v2
return var
}
BEGIN{print max(a,b)}  a和b是实参,实参和形参可以不一样,但是数量必须一致
[root@CENTOS7 ~]#awk -v a=100 -v b=200 -f fun.awk
200
awk脚本
  将awk程序写成脚本,直接调用或执行
  示例:
cat f1.awk
{if($3>=1000)print $1,$3}
awk -F: -f f1.awk /etc/passwd
cat f2.awk
#!/bin/awk –f
#this is a awk script
{if($3>=1000)print $1,$3}
chmod +x f2.awk
f2.awk –F: /etc/passwd
awk中调用shell命令
  system命令
  空格是awk中的字符串连接符,如果system中需要使用awk中的变量可以使用
空格分隔,或者说除了awk的变量外其他一律用””引用起来。
awk BEGIN'{system(“hostname”) }’
awk ‘BEGIN{score=100; system(“echo your score is ” score) }’
[root@CENTOS7 ~]#awk ‘BEGIN{system(“hostname”)}’
CENTOS7.localdomain
[root@CENTOS7 ~]#awk -v i=100 ‘BEGIN{system(“echo your score is ” i)}’  变量要写在””外面
your score is 100
[root@CENTOS7 ~]#awk -v i=100 ‘BEGIN{system (“echo your score is i”)}’
your score is i
向awk脚本传递参数
  格式:
awkfile var=value var2=value2… Inputfile
  注意:在BEGIN过程中不可用。直到首行输入完成以后,变量才可用。可以通
过-v 参数,让awk在执行BEGIN之前得到变量的值。命令行中每一个指定的变
量都需要一个-v参数
  示例:
cat test.awk
#!/bin/awk –f
{if($3 >=min && $3<=max)print $1,$3}
chmod +x test.awk
test.awk -F: min=100 max=200 /etc/passwd
3、提取出字符串Yd$C@M05MB%9&Bdh7dq+YVixp3vpw中的所有数字
[root@CENTOS7 ~]#echo “Yd$C@M05MB%9&Bdh7dq+YVixp3vpw” | awk ‘gsub(/[
][0-9]/,””,$0)’
05973
墨菲定律
  墨菲定律:一种心理学效应,是由爱德华·墨菲(Edward A. Murphy)提出的,
原话:如果有两种或两种以上的方式去做某件事情,而其中一种选择方式将导
致灾难,则必定有人会做出这种选择
  主要内容:
  任何事都没有表面看起来那么简单
  所有的事都会比你预计的时间长
  会出错的事总会出错
  如果你担心某种情况发生,那么它就更有可能发生
安全机制
  信息安全防护的目标
保密性 Confidentiality
完整性 Integrity
可用性 Usability
可控制性Controlability
不可否认性 Non-repudiation
  安全防护环节
物理安全:各种设备/主机、机房环境
系统安全:主机或设备的操作系统
应用安全:各种网络服务、应用程序
网络安全:对网络访问的控制、防火墙规则
数据安全:信息的备份与恢复、加密解密
管理安全:各种保障性的规范、流程、方法
安全
  安全攻击: STRIDE
Spoofing 假冒
Tampering 篡改
Repudiation 否认
Information Disclosure 信息泄漏
Denial of Service 拒绝服务
Elevation of Privilege 提升权限
假冒别人发邮件
[root@CENTOS7 ~]#telnet 127.0.0.1 25
Trying 127.0.0.1…
Connected to 127.0.0.1.
Escape character is ‘^]’.
220 CENTOS7.localdomain ESMTP Postfix
helo a.c:om
250 CENTOS7.localdomain
mail from:magedu@magedu.com
250 2.1.0 Ok
rcpt to:wang
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
subject: i am wang
how are you
how old are you
.
250 2.0.0 Ok: queued as 061FB22476C3
quit
221 2.0.0 Bye
Connection closed by foreign host.
[wang@CENTOS7 ~]$mail
Heirloom Mail version 12.5 7/5/10.  Type ? for help.
“/var/spool/mail/wang”: 4 messages 2 new
    1 root                  Mon Apr  2 20:45  19/647   “hello”
    2 root                  Mon Apr  2 20:48  21/638   “hello”
>N  3 (Cron Daemon)         Sat May  5 19:10  25/868   “Cron <wang@CENTOS7> echo lu shen is a shabi”
 N  4 magedu@magedu.com     Thu May 17 15:03  15/476   “i am wang”
& 4
Message  4:
From magedu@magedu.com  Thu May 17 15:03:47 2018
Return-Path: <magedu@magedu.com>
X-Original-To: wang
Delivered-To: wang@CENTOS7.localdomain
subject: i am wang
Date: Thu, 17 May 2018 15:00:22 +0800 (CST)
From: magedu@magedu.com
Status: R
how are you
how old are you
&
查看某个域的邮箱地址
dig -t mx magedu.com
Information Disclosure 信息泄漏   抓取账号和密码
ftp服务:在centos7上yum install vsftpd 装ftp服务
systemctl start vsftpd
ss -ntl  查看端口是否打开
在centos6上yum install ftp
ftp 192.168.30.7
输入账号密码     使用抓包软件就可以将密码获得!
telnet服务:centos7上systemctl start telnet.socket
ss -ntl 查询telnet端口是否打开,端口号是23
在centos6上telnet 192.168.30.7
输入账号密码
安全设计基本原则
  使用成熟的安全系统
  以小人之心度输入数据
  外部系统是不安全的 : 用防火墙控制外部访问安全,用防水墙控制内部访问安全
  最小授权
  减少外部接口
  缺省使用安全模式
  安全不是似是而非
  从STRIDE思考
  在入口处检查
  从管理上保护好你的系统
安全算法
  常用安全技术
认证
授权
审计
安全通信
  密码算法和协议:
对称加密
公钥加密
单向加密
认证协议
  Linux系统:OpenSSL, gpg(pgp协议的实现)
加密需要
  不加密流量的易受攻击性
  密码/数据嗅探
  数据操作
  验证操作
  相当于邮寄明信片
  不安全的传统协议
  telnet、FTP、POP3等等;不安全密码
  http、smtp、NFS等等;不安全信息
  Ldap、NIS、rsh等等;不安全验证
对称加密算法
   对称加密:加密和解密使用同一个密钥
DES:Data Encryption Standard,56bits
3DES:
AES:Advanced (128, 192, 256bits)
Blowfish,Twofish
IDEA,RC6,CAST5
   特性:
1、加密、解密使用同一个密钥,效率高
2、将原始数据分割成固定大小的块,逐个进行加密
   缺陷:
1、密钥过多
2、密钥分发
3、数据来源无法确认
对称加密
A→B
data明文–加密data—传输—解密—data明文
算法:
算法公开
密钥key 不公开
对称加密算法:
key1=key2
优势:速度快
https://
http://
非对称加密算法
   公钥加密:密钥是成对出现
   公钥:公开给所有人;public key
   私钥:自己留存,必须保证其私密性;secret key
   特点:用公钥加密数据,只能使用与之配对的私钥解密;反之亦然
   功能:
   数字签名:主要在于让接收方确认发送方身份
   对称密钥交换:发送方用对方的公钥加密一个对称密钥后发送给对方
   数据加密:适合加密较小数据
   缺点:密钥长,加密解密效率低下
   算法:
RSA(加密,数字签名),DSA(数字签名),ELGamal
非对称加密算法:
key1 != key2
DES 1G 2G 4m 8m
RSA 1G 1G 1m 64hour
Alice—>Bob
Alice:Pa公,Sa私
Bob:Pb,Sb
公钥无法推出私钥,私钥可以推出公钥
data—加密Pb(data)—解密Sb{Pb(data)}–data
data—加密Sa(data)—解密Pa{Sa(data)}–data
[root@CENTOS7 ssh]#ls
moduli      sshd_config         ssh_host_ecdsa_key.pub  ssh_host_ed25519_key.pub  ssh_host_rsa_key.pub
ssh_config  ssh_host_ecdsa_key  ssh_host_ed25519_key    ssh_host_rsa_key
[root@CENTOS7 ssh]#cat ssh_host_rsa_key.pub  公钥
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC1GM4zoQ0fjPJtfosp0RRuRsZKF2qNDU4KqbrauK5Mc84FfOb/wicmr0tv3uEJOZNKauYzUTHWvzNFO27wFIJjzNxHKzWJjBaWjNax1mgH43XzMOjMMDW60Y9PYz7ZkaEd2inhtY74XdQp279utQf7h3zNm9/uNShd5J7JnGk1YW9/w1qICSCf779xHba2RUJAryvRKMppJh6f/gOgUAlHKiyjT1HjfQ0EmUOHyLmhGlIKe1wP3vFLqXkLSMwXu8InW3I6XI5tstucoczy/VwGtJNewOFPBs6EbwxesDzEr7r+7OzpMthIOnfdYaX9HRNF1B2BEqi6vtIaS9uSMVu1
[root@CENTOS7 ssh]#cat ssh_host_rsa_key   私钥
—–BEGIN RSA PRIVATE KEY—–
MIIEowIBAAKCAQEAtRjOM6ENH4zybX6LKdEUbkbGShdqjQ1OCqm62riuTHPOBXzm
/8InJq9Lb97hCTmTSmrmM1Ex1r8zRTtu8BSCY8zcRys1iYwWlozWsdZoB+N18zDo
zDA1utGPT2M+2ZGhHdop4bWO+F3UKdu/brUH+4d8zZvf7jUoXeSeyZxpNWFvf8Na
iAkgn++/cR22tkVCQK8r0SjKaSYen/4DoFAJRyoso09R430NBJlDh8i5oRpSCntc
D97xS6l5C0jMF7vCJ1tyOlyObbLbnKHM8v1cBrSTXsDhTwbOhG8MXrA8xK+6/uzs
6TLYSDp33WGl/R0TRdQdgRKour7SGkvbkjFbtQIDAQABAoIBAAWYe56axlYIO+Fo
PJKRNEloBG57pL4xAA1SS0TA2hngpigDQPv8GsuWNQWC5H8teUCeZviE9L5G8CWe
fYILkC/XP6MvUZsrafNC7MtX7aT4wUc/ZqIQh0h7eysfzOxaFJlgiVTBEGbaN1kH
wjWAgHukJxYPT+8DU3j7PHDMVW/hwoIEMASsSaPkjsgyz0z6U18tLDKwxWlqHXjF
eBu7kdZL6CvITQONv/eArQAlve0mTni9SjeZvI5Nib97LKDEjl6xiTMCfeyMap2X
ugrz026WTpjmQwA9PNNG86OUsGUUkhHdJvTzcYH6yB1s9bLfdOZ3+EjlOub9sEBU
cdkjDM0CgYEA52VD17NhNap0YDOvRud+VUhGiVDWWiH78cUwsCqtuDUJkJbbniMp
+ha/nGz7E790VP/8/Nv10VI80WDiFlLtadx+ud3s+DVT0RURh+0DwlyBxn+CuMZC
7owyiGuq6Po+nZmdQUcctkUtuS4VdrbvcWUZWa0rAzlPXN/9HdzdbV8CgYEAyFpg
6cEFroHoxCdcCvOcyJ/YmGeskBy/XWoLCLhMR3rV1h1VImMOfRb7V9yjKV8nXR07
4W3RFdsSYoL303wXZeoJXCHQ8DnYYiMkmyffQZ/dcZIlA24Pdzqii/kMKDSDLILd
iTvjgcjcMA6b0DpGcHUJTYQRpLgZtva2IUDoe2sCgYEAz3B44WZuPy4QJi4vc+ET
4GBq268cerD8rEGa5FNeaUUizfxv5dSgTRMXs6P/cjSwlYLnycdnF8AhxZKVHG47
aCvDb90EE3+7JDU/Ahv4wsUrkke9aOhUGIaWxrW/Ah1VBPQxhdO6aaya0Of/Ve2p
un5nu30CkmFORHSI9byKxQECgYB8wpratNG+6zJxAzlzsGOPIsqTjOuOCfi4SNJ6
KZmGYV1LKZTcBub8yhTVj5UirBgtCYlCRUoP3A1Evt1oGjvPwL73Wi9rh/nQkqW2
4EtL6CrTD/hwfFaxHhgeJYWGe7y7OPqO/HYdWWCTpGUuczttx9N1K6p48hNBNbwQ
VQTv5QKBgDnQOuGccCVBIC5v/p4UAtINqYhs7lmogox+41fpoOkG1w6zrCLBsBUE
uhEeqPlpCDhrjNzYV14VF81m3xU8Ej3PHNanNEtEP5lAuTJA3CPAGO3z5GN5wy+j
VNAX52YqGID7pd9j7+j7X9F6nZgNC5Y76zBpEI0iTPf6cxL9uuX8
—–END RSA PRIVATE KEY—–
非对称加密
  基于一对公钥/密钥对
  用密钥对中的一个加密,另一个解密
  实现加密:
  接收者
生成公钥/密钥对:P和S
公开公钥P,保密密钥S
  发送者
使用接收者的公钥来加密消息M
将P(M)发送给接收者
  接收者
使用密钥S来解密:M=S(P(M))
单向散列  这就是hash算法
  将任意数据缩小成固定大小的“指纹”
  任意长度输入
  固定长度输出
  若修改数据,指纹也会改变(“不会产生冲突”)
  无法从指纹中重新生成数据(“单向”)
  功能:数据完整性
  常见算式
md5: 128bits、sha1: 160bits、sha224
sha256、sha384、sha512
?常用工具
  md5sum | sha1sum [ –check ] file
  openssl、gpg
  rpm -V
hash(data)= digest摘要
data不同,digest必不同
digest 不可反推算出data
digest长度固定大小
md5:128
sha1:160
[root@CENTOS7 ~]#md5sum /etc/fstab   数据不变hash值不变
670fa208852c2f5ca53bb48b3848ce60  /etc/fstab
[root@CENTOS7 ~]#md5sum /etc/fstab
670fa208852c2f5ca53bb48b3848ce60  /etc/fstab
[root@CENTOS7 ~]#vim /etc/fstab   文件发生改变
[root@CENTOS7 ~]#md5sum /etc/fstab   hash值发生改变
a77ee5fb28bf319f66500421e2cc2289  /etc/fstab
[root@CENTOS7 ~]#md5sum /etc/fstab
670fa208852c2f5ca53bb48b3848ce60  /etc/fstab
[root@CENTOS7 ~]#md5sum /etc/fstab /etc/passwd > md5.log   将多个文件的hash值从定向到一个文件中,用md5sum –check md5.log来与源文件对比哈市值
[root@CENTOS7 ~]#md5sum –check  md5.log
/etc/fstab: OK
/etc/passwd: OK
hash值只看文件内容,不看文件名。
数字签名:
Pb{data+Sa{hash(data)}}先hash数据,对hash值用sa加密,将数据和sa加密过的hash值放到一块用Pb加密,
Sb
data+Sa{hash(data)} B 用私钥解开  这一步消耗时间太多,效率太次
hash(data)=data1   用A的公钥解开得到hash值 与得到的文件的hash值对比。
Pa
hash(data)=data2
key[data+Sa{hash(data)}]+Pb(key)   综合使用。https就是用的这种方法
密钥交换
1. 用b的公钥加密传给b
2. 密钥交换:IKE( Internet Key Exchange )
公钥加密:
DH (Deffie-Hellman):生成会话密钥,参看如下:
https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange
  DH:
1、A: a,p 协商生成公开的整数a, 大素数p只能被1和自己整除的数
B: a,p
2、A:生成隐私数据 😡 (x<p ),计算得出 a^x%p,发送给B
B:生成隐私数据 :y,计算得出 a^y%p,发送给A
3、A:计算得出 [(a^y%p)^x] %p = a^xy%p,生成为密钥
B:计算得出 [(a^x%p)^y] %p = a^xy%p,生成为密钥
A:
a=5
p=23
x=6
5^6%23=8
19^6%23=2
B
a=5
p=23
y=15
5^15%23=19
8^15%23=2
应用程序:RPM
  文件完整性的两种实施方式
  被安装的文件
  MD5单向散列
  rpm –verify package_name (or -V) 校验包里的每个文件的变化,就是用的hash算法
  发行的软件包文件
  GPG公钥签名
  rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY-redhat*
  rpm –checksig pakage_file_name (or -K)
使用gpg实现对称加密
  对称加密file文件
gpg -c file
ls file.gpg
  在另一台主机上解密file
gpg -o file -d file.gpg
[root@CENTOS7 ~]#cd /data/d1
[root@CENTOS7 d1]#cp /etc/fstab .
[root@CENTOS7 d1]#ls
d2  fstab
[root@CENTOS7 d1]#gpg -c fstab
                          ┌─────────────────────────────────────────────────────┐
                          │ Enter passphrase                                    │
                          │                                                     │
                          │                                                     │
                          │ Passphrase ******__________________________________ │
                          │                                                     │
                          │  <OK>                             <Cancel>     │
                          └─────────────────────────────────────────────────────┘
                          ┌─────────────────────────────────────────────────────┐
                          │ Please re-enter this passphrase                     │
                          │                                                     │
                          │ Passphrase ******__________________________________ │
                          │                                                     │
                          │  <OK>                             <Cancel>     │
                          └─────────────────────────────────────────────────────┘
[root@CENTOS7 d1]#cd
[root@CENTOS7 ~]#cd /data/d1
[root@CENTOS7 d1]#ls
d2  fstab  fstab.gpg
[root@CENTOS7 d1]#cat fstab.gpg
}+???$?Y?^]?Z?#???!°kR[k?垰-Fo???u??3薌¥R2?嘬?q{?£A4+¨C冴o|?K?犖 5?tl£¢+?@±?L$?RR?K?P°???g&? U}Y?ME?A?h′?ma         Z–um?7v3k/
tc??2??^?g皔免A-·LK        ??l”o\б6br?¥n-??????#(??R
       ??m(??p?0·
[root@CENTOS7 d1]#scp /data/d1/fstab.gpg 192.168.30.102:/data/mm
root@192.168.30.102’s password:
fstab.gpg                                                                 100%  374   687.2KB/s   00:00
[root@centos6 mm]#gpg -d fstab.gpg    只是显示,但是不会生成文件
gpg: CAST5 encrypted data
can’t connect to `/root/.gnupg/S.gpg-agent’: No such file or directory
gpg: encrypted with 1 passphrase
#
# /etc/fstab
# Created by anaconda on Tue Mar 27 17:53:47 2018
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk’
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=0a1bc23e-06e5-4210-9b32-0edbff09ca1a /                       xfs     defaults        0 0
UUID=4d8d9214-eeed-4758-8c34-f05492b9ea73 /boot                   xfs     defaults        0 0
UUID=fb669d84-551f-4a70-a11e-f61deec0fd86 /data                   xfs     defaults        0 0
UUID=906330a5-2af1-4bf4-8b2d-9337eaf92250 swap                    swap    defaults        0 0
gpg: WARNING: message was not integrity protected
[root@centos6 mm]#gpg -o f1 -d fstab.gpg     创建解密后的文件 -o f1
gpg: CAST5 encrypted data
can’t connect to `/root/.gnupg/S.gpg-agent’: No such file or directory
gpg: encrypted with 1 passphrase
gpg: WARNING: message was not integrity protected
[root@centos6 mm]#ls
f1  fstab.gpg
[root@centos6 mm]#cat f1
#
# /etc/fstab
# Created by anaconda on Tue Mar 27 17:53:47 2018
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk’
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=0a1bc23e-06e5-4210-9b32-0edbff09ca1a /                       xfs     defaults        0 0
UUID=4d8d9214-eeed-4758-8c34-f05492b9ea73 /boot                   xfs     defaults        0 0
UUID=fb669d84-551f-4a70-a11e-f61deec0fd86 /data                   xfs     defaults        0 0
UUID=906330a5-2af1-4bf4-8b2d-9337eaf92250 swap                    swap    defaults        0 0
使用gpg工具实现公钥加密
  在hostB主机上用公钥加密,在hostA主机上解密–
  在hostA主机上生成公钥/私钥对
gpg –gen-key
  在hostA主机上查看公钥
gpg –list-keys
  在hostA主机上导出公钥到wang.pubkey
gpg -a –export -o wang.pubkey
  从hostA主机上复制公钥文件到需加密的B主机上
scp wang.pubkey hostB:
使用gpg工具实现公钥加密
  在需加密数据的hostB主机上生成公钥/私钥对
gpg –list-keys
gpg –gen-key
  在hostB主机上导入公钥
gpg –import wang.pubkey
gpg –list-keys
  用从hostA主机导入的公钥,加密hostB主机的文件file,生成file.gpg
gpg -e -r wangxiaochun file
file file.gpg
使用gpg工具实现公钥加密
  复制加密文件到hostA主机
scp fstab.gpg hostA:
  在hostA主机解密文件
gpg -d file.gpg
gpg -o file -d file.gpg
  删除公钥和私钥
gpg –delete-keys wangxiaochun
gpg –delete-secret-keys wangxiaochun
[root@CENTOS7 ~]#gpg –gen-key
gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Please select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection?
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048)
Requested keysize is 2048 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0)
Key does not expire at all
Key does not expire at all
Is this correct? (y/N) y
GnuPG needs to construct a user ID to identify your key.
Real name: wang
Name must be at least 5 characters long
Real name: wangge
Email address:
Comment:
You selected this USER-ID:
    “wangge”
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? o
You need a Passphrase to protect your secret key.
You don’t want a passphrase – this is probably a *bad* idea!
I will do it anyway.  You can change your passphrase at any time,
using this program with the option “–edit-key”.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
gpg: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key 96AA6208 marked as ultimately trusted
public and secret key created and signed.
gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0  valid:   1  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 1u
pub   2048R/96AA6208 2018-05-17
      Key fingerprint = 8FE6 085E 5FB5 2C80 6068  3E71 FD59 19AE 96AA 6208
uid                  wangge
sub   2048R/67F30259 2018-05-17
[root@CENTOS7 ~]#gpg –list-key
/root/.gnupg/pubring.gpg
————————
pub   2048R/96AA6208 2018-05-17
uid                  wangge
sub   2048R/67F30259 2018-05-17
[root@CENTOS7 ~]#cd .gnupg
[root@CENTOS7 .gnupg]#ls
gpg.conf           pubring.gpg   random_seed  S.gpg-agent
private-keys-v1.d  pubring.gpg~  secring.gpg  trustdb.gpg
[root@CENTOS7 .gnupg]#ll
total 28
-rw——- 1 root root 7680 May 17 19:34 gpg.conf
drwx—— 2 root root    6 May 17 19:34 private-keys-v1.d
-rw——- 1 root root 1166 May 17 20:01 pubring.gpg
-rw——- 1 root root 1166 May 17 20:01 pubring.gpg~
-rw——- 1 root root  600 May 17 20:01 random_seed
-rw——- 1 root root 2468 May 17 20:01 secring.gpg
srwxr-xr-x 1 root root    0 May 17 19:35 S.gpg-agent
-rw——- 1 root root 1280 May 17 20:01 trustdb.gpg
[root@centos6 .gnupg]#gpg -a –export -o wang.pubkey
scp centos6.pubkey 192.168.30.101:/data/d1
[root@CENTOS7 d1]#ls
centos6.pubkey  d2  fstab  fstab.gpg
[root@CENTOS7 .gnupg]#gpg –import /data/d1/centos6.pubkey
gpg: key B5E37F74: public key “magedu” imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)
[root@CENTOS7 .gnupg]#gpg –list-key
/root/.gnupg/pubring.gpg
————————
pub   2048R/96AA6208 2018-05-17
uid                  wangge
sub   2048R/67F30259 2018-05-17
pub   2048R/B5E37F74 2018-05-17
uid                  magedu
sub   2048R/5F59D856 2018-05-17
[root@CENTOS7 d1]#gpg -e -r magedu fstab
[root@CENTOS7 d1]#scp fstab.gpg 192.168.30.102:/data/mm
[root@centos6 ~]#gpg -o f2 -d /data/mm/fstab.gpg
gpg: encrypted with 2048-bit RSA key, ID 5F59D856, created 2018-05-17
      “magedu”
[root@centos6 ~]#cat f2
#
# /etc/fstab
# Created by anaconda on Tue Mar 27 17:53:47 2018
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk’
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=0a1bc23e-06e5-4210-9b32-0edbff09ca1a /                       xfs     defaults        0 0
UUID=4d8d9214-eeed-4758-8c34-f05492b9ea73 /boot                   xfs     defaults        0 0
UUID=fb669d84-551f-4a70-a11e-f61deec0fd86 /data                   xfs     defaults        0 0
UUID=906330a5-2af1-4bf4-8b2d-9337eaf92250 swap                    swap    defaults        0 0
删除钥匙
[root@CENTOS7 d1]#gpg –list-key
/root/.gnupg/pubring.gpg
————————
pub   2048R/96AA6208 2018-05-17
uid                  wangge
sub   2048R/67F30259 2018-05-17
pub   2048R/B5E37F74 2018-05-17
uid                  magedu
sub   2048R/5F59D856 2018-05-17
[root@CENTOS7 d1]#gpg –delete-keys magedu
gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
pub  2048R/B5E37F74 2018-05-17 magedu
Delete this key from the keyring? (y/N) y
[root@CENTOS7 d1]#gpg –list-key
/root/.gnupg/pubring.gpg
————————
pub   2048R/96AA6208 2018-05-17
uid                  wangge
sub   2048R/67F30259 2018-05-17
[root@CENTOS7 d1]#gpg –list-secret-key wangge
sec   2048R/96AA6208 2018-05-17
uid                  wangge
ssb   2048R/67F30259 2018-05-17
[root@CENTOS7 d1]#gpg –delete-secret-key wangge
gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
sec  2048R/96AA6208 2018-05-17 wangge
Delete this key from the keyring? (y/N) y
This is a secret key! – really delete? (y/N) y
[root@CENTOS7 d1]#gpg –delete-key wangge
gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
pub  2048R/96AA6208 2018-05-17 wangge
Delete this key from the keyring? (y/N) y
[root@CENTOS7 d1]#ll /root/.gnupg
total 20
-rw——- 1 root root 7680 May 17 19:34 gpg.conf
drwx—— 2 root root    6 May 17 19:34 private-keys-v1.d
-rw——- 1 root root    0 May 17 21:12 pubring.gpg
-rw——- 1 root root 1166 May 17 21:11 pubring.gpg~
-rw——- 1 root root  600 May 17 21:07 random_seed
-rw——- 1 root root    0 May 17 21:12 secring.gpg
srwxr-xr-x 1 root root    0 May 17 19:35 S.gpg-agent
-rw——- 1 root root 1280 May 17 21:12 trustdb.gpg
systemd
  POST –> Boot Sequence –> Bootloader –> kernel + initramfs(initrd) —
> rootfs –> /sbin/init
init:  CentOS 5: SysV init
CentOS 6: Upstart
CentOS 7: Systemd
  Systemd:系统启动和服务器守护进程管理器,负责在系统启动或运行时,激
活系统资源,服务器进程和其它进程
  Systemd新特性:
系统引导时实现服务并行启动
按需启动守护进程
自动化的服务依赖关系管理
同时采用socket式与D-Bus总线式激活服务
系统状态快照
systemd
  核心概念:unit
unit表示不同类型的systemd对象,通过配置文件进行标识和配置;文件中
主要包含了系统服务、监听socket、保存的系统快照以及其它与init相关的信息
  配置文件:
/usr/lib/systemd/system:每个服务最主要的启动脚本设置,类似于之前的
/etc/init.d/
/run/systemd/system:系统执行过程中所产生的服务脚本,比上面目录
优先运行
/etc/systemd/system:管理员建立的执行脚本,类似于
/etc/rc.d/rcN.d/Sxx类的功能,比上面目录优先运行
[root@CENTOS7 ~]#cd /usr/lib/systemd/system
[root@CENTOS7 system]#ls
abrt-ccpp.service                        iscsid.service                      runlevel1.target
abrtd.service                            iscsid.socket                       runlevel1.target.wants
abrt-oops.service                        iscsi.service                       runlevel2.target
abrt-pstoreoops.service                  iscsi-shutdown.service              runlevel2.target.wants
abrt-vmcore.service                      iscsiuio.service                    runlevel3.target
abrt-xorg.service                        iscsiuio.socket                     runlevel3.target.wants
service相当于centos 中的/etc/init.d中的程序
ll /etc/systemd/system
total 4
drwxr-xr-x. 2 root root   31 Mar 27 18:00 basic.target.wants
drwxr-xr-x. 2 root root   31 Mar 27 17:57 bluetooth.target.wants
lrwxrwxrwx. 1 root root   41 Mar 27 17:57 dbus-org.bluez.service -> /usr/lib/systemd/system/bluetooth.service
lrwxrwxrwx. 1 root root   44 Mar 27 18:00 dbus-org.freedesktop.Avahi.service -> /usr/lib/systemd/system/avahi-daemon.service
lrwxrwxrwx. 1 root root   44 Mar 27 18:00 dbus-org.freedesktop.ModemManager1.service -> /usr/lib/systemd/system/ModemManager.service
lrwxrwxrwx. 1 root root   46 Mar 27 17:57 dbus-org.freedesktop.NetworkManager.service -> /usr/lib/systemd/system/NetworkManager.service
lrwxrwxrwx. 1 root root   57 Mar 27 17:57 dbus-org.freedesktop.nm-dispatcher.service -> /usr/lib/systemd/system/NetworkManager-dispatcher.service
lrwxrwxrwx. 1 root root   36 Mar 27 18:05 default.target -> /lib/systemd/system/graphical.target
drwxr-xr-x. 2 root root   87 Mar 27 17:56 default.target.wants
drwxr-xr-x. 2 root root   38 Mar 27 18:00 dev-virtio\x2dports-org.qemu.guest_agent.0.device.wants
lrwxrwxrwx. 1 root root   35 Mar 27 17:59 display-manager.service -> /usr/lib/systemd/system/gdm.service
drwxr-xr-x. 2 root root   32 Mar 27 17:56 getty.target.wants
drwxr-xr-x. 2 root root   65 Mar 27 18:08 graphical.target.wants
drwxr-xr-x. 2 root root 4096 May  5 15:56 multi-user.target.wants
drwxr-xr-x. 2 root root   26 Mar 27 17:58 printer.target.wants
drwxr-xr-x. 2 root root   31 Mar 27 17:57 remote-fs.target.wants
drwxr-xr-x. 2 root root  141 Apr 30 17:35 sockets.target.wants
drwxr-xr-x. 2 root root   36 Mar 27 18:00 spice-vdagentd.target.wants
drwxr-xr-x. 2 root root  169 Mar 27 17:57 sysinit.target.wants
drwxr-xr-x. 2 root root   44 Mar 27 17:56 system-update.target.wants
drwxr-xr-x. 2 root root   29 Mar 27 17:57 vmtoolsd.service.requires
target 拥有runlevel的功能
Unit类型
  Systemctl –t help 查看unit类型
  Service unit: 文件扩展名为.service, 用于定义系统服务
  Target unit: 文件扩展名为.target,用于模拟实现运行级别
  Device unit: .device, 用于定义内核识别的设备
  Mount unit: .mount, 定义文件系统挂载点
  Socket unit: .socket, 用于标识进程间通信用的socket文件,也可在系统启动时,
延迟启动服务,实现按需启动
  Snapshot unit: .snapshot, 管理系统快照
  Swap unit: .swap, 用于标识swap设备
  Automount unit: .automount,文件系统的自动挂载点,神奇的目录
   Path unit: .path,用于定义文件系统中的一个文件或目录使用,常用于当文件系统变化时,
延迟激活服务,如:spool 目录
比如/var/spool/at,at一个计划任务,根据时间点进行执行。
[root@CENTOS7 system]#systemctl -t help    查看系统支持的unit类型
Available unit types:
service
socket
busname
target     大概相当于centos6上的init7中模式
snapshot
device
mount
automount
swap
timer
path
slice
scope
特性
  关键特性:
基于socket的激活机制:socket与服务程序分离
基于d-bus的激活机制:
基于device的激活机制:
基于path的激活机制:
系统快照:保存各unit的当前状态信息于持久存储设备中
向后兼容sysv init脚本
  不兼容:
systemctl命令固定不变,不可扩展    如果这些软件是基于systemd开发的就能管理反之不能管理。就是说一个服务必须由systemctl开启才能用systemctl关闭,用别的开启不能用systemctl关闭
非由systemd启动的服务,systemctl无法与之通信和控制
管理服务
  管理系统服务:
CentOS 7: service unit
注意:能兼容早期的服务脚本
  命令:systemctl COMMAND name.service
  启动:service name start ==> systemctl start name.service
  停止:service name stop ==> systemctl stop name.service
  重启:service name restart ==> systemctl restart name.service
  状态:service name status ==> systemctl status name.service
   这样写的好处是一次性可以跟多个服务,多个服务之间用空格隔开
[root@CENTOS7 system]#systemctl status  atd
● atd.service – Job spooling tools
   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2018-05-14 19:10:17 CST; 31min ago
 Main PID: 1043 (atd)
   CGroup: /system.slice/atd.service
           └─1043 /usr/sbin/atd -f
May 14 19:10:17 CENTOS7.localdomain systemd[1]: Started Job spooling tools.
May 14 19:10:17 CENTOS7.localdomain systemd[1]: Starting Job spooling tools…
[root@CENTOS7 system]#service atd status
Redirecting to /bin/systemctl status atd.service
● atd.service – Job spooling tools
   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2018-05-14 19:10:17 CST; 32min ago
 Main PID: 1043 (atd)
   CGroup: /system.slice/atd.service
           └─1043 /usr/sbin/atd -f
May 14 19:10:17 CENTOS7.localdomain systemd[1]: Started Job spooling tools.
May 14 19:10:17 CENTOS7.localdomain systemd[1]: Starting Job spooling tools…
管理服务
  条件式重启:已启动才重启,否则不做操作
service name condrestart ==> systemctl try-restart name.service
  重载或重启服务:先加载,再启动
systemctl reload-or-restart name.service
  重载或条件式重启服务:
systemctl reload-or-try-restart name.service
  禁止自动和手动启动:
systemctl mask name.service
  取消禁止:
systemctl unmask name.service
[root@CENTOS7 ~]#systemctl stop atd
[root@CENTOS7 ~]#systemctl mask atd
Created symlink from /etc/systemd/system/atd.service to /dev/null.
[root@CENTOS7 ~]#ll /etc/systemd/system    这个文件的优先级高,mask以后无法手动启动
total 4
lrwxrwxrwx  1 root root    9 May 14 19:48 atd.service -> /dev/null
[root@CENTOS7 ~]#systemctl start atd
Failed to start atd.service: Unit is masked.
[root@CENTOS7 ~]#systemctl unmask atd    取消mask
Removed symlink /etc/systemd/system/atd.service.
Removed symlink /etc/systemd/system/atd.service.
[root@CENTOS7 ~]#systemctl start atd
[root@CENTOS7 ~]#systemctl status atd
● atd.service – Job spooling tools
   Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2018-05-14 19:51:22 CST; 13s ago
服务查看
  查看某服务当前激活与否的状态:
systemctl is-active name.service
  查看所有已经激活的服务:
systemctl list-units –type|-t service
  查看所有服务:
systemctl list-units –type service –all|-a
  chkconfig命令的对应关系:
  设定某服务开机自启:
chkconfig name on ==> systemctl enable name.service
  设定某服务开机禁止启动:
chkconfig name off ==> systemctl disable name.service
[root@CENTOS7 ~]#systemctl is-active atd     查看atd服务起没启动
active
[root@CENTOS7 ~]#systemctl is-active httpd
unknown
[root@CENTOS7 ~]#echo $?
3
[root@CENTOS7 ~]#systemctl list-units -t service   列出已经加载的service程序
  UNIT                               LOAD   ACTIVE SUB     DESCRIPTION
  abrt-ccpp.service                  loaded active exited  Install ABRT coredump hook
  abrt-oops.service                  loaded active running ABRT kernel log watcher
  abrt-xorg.service                  loaded active running ABRT Xorg log watcher
  abrtd.service                      loaded active running ABRT Automated Bug Reporting Tool
  accounts-daemon.service            loaded active running Accounts Service
68 loaded units listed. Pass –all to see loaded but inactive units, too.
To show all installed unit files use ‘systemctl list-unit-files’.
[root@CENTOS7 ~]#systemctl list-units -t service -all  列出所有的service程序
144 loaded units listed.
To show all installed unit files use ‘systemctl list-unit-files’.
[root@CENTOS7 ~]#systemctl list-units   列出所有加载的units
[root@CENTOS7 ~]#systemctl list-units -all     列出所有的加载和没加载的units
[root@CENTOS7 ~]#systemctl disable atd    开机不启动atd
Removed symlink /etc/systemd/system/multi-user.target.wants/atd.service.
[root@CENTOS7 ~]#systemctl enable atd    开机启动atd
Created symlink from /etc/systemd/system/multi-user.target.wants/atd.service to /usr/lib/systemd/system/atd.service.
[root@CENTOS7 ~]#ll /etc/systemd/system/multi-user.target.wants/atd.service     开机启动就是创建了这个软连接,不启动就是删除了这个软连接
lrwxrwxrwx 1 root root 35 May 14 20:04 /etc/systemd/system/multi-user.target.wants/atd.service -> /usr/lib/systemd/system/atd.service
multi-user.target   相当于centos6中的运行在上面模式就是rc3.d
[root@CENTOS7 ~]#ls /etc/systemd/system/multi-user.target.wants -l   这里的文件就相当于rc3.d中S开头的文件
total 0
lrwxrwxrwx. 1 root root 41 Mar 27 17:57 abrt-ccpp.service -> /usr/lib/systemd/system/abrt-ccpp.service
lrwxrwxrwx. 1 root root 37 Mar 27 17:56 abrtd.service -> /usr/lib/systemd/system/abrtd.service
lrwxrwxrwx. 1 root root 41 Mar 27 17:56 abrt-oops.service -> /usr/lib/systemd/system/abrt-oops.service
lrwxrwxrwx. 1 root root 43 Mar 27 17:57 abrt-vmcore.service -> /usr/lib/systemd/system/abrt-vmcore.service
lrwxrwxrwx. 1 root root 41 Mar 27 17:56 abrt-xorg.service -> /usr/lib/systemd/system/abrt-xorg.service
lrwxrwxrwx  1 root root 35 May 14 20:04 atd.service -> /usr/lib/systemd/system/atd.service
lrwxrwxrwx. 1 root root 38 Mar 27 17:57 auditd.service -> /usr/lib/systemd/system/auditd.service
lrwxrwxrwx. 1 root root 38 Apr 20 16:28 autofs.service -> /usr/lib/systemd/system/autofs.service
lrwxrwxrwx. 1 root root 44 Mar 27 18:00 avahi-daemon.service -> /usr/lib/systemd/system/avahi-daemon.service
lrwxrwxrwx. 1 root root 39 May  5 15:56 chronyd.service -> /usr/lib/systemd/system/chronyd.service
lrwxrwxrwx. 1 root root 37 Mar 27 17:56 crond.service -> /usr/lib/systemd/system/crond.service
lrwxrwxrwx. 1 root root 33 Mar 27 17:58 cups.path -> /usr/lib/systemd/system/cups.path
lrwxrwxrwx. 1 root root 36 Mar 27 17:58 cups.service -> /usr/lib/systemd/system/cups.service
lrwxrwxrwx. 1 root root 42 Mar 27 18:00 irqbalance.service -> /usr/lib/systemd/system/irqbalance.service
lrwxrwxrwx. 1 root root 37 Mar 27 17:57 kdump.service -> /usr/lib/systemd/system/kdump.service
lrwxrwxrwx. 1 root root 35 Mar 27 17:57 ksm.service -> /usr/lib/systemd/system/ksm.service
lrwxrwxrwx. 1 root root 40 Mar 27 17:57 ksmtuned.service -> /usr/lib/systemd/system/ksmtuned.service
lrwxrwxrwx. 1 root root 46 Mar 27 17:56 libstoragemgmt.service -> /usr/lib/systemd/system/libstoragemgmt.service
lrwxrwxrwx. 1 root root 38 Mar 27 18:00 mcelog.service -> /usr/lib/systemd/system/mcelog.service
lrwxrwxrwx. 1 root root 41 Mar 27 17:57 mdmonitor.service -> /usr/lib/systemd/system/mdmonitor.service
lrwxrwxrwx. 1 root root 44 Mar 27 18:00 ModemManager.service -> /usr/lib/systemd/system/ModemManager.service
lrwxrwxrwx. 1 root root 46 Mar 27 17:57 NetworkManager.service -> /usr/lib/systemd/system/NetworkManager.service
lrwxrwxrwx. 1 root root 41 Mar 27 17:57 nfs-client.target -> /usr/lib/systemd/system/nfs-client.target
lrwxrwxrwx. 1 root root 39 Mar 27 18:00 postfix.service -> /usr/lib/systemd/system/postfix.service
lrwxrwxrwx. 1 root root 40 Mar 27 17:56 remote-fs.target -> /usr/lib/systemd/system/remote-fs.target
lrwxrwxrwx. 1 root root 36 Mar 27 18:00 rngd.service -> /usr/lib/systemd/system/rngd.service
lrwxrwxrwx. 1 root root 39 Mar 27 18:00 rsyslog.service -> /usr/lib/systemd/system/rsyslog.service
lrwxrwxrwx. 1 root root 38 Mar 27 18:00 smartd.service -> /usr/lib/systemd/system/smartd.service
lrwxrwxrwx. 1 root root 36 Mar 27 18:00 sshd.service -> /usr/lib/systemd/system/sshd.service
lrwxrwxrwx. 1 root root 39 Mar 27 18:00 sysstat.service -> /usr/lib/systemd/system/sysstat.service
lrwxrwxrwx. 1 root root 37 Mar 27 18:00 tuned.service -> /usr/lib/systemd/system/tuned.service
lrwxrwxrwx. 1 root root 40 Mar 27 17:57 vmtoolsd.service -> /usr/lib/systemd/system/vmtoolsd.service
[root@CENTOS7 ~]#systemctl is-enabled sshd   查看一个服务是否开机启动
enabled
服务查看
  查看所有服务的开机自启状态:
chkconfig –list ==> systemctl list-unit-files –type service
  用来列出该服务在哪些运行级别下启用和禁用
chkconfig sshd –list ==>
ls /etc/systemd/system/*.wants/sshd.service
  查看服务是否开机自启:
systemctl is-enabled name.service
  其它命令:
查看服务的依赖关系:
systemctl list-dependencies name.service
  杀掉进程:
systemctl kill unitname
[root@CENTOS7 ~]#systemctl list-unit-files –type service    列出所有服务
UNIT FILE                                     STATE
abrt-ccpp.service                             enabled
abrt-oops.service                             enabled
abrt-pstoreoops.service                       disabled
[root@CENTOS7 ~]#ls /etc/systemd/system/*.wants/sshd.service   查看sshd在上面模式下是开机启动的。只有在这个multi-user.target.wants模式下启动
/etc/systemd/system/multi-user.target.wants/sshd.service
[root@CENTOS7 ~]#ls /etc/systemd/system/*.wants
/etc/systemd/system/graphical.target.wants:   5 模式  ,在centos7上各个模式有可能存在依赖关系,5模式就调用了3模式.3模式上启动上面5模式只多不少
[root@CENTOS7 ~]#systemctl list-dependencies sshd   查看sshd的依赖性,依赖性特别多,basic.target相当于服务的集合
sshd.service
● ├─sshd-keygen.service
● ├─system.slice
● └─basic.target
服务状态
  systemctl list-unit-files –type service –all显示状态
  loaded:Unit配置文件已处理     已经加载到内存中
  active(running):一次或多次持续处理的运行   一直在运行
  active(exited):成功完成一次性的配置      运行一次就退出了
  active(waiting):运行中,等待一个事件     等待一件事情完成在继续运行
  inactive:不运行
  enabled:开机启动
  disabled:开机不启动
  static:开机不启动,但可被另一个启用的服务激活
在centos上 nfs服务依赖于rpcbind,service rpcbind stop 那么nfs服务无法启动
在centos7上可以直接启动nfs-server,systed会自动帮你启动rpcbind服务。
[root@CENTOS7 ~]#systemctl status rpcbind nfs-server
● rpcbind.service – RPC bind service
   Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; indirect; vendor preset: enabled)
   Active: inactive (dead)
● nfs-server.service – NFS server and services
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
[root@CENTOS7 ~]#systemctl start nfs-server    启动nfs-server服务自动启动rpcbind
[root@CENTOS7 ~]#systemctl status rpcbind nfs-server
● rpcbind.service – RPC bind service
   Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; indirect; vendor preset: enabled)
   Active: active (running) since Mon 2018-05-14 20:40:51 CST; 47s ago
  Process: 3319 ExecStart=/sbin/rpcbind -w $RPCBIND_ARGS (code=exited, status=0/SUCCESS)
 Main PID: 3320 服务
   CGroup: /system.slice/rpcbind.service
           └─3320 /sbin/rpcbind -w
May 14 20:40:51 CENTOS7.localdomain systemd[1]: Starting RPC bind service…
May 14 20:40:51 CENTOS7.localdomain systemd[1]: Started RPC bind service.
● nfs-server.service – NFS server and services
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
   Active: active (exited) since Mon 2018-05-14 20:41:30 CST; 8s ago
  Process: 3340 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS (code=exited, status=0/SUCCESS)
  Process: 3335 ExecStartPre=/bin/sh -c /bin/kill -HUP `cat /run/gssproxy.pid` (code=exited, status=0/SUCCESS)
  Process: 3333 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
 Main PID: 3340 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/nfs-server.service
May 14 20:41:30 CENTOS7.localdomain systemd[1]: Starting NFS server and services…
May 14 20:41:30 CENTOS7.localdomain systemd[1]: Started NFS server and services.
[root@CENTOS7 ~]#yum install telnet-server   这是个非独立服务,在centos6上有xinetd管理,在cengtos7上由systemd管理
[root@CENTOS7 ~]#systemctl start telnet.socket
[root@CENTOS7 ~]#ss -ntpel
LISTEN     0      128                                    :::23                                                 :::*                   users:((“systemd”,pid=1,fd=29)) ino:39847 sk:ffff880000079980 v6only:0 <->
users:((“systemd”,pid=1,fd=29)) ino:39847 sk:ffff880000079980 v6only:0 <->
[root@CENTOS7 ~]#ps aux | grep telnet     没有启动这个服务
root       3688  0.0  0.0 112660   968 pts/0    S+   20:51   0:00 grep –color=auto telnet
当用centos6的telnet连接centos7时由systemd来激活telnet服务
[root@CENTOS7 ~]#ps aux | grep telnet
root       3719  0.0  0.1  39440  1552 ?        Ss   20:53   0:00 in.telnetd: ::ffff:192.168.30.102
systemctl 命令示例
  显示所有单元状态
systemctl 或 systemctl list-units
  只显示服务单元的状态
systemctl –type=service
  显示sshd服务单元
systemctl –l status sshd.service
  验证sshd服务当前是否活动
systemctl is-active sshd
  启动,停止和重启sshd服务
systemctl start sshd.service
systemctl stop sshd.service
systemctl restart sshd.service
[root@CENTOS7 ~]#systemctl -t socket   查看启用的socket服务
UNIT                         LOAD   ACTIVE SUB       DESCRIPTION
avahi-daemon.socket          loaded active running   Avahi mDNS/DNS-SD Stack Activation Socket
cups.socket                  loaded active running   CUPS Printing Service Sockets
dbus.socket                  loaded active running   D-Bus System Message Bus Socket
dm-event.socket              loaded active listening Device-mapper event daemon FIFOs
iscsid.socket                loaded active listening Open-iSCSI iscsid Socket
iscsiuio.socket              loaded active listening Open-iSCSI iscsiuio Socket
lvm2-lvmetad.socket          loaded active running   LVM2 metadata daemon socket
lvm2-lvmpolld.socket         loaded active listening LVM2 poll daemon socket
[root@CENTOS7 ~]#systemctl -t socket -all    查看所有的socket服务
UNIT                         LOAD   ACTIVE   SUB       DESCRIPTION
avahi-daemon.socket          loaded active   running   Avahi mDNS/DNS-SD Stack Activation Socket
cups.socket                  loaded active   running   CUPS Printing Service Sockets
dbus.socket                  loaded active   running   D-Bus System Message Bus Socket
systemctl 命令示例
  重新加载配置
systemctl reload sshd.service   从新加载某个服务,比restart平滑,不会关闭服务。
  列出活动状态的所有服务单元
systemctl list-units –type=service
  列出所有服务单元
systemctl list-units –type=service –all
  查看服务单元的启用和禁用状态
systemctl list-unit-files –type=service
  列出失败的服务
systemctl –failed –type=service
[root@CENTOS7 ~]#systemctl –failed -t service
  UNIT          LOAD   ACTIVE SUB    DESCRIPTION
● kdump.service loaded failed failed Crash recovery kernel arming    一点内核崩溃可以查看这个,可能由于内存不够而加载失败
systemctl 命令示例
  列出依赖的单元
systemctl list-dependencies sshd
  验证sshd服务是否开机启动
systemctl is-enabled sshd
  禁用network,使之不能自动启动,但手动可以
systemctl disable network
  启用network
systemctl enable network
  禁用network,使之不能手动或自动启动
systemctl mask network
  启用network
systemctl unmask network
service unit文件格式
  /etc/systemd/system:系统管理员和用户使用/usr/lib/systemd/system:发
行版打包者使用
  以 “#” 开头的行后面的内容会被认为是注释
  相关布尔值,1、yes、on、true 都是开启,0、no、off、false 都是关闭
  时间单位默认是秒,所以要用毫秒(ms)分钟(m)等须显式说明
  service unit file文件通常由三部分组成:
  [Unit]:定义与Unit类型无关的通用选项;用于提供unit的描述信息、unit行为
及依赖关系等
  [Service]:与特定类型相关的专用选项;此处为Service类型
  [Install]:定义由“systemctl enable”以及”systemctl disable“命令在实现
服务启用或禁用时用到的一些选项
[root@CENTOS7 ~]#ll /etc/systemd/system       这个文件相当于centos6上的/etc/rcN.d
total 4
drwxr-xr-x. 2 root root   31 Mar 27 18:00 basic.target.wants
drwxr-xr-x. 2 root root   31 Mar 27 17:57 bluetooth.target.wants
lrwxrwxrwx. 1 root root   41 Mar 27 17:57 dbus-org.bluez.service -> /usr/lib/systemd/system/bluetooth.service
[root@CENTOS7 ~]#cat /usr/lib/systemd/system/atd.service  这个文件的作用类似于centos6上/etc/init.d中的脚本
在centos7上变成文本形式
[Unit]
Description=Job spooling tools        描述
After=syslog.target systemd-user-sessions.service   依赖关系晚于这些服务启动
[Service]  这个和文件类型相关
EnvironmentFile=/etc/sysconfig/atd
ExecStart=/usr/sbin/atd -f $OPTS
IgnoreSIGPIPE=no
[Install]
WantedBy=multi-user.target
service unit文件格式
  Unit段的常用选项:
  Description:描述信息
  After:定义unit的启动次序,表示当前unit应该晚于哪些unit启动,其功能与
Before相反
  Requires:依赖到的其它units,强依赖,被依赖的units无法激活时,当前unit
也无法激活
  Wants:依赖到的其它units,弱依赖
  Conflicts:定义units间的冲突关系
service unit文件格式
   Service段的常用选项:
   Type:定义影响ExecStart及相关参数的功能的unit进程启动类型
   simple:默认值,这个daemon主要由ExecStart接的指令串来启动,启动后常驻于内
存中
   forking:由ExecStart启动的程序透过spawns延伸出其他子程序来作为此daemon的
主要服务。原生父程序在启动结束后就会终止
   oneshot:与simple类似,不过这个程序在工作完毕后就结束了,不会常驻在内存中
   dbus:与simple类似,但这个daemon必须要在取得一个D-Bus的名称后,才会继续
运作.因此通常也要同时设定BusNname= 才行
   notify:在启动完成后会发送一个通知消息。还需要配合 NotifyAccess 来让 Systemd
接收消息
  idle:与simple类似,要执行这个daemon必须要所有的工作都顺利执行完毕后才会执
行。这类的daemon通常是开机到最后才执行即可的服务
service unit文件格式
  EnvironmentFile:环境配置文件
  ExecStart:指明启动unit要运行命令或脚本的绝对路径
  ExecStartPre: ExecStart前运行
  ExecStartPost: ExecStart后运行
  ExecStop:指明停止unit要运行的命令或脚本
  Restart:当设定Restart=1 时,则当次daemon服务意外终止后,会再次自动
启动此服务  类似于再生机制
service unit文件格式
  Install段的常用选项:
  Alias:别名,可使用systemctl command Alias.service
  RequiredBy:被哪些units所依赖,强依赖
  WantedBy:被哪些units所依赖,弱依赖
  Also:安装本服务的时候还要安装别的相关服务
  注意:对于新创建的unit文件,或者修改了的unit文件,要通知systemd重载此
配置文件,而后可以选择重启
systemctl daemon-reload
服务Unit文件示例:
  vim /etc/systemd/system/bak.service
[Unit]
Description=backup /etc
Requires=atd.service
[Service]
Type=simple
ExecStart=/bin/bash -c “echo /data/bak.sh|at now”
[Install]
WantedBy=multi-user.target
  systemctl daemon-reload
  systemctl start bak
运行级别
   target units:
unit配置文件:.target
ls /usr/lib/systemd/system/*.target
systemctl list-unit-files –type target –all
   运行级别:
0 ==> runlevel0.target, poweroff.target
1 ==> runlevel1.target, rescue.target
2 ==> runlevel2.target, multi-user.target
3 ==> runlevel3.target, multi-user.target
4 ==> runlevel4.target, multi-user.target
5 ==> runlevel5.target, graphical.target
6 ==> runlevel6.target, reboot.target
   查看依赖性:
systemctl list-dependencies graphical.target
运行级别
   级别切换:init N ==> systemctl isolate name.target
systemctl isolate multi-user.target
注:只有/lib/systemd/system/*.target文件中AllowIsolate=yes 才能切换(修改
文件需执行systemctl daemon-reload才能生效)
   查看target:
runlevel ; who -r
systemctl list-units –type target
   获取默认运行级别:
/etc/inittab ==> systemctl get-default
   修改默认级别:
/etc/inittab ==> systemctl set-default name.target
systemctl set-default multi-user.target
ls –l /etc/systemd/system/default.target
[root@CENTOS7 ~]#systemctl get-default    查看当前模式
graphical.target
[root@CENTOS7 ~]#systemctl set-default multi-user.target 3模式    修改进入的模式
Removed symlink /etc/systemd/system/default.target.
Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/multi-user.target.
[root@CENTOS7 ~]#systemctl get-default   重启进入字符界面
multi-user.target
[root@CENTOS7 ~]#systemctl set-default graphical.target    启动进入5模式
Removed symlink /etc/systemd/system/default.target.
Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/graphical.target.
[root@CENTOS7 ~]#systemctl get-default
graphical.target
也可以rm -f /etc/systemd/system/default.target
创建软连接一样可以
ln -s /usr/lib/systemd/system/graphical.target /etc/systemd/system/default.target
systemctl isolate multi-user.target   等价于init3
其它命令
  切换至紧急救援模式:
systemctl rescue
  切换至emergency模式:
systemctl emergency
  其它常用命令:
传统命令init,poweroff,halt,reboot都成为
systemctl的软链接
关机:systemctl halt、systemctl poweroff
重启:systemctl reboot
挂起:systemctl suspend
休眠:systemctl hibernate
休眠并挂起:systemctl hybrid-sleep
CentOS7引导顺序
  UEFi或BIOS初始化,运行POST开机自检
  选择启动设备
  引导装载程序, centos7是grub2
  加载装载程序的配置文件:/etc/grub.d/ /etc/default/grub
/boot/grub2/grub.cfg
  加载initramfs驱动模块
  加载内核选项
  内核初始化,centos7使用systemd代替init
  执行initrd.target所有单元,包括挂载/etc/fstab
  从initramfs根文件系统切换到磁盘根目录
  systemd执行默认target配置,配置文件/etc/systemd/system/default.target
  systemd执行sysinit.target初始化系统及basic.target准备操作系统
  systemd启动multi-user.target下的本机与服务器服务
  systemd执行multi-user.target下的/etc/rc.d/rc.local
  Systemd执行multi-user.target下的getty.target及登录服务
  systemd执行graphical需要的服务
在centos7上service用的是文本文件,调用2进制程序来完成启动服务的开启,用unit单元代替了脚本。
设置内核参数?
  设置内核参数,只影响当次启动
  启动时,在linux16行后添加systemd.unit=desired.target
  systemd.unit=emergency.target
  systemd.unit=rescue.target
  rescue.target 比emergency 支持更多的功能,例如日志等
  systemctl default 进入默认target
删除默认启动模式,指定重启模式,这样电脑就会无限重启,修复方法
rm -f /etc/systemd/system/defualt.target
ln -s /usr/lib/systemd/system/reboot.target /etc/systemd/system/default.target
reboot
修复
1.e
2.在linux16 行后加入 systemd.unit=multi-user.target
3.Ctrl+x
4.重启后能开启centos7,进入登录界面后修改default.target
systemctl set-default graphical.target
破解CentOS7的root口令方法一
  启动时任意键暂停启动
  按e键进入编辑模式
  将光标移动linux16开始的行,添加内核参数rd.break
  按ctrl-x启动
  mount –o remount,rw /sysroot
  chroot /sysroot
  passwd root
  touch /.autorelabel
  exit
  reboot
如果没有禁用selinux则必须在跟目录下创建touch /.autorelabel
破解CentOS7的root口令方法二
  启动时任意键暂停启动
  按e键进入编辑模式
  将光标移动linux16开始的行,改为rw init=/sysroot/bin/sh
  按ctrl-x启动
  chroot /sysroot
  passwd root
  touch /.autorelabel
  exit
  reboot
修复GRUB2
  GRUB“the Grand Unified Bootloader”
引导提示时可以使用命令行界面
可从文件系统引导
  主要配置文件 /boot/grub2/grub.cfg
  修复配置文件
grub2-mkconfig > /boot/grub2/grub.cfg
  修复grub
grub2-install /dev/sda BIOS环境
grub2-install UEFI环境
  调整默认启动内核
vim /etc/default/grub
GRUB_DEFAULT=0
清空/boot/grub2/下的所有文件修复方法:rm -rf /boot/grub2/*
1.进入救援模式
2.chroot /mnt/sysimage 或者 grub2-install –root-directory=/mnt/sysimage /dev/sda
grub2-install /dev/sda
3.grub2-mkconfig >(-o) /boot/grub2/grub.cfg
如果不做第3步,直接重启
insmod xfs
set root=(hd0,1)
linux16 /vmlinuz-3.10.0-693.el7.x86_64 root=UUID=0a1bc23e-06e5-4210-9b32-0edbff09ca1a ro crashkernel=auto rhgb quiet net.ifnames=0 selinux=0
initrd16 /initramfs-3.10.0-693.el7.x86_64.img   支持Tab键补全
boot  启动
修改默认启动选项
[root@CENTOS7 grub2]#cat /etc/default/grub
GRUB_DEFAULT=saved   修改这个saved改成1则是第2项2就是第3项修改之后要用命令
grub2-mkconfig -o /boot/grub2/grub.cfg
[root@CENTOS7 grub2]#cat grub.cfg
 set default=”${saved_entry}”
删除centos7中/boot/下的所有文件
1.chroot /mnt/sysimage
mount /dev/sr0 /mnt
2.rpm -ivh /mnt/Packages/kernel-3.10.0-693.e17.x86_64.rpm –force
3.grub2-install /dev/sda
4.grub2-mkconfig -o /boot/grub2/grub.cfg
5.reboot
SELinux介绍
  SELinux: Secure Enhanced Linux, 是美国国家安全局(NSA=The National
Security Agency)和SCC(Secure Computing Corporation)开发的 Linux的一
个强制访问控制的安全模块。2000年以GNU GPL发布,Linux内核2.6版本后集
成在内核中
  DAC:Discretionary Access Control自由访问控制
  MAC:Mandatory Access Control 强制访问控制
  DAC环境下进程是无束缚的
  MAC环境下策略的规则决定控制的严格程度
  MAC环境下进程可以被限制的
  策略被用来定义被限制的进程能够使用那些资源(文件和端口)
  默认情况下,没有被明确允许的行为将被拒绝
SELinux工作类型
  SELinux有四种工作类型:
  strict: centos5,每个进程都受到selinux的控制,识别的可以用,不识别的用统统拒绝
  targeted: 用来保护常见的网络服务,仅有限进程受到selinux控制,只监控容易,只保护常见的服务,未知的服务是允许的
被入侵的进程,centos4只保护13个服务,centos5保护88个服务
  minimum:centos7,修改的targeted,只对选择的网络服务
  mls:提供MLS(多级安全)机制的安全性
  targeted为默认类型,minimum和mls稳定性不足,未加以应用,strict已不再
使用
centos7上的selinux类型
[root@CENTOS7 ~]#cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing – SELinux security policy is enforced.
#     permissive – SELinux prints warnings instead of enforcing.selinux不起作用但是会报警
#     disabled – No SELinux policy is loaded.  彻底禁用
SELINUX=disabled
# SELINUXTYPE= can take one of three two values:
#     targeted – Targeted processes are protected,
#     minimum – Modification of targeted policy. Only selected processes are protected.
#     mls – Multi Level Security protection.
SELINUXTYPE=targeted
SELinux安全上下文
  传统Linux,一切皆文件,由用户,组,权限控制访问
  在SELinux中,一切皆对象(object),由存放在inode的扩展属性域的
安全元素所控制其访问
  所有文件和端口资源和进程都具备安全标签:安全上下文(security
context)
  安全上下文有五个元素组成:
  user(用户):role(角色):type(类型):sensitivity(敏感度):category(类别)
  user_u:object_r:tmp_t:s0:c0
   实际上下文:存放在文件系统中,ls –Z;ps –Z
  期望(默认)上下文:存放在二进制的SELinux策略库(映射目录和期望安
全上下文)中
semanage fcontext –l
[root@CENTOS7 ~]#ll -Z /etc/fstab
-rw-r–r–. root root system_u:object_r:etc_t:s0       /etc/fstab
五个安全元素
  User:指示登录系统的用户类型,如root,user_u,system_u(系统文件),多数本地进程都属于自
由(unconfined:无限制的)进程
  Role:定义文件,进程和用户的用途:文件:object_r,进程和用户:系统进程system_r  用户创建的一般是unconfined
  Type:指定数据类型,规则中定义何种进程类型访问何种文件Target策略基于
type实现,多服务共用:public_content_t    一个进程是否能访问文件
  Sensitivity:限制访问的需要,由组织定义的分层安全级别,如unclassified,
secret,top,secret, 一个对象有且只有一个sensitivity,分0-15级,s0最
低,Target策略默认使用s0
  Category:对于特定组织划分不分层的分类,如FBI Secret,NSA secret, 一个
对象可以有多个categroy, c0-c1023共1024个分类, Target 策略不使用
category
临时禁用启用selinux
setenforce 1    启用
setenforce 0    禁用
如果/etc/selinux/config文件中SELINUX=disabled,那么想要修改就必须重新启动
启动时会很慢因为selinux要把在禁用这段时间新建的所有文件打标签
[root@CENTOS7 ~]# sestatus
SELinux status:                 enabled    启用的
SELinuxfs mount:                /sys/fs/selinux
SELinux root directory:         /etc/selinux   家目录
Loaded policy name:             targeted    加载策略
Current mode:                   enforcing  当前的状态
Mode from config file:          enforcing  文件的状态
Policy MLS status:              enabled
Policy deny_unknown status:     allowed
Max kernel policy version:      28
SELinux策略
  对象(object):所有可以读取的对象,包括文件、目录和进程,端口等
  主体:进程称为主体(subject)
  SELinux中对所有的文件都赋予一个type的文件类型标签,对于所有的进程也赋
予各自的一个domain的标签。domain标签能够执行的操作由安全策略里定义
  当一个subject试图访问一个object,Kernel中的策略执行服务器将检查AVC (访
问矢量缓存Access Vector Cache), 在AVC中,subject和object的权限被缓存
(cached),查找“应用+文件”的安全环境。然后根据查询结果允许或拒绝访问
  安全策略:定义主体读取对象的规则数据库,规则中记录了哪个类型的主体使用
哪个方法读取哪一个对象是允许还是拒绝的,并且定义了哪种行为是充许或拒绝
设置SELinux
  配置SELinux:
SELinux是否启用
给文件重新打安全标签
给端口设置安全标签
设定某些操作的布尔型开关
SELinux的日志管理
  SELinux的状态:
enforcing: 强制,每个受限的进程都必然受限
permissive: 允许,每个受限的进程违规操作不会被禁止,但会被记录于审
计日志
disabled: 禁用
配置SELinux
  相关命令:
getenforce: 获取selinux当前状态
sestatus :查看selinux状态
setenforce 0|1
0: 设置为permissive
1: 设置为enforcing
  配置文件:
/boot/grub/grub.conf
使用selinux=0禁用SELinux
/etc/selinux/config
/etc/sysconfig/selinux
SELINUX={disabled|enforcing|permissive}
修改SELinux安全标签
  给文件重新打安全标签:
chcon [OPTION]… [-u USER] [-r ROLE] [-t TYPE] FILE…
chcon [OPTION]… –reference=RFILE FILE…
-R:递归打标;
  恢复目录或文件默认的安全上下文:
restorecon [-R] /path/to/somewhere
[root@CENTOS7 ~]#semanage fcontext -l   查看系统所有的什么文件要用什么类型的标签
这个命令所看的文件在
cat /etcselinux/targeted/contexts/files/file_contexts  这是系统默认的上下文
[root@CENTOS7 ~]#semanage fcontext -l | grep “/var/log/messages”    默认的
/var/log/messages[^/]*                             all files          system_u:object_r:var_log_t:s0
[root@CENTOS7 ~]# ll -Z /var/log/messages     硬盘中存放的
-rw——-. root root system_u:object_r:var_log_t:s0   /var/log/messages
cp /var/logmessages /root/
mv /root/messages /var/log
ll -Z /var/log/messages
发现selinux发生改变
logger “this is a text log”   生成一个日志记录在messages中
tail /var/log/messages
并没有记录在日志中说明selinux的type类型发生改变导致log进程无法访问messages文件,从而无法记录
如何修改回去
chcon -t var_log_t /var/log/messages  或者 restorecon /var/log/messages
修改完成后没有马上生效
需要从新启动日志服务
systemctl restart rsyslog
默认安全上下文查询与修改
  Semanage:来自policycoreutils-python包
  查看默认的安全上下文
semanage fcontext –l
  添加安全上下文
semanage fcontext -a –t httpd_sys_content_t ‘/testdir(/.*)?’
restorecon –Rv /testdir
  删除安全上下文
semanage fcontext -d –t httpd_sys_content_t ‘/testdir(/.*)?’
迁移httpd默认显示的文件夹
mkdir /data/html
echo selinux web site > /data/html/index.html
[root@CENTOS7 ~]#vim /etc/httpd/conf/httpd.conf
DocumentRoot “/var/www/html”修改成DocumentRoot “/data/html”
<Directory “/var/www”>    修改成    <Directory “/data/html”>
    AllowOverride None
    # Allow open access:
    Require all granted
systemctl restart httpd
curl 192.168.30.101
打开的是一个测试页面,并不是/data/html/index.html。因为这个文件的标签是default-t
chcon -t httpd_sys_rw_content_t /data/html/index.html这时可以正常访问,但是如果继续再此文件夹下创建的文件还是default_t
因此直接修改文件夹的selinux。
chcon -t httpd_sys_rw_context_t /data/html 这样在这个文件夹下创建的文件都是和这个文件夹一样的selinux
还可以将这个文件夹加入selinux数据库
semanage fcontext -a -t httpd_sys_rw_content_t “/data/html(/.*)?”
这时如果文件夹及其下的文件selinux发生改变
chcon -R -t default_t /data/html
ll -Z
可以用restorecon -R /data/html 来恢复其默认设置
删除数据库信息
semanage fcontext -d -t httpd_sys_rw_content_t “/data/html(/.*)?”
这时使用restorecon -R /data/html
则恢复成 default_t
Selinux端口标签
  查看端口标签
semanage port –l
  添加端口
semanage port -a -t  port_label -p  tcp|udp PORT
semanage port -a -t http_port_t -p tcp 9527
  删除端口
semanage port -d -t  port_label -p  tcp|udp PORT
semanage port -d -t http_port_t -p tcp 9527
  修改现有端口为新标签
semanage port -m -t  port_label -p  tcp|udp PORT
semanage port -m -t http_port_t -p tcp 9527
[root@CENTOS7 ~]#semanage port -l | grep http
http_port_t                    tcp      80, 81, 443, 488, 8008, 8009, 8443, 9000    默认合法的端口号
添加端口
semanage port -a -t http_port_t -p tcp 9527
临时关闭selinux也可以忽略其安全上下文去访问文件.但是仍然会报警。
setenforce 0
semanage port -m -t ssh_port_t -p tcp 9527
这时9527是ssh的合法端口,而原来的http中的9527端口被移除
SELinux布尔值
  布尔型规则:
getsebool
setsebool
  查看bool命令:
getsebool [-a] [boolean]
semanage boolean –l
semanage boolean -l –C 查看修改过的布尔值
  设置bool值命令:
setsebool [-P] boolean value(on,off)
setsebool [-P] Boolean=value(0,1)
[root@CENTOS7 ~]# semanage boolean -l | grep ftp   查看ftp的bool值
                               当前生效的,默认的
ftpd_use_cifs                  (off  ,  off)  Allow ftpd to use cifs
ftpd_connect_db                (off  ,  off)  Allow ftpd to connect db
ftpd_use_fusefs                (off  ,  off)  Allow ftpd to use fusefs
ftpd_full_access               (off  ,  off)  Allow ftpd to full access
tftp_anon_write                (off  ,  off)  Allow tftp to anon write
tftp_home_dir                  (off  ,  off)  Allow tftp to home dir
httpd_can_connect_ftp          (off  ,  off)  Allow httpd to can connect ftp
ftpd_use_passive_mode          (off  ,  off)  Allow ftpd to use passive mode
ftpd_use_nfs                   (off  ,  off)  Allow ftpd to use nfs
ftpd_connect_all_unreserved    (off  ,  off)  Allow ftpd to connect all unreserved
ftpd_anon_write                (off  ,  off)  Allow ftpd to anon write    是否允许匿名写(上传)
httpd_enable_ftp_server        (off  ,  off)  Allow httpd to enable ftp server
[root@CENTOS7 ~]# getsebool -a | grep ftp    查看生效的bool
ftpd_anon_write –> off
ftpd_connect_all_unreserved –> off
ftpd_connect_db –> off
ftpd_full_access –> off
修改生效的bool值
setsebool ftpd_anon_write on或者setsebool ftpd_anon_write=1  这个命令只修改内存中的bool值
想永久生效就要修改文件
setsebool -P ftpd_anon_write on   即修改内存也修改磁盘文件中的bool值
SELinux日志管理   是不是selinux导致的问题如何查看
  yum install setroubleshoot(重启生效)
将错误的信息写入/var/log/message
  grep setroubleshoot /var/log/messages
  sealert -l UUID
查看安全事件日志说明
  sealert -a /var/log/audit/audit.log
扫描并分析日志
SELinux帮助
  yum –y install selinux-policy-devel ( centos7.2)
  yum –y install selinux-policy-doc    这个文件才是真正的man帮助手册
  mandb | makewhatis
  man -k _selinux
本章内容
  awk介绍
  awk基本用法
  awk变量
  awk格式化
  awk操作符
  awk条件判断
  awk循环
  awk数组
  awk函数
  调用系统命令
awk介绍
   awk:Aho, Weinberger, Kernighan,报告生成器,格式化文本输出  可以打印出报表比如日志的报表从而分析问题
   有多种版本:New awk(nawk),GNU awk( gawk)
   gawk:模式扫描和处理语言
   基本用法:
awk [options] ‘program’ var=value file…
awk [options] -f programfile var=value file…
awk [options] ‘BEGIN{ action;… } pattern{ action;… } END{ action;… }’ file …
awk 程序通常由:BEGIN语句块、能够使用模式匹配的通用语句块、END语句块,共3部
分组成
program通常是被单引号或双引号中
   选项:
-F 指明输入时用到的字段分隔符
-v var=value: 自定义变量
awk语言
  基本格式:awk [options] ‘program’ file…
  program:pattern{action statements;..}
  pattern和action:
  pattern部分决定动作语句何时触发及触发事件
BEGIN,END
  action statements对数据进行处理,放在{}内指明
print, printf
  分割符、域和记录
  awk执行时,由分隔符分隔的字段(域)标记$1,$2..$n称为域标识。$0为所有域,
注意:和shell中变量$符含义不同
  文件的每一行称为记录
  省略action,则默认执行 print $0 的操作
默认字段的分隔符是空格,多个空格算一个分割符
行(row):记录record
列(column):字段field
awk工作原理
   第一步:执行BEGIN{action;… }语句块中的语句,打印表头用
   第二步:从文件或标准输入(stdin)读取一行,然后执行pattern{ action;… }语句块,它
逐行扫描文件,从第一行到最后一行重复这个过程,直到文件全部被读取完毕。
   第三步:当读至输入流末尾时,执行END{action;…}语句块
   BEGIN语句块在awk开始从输入流中读取行之前被执行,这是一个可选的语句块,比如
变量初始化、打印输出表格的表头等语句通常可以写在BEGIN语句块中
   END语句块在awk从输入流中读取完所有的行之后即被执行,比如打印所有行的分析
结果这类信息汇总都是在END语句块中完成,它也是一个可选语句块,总结用
   pattern语句块中的通用命令是最重要的部分,也是可选的。如果没有提供pattern语句
块,则默认执行{ print } ,即打印每一个读取到的行,awk读取的每一行都会执行该语句块
[root@CENTOS7 ~]#awk ‘{print “hello awk”}’
aaa
hello awk
bbb
hello awk
cc
hello awk
[root@CENTOS7 ~]#awk ‘{print “hello awk”}’ /etc/fstab   fstab有多少行就打印多少行的hello awk
hello awk
hello awk
hello awk
hello awk
hello awk
hello awk
hello awk
hello awk
hello awk
hello awk
hello awk
hello awk
[root@CENTOS7 ~]#ls | awk ‘{print “hello work”}’   处理命令的执行结果
hello work
hello work
hello work
hello work
[root@CENTOS7 ~]#awk ‘{print “hello awk\n”}’   带特定的字符如\n \t等
aaa
hello awk
bb
hello awk
[root@CENTOS7 ~]#awk ‘BEGIN{print “hello awk”}’  只显示固定的字符串,在文件读入之前。
hello awk
[root@CENTOS7 ~]#awk ‘BEGIN {print “hello awk”}’
hello awk
[root@CENTOS7 ~]#awk ‘BEGIN {print 2^10}’  BEGIN还可以做数字运算
1024
[root@CENTOS7 ~]#cut -d “:” -f1,3 /etc/passwd  取1,3列
root:0
bin:1
daemon:2
adm:3
[root@CENTOS7 ~]#awk -F : ‘{print $1,$3}’ /etc/passwd  默认是空格隔开字段
root 0
bin 1
daemon 2
adm 3
[root@CENTOS7 ~]#awk -F : ‘{print $1$3}’ /etc/passwd   不加,
root0
bin1
daemon2
adm3
[root@CENTOS7 ~]#awk -F : ‘{print $1″:”$3}’ /etc/passwd 自定义用:隔开字段
root:0
bin:1
daemon:2
adm:3
[root@CENTOS7 ~]#df | awk ‘{print $1,$5}’
Filesystem Use%
/dev/sda2 8%
devtmpfs 0%
tmpfs 0%
tmpfs 2%
tmpfs 0%
/dev/sda3 1%
/dev/sda1 16%
tmpfs 1%
/dev/sr0 100%
tmpfs 0%
awk
   print格式: print item1, item2, …
   要点:
(1) 逗号分隔符
(2) 输出的各item可以字符串,也可以是数值;当前记录的字段、变量或awk的表达式
(3) 如省略item,相当于print $0
   示例:
awk ‘{print “hello,awk”}’
awk –F: ‘{print}’ /etc/passwd
awk –F: ‘{print “wang”}’ /etc/passwd
awk –F: ‘{print $1}’ /etc/passwd
awk –F: ‘{print $0}’ /etc/passwd
awk –F: ‘{print $1”\t”$3}’ /etc/passwd
tail –3 /etc/fstab |awk ‘{print $2,$4}’
awk变量
   变量:内置和自定义变量
   FS:输入字段分隔符,默认为空白字符
awk -v FS=’:’ ‘{print $1,FS,$3}’ /etc/passwd
awk –F: ‘{print $1,$3,$7}’ /etc/passwd
   OFS:输出字段分隔符,默认为空白字符
awk -v FS=‘:’ -v OFS=‘:’ ‘{print $1,$3,$7}’ /etc/passwd
   RS:输入记录分隔符,指定输入时的换行符
awk -v RS=’ ‘ ‘{print }’ /etc/passwd
   ORS:输出记录分隔符,输出时用指定符号代替换行符
awk -v RS=’ ‘ -v ORS=’###’‘{print }’ /etc/passwd
   NF:字段数量
awk -F: ‘{print NF}’ /etc/fstab,引用内置变量不用$
awk -F: ‘{print $(NF-1)}’ /etc/passwd
   NR:记录号
awk ‘{print NR}’ /etc/fstab ; awk END'{print NR}’ /etc/fstab
[root@CENTOS7 ~]#awk -v FS=: ‘{print $1FS$3}’ /etc/passwd
root:0
bin:1
daemon:2
adm:3
lp:4
[root@CENTOS7 ~]#fs=”:”;awk -v FS=$fs ‘{print $1$fs$3}’ /etc/passwd   awk不识别bash里的变量
rootroot:x:0:0:root:/root:/bin/bash0
binbin:x:1:1:bin:/bin:/sbin/nologin1
[root@CENTOS7 ~]#fs=”:”;awk -v FS=$fs ‘{print $1″$fs”$3}’ /etc/passwd
root$fs0
bin$fs1
daemon$fs2
[root@CENTOS7 ~]#fs=”:”;awk -v FS=$fs ‘{print $1FS$3}’ /etc/passwd
root:0
bin:1
daemon:2
adm:3
lp:4
[root@CENTOS7 ~]# awk -v FS=: -v OFS==== ‘{print $1,$3}’ /etc/passwd
root===0
bin===1
daemon===2
adm===3
[root@CENTOS7 ~]#cat f1
a b;c
d;e
g h;gg
[root@CENTOS7 ~]#awk -v RS=”;” ‘{print $1}’ f1    默认字段分割符FS是空格,空格包括(空格回车Tab)
a
c
e
gg
[root@CENTOS7 ~]#awk -v RS=”;” -v ORS=”===>” ‘{print $1}’ f1
a===>c===>e===>gg===>
[root@CENTOS7 ~]#awk -v ORS=”—>” ‘{print $0}’ /etc/passwd
root:x:0:0:root:/root:/bin/bash—>bin:x:1:1:bin:/bin:/sbin/nologin—>daemon:x:2:2:daemon:/sbin:/sbin/nologin—>adm:x:3:4:adm:/var/adm:/sbin/nologin—>lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin—>
用awk取分区利用率
[root@CENTOS7 ~]#df | grep “/dev/sd” | awk -v FS=”%” ‘{print $1}’ | awk ‘{print $1,$5}’
/dev/sda2 8
/dev/sda3 1
/dev/sda1 16
[root@CENTOS7 ~]#df | grep “/dev/sd” | awk ‘{print $1,$5}’ | awk -v FS=”%” ‘{print $1}’
/dev/sda2 8
/dev/sda3 1
/dev/sda1 16
[root@CENTOS7 ~]#awk -v FS=”:” ‘{print NF}’ /etc/passwd  用:作为字段分隔符共有多少个字段
7
7
7
7
[root@CENTOS7 ~]#awk -v FS=”:” ‘{print $NF}’ /etc/passwd    显示最后一个字段的信息
/bin/bash
/sbin/nologin
/sbin/nologin
[root@CENTOS7 ~]#awk -v FS=”:” ‘{print NF,$(NF-6)}’ /etc/passwd
7 root
7 bin
[root@CENTOS7 ~]#ls /misc/cd/Packages/*.rpm | awk -v FS=”.” ‘{print $(NF-1)}’|sort|uniq -c   查看rpm包的架构
   2141 i686
   3076 noarch
   4374 x86_64
[root@CENTOS7 ~]#awk -v FS=”:” ‘{print NR,$1}’ /etc/passwd  相当于加行号
1 root
2 bin
3 daemon
4 adm
[root@CENTOS7 ~]#awk -v FS=”:” ‘{print NR,$1}’ /etc/passwd /etc/fstab 这样写会使俩个文件合并一起记录行号
1 root
……
63 UUID=906330a5-2af1-4bf4-8b2d-9337eaf92250 swap
[root@CENTOS7 ~]#awk -v FS=”:” ‘{print FNR,$1}’ /etc/passwd /etc/fstab   这样写是自己记录自己的行号
1 root
……
51 a
1
2 #
3 # /etc/fstab
4 # Created by anaconda on Tue Mar 27 17
5 #
6 # Accessible filesystems, by reference, are maintained under ‘/dev/disk’
7 # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
8 #
9 UUID=0a1bc23e-06e5-4210-9b32-0edbff09ca1a /                       xfs     defaults        0 0
10 UUID=4d8d9214-eeed-4758-8c34-f05492b9ea73 /boot                   xfs     defaults        0 0
11 UUID=fb669d84-551f-4a70-a11e-f61deec0fd86 /data                   xfs     defaults        0 0
12 UUID=906330a5-2af1-4bf4-8b2d-9337eaf92250 swap                    swa
awk
  FNR:各文件分别计数,记录号
awk ‘{print FNR}’ /etc/fstab /etc/inittab
  FILENAME:当前文件名
awk ‘{print FILENAME}’ /etc/fstab
  ARGC:命令行参数的个数
awk ‘{print ARGC}’ /etc/fstab /etc/inittab
awk ‘BEGIN {print ARGC}’ /etc/fstab /etc/inittab
  ARGV:数组,保存的是命令行所给定的各参数
awk ‘BEGIN {print ARGV[0]}’ /etc/fstab /etc/inittab
awk ‘BEGIN {print ARGV[1]}’ /etc/fstab /etc/inittab
[root@CENTOS7 ~]#awk -v FS=”:” ‘{print NR,FILENAME,$1}’ /etc/passwd
1 /etc/passwd root
2 /etc/passwd bin
3 /etc/passwd daemon
[root@CENTOS7 ~]#awk ‘{print ARGC}’ /etc/passwd /etc/fstab   3个参数awk自己就是$1这个参数
3
3
3
[root@CENTOS7 ~]#awk ‘{print ARGV[0]}’ /etc/passwd /etc/fstab
awk
[root@CENTOS7 ~]#awk ‘{print ARGV[1]}’ /etc/passwd /etc/fstab
/etc/passwd
[root@CENTOS7 ~]#awk ‘{print ARGV[2]}’ /etc/passwd /etc/fstab
/etc/fstab
awk变量
  自定义变量(区分字符大小写)
(1) -v var=value
(2) 在program中直接定义
  示例:
awk -v test=’hello gawk’ ‘{print test}’ /etc/fstab
awk -v test=’hello gawk’ ‘BEGIN{print test}’
awk ‘BEGIN{test=”hello,gawk”;print test}’
awk –F:‘{sex=“male”;print $1,sex,age;age=18}’ /etc/passwd
cat awkscript
{print script,$1,$2}
awk -F: -f awkscript script=“awk” /etc/passwd
[root@CENTOS7 ~]#awk -v var1=”hello awk” ‘BEGIN{print var1}’  自定义变量
hello awk
[root@CENTOS7 ~]#awk ‘BEGIN{var1=”hello”;print var1}’
hello
[root@CENTOS7 ~]#awk -v FS=”:” -v var1=”name” ‘{print var1,$1}’ /etc/passwd
name root
name bin
[root@CENTOS7 ~]#awk -v FS=”:” -v var1=”name:” ‘{print var1$1}’ /etc/passwd
name:root
name:bin
[root@CENTOS7 ~]#awk -v FS=”:” -v var1=”name” ‘{print var1″:”$1}’ /etc/passwd
name:root
name:bin
[root@CENTOS7 ~]#awk -v FS=”:” -v var1=”name” -v OFS=”:” ‘{print var1,$1}’ /etc/passwd
name:root
name:bin
[root@CENTOS7 ~]#awk -v FS=”:” -v OFS=”:” ‘{print var1,$1;var1=”name”}’ /etc/passwd   变量要先赋值在使用
:root
name:bin
[root@CENTOS7 ~]#vim f1    将{print $1,$3}放到文件中然后用-f调用
{print $1,$3}
[root@CENTOS7 ~]#awk -v FS=”:” -v OFS=”:” -f f1  /etc/passwd
root:0
bin:1
daemon:2
adm:3
printf命令
  格式化输出:printf “FORMAT”, item1, item2, …
(1) 必须指定FORMAT
(2) 不会自动换行,需要显式给出换行控制符,\n
(3) FORMAT中需要分别为后面每个item指定格式符
   格式符:与item一一对应
%c: 显示字符的ASCII码
%d, %i: 显示十进制整数
%e, %E:显示科学计数法数值
%f:显示为浮点数
%g, %G:以科学计数法或浮点形式显示数值
%s:显示字符串
%u:无符号整数
%%: 显示%自身
   修饰符:
#[.#]:第一个数字控制显示的宽度;第二个#表示小数点后精度,%3.1f
-: 左对齐(默认右对齐) %-15s
+:显示数值的正负符号 %+d
[root@CENTOS7 ~]#awk -v FS=”:” ‘{printf “%-20s:%-d\n”,$1,$3}’ /etc/passwd
root                :0
bin                 :1
[root@CENTOS7 ~]#awk -v FS=”:” ‘BEGIN{print “name                              uin”}{printf “%-20s:%15d\n”,$1,$3}’ /etc/passwd
name                              uin
root                :              0
bin                 :              1
[root@CENTOS7 ~]#awk -v FS=”:” ‘BEGIN{print “name                |              uin\n———————————–“}{printf “%-20s:%15d\n”,$1,$3}’ /etc/passwd
name                |              uin
———————————–
root                :              0
[root@CENTOS7 ~]#awk ‘BEGIN{i=0;print ++i,i}’
1 1
[root@CENTOS7 ~]#awk ‘BEGIN{i=0;print i++,i}’
0 1
[root@CENTOS7 ~]#awk ‘BEGIN{i=1;print i++,i}’
1 2
printf示例
awk -F: ‘{printf “%s”,$1}’ /etc/passwd
awk -F: ‘{printf “%s\n”,$1}’ /etc/passwd
awk -F: ‘{printf “%-20s %10d\n”,$1,$3}’ /etc/passwd
awk -F: ‘{printf “Username: %s\n”,$1}’ /etc/passwd
awk -F: ‘{printf “Username: %s,UID:%d\n”,$1,$3}’  /etc/passwd
awk -F: ‘{printf “Username: %15s,UID:%d\n”,$1,$3}’  /etc/passwd
awk -F: ‘{printf “Username: %-15s,UID:%d\n”,$1,$3}’ /etc/passwd
操作符
  算术操作符:
x+y, x-y, x*y, x/y, x^y, x%y
-x: 转换为负数
+x: 转换为数值
  字符串操作符:没有符号的操作符,字符串连接
  赋值操作符:
=, +=, -=, *=, /=, %=, ^=
++, —
  下面两语句有何不同
  awk ‘BEGIN{i=0;print ++i,i}’
  awk ‘BEGIN{i=0;print i++,i}’
操作符
  比较操作符:
==, !=, >, >=, <, <=
  模式匹配符:
~:左边是否和右边匹配包含 !~:是否不匹配
  示例:
awk –F: ‘$0 ~ /root/{print $1}‘ /etc/passwd    包含的意思
awk ‘$0~“^root”‘ /etc/passwd      默认{print %0}
awk ‘$0 !~ /root/‘ /etc/passwd
awk –F: ‘$3==0’ /etc/passwd
[root@CENTOS7 ~]#awk -v FS=”:” ‘$0 ~ /root/ {print $0}’ /etc/passwd   $0中是否包含root包含则打印这一行
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@CENTOS7 ~]#awk -v FS=”:” ‘$0 !~ /root/ {print $0}’ /etc/passwd   取反
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@CENTOS7 ~]#awk -v FS=”:” ‘$0 ~ /^root/ {print $0}’ /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@CENTOS7 ~]#df | awk ‘$0 ~ /^\/dev\/sd/ {print $1,$5}’ | awk -v FS=”%” ‘{print $1}’
/dev/sda2 8
/dev/sda3 1
/dev/sda1 16
[root@CENTOS7 ~]#df | awk -v FS=”%” ‘$0 ~ /^\/dev\/sd/{print $1}’|awk ‘$5 >= 8 {print $1,$5}’
/dev/sda2 8
/dev/sda1 16
操作符
   逻辑操作符:与&&,或||,非!    普通的与或非
   示例:
   awk –F: ‘$3>=0 && $3<=1000 {print $1}’ /etc/passwd
   awk -F: ‘$3==0 || $3>=1000 {print $1}’ /etc/passwd
   awk -F: ‘!($3==0) {print $1}’ /etc/passwd
   awk -F: ‘!($3>=500) {print $3}’ /etc/passwd
   函数调用: 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
[root@CENTOS7 ~]#awk -v FS=: ‘$3>=1000&&$3<=1007’ /etc/passwd
wang:x:1000:1000:wang:/home/wang:/bin/bash
lele:x:1001:1002::/home/lele:/bin/bash
mage:x:1002:1004::/home/mage:/bin/bash
git:x:1003:1005::/home/git:/bin/bash
xixx:x:1004:1010::/home/xixx:/bin/bash
xxxxxxxx:x:1005:1011::/home/xxxxxxxx:/bin/bash
yyyyyyyyyyyyyy:x:1006:1012::/home/yyyyyyyyyyyyyy:/bin/bash
echo:x:1007:1013::/home/echo:/bin/bash
[root@CENTOS7 ~]#awk -v FS=: ‘!($3>1)’ /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
[root@CENTOS7 ~]#awk ‘BEGIN{print i}’
[root@CENTOS7 ~]#awk ‘BEGIN{print !i}’
1
[root@CENTOS7 ~]#awk ‘BEGIN{i=0;print !i}’
1
[root@CENTOS7 ~]#awk ‘BEGIN{i=2;print !i}’  在awk里认为0是假,1是真
0
[root@CENTOS7 ~]#awk ‘BEGIN{i=”abc”;print !i}’
0
[root@CENTOS7 ~]#awk ‘BEGIN{i=””;print !i}’
1
[root@CENTOS7 ~]#awk -v FS=: ‘{$3>=1000? type=”xinimei”:type=”liu”; print $1,type}’ /etc/passwd
root liu
bin liu
daemon liu
[root@CENTOS7 ~]#awk -v FS=: ‘{$3>=1000? type=”xinimei”:type=”liu”; printf “%-20s:%10s\n”, $1,type}’ /etc/passwd
root                :       liu
bin                 :       liu
awk PATTERN
   PATTERN:根据pattern条件,过滤匹配的行,再做处理
(1)如果未指定:空模式,匹配每一行
(2) /regular expression/:仅处理能够模式匹配到的行,需要用/ /括起来
awk ‘/^UUID/{print $1}’ /etc/fstab
awk ‘!/^UUID/{print $1}’ /etc/fstab
(3) relational expression: 关系表达式,结果为“真”才会被处理
真:结果为非0值,非空字符串
假:结果为空字符串或0值
  示例:
  awk -F: ‘i=1;j=1{print i,j}’ /etc/passwd
  awk ‘!0’ /etc/passwd ; awk ‘!1’ /etc/passwd
  awk –F: ‘$3>=1000{print $1,$3}’ /etc/passwd
  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
[root@CENTOS7 ~]#awk -v FS=: ‘/^r/{print $0}’ /etc/passwd  所有已r开头的行
root:x:0:0:root:/root:/bin/bash
rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
rtkit:x:172:172:RealtimeKit:/proc:/sbin/nologin
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
radvd:x:75:75:radvd user:/:/sbin/nologin
[root@CENTOS7 ~]#awk -v FS=: ‘!/^(r)/{print $0}’ /etc/passwd  所有非r开头的行
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@CENTOS7 ~]#awk -v FS=: ‘/^[^r]/{print $0}’ /etc/passwd  所有非r开头的行
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@CENTOS7 ~]#awk ‘/^UUID/’ /etc/fstab
UUID=0a1bc23e-06e5-4210-9b32-0edbff09ca1a /                       xfs     defaults        0 0
UUID=4d8d9214-eeed-4758-8c34-f05492b9ea73 /boot                   xfs     defaults        0 0
UUID=fb669d84-551f-4a70-a11e-f61deec0fd86 /data                   xfs     defaults        0 0
UUID=906330a5-2af1-4bf4-8b2d-9337eaf92250 swap                    swap    defaults        0 0
[root@CENTOS7 ~]#awk ‘!/^ *#/’ /etc/httpd/conf/httpd.conf   去掉注释的行
ServerRoot “/etc/httpd”
Listen 80
Include conf.modules.d/*.conf
[root@CENTOS7 ~]#seq 10|awk ‘i=!i{print $0}’
1
3
5
7
9
[root@CENTOS7 ~]#seq 10|awk -v i=1 ‘i=!i{print $0}’
2
4
6
8
10
[root@CENTOS7 ~]#awk -v FS=: ‘$NF == “/bin/bash” {print $1,$NF}’ /etc/passwd   是否是/bin/bash结尾的行
root /bin/bash
wang /bin/bash
lele /bin/bash
mage /bin/bash
git /bin/bash
xixx /bin/bash
xxxxxxxx /bin/bash
yyyyyyyyyyyyyy /bin/bash
echo /bin/bash
a /bin/bash
[root@CENTOS7 ~]#awk -v FS=: ‘/\/bin\/bash$/{print $1,$NF}’ /etc/passwd
root /bin/bash
wang /bin/bash
lele /bin/bash
mage /bin/bash
git /bin/bash
xixx /bin/bash
xxxxxxxx /bin/bash
yyyyyyyyyyyyyy /bin/bash
echo /bin/bash
a /bin/bash
awk PATTERN
  4) line ranges:行范围
startline,endline:/pat1/,/pat2/ 不支持直接给出数字格式
awk -F: ‘/^root\>/,/^nobody\>/{print $1}’ /etc/passwd
awk -F: ‘(NR>=10&&NR<=20){print NR,$1}’ /etc/passwd
  (5) BEGIN/END模式
BEGIN{}: 仅在开始处理文件中的文本之前执行一次
END{}:仅在文本处理完成之后执行一次
[root@CENTOS7 ~]#awk -v FS=: ‘/^root\>/,/^nobody\>/{print $0}’ /etc/passwd  显示root到nobody的行
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologin
[root@CENTOS7 ~]#awk -v FS=: ‘NR>=10 && NR <=20 {print NR,$0}’ /etc/passwd
10 operator:x:11:0:operator:/root:/sbin/nologin
11 games:x:12:100:games:/usr/games:/sbin/nologin
12 ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
13 nobody:x:99:99:Nobody:/:/sbin/nologin
14 systemd-network:x:192:192:systemd Network Management:/:/sbin/nologin
15 dbus:x:81:81:System message bus:/:/sbin/nologin
16 polkitd:x:999:998:User for polkitd:/:/sbin/nologin
17 abrt:x:173:173::/etc/abrt:/sbin/nologin
18 libstoragemgmt:x:998:997:daemon account for libstoragemgmt:/var/run/lsm:/sbin/nologin
19 rpc:x:32:32:Rpcbind Daemon:/var/lib/rpcbind:/sbin/nologin
20 colord:x:997:996:User for colord:/var/lib/colord:/sbin/nologin
示例
awk -F : ‘BEGIN {print “USER USERID”} {print $1″:”$3} END{print “end file”}’
/etc/passwd
awk -F : ‘{print “USER USERID“;print $1”:”$3} END{print “end file”}’ /etc/passwd
awk -F: ‘BEGIN{print ” USER UID \n————— “}{print $1,$3}’ /etc/passwd
awk -F: ‘BEGIN{print ” USER UID \n————— “}{print $1,$3}’END{print
“==============”} /etc/passwd
seq 10 |awk ‘i=0’
seq 10 |awk ‘i=1’
seq 10 | awk ‘i=!i‘
seq 10 | awk ‘{i=!i;print i}‘
seq 10 | awk ‘!(i=!i)’
seq 10 |awk -v i=1 ‘i=!i’
[root@CENTOS7 ~]#awk -F : ‘{print “USER USERID”;print $1″:”$3} END{print “end file”}’ /etc/passwd
USER USERID
root:0
USER USERID
bin:1
[root@CENTOS7 ~]#seq 10 | awk ‘i=!i’
1
3
5
7
9
[root@CENTOS7 ~]#seq 10 | awk ‘!(i=!i)’
2
4
6
8
10
[root@CENTOS7 ~]#seq 10 | sed -n ‘1~2p’
1
3
5
7
9
[root@CENTOS7 ~]#seq 10 | sed -n ‘2~2p’
2
4
6
8
10
[root@CENTOS7 ~]#seq 10 | awk ‘{i=!i;print i}’
1
0
1
0
1
0
1
0
1
0
综合算法(public){对称加密}(data+secrit{hash(data)})
这种算法是存在漏洞的,漏洞就是当B把自己的公钥交给A的时候
A无法确定这个公钥就是B的,也有可能是黑客C发给A的,导致A的后续加密用的是C的公钥
这样C可以轻松获得A发给B的信息,而B反而无法解开A发来的信息。
前提:A和B都提前那到了CA的公钥
通讯双方A和B第一次通讯时,通过第三方CA(证书发放机构)A将自己的公钥传给CA,
CA经过检查发现传来的公钥是真是有效的。(CA也有自己的公钥的私钥)CA会用自己的私钥对A的公钥进行签名,
签名后也会有别的信息比如(CA的信息,有效期,A的公钥信息,算法等)。这就是证书,然后CA将证书发送给A,
A就那到了自己的证书(相当于身份证),A将证书传给B,B用ca的公钥解密A的证书,解开则证明A的合法性。B同理。
最高级的RootCA,rootCA对自己和子SubCA授权Sub给Sub Sub的CA授权,每个人都有rootCA的公钥,
rootCA的公钥是系统默认自带的。
在windows系统中,控制面板中internet选项中内容里的证书受信任的颁发机构中就存放着权威的rootCA机构。
如果在使用浏览器时rootCA不在系统的Ca中就会被提示此网站不可信。
在浏览器中点击右键,有检查打开进入安全就可以查看证书
CA和证书
  PKI: Public Key Infrastructure   公共的秘钥体系
签证机构:CA(Certificate Authority)
注册机构:RA    类似于当地的小派出所,没有颁发证书的权力,只能帮助接受申请
证书吊销列表:CRL
证书存取库:      数据库存放颁发的证书信息
  X.509:定义了证书的结构以及认证协议标准
版本号
序列号               主体公钥
签名算法             CRL 分发点
颁发者               扩展信息
有效期限              发行者签名
主体名称
证书获取
  证书类型:
证书授权机构的证书      RootCA给自己颁发的证书及给SubCA颁发的证书
服务器                  如天猫,京东等都是服务器的证书
用户证书                个人申请的证书,为了实现安全通讯
  获取证书两种方法:
  使用证书授权机构
生成签名请求(csr)
将csr发送给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 IETF(Internet工程任务组) RFC 4346
2008:TLS 1.2 当前使用
2015: TLS 1.3
功能:机密性,认证,完整性,重放保护
重放保护:就是登陆一个网站,提交用户密码时候容易被截获这些信息,虽然加密了,但是可以直接将
这些加密的信息提交从而直接登陆。重放保护就是杜绝这种机制的。同样的数据包再发认为已经过期。
   两阶段协议,分为握手阶段和应用阶段
握手阶段(协商阶段):客户端和服务器端认证对方身份(依赖于PKI体系,利用数字证书进行
身份认证),并协商通信中使用的安全参数、密码套件以及主密钥。后续通信使用的所有密钥都是
通过MasterSecret生成。
应用阶段:在握手阶段完成后进入,在应用阶段通信双方使用握手阶段协商好的密钥进行安
全通信
SSL/TLS
  Handshake协议:包括协商安全参数和密码套件、服务器身份认证(客户端身
份认证可选)、密钥交换
  ChangeCipherSpec 协议:一条消息表明握手协议已经完成
  Alert 协议:对握手协议中一些异常的错误提醒,分为fatal和warning两个级别,
fatal类型错误会直接中断SSL链接,而warning级别的错误SSL链接仍可继续,
只是会给出错误警告
  Record 协议:包括对消息的分段、压缩、消息认证和完整性保护、加密等
  HTTPS 协议:就是“HTTP 协议”和“SSL/TLS 协议”的组合。HTTP over
SSL”或“HTTP over TLS”,对http协议的文本数据进行加密处理后,成为二
进制形式传输
访问淘宝网站时SSL/TLS是如何工作的
访问淘宝的时候先互相打声招呼,然后淘宝将其证书发送给用户
taobao 证书中包含着(Sca(Ptaobao)+Ca+expire+Ptaobao)
用户用CA的公钥解开验证淘宝的真实性,然后获得淘宝的公钥。
在网页中生成对称秘钥,将这个秘钥用淘宝的公钥加密发送给淘宝
Ptaobao(key)—>taobao
淘宝用自己的私钥解开获得key双方开始对称加密通讯
Staobao(Ptaobao(key))=key
key(data)
服务器证书是验证服务器身份的,客户端证书是验证客户身份的。
OpenSSL
  OpenSSL:开源项目
三个组件:
openssl: 多用途的命令行工具,包openssl
libcrypto: 加密算法库,包openssl-libs
libssl:加密模块应用库,实现了ssl及tls,包nss
  openssl命令:
两种运行模式:交互模式和批处理模式
openssl version:程序版本号
标准命令、消息摘要命令、加密命令
标准命令:
enc, ca, req, …
openssl 回车
?查看子命令列表
openssl命令
  对称加密:
工具:openssl enc, gpg
算法:3des, aes, blowfish, twofish
  enc命令:
帮助:man enc
加密:
openssl enc -e -des3 -a -salt -in testfile
-out testfile.cipher
解密:
openssl enc -d -des3 -a -salt –in testfile.cipher
-out testfile
openssl ?
base64编码就是a-z,A-Z,0-9 ,/,+ 组合而成,如果位数不够用=号填充,6位编码2^6.ASC编码是8位编码2^8
base64对应ASC关系是3个ASC用4个base64表示
0 A
1 B
22 w
23 X
24 Y
25 Z
26 a
27 b
51 z
52 0
61 9
62 +
63 /
abc 97 98 99
011000 010110 001001 1000
Y       W
用openssl 加密
[root@CENTOS7 d1]#openssl enc -e(加密) -des3(加密方法) -a(base64方式) -salt(加盐) -in fstab -out fstab.f
enter des-ede3-cbc encryption password:
Verifying – enter des-ede3-cbc encryption password:
[root@CENTOS7 d1]#cat fstab.f     加密完以后用base64的方式显示,无法反推。
U2FsdGVkX19KX3oFi2g41Xt1VEwodnAqW8r5dXbRoioyGZvcRI5dXiHn4WLgMjyI
GOQDf3GR4Mul7rVHW4GvJggwavT2hips9IYR1+Tcd+5Ouqdj3M0GL8m04rHIgcNE
KtAvDnSbCa/CjhGlVhdC0UvOt1+/JAGWo9FuBXxbxtbKHg+5PU7opCtv47oVPiwy
x9uGZFlUVhanaL0s0C4xbkuW+xczHMh1dPVltD0dMic/Hl+QM7P5cdpDTW10MVzl
X3/NXh5ZgX8n3k9ngDGO0uFh3EmOG07qLduy7zrBjQYhSNjOH7WWZcF14/rqRKAv
G0+uEHc7gLJJVxkhQZJ+ctTqITQfnGnNZgn7KSwFY/jRCFTIMPpNIIXhYJvrUhD0
eysurH5e2ScgrnAsP3IPqmyRrLVBf7cMB4+4NhH2BI7fwr67HA6JzkrZX8yCCrMu
eWNxA84h4pyZd/FDDQOl9gnidOKjh1fSl+kYW28is1iwtzN2aVim+q0KoiUHTLnD
WQICmtanWhtfZ8pxaxJfbLhKxcrd+lILX1T6YcrD8VHT4QjG9sow9DK9ZyglgFt4
Gzni4A4skfxOuclIokM5h8xCY4AAwJ9iHVzlnac0KGLjKJZ6anvFc4LBvLwZLckf
4uRhZlzIpxaUwqRrX7L/+x8OLvHnJ/JwfYNcAaVs2gm0s695iMppCsNq3IVmiEM9
iRPNuXIRLQLZoXcC08v/Yrr4cWC+deWfHLqmYycStmpKbuYuPg3ZZYaAvVHGgtSO
VfZ2Lt/jzh+lpnms8FnkiPRyWFMNKMoPzh/9JwCEImDdjeKbL9JIUg==(不够6位用=填充)
用openssl解密
[root@CENTOS7 d1]#openssl enc -d -des3 -a -salt -in fstab.f
enter des-ede3-cbc decryption password:
#
# /etc/fstab
# Created by anaconda on Tue Mar 27 17:53:47 2018
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk’
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=0a1bc23e-06e5-4210-9b32-0edbff09ca1a /                       xfs     defaults        0 0
UUID=4d8d9214-eeed-4758-8c34-f05492b9ea73 /boot                   xfs     defaults        0 0
UUID=fb669d84-551f-4a70-a11e-f61deec0fd86 /data                   xfs     defaults        0 0
UUID=906330a5-2af1-4bf4-8b2d-9337eaf92250 swap                    swap    defaults        0 0
[root@CENTOS7 d1]#openssl enc -d -des3 -a -salt -in fstab.f -out f2
enter des-ede3-cbc decryption password:
[root@CENTOS7 d1]#ls
f2  fstab  fstab.f
[root@CENTOS7 d1]#cat f2
#
# /etc/fstab
# Created by anaconda on Tue Mar 27 17:53:47 2018
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk’
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=0a1bc23e-06e5-4210-9b32-0edbff09ca1a /                       xfs     defaults        0 0
UUID=4d8d9214-eeed-4758-8c34-f05492b9ea73 /boot                   xfs     defaults        0 0
UUID=fb669d84-551f-4a70-a11e-f61deec0fd86 /data                   xfs     defaults        0 0
UUID=906330a5-2af1-4bf4-8b2d-9337eaf92250 swap                    swap    defaults        0 0
openssl命令
  对称加密:
工具:openssl enc, gpg
算法:3des, aes, blowfish, twofish
  enc命令:
帮助:man enc
加密:
openssl enc -e -des3 -a -salt -in testfile
-out testfile.cipher
解密:
openssl enc -d -des3 -a -salt –in testfile.cipher
-out testfile
openssl ?
[root@CENTOS7 d1]#openssl dgst -md5 fstab
MD5(fstab)= 670fa208852c2f5ca53bb48b3848ce60
[root@CENTOS7 d1]#md5sum fstab
670fa208852c2f5ca53bb48b3848ce60  fstab
openssl命令
  单向加密:
工具:md5sum, sha1sum, sha224sum,sha256sum…
openssl dgst
  dgst命令:
帮助:man dgst
openssl dgst -md5 [-hex默认] /PATH/SOMEFILE
openssl dgst -md5 testfile
md5sum /PATH/TO/SOMEFILE
  MAC: Message Authentication Code,单向加密的一种延伸应用,用于实现
网络通信中保证所传输数据的完整性机制
CBC-MAC
HMAC:使用md5或sha1算法
openssl命令
  生成用户密码:
passwd命令:
帮助:man sslpasswd
openssl passwd -1 -salt SALT(最多8位)
openssl passwd -1 –salt centos
  生成随机数:
帮助:man sslrand
openssl rand -base64|-hex NUM
NUM: 表示字节数;-hex时,每个字符为十六进制,相当于4位二进制,出
现的字符数为NUM*2
[root@CENTOS7 d1]#openssl passwd -1
Password:
Verifying – Password:
$1(表示md5)$plOAwb2O(表示盐)$QZ.PPjH1Cstf5HhkPryN30  虽然加密的密码是一样的,但是盐不一样所以加密也不一样。如果盐一样,那么加密的也是一样的
[root@CENTOS7 d1]#openssl passwd -1 -salt “plOAwb2O”   指定盐
Password:
$1$plOAwb2O$QZ.PPjH1Cstf5HhkPryN30
[root@CENTOS7 d1]#openssl rand -hex 10 | grep “[a-z]”
65831591b63447116fcc
[root@CENTOS7 d1]#openssl rand -hex 10 | grep -n “[a-z]”
1:3a00d187a41999f59c00
[root@CENTOS7 d1]#openssl rand -hex 10 | grep -o  “[a-z]”
[root@CENTOS7 d1]#openssl rand -hex 10 | tr -dc “[a-z]”
dbccaf
[root@CENTOS7 d1]#openssl rand -base64 20 | tr -dc “[:alnum:]” | head -c 10
CcaLKWYk1t
openssl命令
   公钥加密:
算法:RSA, ELGamal
工具:gpg, openssl rsautl(man rsautl)
   数字签名:
算法:RSA, DSA, ELGamal
  密钥交换:
算法:dh
DSA: Digital Signature Algorithm
DSS:Digital Signature Standard
RSA:
openssl命令
  生成密钥对儿:man genrsa
  生成私钥
openssl genrsa -out  /PATH/TO/PRIVATEKEY.FILE NUM_BITS
(umask 077; openssl genrsa –out test.key –des 2048)
openssl rsa -in test.key –out test2.key 将加密key解密
  从私钥中提取出公钥
openssl rsa -in  PRIVATEKEYFILE  –pubout –out  PUBLICKEYFILE
openssl rsa –in test.key –pubout –out test.key.pub
  随机数生成器:伪随机数字
键盘和鼠标,块设备中断
/dev/random:仅从熵池返回随机数;随机数用尽,阻塞
/dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机
数,非阻塞
私钥是很隐秘的文件,因此其权限应该非常严格
[root@CENTOS7 d1]#ll /etc/ssh
-rw-r—–. 1 root ssh_keys   1675 Mar 27 18:07 ssh_host_rsa_key
[root@CENTOS7 d1]#(umask 066;touch f1)   一次性使用umask,但不改变shell里的umask值
[root@CENTOS7 d1]#ll
total 12
-rw——- 1 root root   0 May 19 09:35 f1
[root@CENTOS7 d1]#(umask 600;openssl genrsa -out private.key 1024)   生成私钥,使用base64编码
Generating RSA private key, 1024 bit long modulus
………++++++
…………++++++
e is 65537 (0x10001)
[root@CENTOS7 d1]#ll
total 16
-rw-r–r– 1 root root 595 May 18 21:13 f2
-rw-r–r– 1 root root 595 May 18 20:58 fstab
-rw-r–r– 1 root root 837 May 18 21:09 fstab.f
—-rw-rw- 1 root root 887 May 19 09:37 private.key
[root@CENTOS7 d1]#cat private.key
—–BEGIN RSA PRIVATE KEY—–
MIICXAIBAAKBgQCkZVahHApN5PKE9BipUdeP9qFQjViRm8uAwm04NxkIQywCWGss
3etsLO2UrFzGnX2xXBnxqwS4Bdb9keYXk7kRWfSTWGpwuljkp7mqx1s8iVANLE9q
Bhpmw+rTTqOz54BfbMERvCvnYlHzO4nkDByGn2jEzkedIRw84fRDT8PA1wIDAQAB
AoGAPb7OLc7hU+Zk7GjeBmJ1611/s0iTdoUkhyT/brjLDx5jnjHld0GW1dd+GHQw
mGy4s+/a0rkgGZof6Lduy3YxcOeuLRALf65v/tspRfYif8meuvge+L103hMToPZD
YBmO4dtoHEVDjK8xP/BYv9fwkkyFSvBJQCzZtsE/J5LRI0kCQQDWbGnttth0jLyI
i0qXQ51e7/0Ei9MjVo0qEjSozN6ugD1BjR51aMyogoQn+blQNwyu3Y0jd0X69cVo
7kiliE99AkEAxEWlH9srl3PYjGxRXQbONEf9slN0z3dnPcl6B6uF2WxXxKhc2DXU
QcsIg6N3uB3ntl6bO30PwDgr/8ojdGdp4wJBAM0EX8wgVZoqrmFH/Yvf5GpPwHZG
UxyottSRD7SOHiRvDSLOEV9lUrmUAVRPm3YtDH1t7HMKqeiocZZAr0lGqekCQFP+
9jbW5iXvxvn5lSx5sB/Bu3noq3HqSL2xjs7fge3Vpw4be3hwOQFbMa6cc6zQ54wt
msNvtyDtKS9Tw66aXz8CQFm6LtmPQYLaVUsBPV55qdQL7bo3jyJbowGbGUEqTxB4
0Q/Ta+2mAc5Joe9K9DPy81JyLMiPVwBnceTqxysQSuY=
—–END RSA PRIVATE KEY—–
[root@CENTOS7 d1]#(umask 600;openssl genrsa -out private.key -des 1024)   用对称加密,加密私钥
Generating RSA private key, 1024 bit long modulus
….++++++
…………………………++++++
e is 65537 (0x10001)
Enter pass phrase for private.key:
Verifying – Enter pass phrase for private.key:
[root@CENTOS7 d1]#ll
total 16
-rw-r–r– 1 root root 595 May 18 21:13 f2
-rw-r–r– 1 root root 595 May 18 20:58 fstab
-rw-r–r– 1 root root 837 May 18 21:09 fstab.f
—-rw-rw- 1 root root 958 May 19 09:40 private.key
[root@CENTOS7 d1]#cat private.key
—–BEGIN RSA PRIVATE KEY—–
Proc-Type: 4,ENCRYPTED
DEK-Info: DES-CBC,4573887836E1F24C
bXtBocbgj6GZileJvQxXpFLfQzFcdXrCDxIxxgiQefQBQLi322s8NVDBpgxGVvcY
c0lIWjywk01aPM77QCXqe/qjL8U4HNEjsHwGtmgFIQ/AfcvRDdh/e7HGZAR8gC0O
uPuGOIjrAdfkpKogCbagheL4n4fldKjHDJWcjkWZYPbgw++lax5pGu21GRhKA1NJ
t3G1NdHl0AuMh9Z/FgIbOkkbaajBgAp7Xb/rgHyEAOR8S6eC5wONGah+O4pplogs
hwhGB4gmjU0wWmSR++hmQTXNX4fCMwV6gcj8FyAzX3aUi+xhuMF3Ek0uIlDVefe7
J8wC7XbX+1IrTfXy5kBN7FkYA0o2JdkimIA1P8JZdEar6TQgGkQBbZEi+YRwVPrt
MSx4nrmVw8IRhjuoZT5yKA17s5zqJUrhZVwyOtHCZZT/tdyUPAe/nH4bct2zdK8c
UvZLTMdiRVtu3XhDF1sqzZZ4DxtsBf8rTpezlMPcx4KAydATmRnBlxYsBUVLN5h+
U3SbW1Hnk07+RK4aLzP371c1dUw8Bd8rT0mQe2xXlgmLBt4yAGcrHOFcqyLsxxkK
otDzesxU11tj5y3Q/1+5oIOFDtfvTMoLPgyCj+v8MLOr0szr81vIi1LQX0BY5zaw
ttOkd1ThZsNgCET6QKx4MJEGTgAorv8mu5+0QGoUSc+1ImZbjKCaOR5UX2mqkg/A
nRWkhiSCRtL3zzkq1O8xRUnN3jXYC9Q2mG1ec3jT7EmPdWB9Ex7yyjDS52fwXXtU
wUdgKjBRi7ZRlLk77Uxs2SDAgV3L97UJuVo+47eaqRffPVtLVv3RkA==
—–END RSA PRIVATE KEY—–
[root@CENTOS7 d1]#openssl rsa -in private.key  -out private.key2  解除对称加密
Enter pass phrase for private.key:
writing RSA key
[root@CENTOS7 d1]#ll
total 20
-rw-r–r– 1 root root 595 May 18 21:13 f2
-rw-r–r– 1 root root 595 May 18 20:58 fstab
-rw-r–r– 1 root root 837 May 18 21:09 fstab.f
—-rw-rw- 1 root root 958 May 19 09:40 private.key
-rw-r–r– 1 root root 887 May 19 09:43 private.key2
[root@CENTOS7 d1]#cat private.key2
—–BEGIN RSA PRIVATE KEY—–
MIICXQIBAAKBgQDQY2iMtCDycjwFl7fkssWrKowg36NR8cYE1Pc1ZeLdrGrolU0K
4NV1lfWN6JAjnu92i4ehTid2pRhugkNDKvrGIh9mBGi6OXosjnGC0qo1mohtKzWS
LINjrlBcD9Y4/JSjIWLMkFOOH1AvCuQ6dQGU0RyXkDe8po3Tv88C3yYuiQIDAQAB
AoGACHiB/3YzAKf0GKYaK4m4z0RjfdKZaPNTAU9G3TzPBAPGNL4c65xIEQePe71A
XrJPOZpiYQQ0RnZfj95rrYdJukFD9FWQBVxwRqAkh7eVTGOSgQ5gJqIxOYKvWFtc
QB+T6rnLf8RaAA6WfWceuAxD0JvNYpQKaig2j4QyV9glg6ECQQD5JoNQMlQd17Lc
r9ybw1Uvn+91AFvCtfQ7j2BY9NiF2uXqYnM8Lpnk/erNjwv2R16VN24CvymhNNjH
Zz/aPv2bAkEA1h4EYk3zIgMLuF9CpeQwSTBPgEcugBxDQLOfM783WeSRnWsOxcCX
JnkXHKX7eDS/HJGFqvkhwmVOgEx3cMjYqwJBAOtic1Tk94tqKVVN4IJYPLbNxxEm
0YpXFPLgNgpU5+suL2EMugn1jPdG3PpvVsHKE5Wt1IVLzSy8HMHmzfCG6lkCQGMq
udsRwSaihH4a2JJekiKDln6R+S5qaJeB2Z0s1aTzoKFo4Qmjvh2afaLOGR6+Rzkj
COZ7xi/znZz8TWFWFEsCQQCt70xr1GHP5+01qfgSnKup2Npoq3CUAzwqKZQUPmHP
1W/7cKxDoxnd5nUM1IxX+sRIatJFOQGI3ab/K7EBYmMi
—–END RSA PRIVATE KEY—–
[root@CENTOS7 d1]#openssl rsa -in private.key -pubout -out public.key    使用私钥生成公钥
Enter pass phrase for private.key:
writing RSA key
[root@CENTOS7 d1]#ll
total 24
-rw-r–r– 1 root root 595 May 18 21:13 f2
-rw-r–r– 1 root root 595 May 18 20:58 fstab
-rw-r–r– 1 root root 837 May 18 21:09 fstab.f
—-rw-rw- 1 root root 958 May 19 09:40 private.key
-rw-r–r– 1 root root 887 May 19 09:43 private.key2
-rw-r–r– 1 root root 272 May 19 09:47 public.key
[root@CENTOS7 d1]#cat public.key
—–BEGIN PUBLIC KEY—–
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQY2iMtCDycjwFl7fkssWrKowg
36NR8cYE1Pc1ZeLdrGrolU0K4NV1lfWN6JAjnu92i4ehTid2pRhugkNDKvrGIh9m
BGi6OXosjnGC0qo1mohtKzWSLINjrlBcD9Y4/JSjIWLMkFOOH1AvCuQ6dQGU0RyX
kDe8po3Tv88C3yYuiQIDAQAB
—–END PUBLIC KEY—–
[root@CENTOS7 d1]#openssl rsa -in private.key2 -pubout -out public.key2
writing RSA key
[root@CENTOS7 d1]#ll
total 28
-rw-r–r– 1 root root 595 May 18 21:13 f2
-rw-r–r– 1 root root 595 May 18 20:58 fstab
-rw-r–r– 1 root root 837 May 18 21:09 fstab.f
—-rw-rw- 1 root root 958 May 19 09:40 private.key
-rw-r–r– 1 root root 887 May 19 09:43 private.key2
-rw-r–r– 1 root root 272 May 19 09:47 public.key
-rw-r–r– 1 root root 272 May 19 09:49 public.key2
[root@CENTOS7 d1]#cat public.key2
—–BEGIN PUBLIC KEY—–
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQY2iMtCDycjwFl7fkssWrKowg
36NR8cYE1Pc1ZeLdrGrolU0K4NV1lfWN6JAjnu92i4ehTid2pRhugkNDKvrGIh9m
BGi6OXosjnGC0qo1mohtKzWSLINjrlBcD9Y4/JSjIWLMkFOOH1AvCuQ6dQGU0RyX
kDe8po3Tv88C3yYuiQIDAQAB
—–END PUBLIC KEY—–
实验:向CA申请证书
1 建立Root CA
1)生成私钥
(umask 077;openssl genrsa -out private/cakey.pem 4096 )
2)自签名证书
openssl req -new -x509 -key private/cakey.pem  -out cacert.pem -days 3650
2 用户或服务器
1)生成私钥
(umask 077;openssl genrsa -out app.key 1024 )
2)生成证书申请文件
openssl req -new  -key app.key   -out app.csr
3)将申请文件发给CA
scp
3 CA颁发证书
touch index.txt
echo 0F > serial
openssl ca -in app.csr -out certs/app.crt -days 100
4.CA将证书发送给客户端
5.应用软件使用证书
[root@CA ~]#vim /etc/pki/tls/openssl.cnf     CA的相关配置文件,格式,内容等定义
[ ca ]
default_ca      = CA_default            # The default ca section    我的机器上可以有多个CA,使用哪个就是默认的那个
####################################################################
[ CA_default ]
dir             = /etc/pki/CA           # Where everything is kept     CA的工作目录
certs           = $dir/certs            # Where the issued certs are kept  存放证书
crl_dir         = $dir/crl              # Where the issued crl are kept    存放证书吊销列表
database        = $dir/index.txt        # database index file.             数据库索引文件(是一个文本文件,默认不存在,需要手工创建):CA都给谁办法了证书,证书编号是什么等信息
#unique_subject = no                    # Set to ‘no’ to allow creation of
                                        # several ctificates with same subject.
new_certs_dir   = $dir/newcerts         # default place for new certs.   新证书存放在这里
certificate     = $dir/cacert.pem       # The CA certificate     CA的证书文件,因为我是RootCA所以自己给自己颁发证书,且名字必须是这个。如果不是需要两边匹配
serial          = $dir/serial           # The current serial number   当前的序列号,下一个要颁发证书的编号(16进制数)
crlnumber       = $dir/crlnumber        # the current crl number    吊销证书的编号,下一个要吊销的编号的号码
                                        # must be commented out to leave a V1 CRL
crl             = $dir/crl.pem          # The current CRL    证书吊销列表
private_key     = $dir/private/cakey.pem# The private key     CA的私钥,必须叫这个名字,存放地址必须是这个文件夹下
RANDFILE        = $dir/private/.rand    # private random number file
x509_extensions = usr_cert              # The extentions to add to the cert
# Comment out the following two lines for the “traditional”
# (and highly broken) format.
name_opt        = ca_default            # Subject Name options
cert_opt        = ca_default            # Certificate field options
# Extension copying option: use with caution.
# copy_extensions = copy
# Extensions to add to a CRL. Note: Netscape communicator chokes on V2 CRLs
# so this is commented out by default to leave a V1 CRL.
# crlnumber must also be commented out to leave a V1 CRL.
# crl_extensions        = crl_ext
default_days    = 365                   # how long to certify for
default_crl_days= 30                    # how long before next CRL
default_md      = sha256                # use SHA-256 by default
preserve        = no                    # keep passed DN ordering
policy          = policy_match
# For the CA policy
[ policy_match ]   策略匹配
countryName             = match    这个策略国家必须匹配
stateOrProvinceName     = match    省
organizationName        = match    公司
organizationalUnitName  = optional 公司中的部门
commonName              = supplied 通用名必须填写(一般就是网站的域名如:www.taobao.com)
emailAddress            = optiona
[ policy_anything ]
countryName             = optional   这个策略国家是可选的
stateOrProvinceName     = optional
localityName            = optional
organizationName        = optional
organizationalUnitName  = optional
commonName              = supplied
emailAddress            = optional
实验:向CA申请证书
1 建立Root CA
1)生成私钥
(umask 077;openssl genrsa -out private/cakey.pem 4096 )
2)自签名证书
openssl req -new -x509 -key private/cakey.pem  -out cacert.pem -days 3650
2 用户或服务器
1)生成私钥
(umask 077;openssl genrsa -out app.key 1024 )
2)生成证书申请文件
openssl req -new  -key app.key   -out app.csr
3)将申请文件发给CA
scp
3 CA颁发证书
touch index.txt
echo 0F > serial
openssl ca -in app.csr -out certs/app.crt -days 100
4.CA将证书发送给客户端
5.应用软件使用证书
1 建立Root CA
[root@CA CA]#(umask 077;openssl genrsa -out private/cakey.pem 4096)
[root@CA CA]#tree
.
├── certs
├── crl
├── newcerts
└── private
    └── cakey.pem
[root@CA CA]#openssl req -new -x509(表示要自签名证书) -key private/cakey.pem -out cacert.pem -days 3650
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:beijing
Locality Name (eg, city) [Default City]:beijing
Organization Name (eg, company) [Default Company Ltd]:magedu
Organizational Unit Name (eg, section) []:M30
Common Name (eg, your name or your server’s hostname) []:www.magedu.com
Email Address []:
[root@CA CA]#ls
cakey.pem  certs  crl  newcerts  private
[root@CA CA]#openssl x509 -in cakey.pem -noout -text    查看证书内容
Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            81:9b:e5:20:d9:c6:35:c1
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C=CN, ST=beijing, L=beijing, O=magedu, OU=M30, CN=www.magedu.com
        Validity
            Not Before: May 19 02:36:20 2018 GMT
            Not After : May 16 02:36:20 2028 GMT
        Subject: C=CN, ST=beijing, L=beijing, O=magedu, OU=M30, CN=www.magedu.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (4096 bit)
                Modulus:
                    00:cb:62:1d:1e:80:08:a7:09:f6:16:da:0f:a6:6b:
                    ef:17:85:29:de:49:0e:d0:32:fd:c1:fb:ec:c1:22:
                    3d:2d:2b:d6:8f:77:3d:8d:11:ec:d4:f4:a8:c6:05:
                    d4:50:5b:ad:81:b1:9f:88:dc:bd:29:e9:13:53:6f:
                    be:c8:e7:e0:7f:af:c3:79:d3:87:1d:d9:8a:0b:e3:
                    e2:a4:d5:ec:aa:e4:57:a8:4d:1c:a5:aa:06:c8:16:
                    70:ff:f8:ac:ee:fe:2b:69:97:04:44:21:ed:0f:c1:
                    2e:1d:5d:b1:14:31:1e:18:38:91:fb:90:47:5b:92:
                    f2:39:65:c6:81:84:70:86:fd:37:cd:e6:91:a6:21:
                    9b:24:1e:10:5c:a5:50:97:bd:44:e2:58:27:5a:15:
                    78:a6:74:24:0b:b1:0b:11:70:d1:90:da:dc:1b:be:
                    0b:6f:ea:fc:35:c6:c9:b8:18:c5:5a:2a:d1:0b:a2:
                    c5:4b:1a:56:d2:5f:67:f0:a6:ee:a7:91:4d:73:01:
                    11:31:c7:bb:30:ad:7e:1a:5d:ac:c3:f2:7f:37:89:
                    af:b2:4d:a1:60:01:ed:36:20:6b:09:39:3a:cb:49:
                    6d:9d:e9:0b:cb:3a:f7:68:a0:cf:a9:46:fc:bb:94:
                    c3:17:4b:d4:c2:09:74:fb:25:6b:dd:95:15:20:08:
                    c6:d9:c4:de:42:ea:0d:dc:f0:aa:2a:96:37:d4:0e:
                    f1:4e:10:f8:2b:c8:13:c2:46:04:16:52:dd:ce:b9:
                    78:11:9f:40:c1:c8:d7:9c:c9:89:1d:ef:28:7d:a0:
                    dd:07:d1:db:87:ff:45:b8:28:95:1f:18:db:f7:e9:
                    0b:dc:5a:92:6f:c6:bd:fb:e8:b9:eb:b6:74:84:5f:
                    e1:5c:03:94:f2:c7:7e:a4:f0:de:a1:f7:53:85:28:
                    1d:6a:97:83:2f:5f:af:00:9a:15:2d:7e:20:30:22:
                    38:40:6b:71:1c:5d:d1:04:4b:ec:c3:4f:3d:0f:80:
                    e1:ac:df:2c:32:41:73:2c:9c:f9:7a:ef:d9:e7:4a:
                    66:62:a6:12:e2:21:33:55:99:bb:52:33:87:b3:99:
                    8f:01:ce:af:c1:06:63:6d:52:f9:b2:49:a2:ea:3d:
                    15:ed:9e:19:4e:3f:4f:d9:e1:10:52:9b:42:17:6c:
                    58:fb:94:94:39:d0:2f:68:17:3d:e5:a8:49:9c:6f:
                    82:d9:c0:a1:c2:2c:e4:e4:b5:62:46:6b:bd:b5:ff:
                    74:5f:19:3d:f6:1d:f8:4c:43:64:03:c8:0b:66:4f:
                    f3:ec:ac:41:14:f1:9a:0f:56:88:8a:95:13:c9:ca:
                    3b:ec:c7:67:f8:77:6f:78:71:16:c6:a7:61:39:81:
                    ee:ce:43
                Exponent: 65537 (0x10001)
        X509v3 extensions:
            X509v3 Subject Key Identifier:
                3D:34:3C:8A:E4:C2:04:B7:01:C7:26:10:3B:77:5B:C5:54:27:8C:C9
            X509v3 Authority Key Identifier:
                keyid:3D:34:3C:8A:E4:C2:04:B7:01:C7:26:10:3B:77:5B:C5:54:27:8C:C9
            X509v3 Basic Constraints:
                CA:TRUE
    Signature Algorithm: sha256WithRSAEncryption
         25:00:57:93:6a:a9:ec:c7:19:ab:af:69:a2:fa:4e:f9:4f:9d:
         ee:bb:94:45:39:92:f6:8d:9d:65:09:89:d1:ce:5b:69:f3:b7:
         81:28:75:9d:bd:c2:31:98:bc:92:e4:6b:04:57:b5:d2:91:85:
         ef:5c:fa:b1:36:83:98:92:aa:1b:03:dc:54:86:eb:7c:f5:d6:
         91:17:76:9c:7e:f8:4a:b4:e4:f6:43:ac:b8:b1:19:a1:6b:cc:
         19:0e:7d:d8:a7:aa:8e:c7:15:b2:dc:98:a6:86:42:b0:b0:8f:
         ca:77:a7:ae:d1:a3:a4:1c:b3:ed:96:d4:e1:aa:b2:45:bd:a9:
         95:ab:bb:a6:c1:59:b1:c2:e8:bb:df:2d:3e:09:df:88:9a:32:
         f1:2d:37:c4:fc:64:cc:82:9a:67:3b:63:0f:f5:da:00:db:69:
         23:b1:78:a4:dc:89:88:78:c2:8e:d2:e1:93:81:1c:fa:ad:58:
         77:0d:27:81:49:a5:f5:f3:40:e4:02:bf:76:c3:53:e1:7d:df:
         85:c9:6f:79:6d:c6:88:55:9b:94:d9:85:23:22:df:aa:2e:dc:
         f6:1a:ec:4a:b2:6d:cc:4e:a0:3e:7c:98:2f:5d:2d:0a:33:0d:
         43:e5:b3:94:69:11:df:42:71:5b:0a:18:60:1f:12:d0:0a:54:
         1e:20:29:fd:27:37:11:1b:14:c5:8f:bf:fd:9f:01:db:98:dd:
         75:88:db:f9:42:c1:98:f7:eb:3b:02:fe:0f:cc:c4:30:f1:98:
         de:59:e3:3e:e7:09:3d:4b:63:64:86:83:b0:d0:f5:56:1c:75:
         88:b9:98:df:e1:bc:4c:77:a7:08:f2:23:fb:0e:58:65:43:bc:
         da:14:c3:e6:ad:83:65:63:47:b9:4b:b0:ff:0d:9d:41:b4:96:
         9c:f9:8b:5f:bd:51:e1:e6:ea:fb:9b:71:51:c9:09:10:34:94:
         ca:88:70:ba:66:0c:b6:70:96:d9:ab:d8:e6:05:75:94:9b:46:
         3f:67:0c:af:e4:1d:c2:95:16:83:df:d7:b8:92:4f:db:20:6a:
         60:e1:e4:2b:8d:5b:be:92:c6:97:98:93:a3:e5:bf:bf:32:cb:
         05:32:9a:73:6d:69:f9:da:46:29:b2:d4:d6:69:88:07:85:7b:
         60:f3:4f:51:de:5e:94:67:36:0d:6b:00:5d:a9:10:38:9f:d2:
         3c:eb:4b:7b:c6:89:cc:1d:cf:4c:81:5d:1d:e5:f7:66:8c:f8:
         c8:a8:3d:e6:f8:a8:0f:b0:d8:ff:b9:e2:57:da:90:fe:6b:0f:
         ac:89:de:70:5e:c9:f5:78:fc:03:03:39:e5:ea:88:c4:94:b9:
         68:86:f8:5b:6d:15:89:ec
[root@CA CA]#openssl x509 -in cakey.pem -noout -issuer     谁颁发的证书
issuer= /C=CN/ST=beijing/L=beijing/O=magedu/OU=M30/CN=www.magedu.com
[root@CA CA]#openssl x509 -in cakey.pem -noout -subject   给谁颁发的证书
subject= /C=CN/ST=beijing/L=beijing/O=magedu/OU=M30/CN=www.magedu.com
[root@CA CA]#openssl x509 -in cakey.pem -noout -dates   有效期
notBefore=May 19 02:36:20 2018 GMT
notAfter=May 16 02:36:20 2028 GMT
[root@CA CA]#sz cakey.pem     发送给windows已图形方式查看。
将cakey.pem 后缀改成cakey.crt 就可以用windows查看了。
此证书是不被信任的因为windows信任证书中没有此证书,导入此证书即可。
2 用户或服务器
[root@client mm]#(umask 077;openssl genrsa -out app.key 1024)
Generating RSA private key, 1024 bit long modulus
…………………………….++++++
………++++++
e is 65537 (0x10001)
[root@client mm]#file app.key
app.key: ASCII text
[root@client mm]#cat app.key
—–BEGIN RSA PRIVATE KEY—–
MIICXQIBAAKBgQCywNOcso5Rpnx+UtGBh+vFvHQweIPgUCRQ0hxMwEMPH0dicgQx
hEIoRwjVe5Y3p9bWMvXRDFBvlC+pasitWC9NClBNElV6FvE666nTZQro6uc0WFZj
j75sKap+91QlaYwQvZmECru5N/htTX6JH3WffjwI0kPz/wZlL3tT+7rDnwIDAQAB
AoGAElWY3t+pnVJYPpS8DG8mjbeQq1ARJrbRosCKSo0F080/gydyqqmIJ51xmIP+
mmLKtFmxwOlkbq1iXhwnzS/YWgCsyK3rO9nynEygQAJMuPev53O/zzWWcKjNAkKj
I0SWK3HHCtKbRcG0H5AO1tcJUuOQYCJlT6b6YkLjQPHYd5ECQQDWALjptXcJ6qKy
CLiptLUPKrZjGnD8V7A2hkWd3SGECBZlZq96xnF7siz8Kg8eaJ+CDaLuK6COKctW
u7GdX/ZFAkEA1dUzoJe354iaigqmGRJJ7nC84sDmaXI54lIwYAnLUHn/raPqqhR+
xIFPKdwY5RdJEobDn8sqhxnx7KWXW8mSkwJBAKcgB0jVI7LF3+sjrnsyGdhPZgJ9
StF29bGPKN0BLcR7wGnOSKqcQVH1svX3LrlzwWYCmkRgI9ICR79jc3FQ2PUCQBvL
rf1XG3G+YRBGmBa0OOYEw5jaKFlWns2bj2w8ebBJW4Hvx8Y6CcxzXp37XUUSRM5i
tDUmTK3pInh3gfhNeH8CQQCH7zgrxOxrWLaoTh67NgleRT6tIh5puKYHsIi9LBUK
p3hRY3ArVg6rGak+8BbRBe1dHyvw2DOmRMo334kZhZB4
—–END RSA PRIVATE KEY—–
[root@client mm]#openssl req -new -key app.key -out app.csr    申请证书
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:beijing
Locality Name (eg, city) [Default City]:beijing
Organization Name (eg, company) [Default Company Ltd]:magedu
Organizational Unit Name (eg, section) []:M30
Common Name (eg, your name or your server’s hostname) []:app.magedu.com
Email Address []:
Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
[root@client mm]#ll
total 8
-rw-r–r– 1 root root 651 May 19 10:58 app.csr
-rw——- 1 root root 887 May 19 10:55 app.key
[root@client mm]#scp app.csr 192.168.30.101:/etc/pki/CA     将证书发送给CA请求CA盖章
root@192.168.30.101’s password:
app.csr                                                                  100%  651     0.6KB/s   00:00
[root@CA CA]#openssl ca -in app.csr  -out certs/app.crt -days 100   盖章出错,因为缺少index.text这个文件
Using configuration from /etc/pki/tls/openssl.cnf
Error opening CA certificate /etc/pki/CA/cacert.pem
140252291815328:error:02001002:system library:fopen:No such file or directory:bss_file.c:402:fopen(‘/etc/pki/CA/cacert.pem’,’r’)
140252291815328:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:404:
unable to load certificate
[root@CA CA]#touch index.text
[root@CA CA]#openssl ca -in app.csr -out certs/app.crt -days 100   盖章出错还缺少
Using configuration from /etc/pki/tls/openssl.cnf
/etc/pki/CA/serial: No such file or directory
error while loading serial number
140202379884448:error:02001002:system library:fopen:No such file or directory:bss_file.c:402:fopen(‘/etc/pki/CA/serial’,’r’)
140202379884448:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:404:
[root@CA CA]#echo 0F > serial
[root@CA CA]#cat serial   这就是要颁发证书的编号
0F
[root@CA CA]#openssl ca -in app.csr  -out certs/app.crt -days 100
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 15 (0xf)
        Validity
            Not Before: May 19 03:22:45 2018 GMT
            Not After : Aug 27 03:22:45 2018 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = beijing
            organizationName          = magedu
            organizationalUnitName    = M30
            commonName                = app.magedu.com
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                21:B2:CE:F3:05:5D:C7:08:96:93:2B:BA:D4:CB:50:E4:F7:77:7D:30
            X509v3 Authority Key Identifier:
                keyid:3D:34:3C:8A:E4:C2:04:B7:01:C7:26:10:3B:77:5B:C5:54:27:8C:C9
Certificate is to be certified until Aug 27 03:22:45 2018 GMT (100 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
[root@CA CA]#ll certs/app.crt
-rw-r–r– 1 root root 4966 May 19 11:22 certs/app.crt
[root@CA CA]#ll certs/app.crt newcerts
-rw-r–r–  1 root root 4966 May 19 11:22 certs/app.crt
newcerts:
total 8
-rw-r–r– 1 root root 4966 May 19 11:22 0F.pem
[root@CA CA]#openssl x509 -in certs/app.crt -noout -issuer
issuer= /C=CN/ST=beijing/L=beijing/O=magedu/OU=M30/CN=www.magedu.com
[root@CA CA]#openssl x509 -in certs/app.crt -noout -dates
notBefore=May 19 03:22:45 2018 GMT
notAfter=Aug 27 03:22:45 2018 GMT
[root@CA CA]#openssl x509 -in certs/app.crt -noout -subject
subject= /C=CN/ST=beijing/O=magedu/OU=M30/CN=app.magedu.com
[root@CA CA]#cat index.txt
V 180827032245Z 0F unknown /C=CN/ST=beijing/O=magedu/OU=M30/CN=app.magedu.com
[root@CA CA]#cat index.txt.old
[root@CA CA]#cat serial
10
[root@CA CA]#cat serial.old
0F
[root@CA CA]#scp certs/app.crt 192.168.30.102:/data/mm   将颁发的证书发还给申请者
root@192.168.30.102’s password:
app.crt                                                                  100% 4966     7.8MB/s   00:00
[root@CA CA]#
[root@client mm]#ls
app.crt  app.csr  app.key
OpenSSL
   PKI:Public Key Infrastructure
CA
RA
CRL
证书存取库
   建立私有CA:
OpenCA
openssl
   证书申请及签署步骤:
1、生成申请请求
2、RA核验
3、CA签署
4、获取证书
创建CA和申请证书
   创建私有CA:
openssl的配置文件:/etc/pki/tls/openssl.cnf
三种策略:匹配、支持和可选
匹配指要求申请填写的信息跟CA设置信息必须一致,支持指必须填写这项申请信息,
可选指可有可无
   1、创建所需要的文件
touch /etc/pki/CA/index.txt 生成证书索引数据库文件
echo 01 > /etc/pki/CA/serial 指定第一个颁发证书的序列号
   2、 CA自签证书
生成私钥
cd /etc/pki/CA/
(umask 066; openssl genrsa -out
/etc/pki/CA/private/cakey.pem 2048)
创建CA和申请证书
   生成自签名证书
openssl req -new -x509 –key
/etc/pki/CA/private/cakey.pem -days 7300 -out
/etc/pki/CA/cacert.pem
-new: 生成新证书签署请求
-x509: 专用于CA生成自签证书
-key: 生成请求时用到的私钥文件
-days n:证书的有效期限
-out / PATH/TO/SOMECERTFILE : 证书的保存路径
创建CA和申请证书
   3 、 颁发证书
  在需要使用证书的主机生成证书请求
给web服务器生成私钥
(umask 066; openssl genrsa -out
/etc/pki/tls/private/test.key 2048)
生成证书申请文件
openssl req -new -key /etc/pki/tls/private/test.key
-days 365 -out etc/pki/tls/test.csr
   将证书请求文件传输给CA
   CA签署证书,并将证书颁发给请求者
openssl ca -in /tmp/test.csr –out
/etc/pki/CA/certs/test.crt -days 365
注意:默认国家,省,公司名称三项必须和CA一致
创建CA和证书管理
   查看证书中的信息:
openssl x509 -in  /PATH/FROM/CERT_FILE  -noout -text|issuer|subject|serial|dates
openssl ca -status SERIAL 查看指定编号的证书状态
   4、吊销证书
   在客户端获取要吊销的证书的serial
openssl x509 -in / PATH/FROM/CERT_FILE -noout -serial -subject
   在CA上,根据客户提交的serial与subject信息,对比检验是否与index.txt文件中的信息一致,吊
销证书:
openssl ca -revoke /etc/pki/CA/newcerts/ SERIAL .pem
   指定第一个吊销证书的编号 , 注意:第一次更新证书吊销列表前,才需要执行
echo 01 > /etc/pki/CA/crlnumber
   更新证书吊销列表
openssl ca -gencrl -out /etc/pki/CA/crl.pem
   查看crl文件:
openssl crl -in /etc/pki/CA/crl.pem -noout -text
无法重复提交相同的信息去申请不同的证书
[root@CA CA]#openssl ca -in app.csr -out certs/app2.crt
Using configuration from /etc/pki/tls/openssl.cnf
Check that the request matches the signature
Signature ok
Certificate Details:
        Serial Number: 16 (0x10)
        Validity
            Not Before: May 19 03:57:55 2018 GMT
            Not After : May 19 03:57:55 2019 GMT
        Subject:
            countryName               = CN
            stateOrProvinceName       = beijing
            organizationName          = magedu
            organizationalUnitName    = M30
            commonName                = app.magedu.com
        X509v3 extensions:
            X509v3 Basic Constraints:
                CA:FALSE
            Netscape Comment:
                OpenSSL Generated Certificate
            X509v3 Subject Key Identifier:
                21:B2:CE:F3:05:5D:C7:08:96:93:2B:BA:D4:CB:50:E4:F7:77:7D:30
            X509v3 Authority Key Identifier:
                keyid:3D:34:3C:8A:E4:C2:04:B7:01:C7:26:10:3B:77:5B:C5:54:27:8C:C9
Certificate is to be certified until May 19 03:57:55 2019 GMT (365 days)
Sign the certificate? [y/n]:y
failed to update database
TXT_DB error number 2
-rw-r–r–  1 root root   21 May 19 11:22 index.txt.attr  之所以无法重复申请是因为这个文件unique_subject = yes   唯一的申请者如果改成no就可以重复申请了。
[root@CA CA]#openssl ca -status 0F     查看证书的状态
Using configuration from /etc/pki/tls/openssl.cnf
0F=Valid (V)
吊销证书:
[root@CA CA]#openssl ca -revoke newcerts/10.pem
Using configuration from /etc/pki/tls/openssl.cnf
Revoking Certificate 10.
Data Base Updated
[root@CA CA]#cat index.txt
V 180827032245Z 0F unknown /C=CN/ST=beijing/O=magedu/OU=M30/CN=app.magedu.com
R 180827050444Z 180519050702Z 10 unknown /C=CN/ST=beijing/O=magedu/OU=M30/CN=www.app2.com
[root@CA CA]#openssl ca -status 10       虽然已经吊销了这个证书,但是需要发布到网络上让其他人也知道
Using configuration from /etc/pki/tls/openssl.cnf
10=Revoked (R)
[root@CA CA]#openssl ca -gencrl -out crl.pem     无法生成吊销列表,因为缺少crlnumber这个文本文件
Using configuration from /etc/pki/tls/openssl.cnf
/etc/pki/CA/crlnumber: No such file or directory
error while loading CRL number
140244731029408:error:02001002:system library:fopen:No such file or directory:bss_file.c:402:fopen(‘/etc/pki/CA/crlnumber’,’r’)
140244731029408:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:404:
[root@CA CA]#echo 01 > crlnumber
[root@CA CA]#cat crlnumber
01
[root@CA CA]#openssl ca -gencrl -out crl.pem
Using configuration from /etc/pki/tls/openssl.cnf
[root@CA CA]#cat crlnumber
02
[root@CA CA]#openssl crl -in crl.pem -noout -text
Certificate Revocation List (CRL):
        Version 2 (0x1)
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: /C=CN/ST=beijing/L=beijing/O=magedu/OU=M30/CN=www.magedu.com
        Last Update: May 19 05:14:51 2018 GMT
        Next Update: Jun 18 05:14:51 2018 GMT
        CRL extensions:
            X509v3 CRL Number:
                1
Revoked Certificates:
    Serial Number: 10
        Revocation Date: May 19 05:07:02 2018 GMT
    Signature Algorithm: sha256WithRSAEncryption
         c4:ce:01:c7:f5:cb:7f:98:17:c6:c2:b3:59:3d:3e:50:0f:79:
         17:66:df:08:5a:a4:4e:47:3e:62:33:88:f8:af:2c:6c:f7:c4:
         e5:45:23:bf:79:56:98:cb:d9:3d:bf:a8:a4:53:e0:5f:de:00:
         2f:db:b1:74:51:d3:79:d5:16:e1:da:13:3b:15:73:fc:40:5d:
         8a:75:f2:a3:40:a9:65:82:0f:c3:d6:ea:fa:7b:47:db:aa:05:
         0f:ef:72:e5:6c:18:85:f3:98:fd:73:ca:4a:15:c3:57:83:30:
         d1:0c:42:01:a6:5c:1f:cb:22:dd:3e:6d:d9:20:6b:9d:40:41:
         1d:15:55:44:b7:c8:0e:f3:1c:88:c8:57:43:6f:e6:8f:65:a7:
         05:ba:48:42:74:05:d7:16:f7:45:51:43:02:da:47:28:40:d8:
         79:b2:26:6e:e0:1e:1f:8f:87:49:11:65:21:a7:70:e5:df:93:
         75:80:12:77:c0:f4:41:f4:a6:fc:6f:85:43:ef:a8:20:a6:b1:
         b1:c3:9d:2c:55:f9:69:8c:71:be:28:f2:ce:e2:0a:23:06:51:
         c8:2d:a6:3e:03:fd:ad:8b:bb:21:86:2c:1d:65:19:24:a3:76:
         c1:f6:f5:15:20:a7:47:cc:f9:b6:fa:8a:01:a4:b1:2e:ed:b3:
         b2:08:6a:a2:fe:37:e1:94:2c:cf:15:dd:48:b9:f5:82:de:e4:
         1f:fd:0a:d2:28:37:64:29:b9:e6:02:b9:22:f2:d7:4b:d3:ff:
         d0:8b:de:0a:c2:ed:5b:df:86:4c:87:a7:05:6e:d7:a6:c6:32:
         f8:0d:75:2d:df:4e:3f:b3:db:50:de:27:b6:02:6c:e8:51:8b:
         51:74:f2:bc:a9:cf:9e:07:79:a0:42:09:37:3a:3c:33:bd:7f:
         c5:4c:48:6f:da:b1:f4:8f:c4:e0:96:39:11:b9:e0:99:ce:f2:
         f1:19:ab:8d:b8:8d:8e:48:f8:23:9e:03:fd:cd:dc:e5:1f:3c:
         ff:11:dc:3c:34:7e:af:c8:06:d9:5e:67:e3:78:d8:10:e0:30:
         42:85:2e:73:6b:d7:1a:f3:9c:7f:21:4a:78:b1:26:3f:3c:a4:
         fb:64:47:a1:6b:0b:e8:35:c2:4a:81:4c:a0:8f:51:f4:64:5a:
         f6:63:45:91:f7:6d:16:8e:00:11:46:00:bb:41:7c:19:3d:e5:
         3e:f6:60:9b:1c:f8:47:89:54:36:5c:f0:f1:e1:0a:ac:5c:21:
         cd:4a:29:11:de:ff:f3:c3:fa:7e:8b:dd:b4:94:24:cf:8b:d1:
         a7:da:27:9c:44:06:14:96:6e:92:5d:ca:24:5c:fb:34:39:36:
         7c:78:7c:a0:6a:2c:39:ad
[root@CA CA]#openssl crl -in crl.pem -noout -issuer
issuer=/C=CN/ST=beijing/L=beijing/O=magedu/OU=M30/CN=www.magedu.com
也可以将文件传到windows中将crl.pem 后缀修改成crl.crl即可
[root@CA CA]#rpm -qp /misc/cd/Packages/mod_ssl-2.4.6-67.el7.centos.x86_64.rpm
mod_ssl-2.4.6-67.el7.centos.x86_64
[root@CA CA]#rpm -qp –scripts /misc/cd/Packages/mod_ssl-2.4.6-67.el7.centos.x86_64.rpm
postinstall scriptlet (using /bin/sh):
umask 077
if [ -f /etc/pki/tls/private/localhost.key -o -f /etc/pki/tls/certs/localhost.crt ]; then   判断文件存在不存在,如果存在退出
   exit 0
fi
/usr/bin/openssl genrsa -rand /proc/apm:/proc/cpuinfo:/proc/dma:/proc/filesystems:/proc/interrupts:/proc/ioports:/proc/pci:/proc/rtc:/proc/uptime 2048 > /etc/pki/tls/private/localhost.key 2> /dev/null
FQDN=`hostname`
if [ “x${FQDN}” = “x” -o ${#FQDN} -gt 59 ]; then
   FQDN=localhost.localdomain
fi
cat << EOF | /usr/bin/openssl req -new -key /etc/pki/tls/private/localhost.key \
         -x509 -sha256 -days 365 -set_serial $RANDOM -extensions v3_req \
         -out /etc/pki/tls/certs/localhost.crt 2>/dev/null
SomeState
SomeCity
SomeOrganization
SomeOrganizationalUnit
${FQDN}
root@${FQDN}
EOF
[root@CA certs]#pwd
/etc/pki/tls/certs
[root@CA certs]#cat Makefile      可以调用这个脚本申请证书
UTF8 := $(shell locale -c LC_CTYPE -k | grep -q charmap.*UTF-8 && echo -utf8)
DAYS=365
KEYLEN=2048
TYPE=rsa:$(KEYLEN)
EXTRA_FLAGS=
ifdef SERIAL
EXTRA_FLAGS+=-set_serial $(SERIAL)
endif
.PHONY: usage
.SUFFIXES: .key .csr .crt .pem
.PRECIOUS: %.key %.csr %.crt %.pem
usage:
@echo “This makefile allows you to create:”
@echo ”  o public/private key pairs”
@echo ”  o SSL certificate signing requests (CSRs)”
@echo ”  o self-signed SSL test certificates”
@echo
@echo “To create a key pair, run \”make SOMETHING.key\”.”
@echo “To create a CSR, run \”make SOMETHING.csr\”.”
@echo “To create a test certificate, run \”make SOMETHING.crt\”.”
@echo “To create a key and a test certificate in one file, run \”make SOMETHING.pem\”.”
@echo
@echo “To create a key for use with Apache, run \”make genkey\”.”
@echo “To create a CSR for use with Apache, run \”make certreq\”.”
@echo “To create a test certificate for use with Apache, run \”make testcert\”.”
@echo
@echo “To create a test certificate with serial number other than random, add SERIAL=num”
@echo “You can also specify key length with KEYLEN=n and expiration in days with DAYS=n”
@echo “Any additional options can be passed to openssl req via EXTRA_FLAGS”
@echo
@echo Examples:
@echo ”  make server.key”
@echo ”  make server.csr”
@echo ”  make server.crt”
@echo ”  make stunnel.pem”
@echo ”  make genkey”
@echo ”  make certreq”
@echo ”  make testcert”
@echo ”  make server.crt SERIAL=1″
@echo ”  make stunnel.pem EXTRA_FLAGS=-sha384″
@echo ”  make testcert DAYS=600″
%.pem:
umask 77 ; \
PEM1=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
PEM2=`/bin/mktemp /tmp/openssl.XXXXXX` ; \
/usr/bin/openssl req $(UTF8) -newkey $(TYPE) -keyout $$PEM1 -nodes -x509 -days $(DAYS) -out $$PEM2 $(EXTRA_FLAGS) ; \
cat $$PEM1 >  $@ ; \
echo “”    >> $@ ; \
cat $$PEM2 >> $@ ; \
$(RM) $$PEM1 $$PEM2
%.key:
umask 77 ; \
/usr/bin/openssl genrsa -aes128 $(KEYLEN) > $@
%.csr: %.key
umask 77 ; \
/usr/bin/openssl req $(UTF8) -new -key $^ -out $@
%.crt: %.key
umask 77 ; \
/usr/bin/openssl req $(UTF8) -new -key $^ -x509 -days $(DAYS) -out $@ $(EXTRA_FLAGS)
TLSROOT=/etc/pki/tls
KEY=$(TLSROOT)/private/localhost.key
CSR=$(TLSROOT)/certs/localhost.csr
CRT=$(TLSROOT)/certs/localhost.crt
genkey: $(KEY)
certreq: $(CSR)
testcert: $(CRT)
$(CSR): $(KEY)
umask 77 ; \
/usr/bin/openssl req $(UTF8) -new -key $(KEY) -out $(CSR)
$(CRT): $(KEY)
umask 77 ; \
/usr/bin/openssl req $(UTF8) -new -key $(KEY) -x509 -days $(DAYS) -out $(CRT) $(EXTRA_FLAGS)
SSH : 代替telnet,口令是密文的更安全
  ssh: secure shell, protocol, 22/tcp, 安全的远程登录
  具体的软件实现:
OpenSSH: ssh协议的开源实现,CentOS默认安装
[root@CA certs]#rpm -qf /bin/ssh   ssh来自openssh
openssh-clients-7.4p1-11.el7.x86_64
dropbear:另一个开源实现
  SSH协议版本
v1: 基于CRC-32做MAC,不安全;man-in-middle
v2:双方主机协议选择安全的MAC方式
基于DH(的符合尔曼大素数加密算法)算法做密钥交换,基于RSA或DSA实现身份认证
  两种方式的用户登录认证:
基于password
基于key
Openssh软件组成
  OpenSSH介绍
  相关包:
openssh
openssh-clients
openssh-server
在centos7上
[root@CA certs]#rpm -ql openssh-server
/usr/sbin/sshd
/usr/lib/systemd/system/sshd.service
在centos6上
/usr/sbin/sshd
/etc/rc.d/init.d/sshd
  工具:
基于C/S结构
Client: ssh, scp, sftp,slogin
Windows客户端:
xshell, putty, securecrt, sshsecureshellclient
Server: sshd
[root@CA certs]#systemctl status sshd
● sshd.service – OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2018-05-19 09:06:46 CST; 4h 40min ago
[root@CA certs]#ss -ntl
State       Recv-Q Send-Q        Local Address:Port                       Peer Address:Port
LISTEN      0      128                       *:111                                   *:*
LISTEN      0      128                       *:22                                    *:*
LISTEN      0      128               127.0.0.1:631                                   *:*
LISTEN      0      100               127.0.0.1:25                                    *:*
LISTEN      0      128                      :::111                                  :::*
LISTEN      0      128                      :::22                                   :::*
LISTEN      0      128                     ::1:631                                  :::*
LISTEN      0      100                     ::1:25                                   :::*
[root@CA certs]#ss -tl
State       Recv-Q Send-Q      Local Address:Port                       Peer Address:Port
LISTEN      0      128                     *:sunrpc                                *:*
LISTEN      0      128                     *:ssh                                   *:*
LISTEN      0      128             127.0.0.1:ipp                                   *:*
LISTEN      0      100             127.0.0.1:smtp                                  *:*
LISTEN      0      128                    :::sunrpc                               :::*
LISTEN      0      128                    :::ssh                                  :::*
LISTEN      0      128                   ::1:ipp                                  :::*
LISTEN      0      100                   ::1:smtp                                 :::*
ssh客户端
   客户端组件:
   ssh, 配置文件:/etc/ssh/ssh_config
Host PATTERN
StrictHostKeyChecking no 首次登录不显示检查提示,默认是ask
   格式:ssh [user@]host [COMMAND]
ssh [-l user] host [COMMAND]
-p port:远程服务器监听的端口
-b:指定连接的源IP
-v:调试模式
-C:压缩方式
-X: 支持x11转发   图形功能的转发
ssh 192.168.30.102
无法使用xclock
ssh -X 192.168.30.102
可以使用xclock
-Y:支持信任x11转发
ForwardX11Trusted yes
-t: 强制伪tty分配
ssh -t remoteserver1 ssh remoteserver2
[root@CA certs]#cat /etc/ssh/ssh_config   ssh客户端的配置文件
#   Port 22      默认端口号
#   CheckHostIP no    检查主机地址是否可信,第一次连接时会问是否yes,yes后便会记录连接的这个ID和其个人信息,如果ID一样但是主机发生改变禁止连接
如果你修改自己的IP地址和MAC地址,ssh也会发现骗你与原来机器的不同之处,禁止连接。
ssh记录了原来IP地址的一对公钥。
[root@CA .ssh]#cat known_hosts    在这个文件中记录了连接过的IP的公钥
172.20.102.175 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAzOEptoH94oi+Cm3GovJbnb1ryyYxh6huFNvL+AaH9rI/RBsIFqxKNZsx2f7C8Tlf4THCPoO+5BItTBOkJVpC5PVzbhvWA2ZBCx9Kk/55H8PBAnR0NuofcfOvPSRmO0pjwtnQ31/TOFZXgnRUfgetaXAaPMJvIp4w0JFKvFpdk36bNS6Xsr0qpzyj2xRUFz0jbLV4zaDinCBuX3lvFn9ndKa88nR+LPdsAxc4gYpGx7q6eVpE7Ulpu1+O1cuOzIpGWz3Ir6A+n5WjAAilyRKWPCL15rtnXlVb5dmfB8y/V+ac6vygr7JongXQESBbF91mgQF+JXEpXN0DFJ6tD03UMw==
172.20.102.77 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBOd3RxYMhIGhaYivp1YJsHoTgDgbpQdb8l0185VVeMdNpvQ8WYDpODdMVbdbARVe/zyJPMf4K/DzeHWmVxs8BZU=
192.168.30.103 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAzOEptoH94oi+Cm3GovJbnb1ryyYxh6huFNvL+AaH9rI/RBsIFqxKNZsx2f7C8Tlf4THCPoO+5BItTBOkJVpC5PVzbhvWA2ZBCx9Kk/55H8PBAnR0NuofcfOvPSRmO0pjwtnQ31/TOFZXgnRUfgetaXAaPMJvIp4w0JFKvFpdk36bNS6Xsr0qpzyj2xRUFz0jbLV4zaDinCBuX3lvFn9ndKa88nR+LPdsAxc4gYpGx7q6eVpE7Ulpu1+O1cuOzIpGWz3Ir6A+n5WjAAilyRKWPCL15rtnXlVb5dmfB8y/V+ac6vygr7JongXQESBbF91mgQF+JXEpXN0DFJ6tD03UMw==
172.20.0.7 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBOd3RxYMhIGhaYivp1YJsHoTgDgbpQdb8l0185VVeMdNpvQ8WYDpODdMVbdbARVe/zyJPMf4K/DzeHWmVxs8BZU=
192.168.30.102 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAzOEptoH94oi+Cm3GovJbnb1ryyYxh6huFNvL+AaH9rI/RBsIFqxKNZsx2f7C8Tlf4THCPoO+5BItTBOkJVpC5PVzbhvWA2ZBCx9Kk/55H8PBAnR0NuofcfOvPSRmO0pjwtnQ31/TOFZXgnRUfgetaXAaPMJvIp4w0JFKvFpdk36bNS6Xsr0qpzyj2xRUFz0jbLV4zaDinCBuX3lvFn9ndKa88nR+LPdsAxc4gYpGx7q6eVpE7Ulpu1+O1cuOzIpGWz3Ir6A+n5WjAAilyRKWPCL15rtnXlVb5dmfB8y/V+ac6vygr7JongXQESBbF91mgQF+JXEpXN0DFJ6tD03UMw==
192.168.30.101 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBK6K6kiEZLOoK6vl04j7qdyCOXH3LfgLfIqEVumP1mhV8MGYSJ77oMo4JJOwuw3doO6uyW8Sz97xGurwfciQRbA=
将这个文件对应的IP地址行删掉就可以连接了
想要冒充就必须得到要冒充机器的私钥。
开启一个新的centos7.4wang
mv /etc/ssh ssh_host_rsa_key /data
将centos7.4上/etc/ssh中的ssh_host_rsa_key拷贝到centos7.4wang机器上
scp -p(注意:保留原属性)/etc/ssh/ ssh_host_rsa_key 192.168.30.17:/etc/ssh/
然后修改centos7.4wang机器上的IP地址。
cd /etc/sysconfig/network-scripts
vim ifcfg-eth0
将地址修改成和centos7.4一样。
让后再用centos6去ssh 192.168.30.101 就可以连接了
[root@client ~]#cat /etc/ssh/sshd_config     服务器端的配置文件
# $OpenBSD: sshd_config,v 1.80 2008/07/02 02:24:18 djm Exp $
# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.
# This sshd was compiled with PATH=/usr/local/bin:/bin:/usr/bin
# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented.  Uncommented options change a
# default value.
#Port 22
[root@CENTOS7 ~]#ssh -X 192.168.30.102
windows 安装Xmanager Enterprise5
-t: 强制伪tty分配
ssh -t remoteserver1 ssh remoteserver2
c在防火墙中拒绝a的访问
a可以通过b来访问c
ssh -t 192.168.30.102 ssh192.168.30.103
ssh客户端
  允许实现对远程系统经验证地加密安全访问
  当用户远程连接ssh服务器时,会复制ssh服务器/etc/ssh/ssh_host*key.pub
(CentOS7默认是ssh_host_ecdsa_key.pub)文件中的公钥到客户机的
~./ssh/know_hosts中。下次连接时,会自动匹配相应私钥,不能匹配,将拒
绝连接
[root@CENTOS7 ~]#ssh 192.168.30.102 ‘cat /etc/centos-release’   执行一次命令就自动退出
root@192.168.30.102’s password:
CentOS release 6.9 (Final)
ssh服务登录验证
  ssh服务登录验证方式:
  用户/口令
  基于密钥
  基于用户和口令登录验证
  1 客户端发起ssh请求,服务器会把自己的公钥发送给用户
  2 用户会根据服务器发来的公钥对密码进行加密
  3 加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则
用户登录成功
ssh服务登录验证
  基于密钥的登录方式
  1 首先在客户端生成一对密钥(ssh-keygen)
  2 并将客户端的公钥ssh-copy-id 拷贝到服务端
  3 当客户端再次发送一个连接请求,包括ip、用户名
  4 服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP
和用户,就会随机生成一个字符串,例如:acdf
  5 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端
  6 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的
字符串发送给服务端
  7服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,
就允许免密码登录
基于key认证
  基于密钥的认证:
  (1) 在客户端生成密钥对
ssh-keygen -t rsa [-P ”] [-f “~/.ssh/id_rsa”]
  (2) 把公钥文件传输至远程服务器对应用户的家目录
ssh-copy-id [-i [identity_file]] [user@]host
  (3) 测试
  (4) 在SecureCRT或Xshell实现基于key验证
在SecureCRT工具—>创建公钥—>生成Identity.pub文件
转化为openssh兼容格式(适合SecureCRT,Xshell不需要转化格式),并复制到
需登录主机上相应文件authorized_keys中,注意权限必须为600,在需登录的ssh
主机上执行:
ssh-keygen -i -f Identity.pub >> .ssh/authorized_keys
基于key认证
  (5)重设私钥口令:
ssh-keygen –p
  (6)验证代理(authentication agent)保密解密后的密钥
  这样口令就只需要输入一次
  在GNOME中,代理被自动提供给root用户
  否则运行ssh-agent bash
  (7)钥匙通过命令添加给代理
ssh-add
[root@client ~]#ssh-keygen -t rsa    生成一对key
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
22:71:3a:67:26:9b:62:00:79:f7:25:9a:13:0d:10:c5 root@client
The key’s randomart image is:
+–[ RSA 2048]—-+
|  o=o            |
| .  Eo           |
|o . + + .        |
|.. . O o         |
|.   O * S        |
| .   @ .         |
|  o o            |
| . .             |
|                 |
+—————–+
[root@client ~]#ll .ssh
total 12
-rw——-  1 root root 1675 May 19 17:28 id_rsa
-rw-r–r–  1 root root  393 May 19 17:28 id_rsa.pub
-rw-r–r–. 1 root root 1978 May 19 15:06 known_hosts
实现ssh基于key的连接
[root@client ~]#ssh-copy-id -i .ssh/id_rsa.pub 192.168.30.101
root@192.168.30.101’s password:
Now try logging into the machine, with “ssh ‘192.168.30.101’”, and check in:
  .ssh/authorized_keys
to make sure we haven’t added extra keys that you weren’t expecting.
[root@client ~]#ssh 192.168.30.101
Last login: Sat May 19 15:03:20 2018 from 172.20.68.100
?  _oo0oo_
088888880
88″ . “88
(| -_- |)
 0\ = /0
               ___/’—‘\___
             .’ \\\\| |//// ‘.
            / \\\\|||:|||//// \
           /_ ||||| -:- ||||| _\
          |   | \\\\\-///// |   |
          | \_|  ”\—/”  |_/ |
          \  .-\__  ‘-‘  __/-.  /
        ___’. .’  /–.–\  ‘. .’___
     .”” ‘<  ‘.___\_<|>_/___.’ >’  “”.
    | | : ‘-  \’.;’\ _ /’;.’/ – ‘ : | |
    \  \ ‘_.   \_ __\ /__ _/   ._’ /  /
=====’-.____’.___ \_____/___.-‘____.-‘=====
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        佛祖保佑    iii    永不死机
[root@CENTOS7 ~]#cd .ssh
[root@CENTOS7 .ssh]#ls
authorized_keys  known_hosts
[root@client ~]#scp /etc/fstab 192.168.30.101:/data/d1/
fstab                                                                    100% 1040     1.0KB/s   00:00
root@CENTOS7 d1]#ls
f2  fstab  fstab.f  private.key  private.key2  public.key  public.key2
[root@client ~]#ssh 192.168.30.101 ‘cat /etc/centos-release’
CentOS Linux release 7.4.1708 (Core)
远程半自动推送多脚本并执行
写一个脚本收集本网段的所有开机的主机从定向到host文件中。
ssh-keygen -t rsa生成一对要是
for循环
用expect将scp-copy-id -i .ssh/id_rsa.pub host。
这时就可以自动ssh连接了。
然后在用for循环scp 脚本传给 host
最后在用ssh执行这些脚本
3台机器互相通:
第一种方法:
1.在a,b,c机器上生成分别生成秘钥对
ssh-keygen -t rsa
2.在a上将生成的秘钥复制给自己
  ssh-copy-id ipa
在b和c上分别执行上述命令
3.在a的.ssh/authorized_keys收集了所有的秘钥信息
将a的.ssh/authorized_keys分别发给b和c
scp .ssh/authorized_keys ipb:/root/.ssh
scp .ssh/authorized_keys ipc:/root/.ssh
第二种方法:这种方法A,B,C共用一套钥匙
1.在a机器上生成分别生成秘钥对
2.在a上将生成的秘钥复制给自己
  ssh-copy-id ipa
3.将a的.ssh文件夹分别复制给b和c
scp -pr .ssh ipb:/root/
scp -pr .ssh ipc:/root/
给私钥加上口令:
[root@client ~]#ssh-keygen -p    给私钥加口令
Enter file in which the key is (/root/.ssh/id_rsa):
Key has comment ‘/root/.ssh/id_rsa’
Enter new passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved with the new passphrase.
[root@client ~]#ssh 192.168.30.101   在连接已将基于key认证的远程主机时需要输入私钥口令。
Enter passphrase for key ‘/root/.ssh/id_rsa’:
Last login: Sat May 19 18:52:52 2018 from 192.168.30.102
这时可以启用代理服务,让代理服务自动提交私钥口令
[root@client ~]#ssh-agent bash    启动代理服务
[root@client ~]#ssh-add        添加自动提交的私钥密码
Enter passphrase for /root/.ssh/id_rsa:
Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)
[root@client ~]#ssh 192.168.30.101     实现自动提交私钥密码,自动登录
Last login: Sat May 19 19:24:09 2018 from 192.168.30.102
一但退出登录,那么代理服务必须重新启动,否则还是需要输入私钥口令
在xshell中使用key登录
点击工具
新建用户秘钥生成向导
一直下一步
到处公钥到windows中
将windows中的公钥导入centos中
cat id_rsa_10246.pub > authorized_keys
 在打开centos6属性中修改登录方式即可
在secureCRT上同样的方法
但是其生成的公钥格式不对
用命令改变其公钥的格式
ssh-keygen -i -f 公钥文件
将ssh-keygen交互式命令变成非交互式
ssh-keygen -p”” -f “/root/.ssh/di_rsa”
[root@centos6 ~]#vim auto_ssh_connect.sh
#!/bin/bash
rpm -q expect &>/dev/null || yum install expect -y > /dev/null
ssh-keygen -p “” -f “/root/.ssh/id_rsa”
password=magedu
while read inaddr;do
expect << eof
set timeout 10
spawn ssh-copy-id $inaddr
expect {
“yes/no” { send “yes\n” ; exp_continue }
“password” { send “$password\n” }
}
expect eof
eof
done < f1  (f1中存放着IP地址)
scp命令
  scp命令:
  scp [options] SRC… DEST/
  两种方式:
scp [options] [user@]host : /sourcefile /destpath
scp [options] /sourcefile [user@]host:/destpath
  常用选项:19
-C: 压缩数据流
-r: 递归复制
-p: 保持原文件的属性信息
-q: 静默模式
-P PORT: 指明remote host的监听的端口
scp 命令复制文件的时候不管文件发没发生改变都统统重新复制一遍,因此scp不适合同步文件。rsync能解决这个问题
rsync命令
   基于ssh和rsh服务实现高效率的远程系统之间复制文件
   使用安全的shell连接做为传输方式
   rsync –av /etc server1:/tmp 复制目录和目录下文件
   rsync –av /etc/ server1:/tmp 只复制目录下文件
   比scp更快,只复制不同的文件
   选项:
-n 模拟复制过程
-v 显示详细过程
-r 递归复制目录树
-p 保留权限
-t 保留时间戳
-g 保留组信息
-o 保留所有者信息
-l 将软链接文件本身进行复制(默认)
-L 将软链接文件指向的文件复制
-a 存档,相当于–rlptgoD,但不保留ACL(-A)和SELinux属性(-X)
sftp命令    底层是ssh协议,上层类似于ftp格式的传输工具
  交互式文件传输工具
  用法和传统的ftp工具相似
  利用ssh服务实现安全的文件上传和下载
  使用ls cd mkdir rmdir pwd get put等指令,可用?或help获取帮助信息
sftp [user@]host
sftp> help
pssh工具
   pssh是一个python编写可以在多台服务器上执行命令的工具,也可实现文件复制
   选项如下:
   –version:查看版本
   -h:主机文件列表,内容格式”[user@]host[:port]”
   -H:主机字符串,内容格式”[user@]host[:port]”
   -l:登录使用的用户名
   -p:并发的线程数【可选】
   -o:输出的文件目录【可选】
   -e:错误输入文件【可选】
   -t:TIMEOUT 超时时间设置,0无限制【可选】
   -O:SSH的选项
   -v:详细模式
   -A:手动输入密码模式
   -x:额外的命令行参数使用空白符号,引号,反斜线处理
   -X:额外的命令行参数,单个参数模式,同-x
   -i:每个服务器内部处理信息输出
   -P:打印出服务器返回信息
[root@CENTOS7 ~]#pssh -H “192.168.30.102” -A -i hostname
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password:
[1] 14:18:21 [SUCCESS] 192.168.30.102
centos6.localdomain
[root@centos6 ~]#cat f1
192.168.30.101
192.168.30.102
[root@centos6 ~]#mkdir /data/nn
[root@centos6 ~]#pssh -h f1 -o /data/nn ‘cat /etc/fstab’
[1] 15:06:35 [SUCCESS] 192.168.30.101
[2] 15:06:40 [SUCCESS] 192.168.30.102
[root@centos6 ~]#ll /data/nn
total 0
-rw-r–r– 1 root root 0 May 20 15:06 192.168.30.101
-rw-r–r– 1 root root 0 May 20 15:06 192.168.30.102
pssh -h f1 ‘sed -i “s/^SELINUX=.*/SELINUX=enforcing/” /etc/selinux/config’
[root@centos6 ~]#pssh -h f1 ‘sed -i “s/SELINUX=.*/SELINUX=enforcing/” /etc/selinux/config’
[1] 15:18:10 [SUCCESS] 192.168.30.102
[2] 15:18:10 [SUCCESS] 192.168.30.101
[root@centos6 ~]#cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX=enforcing
#     enforcing – SELinux security policy is enforced.
#     permissive – SELinux prints warnings instead of enforcing.
#     disabled – No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of these two values:
#     targeted – Targeted processes are protected,
#     mls – Multi Level Security protection.
SELINUXTYPE=targeted
[root@CENTOS7 ~]#mkdir /data/nn
[root@CENTOS7 ~]#cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX=enforcing
#     enforcing – SELinux security policy is enforced.
#     permissive – SELinux prints warnings instead of enforcing.
#     disabled – No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three two values:
#     targeted – Targeted processes are protected,
#     minimum – Modification of targeted policy. Only selected processes are protected.
#     mls – Multi Level Security protection.
SELINUXTYPE=targeted
[root@CENTOS7 ~]#mkdir /data/nn
[root@CENTOS7 ~]#cat /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX=enforcing
#     enforcing – SELinux security policy is enforced.
#     permissive – SELinux prints warnings instead of enforcing.
#     disabled – No SELinux policy is loaded.
SELINUX=enforcing
# SELINUXTYPE= can take one of three two values:
#     targeted – Targeted processes are protected,
#     minimum – Modification of targeted policy. Only selected processes are protected.
#     mls – Multi Level Security protection.
SELINUXTYPE=targeted
pssh只适用于远程实现命令,不适用与将本机的文件传输到远程主机,pscp.pssh适用于远程传输文件.
[root@centos6 ~]#cat > f2.sh
#!/bin/bash
hostname
^C
[root@centos6 ~]#chmod +x f2.sh
[root@centos6 ~]#ll f2.sh
-rwxr-xr-x 1 root root 21 May 20 15:26 f2.sh
[root@centos6 ~]#pscp.pssh -h f1 /root/f2.sh /data/nn
[1] 15:27:10 [SUCCESS] 192.168.30.101
[2] 15:27:15 [SUCCESS] 192.168.30.102
[root@centos6 ~]#pssh -h f1 -i ‘/data/nn/f2.sh’
[1] 15:27:48 [SUCCESS] 192.168.30.101
CENTOS7.localdomain
[2] 15:27:48 [SUCCESS] 192.168.30.102
centos6.localdomain
[root@centos6 ~]#pslurp -h f1 -L /data/nn/ /var/log/messages m   将远程主机上的文件拉取(复制)到我的电脑上
[root@centos6 ~]#tree /data/nn
/data/nn
├── 192.168.30.101
│?? └── m
└── 192.168.30.102
    └── m
Pssh示例
?通过pssh批量关闭seLinux
?pssh -H root@192.168.1.10 -i “sed -i
“s/SELINUX=enforcing/SELINUX=disabled/” /etc/selinux/config”
批量发送指令
?pssh -H root@192.168.1.10 -i setenforce 0
?pssh -H xuewb@192.168.1.10 -i hostname
?当不支持ssh的key认证时,通过 -A选项,使用密码认证批量执行指令
?pssh -H xuewb@192.168.1.10 -A -i hostname
?将标准错误和标准正确重定向都保存至/app目录下
?pssh -H 192.168.1.10 -o /app -e /app -i “hostname”
PSCP.PSSH命令
? pscp.pssh功能是将本地文件批量复制到远程主机
? pscp [-vAr] [-h hosts_file] [-H [user@]host[:port]] [-l user] [-p par] [-o outdir] [-e errdir]
[-t timeout] [-O options] [-x args] [-X arg] local remote
? Pscp-pssh选项
-v 显示复制过程
-a 复制过程中保留常规属性
-r 递归复制目录
? 将本地curl.sh 复制到/app/目录
pscp.pssh -H 192.168.1.10 /root/test/curl.sh /app/
pscp.pssh -h host.txt /root/test/curl.sh /app/
? 将本地多个文件批量复制到/app/目录
pscp.pssh -H 192.168.1.10 /root/f1.sh /root/f2.sh /app/
? 将本地目录批量复制到/app/目录
pscp.pssh -H 192.168.1.10 -r /root/test/ /app/
PSLURP.PSSH命令
?pslurp.pssh功能是将远程主机的文件批量复制到本地
?pslurp [-vAr] [-h hosts_file] [-H [user@]host[:port]] [-l user] [-p par][-o
outdir] [-e errdir] [-t timeout] [-O options] [-x args] [-X arg] [-L localdir]
remote local(本地名)
?Pslurp-pssh选项
-L 指定从远程主机下载到本机的存储的目录,local是下载到本地后的名称
-r 递归复制目录
?批量下载目标服务器的passwd文件至/app下,并更名为user
pslurp -H 192.168.1.10 -L /app/ /etc/passwd user

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/98959

发表评论

登录后才能评论

联系我们

400-080-6560

在线咨询:点击这里给我发消息

邮件:1823388528@qq.com

工作时间:周一至周五,9:30-18:30,节假日同时也值班