SSH

SSH


一、SSH基本介绍

1、含义:

    SSH 为 Secure Shell 的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。SSH最初是UNIX系统上的一个程序,后来又迅速扩展到其他操作平台。SSH在正确使用时可弥补网络中的漏洞。SSH客户端适用于多种平台。几乎所有UNIX平台—包括HP-UX、Linux、AIX、Solaris、Digital UNIX、Irix,以及其他平台,都可运行SSH<摘自:百度>。

2、实现SSH的方法

(1)OpenSSH 工具
(2)dropbear 工具

3、SSH协议版本

SSHv1:基于CRC-32做MAC(Massage Autherization Code);不安全。
SSHv2:双方主机协议选择安全的MAC方式,基于DH算法做秘钥交换,基于RSA或DSA实现身份认证。

4、SSH认证方式

- 基于passwd认证方式
- 基于秘钥认证

二、实现SSH的管理方法

1、基于OpenSSH

(1)概念

    OpenSSH 是 SSH (Secure SHell) 协议的免费开源实现。SSH协议族可以用来进行远程控制, 或在计算机之间传送文件。而实现此功能的传统方式,如telnet(终端仿真协议)、 rcp ftp、 rlogin、rsh都是极为不安全的,并且会使用明文传送密码。OpenSSH提供了服务端后台程序和客户端工具,用来加密远程控件和文件传输过程中的数据,并由此来代替原来的类似服务。

(2)openssh工具

(a)ssh工具相关的安装包

openssh-VERSION.rpm 通用包
openssh-server-VERSION.rpm  服务端安装包
openssh-client-VERSION.rpm 客户端安装包

(b)配置文件

/etc/sshd/ssh_config客户端配置文件

选项含义
Host *表示所有主机
StrictHostKeyChecking ask首次登陆是否检查提示
ForwardX11Trusted yes是否开启信任x11转发

/etc/sshd/sshd_config 服务器端配置文件

选项含义
Port 22默认端口号为22
AddressFamily any地址家族
ListenAddress ::监听的地址
HostKey密钥存放的位置
AuthorizedKeysFile认证文件存放位置
PermitRootLogin是否允许管理员登录,建议改为no
UseDNS是否支持dns反向解析 此选项和GSSAPIAuthentication 同时使用;
ClientAliveInterval和ClientAliveCountMax同时使用,两者相乘,就是连接的存活时间。
MaxAuthTries最多认证次数
Banner /path/file登录的提示信息
MaxSessions最多会话
AllowUsers允许用户
AllowGroups允许组>
DenyUsers禁止用户
DenyGroups禁止组

(3)ssh工具使用格式

    ssh [user@]host [COMMAND]
    ssh [-l user] host [COMMAND]
选项含义
-c压缩方式
-b绑定IP连接
-pPORT 指定对方的端口号
-X支持x11转发
-y支持信任x11转发,与配置文件ForwardX11Trusted有关
-t强制伪tty分配

ssh -t remoteserver1 ssh remoteserver2:当远程主机remoteserver2无法直接到达时,可以使用-t参数,然后由remoteserver1跳转到remoteserver2。在此过程中要先输入remoteserver1的密码,然后再输入remoteserver2的密码,然后就可以操作remoteserver2了。

示例:
假设这里有三台机器,CnetOS6.9-1 IP为192.168.159.138;CnetOS6.7-1 IP为192.168.159.139;CnetOS7.3-2 IP为192.168.159.161。CentOS6.9-1 可以与CentOS7.3-1通信,不能与CentOS7.3-2通信;而CentOS7.3-1可以与CentOS7.3-2通信。如何实现CentOS6.9-1与CentOS7.3-2通信呢?

(1)在CentOS7.3-2禁止CentOS6.9-1的IP 连接
[root@localhost~]#iptables -A INPUT -s 192.168.159.138 -j REJECT

