一、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连接
-p PORT 指定对方的端口号
-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 refuse
(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_con1fig文件下的选项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 protocol Protocol
限制可登录用户 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,处于等待状态
-g 启用网关功能
示例
假设这里有三台机器,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 -9 `pidof 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 <local port> <SSH Server>
(1)建立通道
[root@centos7~]#ssh -D 1080 -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
以上执行的命令。
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服务
示例
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
选项
-L localdir 复制远程主机文件或目录到本机指定的目录下
-r 递归复制
其他选项请参考pssh
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 压缩传输
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选项
-F Don‘t fork into background前台执行
-E Log to stderr rather than syslog输出信息在屏幕上
-p [address:]port Listen 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:
本文出自 “Joah” 博客,请务必保留此出处http://merit.blog.51cto.com/10757694/1965107
原文地址:http://merit.blog.51cto.com/10757694/1965107