1、安全协议SSL/TLS
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
这两种协议位于传输层和应用层之前的协议,用于加密数据,保证数据安全的协议。
加密机制:服务器端将证书发给客户端,证书里面是CA用私钥签名的服务器的公钥,客户端因为信任CA,所以事先已经拿到CA的公钥,客户端用CA的公钥解密证书,得到服务器的公钥,客户端会自动生成对称秘钥,并用服务器的公钥加密这个对称秘钥,将这个对称秘钥传给服务器,服务器用自己的私钥解密也得到这个对称秘钥,这样双方就可以用这个对称秘钥加密数据进行通讯了。
HTTPS 协议:就是“HTTP 协议”和“SSL/TLS 协议”的组合。HTTP over SSL”或“HTTP over TLS”,对http协议的文本数据进行加密处理后,成为二进制形式传输。
2、openssl
- 对称加密
工具:openssl enc
算法:3des, aes, blowfish, twofish
[root@redhat7 app]#ls
bak.sh dos.sh reset.sh scp.sh script
[root@redhat7 app]#openssl enc -e -des3 -a -salt -in bak.sh -out bak.enc 加密文件,-e是加密,-des3就是3des加密算法-a -salt是加盐
enter des-ede3-cbc encryption password:
Verifying - enter des-ede3-cbc encryption password:
[root@redhat7 app]#ls
bak.enc bak.sh dos.sh reset.sh scp.sh script
[root@redhat7 app]#openssl enc -d -des3 -a -salt -in bak.enc -out bak ---解密文件用-d
enter des-ede3-cbc decryption password:
[root@redhat7 app]#ls
bak bak.enc bak.sh dos.sh reset.sh scp.sh script
[root@redhat7 app]#cat bak
cp -a /etc/ /app/`date "+%F-%T"`/
- 对文件进行哈希运算
[root@redhat7 app]#openssl dgst -md5 bak ---也可以进行哈希运算
MD5(bak)= 1bd8b8413eafd7d6502c763ecba53386
[root@redhat7 app]#md5sum bak ---和上面是相同的,因为算法相同
1bd8b8413eafd7d6502c763ecba53386 bak
[root@redhat7 app]#openssl dgst -sha512 bak
SHA512(bak)= d5ea17d3c7dc100967e4a9098793f41a4e53dc2b429bf9205fbc3e65cbb58c4810a2268cbafc4fcde03f5ab33d45ff138d409977e24bd3b1ef21f6d14f652b2e
- 生成用户加密口令
[root@redhat7 app]#openssl passwd -1 ---1就是$1,指的是md5加密算法,默认生成的口令是加盐的
Password:
Verifying - Password:
$1$u1p3rJj9$yPPNsuRQGwPl6/fo7K.fo/
[root@redhat7 app]#openssl passwd -1 -salt magedu ---也可以指定加的盐是什么
Password:
$1$magedu$2fbALA5Hbgf9m8izrwwA//
[root@redhat7 app]#openssl passwd -1 -salt magedu
Password:
$1$magedu$2fbALA5Hbgf9m8izrwwA// ---可以发现盐相同,输入的口令也相同,生成的加密口令就相同
[root@redhat7 app]#openssl passwd -1 -salt mageduddffggg
Password:
$1$magedudd$3ZgvXBGsY20eqyOIBJ5F0/ ---盐不相同,输入的口令相同,生成的加密口令也不同
- 生成随机数
[root@redhat7 app]#openssl rand -base64 12 ---基于base64编码机制生成随机数
1F5TsRK4otfuKgMg
[root@redhat7 app]#openssl rand -hex 12 ---基于十六进制生成随机数
1b1efd0bd28a1e017a1d4941
12表示字节数,-hex时,每个字符为十六进制,相当于4位二进制,1/2个字节,一个字节8位
- 生成秘钥对
[root@redhat7 app]#(umask 066;openssl genrsa -out zhang.skey -des 2048) ---生成私钥,umask 066是设定私钥的默认权限,让私钥
的权限低一点,rsa指生成私钥的加密算法,-des是对称秘钥加密算
法,用来对私钥进行对称秘钥加密,保护私钥的安全,2048指明生成
私钥的位数。小括号的作用是让umask的值只对本次有效,相当于开
了一个子进程,避免对当前shell造成影响。
[root@redhat7 app]#ll zhang.skey
-rw-------. 1 root root 1746 Sep 9 20:55 zhang.skey
[root@redhat7 app]#openssl rsa -in zhang.skey -pubout -out zhang.pubkey ---从私钥中提取公钥
Enter pass phrase for zhang.skey:
writing RSA key
[root@redhat7 app]#ll zhang.pubkey
-rw-r--r--. 1 root root 451 Sep 9 21:01 zhang.pubkey
- 随机数生成器
利用键盘、鼠标和块设备中断生成的随机数,保存在熵池中。
/dev/random:仅从熵池返回随机数;随机数用尽,阻塞
/dev/urandom:从熵池返回随机数;随机数用尽,会利用软件生成伪随机数,非阻塞
两个都可以用来生成随机数,只是第一个随机数用完时会终端。
[root@redhat7 app]#cat /dev/urandom |tr -dc "[[:alnum:]]"|head -c 10 ---生成随机数
ZnDsTH9CRS
3、CA的配置文件
[root@redhat7 app]#cat /etc/pki/tls/openssl.cnf
---查看一下openssl的配置文件,这个配置文件中有关于CA搭建的配置说明
4、如何搭建CA和服务器向CA申请证书
centos7为搭建CA主机,cenots6为服务器,向CA申请证书
1、生成CA的私钥
[root@redhat7 CA]#(umask 066;openssl genrsa -out private/cakey.pem 2048)
--在这里没有对私钥进行加密,为了试验方便
[root@redhat7 CA]#tree
.
├── certs
├── crl
├── newcerts
└── private
└── cakey.pem --发现已经生成
4 directories, 1 file
2、生成自签名证书
[root@redhat7 CA]#openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 7300 ---req请求, -new新的证书,-x509专用
于CA生成自签名证书,-key指明生成自签名证书时用到的私钥文
件,这里没有用公钥,是因为私钥里面有公钥 -out指明输出的证书文
件
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) []:henan ---必须和后面匹配
Locality Name (eg, city) [Default City]:zhengzhou
Organization Name (eg, company) [Default Company Ltd]:magedu.com ---必须和后面匹配
Organizational Unit Name (eg, section) []:shuaiguo
Common Name (eg, your name or your server's hostname) []:magedu ----这里颁发者的名字
Email Address []:
到此CA就搭建好了,就可以给服务器颁发证书了
3、切换到centos6,生成私钥,这里私钥文件没有具体的规定放到哪里,可以在app下创建一个private/目录
[root@centos6 app]#(umask 066;openssl genrsa -out /app/private/app.key 2048)
4、生成证书请求文件
[root@centos6 app]#openssl req -new -key private/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) []:henan --和上面的要相同
Locality Name (eg, city) [Default City]:luoyang
Organization Name (eg, company) [Default Company Ltd]:magedu.com --和上面要相同
Organizational Unit Name (eg, section) []:beiguoxia
Common Name (eg, your name or your server's hostname) []:www.magedu.com ---这个名字就是将来给网站用的域名,必须是唯一的,可以用泛域名*.magedu.com
Email Address []:
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
5、把证书请求文件传给CA
[root@centos6 app]#scp app.csr 172.18.21.7:/etc/pki/CA/certs.csr
可以在centos7上创建一个目录certs.csr,专门放证书请求文件,便
于管理
root@172.18.21.7's password:
app.csr 100% 1017 1.0KB/s 00:00
6、颁发证书
[root@redhat7 certs.csr]#openssl ca -in app.csr -out /etc/pki/CA/certs/app.crt -days 365 ---颁发证书
Using configuration from /etc/pki/tls/openssl.cnf
/etc/pki/CA/index.txt: No such file or directory
unable to open '/etc/pki/CA/index.txt' ---发现没有创建索引数据库文件
140336389027744:error:02001002:system library:fopen:No such file or directory:bss_file.c:402:fopen('/etc/pki/CA/index.txt','r')
140336389027744:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:404:
[root@redhat7 certs.csr]#touch /etc/pki/CA/index.txt --创建之后继续执行
[root@redhat7 certs.csr]#openssl ca -in app.csr -out /etc/pki/CA/certs/app.crt -days 365
Using configuration from /etc/pki/tls/openssl.cnf
/etc/pki/CA/serial: No such file or directory ---发现没有指明证书编号的文件
error while loading serial number
140336405546912:error:02001002:system library:fopen:No such file or directory:bss_file.c:402:fopen('/etc/pki/CA/serial','r')
140336405546912:error:20074002:BIO routines:FILE_CTRL:system lib:bss_file.c:404:
[root@redhat7 certs.csr]#echo 01 > /etc/pki/CA/serial ---创建证书编号的文件,并指明编号,编号必须是两位数
[root@redhat7 certs.csr]#openssl ca -in app.csr -out /etc/pki/CA/certs/app.crt -days 365 ---再次执行就可以了
[root@redhat7 CA]#tree
.
├── cacert.pem
├── certs
│ └── app.crt ---证书文件已经生成
├── certs.csr
│ └── app.csr
├── crl
├── index.txt
├── index.txt.attr
├── index.txt.old
├── newcerts ---又生成了一个新的证书文件,这两个文件是相同的
│ └── 01.pem
├── private
│ └── cakey.pem
├── serial
└── serial.old
5 directories, 10 files
[root@redhat7 CA]#cat index.txt ---查看一下数据库,V表示证书是有效的
V 180909143602Z 01 unknown /C=cn/ST=henan/O=magedu.com/OU=beiguoxia/CN=www.magedu.com
[root@redhat7 CA]#cat serial ---下一个证书的编号
02
[root@redhat7 CA]#scp certs/app.crt 172.18.21.6:/app
把证书传给服务器就可以了
[root@centos6 app]#openssl x509 -in app.crt -noout -text ---查看证书,以文本方式显示
[root@centos6 app]#openssl x509 -in app.crt -noout -dates
notBefore=Sep 9 14:36:02 2017 GMT
notAfter=Sep 9 14:36:02 2018 GMT
[root@centos6 app]#openssl x509 -in app.crt -noout -subject
subject= /C=cn/ST=henan/O=magedu.com/OU=beiguoxia/CN=www.magedu.com
[root@centos6 app]#openssl x509 -in app.crt -noout -issuer
issuer= /C=cn/ST=henan/L=zhengzhou/O=magedu.com/OU=shuaiguo/CN=www.magedu.com
也可以单独的查看
[root@redhat7 CA]#openssl ca -status 01
Using configuration from /etc/pki/tls/openssl.cnf
01=Valid (V)
查看证书某个编号的信息,可以看到证书是可用的
- cenots6做为子CA,给服务颁发证书如何实现
1、首先centos6做为子CA,要搭建子CA
[root@centos6 app]#cd /etc/pki/CA/
[root@centos6 CA]#ls
certs crl newcerts private
[root@centos6 CA]#touch index.txt ---创建数据库文件
[root@centos6 CA]#echo 01 > serial ---生成证书的编号文件
[root@centos6 CA]#ls
certs crl index.txt newcerts private serial
[root@centos6 CA]#(umask 066;openssl genrsa -out private/cakey.pem 2048) ---生成子CA的私钥
[root@centos6 CA]#openssl req -new -key private/cakey.pem -out subca.csr ---生成证书请求文件,用于向根CA申请证书
[root@centos6 CA]#scp subca.csr 172.18.21.7:/etc/pki/CA/certs.csr ---把证书请求文件传给根CA
[root@redhat7 CA]#openssl ca -in certs.csr/subca.csr -out certs/subca.crt -days 300 ---颁发证书
无论是根CA还是子CA。都必须有自签名或者上级CA签名的证书后,才能给服务器颁发证书
[root@redhat7 CA]#cat index.txt ----查看数据库,可以看到有两个证书了,第二个是颁发给子CA的证书
V 180909143602Z 01 unknown /C=cn/ST=henan/O=magedu.com/OU=beiguoxia/CN=www.magedu.com
V 180706151220Z 02 unknown /C=cn/ST=henan/O=magedu.com/OU=beigo/CN=centos6magedu
[root@redhat7 CA]#scp certs/subca.crt 172.18.21.6:/etc/pki/CA/cacert.pem ---将证书文件传给子CA,在
配置文件里规定,无论是根CA还是子CA,只要是CA,证书文件就应
该是/etc/pki/CA/cacert.pem文件,并且路径也要是这个。
所以在拷贝的时候直接把名字改过来了
这样子CA已经搭建好了。这里用centos7.3做为服务器,向子CA申请证书
[root@centos7 app]#(umask 066;openssl genrsa -out app1.key 2048) ---生成私钥
[root@centos7 app]#openssl req -new -key app1.key -out app.csr
----生成证书请求文件
[root@centos7 app]#scp app.csr 172.18.21.6:/app
---把证书请求文件发给子CA
[root@centos6 app]#openssl ca -in app.csr -out /etc/pki/CA/certs/app.crt -days 365 ---颁发证书,然后将证书传给服务器就可以了
- 吊销证书和生成证书吊销列表
[root@redhat7 CA]#openssl ca -revoke newcerts/01.pem ---吊销证书
Using configuration from /etc/pki/tls/openssl.cnf
Revoking Certificate 01.
Data Base Updated
[root@redhat7 CA]#cat index.txt ---发现数据库里面证书已经处于R
状态,就是被吊销的状态
R 180909143602Z 170909154144Z 01 unknown /C=cn/ST=henan/O=magedu.com/OU=beiguoxia/CN=www.magedu.com
V 180706151220Z 02 unknown /C=cn/ST=henan/O=magedu.com/OU=beigo/CN=centos6magedu
[root@redhat7 CA]#echo 01 > /etc/pki/CA/crlnumber --生成被吊销
的证书的序号文件,并指明序号
[root@redhat7 CA]#openssl ca -gencrl -out /etc/pki/CA/crl/crl.pem
生成证书吊销列表
[root@redhat7 CA]#cat crlnumber ---下一个被吊销的证书的编号
02
[root@redhat7 CA]#cat crlnumber.old ---前一个编号
01
[root@redhat7 CA]#openssl ca -revoke newcerts/02.pem ---再吊销一个证书
Using configuration from /etc/pki/tls/openssl.cnf
Revoking Certificate 02.
Data Base Updated
[root@redhat7 CA]#cat index.txt ---发现两个证书都被吊销了
R 180909143602Z 170909154144Z 01 unknown /C=cn/ST=henan/O=magedu.com/OU=beiguoxia/CN=www.magedu.com
R 180706151220Z 170909154819Z 02 unknown /C=cn/ST=henan/O=magedu.com/OU=beigo/CN=centos6magedu
[root@redhat7 CA]#openssl ca -gencrl -out /etc/pki/CA/crl/crl.pem
生成证书吊销列表文件,文件名必须是crl.pem,并且路径也要是这个
路径。吊销一个证书,就要从新更新一下这个列表文件。
[root@redhat7 CA]#openssl crl -in crl/crl.pem -noout -text 查看吊销列表文件
如果把这个吊销列表导出来在windows中看,要把后缀改为crl才可以
看。
最后生成的证书文件在windows中查看如下图
出现这种效果,要把证书一个个的安装才可以,安装过程为要把每个证书导出来,后缀为crt才可以,安装过程如下
也可以在浏览器的internet选项里、内容、证书里导入证书或者删除证书。
5、ssh客户端
ssh: secure shell, protocol, 22/tcp, 安全的远程登录
具体的软件实现:
OpenSSH: ssh协议的开源实现,CentOS默认安装
dropbear:另一个开源实现
两种方式的用户登录认证:
基于password
基于key
OpenSSH介绍
相关包:
openssh
openssh-clients
openssh-server
- ssh客户端
ssh, 配置文件:/etc/ssh/ssh_config
[root@redhat7 ~]#ssh wang@172.18.21.6
默认不写wang@时是连接到对方的roo用户,因为你现在是以root身份登录的,如果你现在是以wang身份登录的,默认连接的时候就是连接到对方的wang用户,但如果对方没有wang用户就连接不了了,所以连接的时候最好指明对方的用户。
[root@redhat7 ~]#ssh -b 172.18.21.100 172.18.21.6 ---指定用哪个
ip地址去连接对方的ip地址
[root@centos7 ~]#ssh -t 172.18.21.100 172.18.21.106
-t选项的作用是。如果直接连接
172.18.21.106不能连接,可以借助于
172.18.21.100这个ip地址去连接后面的,
相当于借助于一个跳板去连接
[root@redhat7 ~]#ssh 172.18.21.6 -p 2222 ---指定端口号,如果把
服务器的端口号改为非标准端口,连接时就要指明端口号,因为默认
是22端口
[root@centos6 ~]#ssh 172.18.21.7
The authenticity of host '172.18.21.7 (172.18.21.7)' can't be established.
RSA key fingerprint is f4:90:98:ae:60:ed:e4:ae:bf:16:34:83:2e:17:1c:1e.
Are you sure you want to continue connecting (yes/no)?
用ssh和远程主机连接时,刚开始要问yes,这个就是要确定一下远程
主机的身份,身份如何确定的呢?RSA key fingerprint is
f4:90:98:ae:60:ed:e4:ae:bf:16:34:83:2e:17:1c:1e.就是根据这个key
确定的,远程主机的key会公开的发布到一个网站上,可以根据
key确定是否是远程主机。
确定身份后当敲yes的时候,就会在自己的家目录里复制一份远程
主机的公钥,下次再连接时就不用敲yes了,因为已经有这个公钥
了,下次连接时远程主机会用自己的私钥签名加密数据传给要连接的主机,因为要连接的主机已经有远程主机的公钥了,所以就能解开这个数据,进而证明这个数据就是远程主机发过来的,就确定了远程主机的身份了,不用再问yes,到网站上去查找比对了,比如以root身份登录时在自己的家目录里会看到如下
[root@redhat7 ~]#cd .ssh/ ---家目录里有个隐藏的目录
[root@redhat7 .ssh]#ls ---这个文件里存放的就是远程主机的公钥
known_hosts
远程主机的公钥存放在下面目录中
[root@centos6 .ssh]#cd /etc/ssh/
[root@centos6 ssh]#ls
moduli ssh_host_dsa_key ssh_host_key.pub
ssh_config ssh_host_dsa_key.pub ssh_host_rsa_key
sshd_config ssh_host_key ssh_host_rsa_key.pub ---这个就
是主机的公钥,如果之前两个主机连接过,这个公钥在对方的家目录
里.ssh/known_hosts文件中也会有这个公钥,是一样的
如果另外一台主机想要冒充远程主机,只要将远程主机的私钥偷到自
己的主机上,并覆盖自己的私钥文件/etc/ssh/ ssh_host_rsa_key,
并且将ip地址改成和远程主机一样的ip地址,当我要连接远程主机
时,你用私钥签名加密数据传给我,我可以用原来远程主机的公钥解
开,我就误认为你就是原来的那个远程主机了。
ssh -X 选项用于在连接远程主机后,可以在本主机显示远程主机的图形。
总结:当你用ssh连接远程主机时,如果是第一次连接,要回答yes,是确定远程主机的身份,你连接的是不是远程主机,当输入yes后,第二次就不用输入了,因为在输入yes的时候你已经得到了远程主机的公钥,并保存在自己家目录里的.ssh目录,第二次连接时因为你有远程主机的公钥,你会发个数据用远程主机的公钥加密,如果能够解密确定是远程主机;当连接的时候要输入密码,是确定你的身份,如果把你的公钥给远程主机,这样远程主机就会发数据用你的公钥加密,如果你能解开,远程主机就可以确定是你,这样就可以连接了,所以连接的过程是个双方确认的过程。
6、ssh登录验证
ssh服务登录验证方式:①用户/口令;②基于密钥
一、基于用户和口令登录验证
1、客户端发起ssh请求,服务器会把自己的公钥发送给用户
2、用户会根据服务器发来的公钥对密码进行加密
3、加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则用户登录成功
二、基于密钥的登录方式
1、首先在客户端生成一对密钥(ssh-keygen)
2、并将客户端的公钥ssh-copy-id 拷贝到服务端
3 、当客户端再次发送一个连接请求,包括ip、用户名
4、服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP和用户,就会随机生成一个字符串,例如:acdf
5、服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端
6、得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端
7、服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录
7、基于key认证
1、在客户端生成秘钥对
[root@centos7 ssh]#ssh-keygen -t rsa -P '' -f "/root/.ssh/id_rsa"
生成公钥和私钥对儿,-t指定算法,-P给私钥对称加密,在这里为了
方便,写的是空口令,可以在单引号里输入口令,这样私钥就被加密
了,注意是大写的P,也可以直接用ssh-keygen命令生成。默认就是rsa算法、空口令和私钥存放在/root/.ssh/id_rsa文件中。
[root@centos7 ssh]#cd
[root@centos7 ~]#cd .ssh
[root@centos7 .ssh]#ls ---可以看到已经生成公钥和私钥对
id_rsa id_rsa.pub known_hosts
2、把公钥文件传输至远程服务器对应用户的家目录
[root@centos7 .ssh]#ssh-copy-id -i id_rsa.pub root@172.18.21.106
[root@centos6 ~]#cd .ssh/
[root@centos6 .ssh]#ls ---可以看到在远程服务器生成一个
authorized_keys文件,这个文件就是客户端的公钥
authorized_keys known_hosts
3、测试连接
[root@centos7 .ssh]#ssh 172.18.21.106 ---不需要输入口令就可以直接连接了
Last login: Thu Aug 31 07:02:08 2017 from 172.18.252.32
Good morning,clock in please!
[root@centos6 .ssh]#ssh-keygen -t rsa -P '123456' ---也可以不指定存放的文件,-P指定了对私钥加密的口令
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): ---直接敲回车,就是默认的这个文件
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:93:c3:7e:a6:9d:5c:48:16:29:af:bc:1f:e5:07:22 root@centos6.magedu.com
[root@centos6 .ssh]#cd
[root@centos6 ~]#cd .ssh
[root@centos6 .ssh]#ls ---发现已经生成
authorized_keys id_rsa id_rsa.pub known_hosts
[root@centos6 .ssh]#ssh-copy-id id_rsa.pub root@172.18.21.107
把公钥拷贝给对方
[root@centos6 .ssh]#ssh 172.18.21.107 ---可以直接连接了,连接
之前要输入对称加密的口令,就是给私钥加密的对称秘钥的口令,从
中也可以看出连接的过程中要用到私钥解密。
[root@centos7 .ssh]#ssh-keygen -p ---如果私钥之前没有加口令,可以用这个命令对私钥加口令,注意是小写的p
- 启用代理
对私钥加密后,要连接对方时,每次都要输入生成秘钥对时设置的对称加密口令,很麻烦,可以用下面的办法,启用代理,让代理去帮助你输入口令,就可以直接连接了。
[root@centos7 .ssh]#ssh-agent bash ---启用代理
[root@centos7 .ssh]#ssh-add ---输入要代理的对称加密口令
Enter passphrase for /root/.ssh/id_rsa:
Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)
8、在xshell里实现基于key的验证
将公钥另存到桌面上,并rz上传至要连接的服务器,这里我们要连接172.18.21.106的机器,并且存放到/root/.ssh/authorized_keys中
[root@centos6 .ssh]#ls
authorized_keys id_rsa_2048_zhang.pub known_hosts
id_rsa id_rsa.pub
[root@centos6 .ssh]#cat id_rsa_2048_zhang.pub >>authorized_keys ---因为这个文件中已经有别的公钥了,所以要用>>把公钥追加到这个文件中
[root@centos6 .ssh]#cat authorized_keys ---我们看到已经追加进去,变成两个公钥了
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDirvPoTUGmzblUyiZXYdufIK0E0Q8K8q/6T413e5dr+RcbdUX8OcBYTtNLUyefGwERsfmHuxJE0Ic2ECBW1v42+7EOreyjP6bGQieNRdogiwcRQQoc/4QdADoVWo/W4aPlAh06nwbDL0BratXnZtFs6rZwDnc1s/onM9ClwolvJoTwUY+jLMiXATONr0D+THyyCySQRHKlZUexIkHT5DNcxAt/Zw5Qqx96PAo1AnUyEtZ15bLVVLtZtf2LkeFGo9x/BWIK1MbOduWnFUhxskeHhEAxTC4VoW4IuChGJMG+krFEeebDON96B4V4tWaP+ESHWvvwOpoqa9T8IKxZ5k+t root@centos7.magedu.com
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEArcugl5AB+AKs8QfganOe02iURbfOYQi5EYcOSRu0iy6r/a+qbnl8Dr8ZM8RdW8JTpT1Z1adQ3p6pJcELXw/J4h3Ikc7o9mMbJkSSv/mjbYQW+0F68TKjD9pHZT0uyIWGu5a3gIDm3RnlzLxlWPRQa9NhRfHo2Qk4sjJ6LL7Rnta4iL0JhC9PZcTIdUdp4Q9mOFvhyfVb1QZxVU/XGsrwid3A9xspdBm3MLkGdN8ze13aeTW7Nt/3Zryv3j8PkzISHZrNftgJVHfULNFS9133JfEhWEgms/MkEVFuuY7EUMvOwT1ybeGT73QjBM3LKShjiA4SosNzKOH+Tpy09JwU1Q==
在xshell中进行如下操作
9、scp命令
基于key的验证后,scp命令十分方便,不用输入密码就可以实现远程拷贝。
scp[options] SRC... DEST/
两种方式:
scp[options] [user@]host:/sourcefile /destpath ---把远程主机的文件拷贝到当前主机的目录
scp[options] /sourcefile [user@]host: /destpath ---把当前主机的文件拷贝到远程主机的哪个目录
常用选项:
-C: 压缩数据流
-r: 递归复制
-p: 保持原文件的属性信息
-q: 静默模式
-P PORT: 指明remote host的监听的端口
[root@centos7 app]#scp app.csr app1.key root@172.18.21.106:/app ---可以一次性的拷贝多个文件。
[root@centos7 app]#scp -r /etc/sysconfig/ root@172.18.21.106:/app ---拷贝目录要加上-r选项,也可以加上-q为静默模式拷贝,不在屏幕上输出,适合写到脚本里
scp在拷贝时,如果远程主机已经有这个文件,它也会再拷贝一遍,并且覆盖原来的文件。
10、rsync命令
基于ssh和rsh服务实现高效率的远程系统之间复制文件
使用安全的shell连接做为传输方式
•rsync –av /etc server1:/tmp复制整个目录
•rsync –av /etc/ server1:/tmp只复制目录下文件
比scp更快,只复制不同的文件,用法和格式根scp差不多
选项:
-n 模拟复制过程
-v 显示详细过程
-r 递归复制目录树
-p 保留权限
-t 保留时间戳
-g 保留组信息
-o 保留所有者信息
-l 将软链接文件本身进行复制(默认)
-L 将软链接文件指向的文件复制
-a 存档,相当于–rlptgoD,但不保留ACL(-A)和SELinux属性(-X)
示例
[root@centos7 app]#rsync /etc/fstab root@172.18.21.106:/app/
[root@centos7 app]#rsync -av /etc root@172.18.21.106:/app
这里要注意,/etc后面加斜线和不加斜线是有区别的,加斜线表示复制这个目录下文件,不加斜线表示复制整个目录,把文件夹也复制了
11、pssh工具
pssh是一个python编写可以在多台服务器上执行命令的工具,也可实现文件复制,工具在epel源里下载,包名为pssh,pssh命令可以用于管理远程多台主机。
选项如下:
--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 yum.repos.d]#pssh -H 172.18.21.106 -i hostname
[1] 15:56:20 [SUCCESS] 172.18.21.106
centos6.magedu.com
[root@centos7 yum.repos.d]#pssh -H "172.18.21.106 172.18.21.6" -i hostname
[1] 16:08:59 [SUCCESS] 172.18.21.6
centos6.9.magedu.com
[2] 16:08:59 [SUCCESS] 172.18.21.106
centos6.magedu.com
[root@centos7 app]#vim ip.txt
1 172.18.21.106
2 172.18.21.6
[root@centos7 app]#pssh -h ip.txt -i hostname
[1] 16:11:34 [SUCCESS] 172.18.21.6
centos6.9.magedu.com
[2] 16:11:34 [SUCCESS] 172.18.21.106
centos6.magedu.com
[root@centos7 app]#pssh -h ip.txt -i setenforce 0
[1] 16:12:28 [SUCCESS] 172.18.21.106
[2] 16:12:28 [SUCCESS] 172.18.21.6
[root@centos7 app]#pssh -h ip.txt -i sed -i.bak '/^SELINUX=/cSELINUX=permissive' /etc/selinux/config
[1] 16:16:11 [SUCCESS] 172.18.21.6
[2] 16:16:11 [SUCCESS] 172.18.21.106
[root@centos7 app]#pssh -H root@172.18.21.6 -i hostname ---这
种写法才是正规的写法。不写用户名默认是当前登录的用户
[1] 16:22:55 [SUCCESS] root@172.18.21.6
centos6.9.magedu.com
[root@centos7 ~]#pssh -H 172.18.21.106 -l zhang -A -i hostname
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password:
[1] 16:35:57 [SUCCESS] 172.18.21.106
centos6.magedu.com
[root@centos7 app]#pssh -h ip.txt -i -o /app/ hostname ---在远程的
主机上执行hostname这个命令,并把结果保存到/app/目录下
[1] 19:48:25 [SUCCESS] 172.18.21.106
centos6.magedu.com
[2] 19:48:25 [SUCCESS] 172.18.21.6
centos6.9.magedu.com
[root@centos7 app]#ls
172.18.21.106 172.18.21.6 app1.key app.csr ip.txt
[root@centos7 app]#cat 172.18.21.106
centos6.magedu.com
[root@centos7 app]#cat 172.18.21.6
centos6.9.magedu.com
[root@centos7 app]#pssh -h ip.txt -i -o /app/ uptime ---查看两个主
机的负载情况,并把结果保存到/app的目录下
[1] 19:51:07 [SUCCESS] 172.18.21.6
19:51:57 up 3:53, 1 user, load average: 0.00, 0.00, 0.00
[2] 19:51:07 [SUCCESS] 172.18.21.106
13:37:26 up 7:12, 3 users, load average: 0.00, 0.00, 0.00
[root@centos7 app]#vim f1.sh
1 #!/bin/bash
2 echo $HOSTNAME
[root@centos7 app]#pscp.pssh -h ip.txt /app/f1.sh /app ---把f1.sh
这个脚本推送到远程主机
[1] 19:55:23 [SUCCESS] 172.18.21.106
[2] 19:55:23 [SUCCESS] 172.18.21.6
[root@centos7 app]#pssh -h ip.txt -i /app/f1.sh ---执行远程主机的
脚本,执行之前要加执行权限
[1] 19:57:48 [SUCCESS] 172.18.21.6
centos6.9.magedu.com
[2] 19:57:48 [SUCCESS] 172.18.21.106
centos6.magedu.com
[root@centos7 app]#pslurp -h ip.txt -L /app /etc/passwd pass ---把
远程主机的文件拷贝到我的主机,并改名为pass,-L 是指定考到本
机的哪个目录
[1] 20:08:49 [SUCCESS] 172.18.21.6
[2] 20:08:49 [SUCCESS] 172.18.21.106
[root@centos7 app]#tree
.
├── 172.18.21.106
│ └── pass
├── 172.18.21.6
│ └── pass
└── ip.txt
2 directories, 3 files
pssh这个命令对于管理远程多台主机很方便,小型环境很实用,但前提是基于key的验证,就是要把本机本用户的公钥传给远程主机,也可以不基于key的验证,用-A选择进行输入密码,但前提是远程主机的密码都是一样的,只需要输入一次密码。如果远程主机每个密码都不一样,则要输入很多次,所以最好还是基于key的验证,每个主机的每个用户都有自己的公钥私钥对,放在自己的家目录里,root用户就放在/root/.ssh这个目录下,zhang用户就放在/home/zhang/.ssh目录下,进行这个命令前,要把本机登录的用户的公钥传给远程主机的用户。
12、sftp命令
交互式文件传输工具
用法和传统的ftp工具相似
利用ssh服务实现安全的文件上传和下载
使用ls cd mkdirrmdirpwdget put等指令,可用?或help获取帮助信息
sftp[user@]host
sftp> help
[root@centos7 app]#sftp 172.18.21.106
Connected to 172.18.21.106. ---因为事先已经基于key的验证,所
以直接就连到远程主机上了
sftp> ls
Desktop Documents Downloads
Music Pictures Public
Templates Videos anaconda-ks.cfg
install.log install.log.syslog mbr
sftp> cd /app
sftp> ls
app.csr app1.key etc f1.sh fstab sysconfig
sftp> get fstab ---可以下载文件
Fetching /app/fstab to fstab
/app/fstab 100% 595 0.6KB/s 00:00
sftp> put /etc/issue ---可以上传本机的文件到远程
Uploading /etc/issue to /root/issue
/etc/issue 100% 68 0.1KB/s 00:00
sftp> pwd
Remote working directory: /root
sftp> ls
Desktop Documents Downloads
Music Pictures Public
Templates Videos anaconda-ks.cfg
install.log install.log.syslog issue ---发现已经上传成功
mbr
sftp> quit
[root@centos7 app]#ls ---发现文件已经下载到连接的时候的前期目
录
172.18.21.106 172.18.21.6 fstab ip.txt
sftp走的是ssh协议,所以是安全的,可以实现安全的上传和下载文件。
openssl软件包提供的是ssl/tls协议,命令是openssl;openssh软件包提供的是ssh服务,走的是ssh协议,命令时ssh,这两个协议都是安全的加密协议。
13、SSH的端口转发
SSH端口转发
SSH 会自动加密和解密所有SSH 客户端与服务端之间的网络数据。但是,SSH 还能够将其他TCP 端口的网络数据通过SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一过程也被叫做“隧道”(tunneling),这是因为SSH 为其他TCP 链接提供了一个安全的通道来进行传输而得名。例如,Telnet,SMTP,LDAP 这些TCP 应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。而与此同时,如果工作环境中的防火墙限制了一些网络端口的使用,但是允许SSH 的连接,也能够通过将TCP 端口转发来使用SSH 进行通讯
SSH 端口转发能够提供两大功能:
•加密SSH Client 端至SSH Server 端之间的通讯数据
•突破防火墙的限制完成一些之前无法建立的TCP 连接
本地转发:
-L localport:remotehost:remotehostport sshserver
选项:
-f 后台启用
-N 不打开远程shell,处于等待状态
-g 启用网关功能
示例
ssh–L 9527:telnetsrv:23 -N sshsrv
telnet 127.0.0.1 9527
当访问本机的9527的端口时,被加密后转发到sshsrv的ssh服务,再解密被转发到telnetsrv:23
data<--->localhost:9527 <--->localhost:XXXXX<--->sshsrv:22 <--->sshsrv:YYYYY<--->telnetsrv:23
数据首先发送到本机的9527端口,收到后在本机开一个随机端口充当ssh的客户端,把数据通过ssh协议加密后发送到ssh服务器的22端口,服务器收到后解密数据并在ssh服务器生成一个随机端口充当telnet的客户端,然后走telnet流量把数据传给telnet服务器的23端口。
实验
本机是个172.18.21.106去连接远程的telnet服务器172.18.21.6,因为防火墙限制,无法直接连接,172.18.21.107是一个ssh服务器,可以通过中间的ssh服务器做为跳板,连接到远程的telnet服务器,当你telnet 127.0.0.1 9527时,最终的连接就是172.18.21.106连接到172.18.21.107的ssh22端口,172.18.21.107去连接172.18.21.6的telnet23端口,因为172.18.21.107没有被172.18.21.6这个机器做防火墙策略拒绝,可以访后者的telnet23端口。中间的ssh服务器就向一个隧道或者桥一样,把前后两者通过ssh协议连接起来。
[root@centos6 ~]#ssh -L 9527:172.18.21.6:23 -Nf 172.18.21.107 ---实现隧道功能的命令
[root@centos6 ~]#telnet 127.0.0.1 9527 ---执行连接命令
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
CentOS release 6.9 (Final)
Kernel 2.6.32-696.el6.x86_64 on an x86_64
centos6.9.magedu.com login: dufu
Password:
Last login: Sun Sep 10 21:08:23 from 172.18.21.106
[dufu@centos6 ~]$