(2)在CentOS6.9-1测试是否能ping通
[root@centos6~]#ping 192.168.159.161
PING 192.168.159.161 (192.168.159.161) 56(84) bytes of data.
From 192.168.159.161 icmp_seq=1 Destination Port Unreachable

(3)然后通过CentOS7-1为跳板机连接到CentOS7.3-2主机上

(a)先测试CentOS6.9-1是否能连接到主机CentOS7.3-2
[root@centos6~]#ssh 192.168.159.161
ssh: connect to host 192.168.159.161 port 22: Connection refused

(b)利用CentOS7.3-1作为跳板机连接到CentOS7.3-2主机上
[root@centos6~]#ssh -t 192.168.159.139 ssh 192.168.159.161
root@192.168.159.139's password:
root@192.168.159.161's password:
Last login: Tue Sep 12 19:21:37 2017 from 192.168.159.161

顺利的解决了我们遇到的问题。

(4)工作机制

     当客户端连接SSH服务器时,会复制ssh服务器 `/etc/ssh/ssh_host*.key.pub ` (CentOS7是/etc/ssh/ssh_host_ecdsa_key.pub)文件中的公钥到客户机的` ~./ssh/know_hosts`中。下次连接时,会自动匹配响应的私钥,如果匹配成功,则连接,反之亦然。

(a)客户端向服务器端发出请求
(b)服务器端接受到请求,发送公钥给客户端
(c)客户端输入账户和密码通过服务器端的公钥加密回传给服务端
(d)服务端通过自己的私钥解密,得到用户名和密码与本地作对比验证,验证成功则允许登录,反之亦然。

示例:

前提:CentOS 6 IP 为192.168.10.100
;CentOS 7 IP 为192.168.10.101

(1)使用ssh命令使两台主机通信

[root@centos6~]#ssh root@192.168.10.100
The authenticity of host ‘192.168.10.100(192.168.10.100)’ can’t be established.
RSA key fingerprint is a1:18:36:cc:e4:a1:de:c5:ad:6f:e4:ec:91:1d:d7:c4.
Are you sure you want to continue connecting (yes/no)? yes #第一次连接会询问是否信任此台主机
Warning: Permanently added ‘192.168.10.100’ (RSA) to the list of known hosts.
root@192.168.159.1’s password: #输入密码
Last login: Sat Sep 9 23:30:57 2017 from 192.168.159.1# #登录成功
上面询问/etc/ssh/ssh_config文件下的选项StrictHostKeyChecking 有关,如果该为no,则不会显示检查

[root@localhost~]#l. #查看是否生成.ssh目录

上述过程中CentOS 6系统会自动创建~/.ssh/known_hosts且会复制CentOS 7中的公钥到自己主机上。

(2)上述的验证机制与公钥有关还是私钥有关呢?

下面我们再启动 一台虚拟主机 CentOS 7.2 IP 为 192.168.10.102
现在我们让CentOS 7.2 冒充CnetOS 6

情况一:修改CentOS 7.2的IP地址为192.168.10.100,尝试连接CentOS 7

(a)修改IP地址为192.168.10.100

(b)把CentOS6服务端IP禁用

[root@localhost~]#ifconfig eth0 down

(c)使用客户机CentOS 7 连接

[root@localhost~]#ssh 192.168.10.100
会发出WARNING警告远程主机认证已经改变。

情况二:如果我们把公钥复制到CentOS 7.2中连接呢?

(a)将/etc/ssh/ssh_host_rsa_key.pub拷贝到冒充主机上
[root@localhost~]#scp /etc/ssh/ssh_host_rsa_key.pub 192.168.10.102:/etc/ssh
(b)连接CentOS 7.2
[root@localhost~]#ssh 192.168.10.100
会发出警告。

情况三:如果我们发私钥复制到CentOS7.2中,连接会发生什么情况?

[root@localhost~]#ssh 192.168.10.100 认证成功,所以我们在日常生产中保管好自己的私钥文件。

(5)ssh服务的最佳实践

