SSH服务
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
|
[[email protected] ~] # rpm -qa openssh
openssh-5.3p1-94.el6.x86_64 [[email protected] ~] # rpm -qa openssh openssl
openssl-1.0.1e-15.el6.x86_64 openssh-5.3p1-94.el6.x86_64 [[email protected] ~] # rpm -qa|grep openssh
openssh-5.3p1-94.el6.x86_64 openssh-server-5.3p1-94.el6.x86_64 [[email protected] ~] # 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:[email protected] /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地址
[[email protected]~]# 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
|
[[email protected] ~] # 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
|
[[email protected] ~] # 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
|
[[email protected] ~] # 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 [[email protected] ~] #
|
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
|
[[email protected] ~] # ss #查看以ss开头的服务
ss ssh -add ssh -copy- id ssh -****** ssltap
ssh ssh -agent sshd ssh -keyscan
[[email protected] ~] # ssh -p22 [email protected] #连接到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!
[email protected]'spassword: #输入密码
Last login: FriJul 8 11:45:43 2016 from 192.168.2.129 192.168.88.66 Connection to192.168.88.66 closed. [[email protected] ~] # ls -l~/.ssh #已经有了文件
total 4 -rw-r--r--. 1 root root395 Jul 8 23:34 known_hosts [[email protected] ~] # cat~/.ssh/known_hosts #以下是加密信息
192.168.88.66 ssh -rsaAAAAB3NzaC1yc2EAAAABIwAAAQEAya+hbnpwYoPvrgSC+puPzLjVWkSOlrqFtysjCX0aMhTRRqpA1SpeLiBmKsKyDbyNVQa2mXcOYVdbjE7qPB7QcqK99nmgTkV70DE0Xvv6jxF5FFpV0qKepaTyRhFrMsmK0Mky04Iwb7rdkjfD82Hi+IQZY8DC2zGKS1+V6fKZ1XNapz4+ /CXcoWTOGS6 +H50zrv3ET5vtby3OLU6lJp4E5nPuE+0H2da9poQaIsJ2 /JmW8gA5u8rXSC1Ccv1BEWjzqKeU8ZE72QEtDUqVfavGpRu8GjKRkCojXhsTsCBjy593GVu0ZGEgSUdWn1 +CBXp7acc6Bhmd5HCCK /rWk3OEwQ ==
[[email protected] ~] #
|
基于**的安全验证:
基础**的安全验证方式是指,需要依靠**,也就是必须事先建立一对**对,然后把公用**(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
|
[[email protected] ~] # 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 [[email protected] ~] # 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 [[email protected] ~] #
[[email protected] ~] # ll/etc/ssh/sshd_config #sshd是服务端
-rw-------. 1 root root3879 May 12 12:52 /etc/ssh/sshd_config
[[email protected] ~] # ll/etc/ssh/ssh_config #sshd是客户端
-rw-r--r--. 1 root root2047 May 12 12:52 /etc/ssh/ssh_config
通过查看配置也可以区别是服务端还是客户端,如下: [[email protected] ~] # 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
|
[[email protected] ~] # 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)
[[email protected] ~] # 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 tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 :::22 :::* LISTEN |
小结:
1、 切换到别的机器ssh–p52113 [email protected]
2、 到其他机器执行命令(不会切到机器上)ssh –p52113 [email protected] 命令(全路径!不识别环境变量
当第一次连接的时候,本地会产生一个**文件~/.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上的操作 [[email protected] 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 [[email protected] tmp] # pwd
/tmp [[email protected] tmp] # scp -P22 /tmp/123.log [email protected]:/tmp #scp后面的-P(是大写)
reverse mappingchecking getaddrinfo for bogon [192.168.2.30] failed - POSSIBLE BREAK-INATTEMPT!
[email protected]'spassword: 123.log 100% 0 0.0KB /s 00:00
[[email protected] tmp] #
另一台机器cl1 [[email protected] ~] # 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 [[email protected] ~] #
|
示例:拉
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
Cl1机器创建ddd文件 [[email protected] ~] # echo123456 >ddd
[[email protected] ~] # cat ddd
123456 在cl2机器上把cl1家目录的ddd拉过来 [[email protected] tmp] # scp -P22 [email protected]:~/ddd . #.代表当前目录
reverse mappingchecking getaddrinfo for bogon [192.168.2.30] failed - POSSIBLE BREAK-INATTEMPT!
[email protected]'spassword: ddd 100% 7 0.0KB /s 00:00
[[email protected] 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 [[email protected] tmp] # cat ddd
123456 |
推:PUSH
scp -P22 /tmp/123.log [email protected]:/tmp
拉:PULL
scp -P22 [email protected]:~/ddd .
#-àscp为远程拷贝文件或目录的命令
#-à-P(大写,注意和ssh命令的不同)接端口,默认22端口时可以省略-P22
#-à-r表示拷贝目录
#-à-p表示在拷贝前后保持文件或目录属性
#-à/tmp为本地的目录。“@”前为用户名,“@”后为要连接的服务器IP。IP后的:/tmp目录,为远端的目标目录。->以上命令作用是反本地/tmp下的123.log拷贝到远端服务器192.168.2.30的/tmp目录;
#-à还可以把远端目录抓到本地,scp –P22 [email protected]:/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
|
[[email protected] ~] # sftp -o Port=52113 [email protected] #进入到192.168.2.30这台机器
Connecting to192.168.2.30... reverse mappingchecking getaddrinfo for bogon [192.168.2.30] failed - POSSIBLE BREAK-INATTEMPT!
[email protected]'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 >
[[email protected] ~] # ls #ddd已下载(下载的目录是当前目录)
anaconda-ks.cfg ddd install .log install .log.syslog
|
小结:
1、 sftp –oPort=22 [email protected]
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
|
[[email protected] ~] # 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
[[email protected] ~] #
|
学习自:
老男孩Linux
本文转自cix123 51CTO博客,原文链接:http://blog.51cto.com/zhaodongwei/1825712,如需转载请自行联系原作者