<服务>SSH

时间:Feb. 15, 2017 分类:

目录:

SSH介绍

SSH通过安全的加密协议用于连接远端服务器。

[root@why-2 ~]# rpm -qa openssl openssh
openssh-5.3p1-94.el6.x86_64
openssl-1.0.1e-15.el6.x86_64

SSH服务端通过实时监听远程SSH客户端的连接请求,并进行处理,一般包括公共密钥认证,密钥交换,对称密钥加密和非安全连接等。为自启动服务。

SSH客户端包含SSH程序以及scp,slogin,sftp等。 工作机制为SSH客户端发送请求到达远程的SSH服务端,服务端检查连接的客户端发送的数据包和IP地址,如果确认合法,就会发送密钥给SSH的客户端,然后客户端将服务端密钥和客户端密钥整合成密钥对返回给服务端,这样就建立起了连接,不过ssh2和ssh1协议之间是无法通信的。

SSH加密说白了就是将能看懂的数据根据特殊的加密算法把这些数据变为杂乱无章的数据进行传输,到达目的地再通过对于的解密算法进行解密,即公钥和私钥,通过公钥加密,通过私钥来进行解密。

查看SSH协议版本

[root@why-2 ~]# cat /etc/ssh/sshd_config | grep Protocol
Protocol 2

代表SSH2,SSH2支持RSA和DSA密钥而SSH1只支持RSA

ssh认证流程

  1. sshd服务启动的时候,会产生一个临时公钥,存放在server端;
  2. 当client端向server端发送连接请求,server端会将这个临时公钥传给client端,client端会将此公钥与先前存储的公钥进行对比,看是否一致,判断标准是client端~/.ssh/known_hosts文件的内容;
  3. 在client端接收到公钥后会随机产生一个私钥,以加密的方式,默认为3DES算法将Server端的公钥和client端的私钥进行整合成密钥对,发送给server端
  4. 公钥放在server端,client端的软件需要能接受公钥,以后的通讯连接都通过这个密钥对进行传递信息

SSH1.x和SSH2.x的区别是,返回密钥对的时候,通过SSH1.x在client端返回密钥对的时候不进行检验,SSH2.x多了一个Diffie-Hellman机制,在每次联机的过程中都会进行检验。

验证方式

  1. 口令
  2. 基于密钥

SSH配置优化

#Port 22                    #修改默认端口
PermitRootLogin yes         #禁止root用户登录
#PermitEmptyPasswords no    #禁止空密码登录
UseDNS no                   #不使用DNS
GSSAPIAuthentication yes    #如果出现ssh连接慢的情况,可以将这个值该为no

一般生产环境下,都会只留一台内网机器,绑定外网IP进行ssh登录,通过这台机器跳转到内网的机器上进行操作,这样我们的服务会安全一些。

SSH命令使用

ssh [user@]hostname [command]

远程连接

ssh -p22 why@192.168.0.230

远程执行

ssh -p22 why@192.168.0.230 /sbin/ifconfig环境变量等不识别,必须用全路径

不过远程执行不能执行sudo,可以用ssh -t,或者注释掉/etc/sudoers中的Defaults requiretty内容。

生成密钥对

[root@why-1 ~]# ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/root/.ssh/id_dsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
The key fingerprint is:
5d:9e:88:fb:0c:97:98:d5:eb:42:3b:f9:02:67:20:f2 root@why-1
The key's randomart image is:
+--[ DSA 1024]----+
|                 |
|                 |
|            .    |
|    . . .o = .   |
|     o .S.+ +    |
|      E .=+. .   |
|        ==oo.    |
|         =*.     |
|          o=o    |
+-----------------+

ssh-copy-id

ssh-copy-id ~/.ssh/id_rsa.pub "-p 22 why@192.168.0.202" 实质是读取clients端的~/.ssh/id_dsa.pub到server端的~/.ssh/authorized_keys

SFTP使用

[root@why-1 ~]# sftp -oPort=22 192.168.0.202
Connecting to 192.168.0.202...
The authenticity of host '192.168.0.202 (192.168.0.202)' can't be established.
RSA key fingerprint is 8e:c6:93:52:57:44:3f:d6:3a:2e:95:69:56:70:bf:96.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.0.202' (RSA) to the list of known hosts.
root@192.168.0.202's password: 
sftp> ls
jdk-7u79-linux-x64.tar.gz
sftp> put a
Uploading a to /root/a
a                                                                                                                                                            100%    3     0.0KB/s   00:00   
sftp> put a /opt/
Uploading a to /opt/a
a                                                                                                                                                            100%    3     0.0KB/s   00:00   
sftp> get jdk-7u79-linux-x64.tar.gz
Fetching /root/jdk-7u79-linux-x64.tar.gz to jdk-7u79-linux-x64.tar.gz
/root/jdk-7u79-linux-x64.tar.gz                                                                                                                              100%  146MB  13.3MB/s   00:11    
sftp> quit
[root@why-1 ~]# ll | grep dk-7u79-linux-x64.tar.gz
-rw-r--r--   1 root  root  153512879 1月  16 05:08 jdk-7u79-linux-x64.tar.gz