建议选项
不要使用默认端口Port
禁止使用version 1 protocolProtocol
限制可登录用户MaxAuthTries
设定空闲会话时长ClientAliveInterval和ClientAliveCountMax
利用防火墙设置ssh访问策略
仅监听特定的IP地址ListenAddress
基于口令认证时,使用强密码策略
基于密钥的认证PubkeyAuthentication
禁止使用空密码PasswordAuthentication
禁止root用户直接登录PermitRootLogin
限制ssh的访问频度和并发在线数MaxAuthTries和MaxSessions
做好日志分析SyslogFacility

三、基于密钥认证

1、工作机制

(a)客户端在本机生成一对密钥
(b)客户端通过密令将本机的公钥拷贝到服务器端,服务端会将客户端的公钥存在`~/.ssh/authorized.keys`目录下
(c)客户端再次发送请求时,包括IP、用户名;
(d)服务端在通过上述目录查找是否有与之对应的公钥,如果查找成功响应IP和用户名,会随机生成一个字符串
(e)服务端将使用客户端的公钥进行加密,然后发送给客户端
(f)客户端得到服务端发来的消息后,客户端使用私钥进行解密,将解密的字符串发送给服务端
(g)服务端接受客户端发来的字符串后,跟之前对比,如果一致,允许登录,反之亦然。

2、生成密钥对命令的介绍

ssh-keygen:authentication key generation, management and conversion
格式:
    ssh-keygen [-q] [-b bits] -t type [-N new_passphrase] [-C comment]   [-f output_keyfile]
选项含义
-t加密的类型
-P是否对生成的私钥加密
-f指定的文件名
ssh-copy-id :install  your  public  key  in a remote machine’s authorized_keys
格式:
    ssh-copy-id [-i [identity_file]] [user@]machine
选项含义
-i指定公钥存放的位置

3、基于key的过程

(a)在客户端生CentOS 7在一对密钥

[root@localhost~]#ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): #密钥存放的位置
Enter passphrase (empty for no passphrase): #是否对密钥加密,建议加密,这里相当于选项-P
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:  
f5:f9:21:08:dd:2a:8d:f7:9f:88:4e:88:53:3e:45:a3 root@localhost.localdomain
The key's randomart image is:
+--[ RSA 2048]----+
|                 |
|         . .     |
|        . = .    |
|         B = .   |
|        E * + .  |
|       + = . o . |
|      o + . . .  |
|       . o . o . |
|         .o . o  |
+-----------------+

(b)使用命令将公钥拷贝到服务端CentOS 6主机上

[root@localhost~]#ssh-copy-id -i .ssh/id_rsa.pub root@192.168.10.100
[root@centos6~]#ls .ssh/authorized_keys 查看是否在服务端生成目录`authorized.keys`
.ssh/authorized_keys

(c)测试

[root@localhost~]#ssh 192.168.10.100
Last login: Thu Sep  7 18:39:01 2017 from 192.168.159.1  #登录成功

如果我们私钥加密需要验证多台,如果我们一台一台的验证,这样显然不是我们想要的方法,下面就很好的解决了我们这个问题

ssh-agent命令介绍

ssh-agent是个长时间持续运行的守护进程(daemon),设计它的唯一目的就是对解密的专用密钥进行高速缓存,这是一个一次性的过程,如果终端退出即消失。

工作机制

  如果执行这条命令,会启动后台一个子进程。代理一开始并没有私钥文件,私钥文件是通过命令`ssh-add`添加。并且把文件~/.ssh/id_rsa, ~/.ssh/id_dsa, ~/.ssh/id_ecdsa, ~/.ssh/id_ed25519 and
 ~/.ssh/identity添加到代理中。通过使用环境变量能定位和验证。SSH_AUTH_SOCK和SSH_AGENT_PID环境变量。

实现代理的方法

(a)ssh-agent xterm &  利用内含的export命令执行环境使环境变量可用
(b)eval `ssh-agent -s`
            -s sh ksh
            -c csh

步骤

(a)对上述生成的密钥加密

