SSH服务
1.1.1 ssh介绍
SSH是Secure ShellProtocol的简写,由IETF网络工作小组(Network Working Group)制定;在进行数据传输之前,SSH先对联机数据包通过加密技术进行加密处理,加密后在进行数据传输。确保了传递的数据安全。
SSH是专为远程登录会话和其他网络服务提供的安全性协议。利用SSH协议可以有效的防止远程管理过程中的信息泄露问题,在当前的生产环境中,绝大多数企业普遍采用SSH协议服务来代替传统的不安全的远程联机服务软件,如telnet(23端口,非加密的)等。
在默认状态下,SSH服务主要提供两个服务功能:一个是提供类似telnet远程联机服务器的服务,即上面提到的SSH服务;另一个是类似FTP服务的sftp-server,借助SSH协议来传输数据的,提供更安全的SFTP服务。
特别提醒:SSH客户端(ssh命令)还包含一个很有用的远程安全拷贝命令scp,也是通过ssh协议工作的。
总结:
1、 ssh安全的加密协议,用于远程连接服务器。
2、 默认端口是22,安全协议版本ssh2
3、 服务端主要包含两服务功能shh远程连接,SFTP服务。
4、 Ssh客户端包含ssh连接命令,以及远程拷贝scp命令等。
1.1.2 ssh结构
SSH服务由服务端软件OpenSSH和客户端(SecureCRT、xshell)组成,SSH服务默认使用22端口提供服务,它有两个不兼容的SSH协议版本,分别是1.x和2.x。
下面查看服务端上的ssh相关软件
小提示:sudo su – 切换到root模式
1
2
3
4
5
6
7
8
9
10
11
12
|
[root@cl1 ~]
# rpm -qa openssh
openssh-5.3p1-94.el6.x86_64
[root@cl1 ~]
# rpm -qa openssh openssl
openssl-1.0.1e-15.el6.x86_64
openssh-5.3p1-94.el6.x86_64
[root@cl1 ~]
# rpm -qa|grep openssh
openssh-5.3p1-94.el6.x86_64
openssh-server-5.3p1-94.el6.x86_64
[root@cl1 ~]
# ps -ef|grep sshd
root 986 1 0 18:28 ? 00:00:00
/usr/sbin/sshd
root 1100 986 0 18:29 ? 00:00:00 sshd:root@pts
/0
root 1122 1104 0 18:30 pts
/0
00:00:00 grepsshd
|
OpenSSH同时支持SSH1.x和2.x。用SSH2.x的客户端程序不能连接到SSH1.x的服务程序上。
SSH服务端是一个守护进程(demon),他在后台运行并响应来自客户端的连接请求。SSH服务端的进程名为sshd,负责实时监听远程SSH客户端的连接请求,并进行处理,一般包括公共密钥认证、密钥交换、对称密钥加密和非安全连接等。这个SSH服务必须开机自启动。
ssh客户端包含ssh程序以及像scp(远程拷贝)、slogin(远程登录)、sftp(安全FTP文件传输)等应用程序。
ssh的工作机制大致是本地的ssh客户端先发送一个连接请求到远程的ssh服务端,服务端检查连接的客户端发送的数据包和IP地址,如果确认合法,就会发送密钥给SSH的客户端,此时,客户端本地再将密钥发回给服务端,自此连接建立。SSH 1.x和SSH 2.x在连接协议上有一些安全方面的差异。
小提示:取IP地址
[root@cl2~]# ifconfig eth0|sed -rn 's#^.*dr:(.*) Bc.*$#\1#gp'
192.168.2.31
1.1.3 加密
当前,网络上的数据包加密技术一般是通过所谓的一对公钥与私钥(Public key and Private key)组合成的密钥对进行加密与解密操作。
服务端Public key公钥 锁
客户端Private key私钥 钥匙
查看sshd_config配件文件
1
2
3
4
5
|
[root@cl1 ~]
# less /etc/ssh/sshd_config 有d就是服务端,没有d是客户端
# Disable legacy (protocol version 1) support in the server for new
# installations. In future the default will change to requireexplicit
# activation of protocol 1
Protocol 2
|
另外,SSH2同时支持RSA和DSA密钥,但是SSH1仅支持RSA密钥。
1、SSH 1.x
每一台SSH服务器主机都可以使用RSA加密方式来产生一个1024-bit的RSAkey,这个RSA的加密方式就是用来产生公钥与私钥的算法之一。SSH 1.x的整个联机加密步骤如下:
当SSH服务启动时,就会产生一个768-bit的临时公钥(sshd_config配置文件中ServerKeyBits 1024)存放在Server中。
1
2
|
[root@cl1 ~]
# grep ServerKey /etc/ssh/sshd_config #C6以后是1024,C5是768
#ServerKeyBits 1024
|
当Client端SSH联机请求传送过来时,Server就会将这个1024-bit的公钥传给Client端,此时Client会将此公钥与先前存储的公钥进行对比,看是否一致。判断标准是Client端联机用户目录下~/.ssh/known_hosts文件的内容(linux客户端)。
在Client端接收到这个768-bit的Serverkey后,Client本地也会随机产生一个256-bit的私钥(Privatekey或hostkey),并且以加密的方式(具体的加密算法由客户端在服务器提供的所有可用算法中选择,默认为3DES算法)将Serverkey与hostkey整合成一对完整的keypair,交将这对KeyPair再传给Server。
当客户端发完成以后,Server与Client端在这次的联机中,就以这一对1024-bit的Keypair来进行数据的传输。
也就是说,Public key是放在Server上的,而Client端的软件需要接受Public key、计算出Private key,并把二者组合成一把独一无二的Key pair,因为Client每次的256-bit的host key是随机产生的,所以这次联机与下次联机的host key可能就会不一样。此外,在Client端的用户默认目录下的~/.ssh/know_hosts会记录曾经联机过的主机的Public key,用以确认每次来自该主机的联机是否正确。
2、SSH 2.x
在SSH 1.x的联机过程中,当Server接受Client端的Privatekey后,就不再针对该次联机的Key pair进行检验。此时若有恶意黑客户针对该联机的Key pair对插入恶意的程序代码时,由于服务端你不会再检验联想的正确性,因为可能会接收该程序代码,从而造成系统被黑掉的问题。
为了改正这个缺点,SSH version 2多加了一个确认联机正确性的Diff-Hellman机制,在每次数据传输中,server都会以该机制检查数据的来源是否正确,这样,可以避免联机过程中被插入恶意程序代码的问题。也就是说,SSH verion 2是比较安全的。
1.1.4 ssh服务谁类型
从SSH客户端来看,SSH服务主要提供两种级别的安全验证,具体级别如下:
基于口令的安全验证:
基于口令的安全验证方式就是大家现在一直在用的,只要知道服务器的SSH连接帐号和口令(服务器的IP及开放的SSH端口,默认为22),就可以通过ssh客户端登录到这台远程主机。此时,联机过程中所有传输的数据都是加密的。
小提示:查看ssh使用的端口
1
2
3
4
|
[root@cl1 ~]
# netstat -lntup|grep ssh #使用的端口是22
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 986
/sshd
tcp 0 0 :::22 :::* LISTEN 986
/sshd
[root@cl1 ~]
#
|
ssh客户端连接演示
在连接之前ls -l ~/.ssh没有文件,连接之后就会产生文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
[root@cl1 ~]
# ss #查看以ss开头的服务
ss
ssh
-add
ssh
-copy-
id
ssh
-keygen ssltap
ssh
ssh
-agent sshd
ssh
-keyscan
[root@cl1 ~]
# ssh -p22 root@192.168.88.66 #连接到192.168.88.66
The authenticity ofhost
'192.168.88.66 (192.168.88.66)'
can't be established.
RSA key fingerprint is6e:6d:48:4c:63:be:17:e0:05:11:4a:9f:f5:d5:5d:b9.
Are you sure you wantto
continue
connecting (
yes
/no
)?
yes
#输入yes按回车
Warning: Permanentlyadded
'192.168.88.66'
(RSA) to the list of known hosts.
reverse mappingchecking getaddrinfo
for
bogon [192.168.88.66] failed - POSSIBLE BREAK-INATTEMPT!
root@192.168.88.66'spassword:
#输入密码
Last login: FriJul 8 11:45:43 2016 from 192.168.2.129
[root@
cat
~]
# ifconfigeth0|sed -rn 's#^.*dr:(.*) Bc.*$#\1#gp' #查看IP,已连接上
192.168.88.66
[root@
cat
~]
#logout #ctrl+d退出
Connection to192.168.88.66 closed.
[root@cl1 ~]
# ls -l~/.ssh #已经有了文件
total 4
-rw-r--r--. 1 root root395 Jul 8 23:34 known_hosts
[root@cl1 ~]
# cat~/.ssh/known_hosts #以下是加密信息
192.168.88.66
ssh
-rsaAAAAB3NzaC1yc2EAAAABIwAAAQEAya+hbnpwYoPvrgSC+puPzLjVWkSOlrqFtysjCX0aMhTRRqpA1SpeLiBmKsKyDbyNVQa2mXcOYVdbjE7qPB7QcqK99nmgTkV70DE0Xvv6jxF5FFpV0qKepaTyRhFrMsmK0Mky04Iwb7rdkjfD82Hi+IQZY8DC2zGKS1+V6fKZ1XNapz4+
/CXcoWTOGS6
+H50zrv3ET5vtby3OLU6lJp4E5nPuE+0H2da9poQaIsJ2
/JmW8gA5u8rXSC1Ccv1BEWjzqKeU8ZE72QEtDUqVfavGpRu8GjKRkCojXhsTsCBjy593GVu0ZGEgSUdWn1
+CBXp7acc6Bhmd5HCCK
/rWk3OEwQ
==
[root@cl1 ~]
#
|
基于密钥的安全验证:
基础密钥的安全验证方式是指,需要依靠密钥,也就是必须事先建立一对密钥对,然后把公用密钥(Public key)放在需要访问的目录服务器上,另外,还需要把私有密钥(Private key)放到SSH的客户端或对应的客户端服务器上。
此时,如果要想连接到这个带有公用密钥的SSH服务器,客户端SSH软件或者客户端服务器就会向SSH服务器发出请求,请求用联机的用户密钥进行安全验证。SSH服务器收到请求之后,会先在该SSH服务器上连接的用户的家目录下寻找事先放上去的对应用户的公用密钥,然后反它和连接的SSH客户端发送过来的公用密钥进行比较。如果两个密钥一致,SSH服务器就用公用密钥加密“质询“(challenge)并反它发送给SSH客户端。
SSH客户端收到“质询“之后就可以用自己的私匙解密,再把它发送给SSH服务器。使用这种方式,需要知道联机用户的密钥文件。与第一种基于口令难的方式相比,第二种方式不需要在网络上传送口令密码,所以安全性更高了,这时我们也要注意保护我们的密钥文件,特别是私钥文件,一旦被黑客获取,危险就很大了。
1.1.5 启动SSH服务
SSH服务所需要的软件包含OpenSSL和OpenSSH,通过命令查询如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
[root@cl1 ~]
# rpm-qa|egrep "openss"
openssl-1.0.1e-15.el6.x86_64
openssh-server-5.3p1-118.1.el6_8.x86_64
openssh-5.3p1-118.1.el6_8.x86_64
openssh-clients-5.3p1-118.1.el6_8.x86_64
[root@cl1 ~]
# chkconfig--list|grep 3:on
rsyslog 0:off 1:off 2:on 3:on 4:on 5:on 6:off
sshd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
udev-post 0:off 1:on 2:on 3:on 4:on 5:on 6:off
[root@cl1 ~]
#
[root@cl1 ~]
# ll/etc/ssh/sshd_config #sshd是服务端
-rw-------. 1 root root3879 May 12 12:52
/etc/ssh/sshd_config
[root@cl1 ~]
# ll/etc/ssh/ssh_config #sshd是客户端
-rw-r--r--. 1 root root2047 May 12 12:52
/etc/ssh/ssh_config
通过查看配置也可以区别是服务端还是客户端,如下:
[root@cl1 ~]
# less/etc/ssh/sshd_config
# $OpenBSD: sshd_config,v 1.80 2008/07/0202:24:18 djm Exp $
# This is the sshdserver system-wide configuration file. See #显示server就是服务端
|
面试题:给你一个端口,如果查出对应的服务
下面以22端口为例,进行查询
1
2
3
4
5
6
7
8
9
10
11
|
[root@cl1 ~]
# lsof -i:22 #使用lsof命令加端口号,可以看到SSHD服务
COMMAND PID USER FD TYPE DEVICE SIZE
/OFF
NODENAME
sshd 2276 root 3r IPv4 14165 0t0 TCP bogon:
ssh
->bogon:50317 (ESTABLISHED)
sshd 2700 root 3u IPv4 15010 0t0 TCP *:
ssh
(LISTEN)
sshd 2700 root 4u IPv6 15012 0t0 TCP *:
ssh
(LISTEN)
[root@cl1 ~]
# netstat-lntup|grep 22 #lntup中的p是打印进程名的
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 2700
/sshd
tcp 0 0 :::22 :::* LISTEN 2700
/sshd
[root@cl1 ~]
# netstat -lntu|grep 22 #不加p进程名不显示了
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 :::22 :::* LISTEN
|
小结:
1、 切换到别的机器ssh–p52113 user@ip
2、 到其他机器执行命令(不会切到机器上)ssh –p52113 user@ip 命令(全路径!不识别环境变量
当第一次连接的时候,本地会产生一个密钥文件~/.ssh/known_hosts(可能有多个密钥)
1.1.6 ssh客户端附带的远程拷贝scp命令
示例:把cl1机器tmp目录下的123.log复制到cl2上。这个相当于推push
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
cl2上的操作
[root@cl2 tmp]
# ll
total 0
-rw-r--r--. 1 root root0 Jul 9 01:21 123.log
-rw-------. 1 root root0 Jul 8 16:56 yum.log
[root@cl2 tmp]
# pwd
/tmp
[root@cl2 tmp]
# scp -P22 /tmp/123.log root@192.168.2.30:/tmp #scp后面的-P(是大写)
reverse mappingchecking getaddrinfo
for
bogon [192.168.2.30] failed - POSSIBLE BREAK-INATTEMPT!
root@192.168.2.30'spassword:
123.log 100% 0 0.0KB
/s
00:00
[root@cl2 tmp]
#
另一台机器cl1
[root@cl1 ~]
# ll /tmp #/tmp下已有123.log文件
total 0
-rw-r--r--. 1 root root0 Jul 9 01:22 123.log
-rw-------. 1 root root0 Jul 8 01:41 yum.log
[root@cl1 ~]
#
|
示例:拉
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
Cl1机器创建ddd文件
[root@cl1 ~]
# echo123456 >ddd
[root@cl1 ~]
# cat ddd
123456
在cl2机器上把cl1家目录的ddd拉过来
[root@cl2 tmp]
# scp -P22 root@192.168.2.30:~/ddd . #.代表当前目录
reverse mappingchecking getaddrinfo
for
bogon [192.168.2.30] failed - POSSIBLE BREAK-INATTEMPT!
root@192.168.2.30'spassword:
ddd 100% 7 0.0KB
/s
00:00
[root@cl2 tmp]
# ll #cl2的/tmp下已有ddd
total 4
-rw-r--r--. 1 root root0 Jul 9 01:21 123.log
-rw-r--r--. 1 root root7 Jul 9 01:31 ddd
-rw-------. 1 root root0 Jul 8 16:56 yum.log
[root@cl2 tmp]
# cat ddd
123456
|
推:PUSH
scp -P22 /tmp/123.log root@192.168.2.30:/tmp
拉:PULL
scp -P22 root@192.168.2.30:~/ddd .
#-àscp为远程拷贝文件或目录的命令
#-à-P(大写,注意和ssh命令的不同)接端口,默认22端口时可以省略-P22
#-à-r表示拷贝目录
#-à-p表示在拷贝前后保持文件或目录属性
#-à/tmp为本地的目录。“@”前为用户名,“@”后为要连接的服务器IP。IP后的:/tmp目录,为远端的目标目录。->以上命令作用是反本地/tmp下的123.log拷贝到远端服务器192.168.2.30的/tmp目录;
#-à还可以把远端目录抓到本地,scp –P22 root@192.168.2.30:/tmp /tmp/zdw。就是把PUSH的目录位置对调一下即可。
小结:
scp是加密的远程拷贝,可以把数据从一台机器推送到另一台机器,也可以从其它服务器把数据拉回到本地执行命令的服务器,但是,每次都是全量拷贝(rsync增量拷贝),因此,效率不高。
sftp服务:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
[root@cl2 ~]
# sftp -o Port=52113 zdw@192.168.2.30 #进入到192.168.2.30这台机器
Connecting to192.168.2.30...
reverse mappingchecking getaddrinfo
for
bogon [192.168.2.30] failed - POSSIBLE BREAK-INATTEMPT!
root@192.168.2.30'spassword:
#提示输入密码
sftp
>
ls
–l
#查看文件,这时看到的是2.30这台机器的家目录
-rw------- 1 root root 1096 Jul 8 01:44 anaconda-ks.cfg
-rw-r--r-- 1 root root 7 Jul 9 01:29 ddd
-rw-r--r-- 1 root root 9458 Jul 8 01:44
install
.log
-rw-r--r-- 1 root root 3091 Jul 8 01:43
install
.log.syslog
sftp
> put
/data/123
.log
#把123.log文件放到2.30上
Uploading
/data/123
.logto
/root/123
.log
/data/123
.log 100% 0 0.0KB
/s
00:00
sftp
>
ls
–l
#查看,已存在123.log的文件
-rw-r--r-- 1 root root 0 Jul 11 17:30123.log
-rw------- 1 root root 1096 Jul 8 01:44 anaconda-ks.cfg
-rw-r--r-- 1 root root 7 Jul 9 01:29 ddd
-rw-r--r-- 1 root root 9458 Jul 8 01:44
install
.log
-rw-r--r-- 1 root root 3091 Jul 8 01:43
install
.log.syslog
sftp
>
sftp
> get ddd
#下载ddd
Fetching
/root/ddd
toddd
/root/ddd
100% 7 0.0KB
/s
00:00
sftp
>
[root@cl2 ~]
# ls #ddd已下载(下载的目录是当前目录)
anaconda-ks.cfg ddd
install
.log
install
.log.syslog
|
小结:
1、 sftp –oPort=22 root@192.168.2.30
2、 上传put加客户端本地路径,也可以指定路径上传,put /etc/hosts /tmp
3、 下载get服务端的内容,下载到本地的当前目录
客户端sftp:
上传:
1
2
3
4
5
6
7
8
9
|
Therewas a problem using the initial
local
directoryC:\Users\dongwei_zhao\Documents: 系统找不到指定的路径。
Attemptingto fall back to default initial path.
sftp
>put
"C:\Users\zdw11\Desktop\work\wltx\678.txt"
Uploading678.txt to
/root/678
.txt
100% 0 bytes 0 bytes
/s
00:00:00
sftp
>
ls
123.log 678.txt anaconda-ks.cfg
ddd
install
.log
install
.log.syslog
sftp
>
|
下载:
下载的目录在选项-会话选项里设置
1
2
3
|
sftp
>get 123.log
#下载123.log文件到windows本地
Downloading123.log from
/root/123
.log
100% 0 bytes 0 bytes
/s
00:00:00
|
注:下载操作时,如果没有成功。退出重新连接生效。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
[root@www ~]
# egrep -v "^#|^$" /etc/ssh/sshd_config #排除以#和$开头的
Port 52113
PermitRootLogin no
PermitEmptyPasswords no
UseDNS no
GSSAPIAuthentication no
Protocol 2
SyslogFacility AUTHPRIV
PasswordAuthenticationyes
ChallengeResponseAuthenticationno
GSSAPIAuthenticationyes
GSSAPICleanupCredentialsyes
UsePAM
yes
AcceptEnv LANG LC_CTYPELC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPERLC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATIONLC_ALL LANGUAGE
AcceptEnv XMODIFIERS
X11Forwarding
yes
Subsystem
sftp
/usr/libexec/openssh/sftp-server
[root@www ~]
#
|
学习自:
老男孩Linux
本文转自cix123 51CTO博客,原文链接:http://blog.51cto.com/zhaodongwei/1825712,如需转载请自行联系原作者