[root@localhost~]#ssh-keygen -p  #-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: 
Pass phrases do not match.  Try again.

(b)启动代理

[root@localhost~]#ssh-agent bash #启动一个bash子进程

(c)将私钥文件添加至代理中

[root@localhost~]#ssh-add
Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)

(d)测试
[root@localhost~]#ssh 192.168.10.102
Last login: Sun Sep 10 17:46:13 2017 from 192.168.10.101
登录成功,这样提高了我们的工作效率。

4、利用xshell基于key连接

 在xshell中工具-->新建用户密钥生成向导-->选择密钥类型和密钥长度-->给密钥名称命名并给密钥加密-->选择公钥格式-->保存公钥文件至指定目录下-->将公钥复制到需要远程连接的主机上~/.ssh/authorized.keys目录下,如果没有文件需要创建此目录,并修改权限。

在生成密钥是选择不合适的公钥格式,可以使用密令修改:
[root@centos6~]#ssh-keygen -i -f PUBLIK.key >>~/.ssh/authorized.keys

 -i 读取不加密的私钥和公钥非OpenSSH兼容输出

四、端口转发

在日常生产中,我们常常会遇到这样的问题,在公司运行一个服务或者一些程序,想要查看其运行状态及其结果等;公司的机器只能从内部访问外网,而内部外的并不能访问内部的机器;或者公司有一台ssh服务器,不能使用telnet服务去访问内部的主机,这样我们如何解决呢?由于ssh服务加密传输数据,我们可通过ssh服务解决上述问题。通过ssh连接首先构建一个”隧道“,然后可以通过这个隧道,远程连接到主机。

1、ssh本地端口转发

格式:ssh -L localPort:remateIp1(需要远程连接的IP):rematePort IP2(跳板机的IP)

选项含义
-f后台启用
-N不打开远程shell,处于等待状态

示例

假设这里有三台机器,CnetOS6.9-1 IP为192.168.159.138;CnetOS6.7-1 IP为192.168.159.139;CnetOS7.3-2 IP为192.168.159.161。CentOS7.3-2和CentOS7.3-1在公司的局域网中,CentOS6.9-1想连接CentOS7.3-2与之通信,该如何实现?

(1)模拟一个环境,先禁止CentOS6.9-1远程连接CentOS7.3-2

[root@localhost~]#iptables -A INPUT -s 192.168.159.138 -j REJECT

(2)首先确认要使用本地端口是否被别的服务占用
[root@centos7~]#ss -tn

(3)CentOS6.9-1利用ssh本地端口转发连接
[root@centos6~]#ssh -L 10001:192.168.159.161:23 -fN 192.168.159.139
root@192.168.159.139's password:
Last failed login: Tue Sep 12 05:04:50 CST 2017 from ``192.168.159.138 on ssh:notty
There were 4 failed login attempts since the last successful login.
Last login: Tue Sep 12 04:58:25 2017 from 192.168.159.1

(4)查看隧道是否建立成功

[root@centos6~]#ss -tn
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.159.138:22 192.168.159.1:4708
ESTAB 0 0 192.168.159.138:35506 192.168.159.139:22 #已经建立连接
[root@localhost~]#ss -tn #在CetnOS 7.3-2无连接
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.159.161:22 192.168.159.1:474

(5)在CentOS6.9-1ftp服务连接操作了

[root@centos7~]#ssh -p 10000 127.0.0.1

(6)如果我们连接完成想删除“隧道”该怎么解决呢?此时只能同过kill命令删除

[root@centos7~]#kill -9pidof ssh“

2、ssh远程端口转发

与上述示例相反,内网中只有一台主机可以访问外网,而另外一台主机不能访问外网,但是另外一台主机要想与外部的主机连接时,只能让一台主机作为跳板机,连接至外部机器,下面是实现方法:

(1)先模拟出来一个环境,同上述环境一样

(2)在CentOS7.3-2主机上创建隧道

[root@centos7~]#ssh -R 9999:192.168.159.138:22 -fN 192.168.159.164

(3)查看端口是否创建成功

[root@centos7~]#ss -tn
State Recv-Q Send-Q Local Address:Port Peer Address:Port

ESTAB 0 0 192.168.159.139:51608 192.168.159.164:22

(4)在CentOS7.3-2连接CentOS6.9-1

[root@localhost~]#telnet 127.0.0.1 9999

(5)此处删除的方法更ssh本地端口转发一样。

3、ssh动态端口转发

上述的两种,只是点对点的转发,如果我们有许多的端口,显然这样操作是不理想的,所有ssh支持ssh动态端口转发功能。如果某一台机器不能受限制不能访问某些网站,而另一台主机可以访问,ssh动态转发就解决了这个问题。工作原理是本地机器上分配一个socket侦听port端口,一旦这个端口上有了连接,该连接就经过安全通道转发出去,根据应用程序的协议可以判断远程主机和哪里连接。
注意:只有root才能转发特权端口。

格式:ssh -D localPort SSHServer

(1)建立通道

[root@centos7~]#ssh -D 9999 -fN 192.168.159.165

(2)测试是否成功
[root@centos7~]#curl --socks5 127.0.0.1 http://192.168.159.166
test

上述过程中与sshd_config中的几个选项有关,AllowTcpForwarding
GatewayPorts

4、X协议转发

格式:ssh -X user@remotehost gedit

X协议转发与sshd_config配置文件中的选项X11Forwarding有关。

五、复制文件命令介绍

1、scp命令

scp:secure copy (remote file copy program)
格式:
    scp [options] [user@]host:/sourcefile /destpath 
    scp [options] /sourcefile [user@]host:/destpath
选项含义
-c压缩数据流
-r递归复制
-p保持原文件属性
-q静默模式
-P PORT指明远程主机的端口

2、rsync

rsync: rsync - a fast, versatile, remote (and local) file-copying tool
格式:
    Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
    Push: rsync [OPTION...] SRC... [USER@]HOST:DEST
选项含义
-n模拟复制过程
-v显示详细过程
-r递归复制
-p保留权限
-t保留时间戳
-g保留组信息
-o保留所有者信息
-l将软连接文件本身复制
-L将软连接文件指向的文件复制
-X保留SElinux属性
-a存档,但不保留ACL和SElinux属性

注意:rsync命令只复制原有文件修改的文件或目录。而scp不管是否修改文件属性都复制。

3、sftp命令

scp:secure file transfer program,交换式传输工具
格式:
     sftp [user@]host[:file ...]
     sftp [user@]host[:dir[/]]

如果我们管理几十台或者更多机器,使用起来并不是特别方便,而且还耗时耗力。下面介绍介个轻量级的工具。

4、pssh

pssh包是来自于epel源。
     /usr/bin/pnuke
     /usr/bin/prsync
     /usr/bin/pscp.pssh
     /usr/bin/pslurp
     /usr/bin/pssh

以上执行的命令。

(1)pssh命令: parallel ssh program

格式:
       pssh  [-vAiIP]  [-h hosts_file] [-H [user@]host[:port]] [-l user]
   [-p par] [-o outdir] [-e errdir] [-t timeout]  [-O  options]  [-x
   args] [-X arg] command ...
选项含义
-h HOST_FILE包含IP的文件
-H [user@]IP[:port]连接的主机,如果要接连多个主机,用“”引起来,主机之间空格分开
-l USER用户名
-p并发数
-t超时秒数
-o OUTDIR输出目录,在该目录下创建
-e ERRDIR错误输出目录
-x ARGS传递过个命令,多个命令用“”引起来,使用空格分隔
-X同-x意义一样,但每次只传递一个命令
-i将输出结果输出当前终端
-I读取每个输出命令,并传递ssh进程,允许脚本传送到标准输入
-v显示ssh连接时的错误信息
-P打印输出
-A提示输入密码,并把密码传递给ssh服务

示例

(2)pslurp:parallel process kill program

格式:
          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
选项含义
-Llocaldir 复制远程主机文件或目录到本机指定的目录下
-r递归复制

其他选项请参考pssh

(3)prsync 将文件或文件夹从本地同步到远程主机上

格式:
       prsync [-vAraz] [-h hosts_file] [-H [user@]host[:port]] [-l user]
   [-p par] [-o outdir] [-e errdir] [-t timeout]  [-O  options]  [-x
   args] [-X arg] [-S args] local remote
选项含义
-a可以维持文件的属性
-z压缩传输

(4)pnuke:杀死远程主机上的进程,相当于killall

六、dropbear

Dropbear是一个相对较小的SSH服务器和客户端。它运行在一个基于POSIX的各种平台。 Dropbear是开源软件,在麻省理工学院式的许可证。 Dropbear是特别有用的“嵌入”式的Linux(或其他Unix)系统,如无线路由器。 <摘自:百度>

1、安装dropbear工具包

(a)从官网上下载dropbear源码包并安装有关编译的环境包组

(b)编译安装源码包

[root@centos7/usr/src]#tar xvf dropbear-2017.75.tar.bz2
[root@centos7/usr/src/dropbear-2017.75]#./configure
[root@centos7/usr/src/dropbear-2017.75]#make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp"
[root@centos7/usr/src/dropbear-2017.75]#make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" install

(c)有关命令的存放位置

/usr/local/sbin/usr/local/bin

(d)生成key存放的位置

dss /etc/dropbear/dropbear_dss_host_key
rsa /etc/dropbear/dropbear_rsa_host_key
ecdsa /etc/dropbear/dropbear_ecdsa_host_key

(e)创建目录并生成密钥

[root@centos7/usr/local/sbin]#mkdir /etc/dropbear
[root@centos7/usr/local/bin]#dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key -s 2048

Generating key, this may take a while...
Public key portion is:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDCfn+syhEMRgkxQ1Y/8Hzu54aTv23hLKyiDOTNVAqpZD+kS63TOcD4r5wCQsARNhl4e0kKWz9CLl6y3cWPxO+BbxCcZ+Ue2HqGQO2vhltzD2voL5xuOOg50nv1nrMrudS3kIYkg3gmVhn0Z0nKntJFdbzihzbLU0c1MgstTscu0PpX7q9j2c0mUHuYFqTmj2X4AJB0qjj8VZs93KTn3YyzVBph7mub8FQkS+fLjMvzan66+GjAtafeR+ezoFP6NAC7BuVaHaKoUNyP/myZgA3wkM4LL8OuoSk3uJia5ZDzDEsUNcHsmwaDVlJDGbjMRx+Djoafj9JNE7su+TmLMl2z root@centos7
Fingerprint: md5 bf:3b:0a:85:94:85:e1:af:91:74:14:d3:e2:0c:6e:d0

(f)启动dropbear
dropbear选项

选项含义
-FDon’t fork into background前台执行
-ELog to stderr rather than syslog输出信息在屏幕上
-p [address:]portListen on specified tcp port (and optionally address),up to 10 can be specified(default port is 22 if none specified)

[root@centos7/usr/local/bin]#dropbear -p 2222 -F -E

(g)使用dbclinet远程连接

[root@centos6/usr/local/bin]#dbclient 192.168.159.139

(h)拷贝文件

[root@centos6/usr/local/bin]#scp /etc/fstab 192.168.159.139:/

/usr/bin/dbclient: No such file or directory
lost connection

此时连接会报错,说我们没有/usr/bin/dbclient

[root@centos6/usr/local/bin]#hash
通过hash命令查看确实是使用我们刚刚创建的路径程序,所有解决此问题创建一个软连接即可。

[root@centos6/usr/local/bin]#ln -sv /usr/local/bin/dbclient /usr/bin/dbclient

`/usr/bin/dbclient' -> `/usr/local/bin/dbclient'

[root@centos6/usr/local/bin]#scp /etc/fstab 192.168.159.139:/

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页