ssh-基本介绍,安装,配置
本网站相关文章:
- 远程自动化工具
- ssh 基本安装和配置
- ssh 隧道转发功能以及应用
- ssh 代理转发介绍及应用场景
- ssh 代理中使用 https 以及二级代理的介绍
- ssh 数字证书生成以及 https 原理介绍
- ftp 安装,原理,配置
- ssh 远程执行命令和 bash 工作模式
Introduction
Secure Shell
SSH: Secure Shell, 一种加密的网络传输协议, 通过在网络中建立一个虚拟的安全隧道
来实现 client 和 server 之间的安全通信, 通过压缩数据, 加密数据
, 以更加安全, 更少量的流量
进行数据流通.
在了解了 SSH 的基本定义之后, 让我们带着如下的问题注意了解 SSH:
- SSH 提出的目的是为了解决哪些问题?
- SSH 的应用场景是什么?
- SSH 的通信原理或者交互流程是怎样的?
- SSH 如何安装和配置?
在了解了上述的基本内容之后, 我们后续会继续讲解 SSH 的进阶应用:
- ssh agent 是什么?应用场景是什么?如何使用?
- ssh tunnel 是什么?应用场景是什么?如何使用?
再将知识面扩展, 由 SSH 引申出安全相关话题, 进而了解TSL
安全通信, authentication认证
等等内容, 这些会在以前或者后续的文章中给出, 本篇文章主要讲解Secure Shell
相关知识点.
术语
在介绍 SSH 相关知识点之前, 让我们先简单的了解一下相关的术语:
SSH1
采用 DES,3DES,Blowfish 和 RC4 等对称加密算法保护数据安全传输,而对称加密算法的密钥是通过非对称加密算法(RSA)来完成交换的,使用 CRC 来保证数据的完整性.SSH2
避免了 RSA 的专利问题, 并修补了 CRC 的缺陷,SSH2 用数字签名算法(DSA)和 Diffie-Hellman(DH)算法代替 RSA 来完成对称密钥的交换,用消息证实代码(HMAC)来代替 CRC.OpenSSH
: SSH 最初是由芬兰的一家公司开发, 目前有两个版本的 openSSH, 其中大部分人都使用免费开源版本.
应用场景
让我们回到第一节提出的问题中来, SSH
是因何提出来的? SSH
的具体应用场景是哪些?
SSH
在一开始就是为了替代telnet
, ftp
这种不安全
的远程连接方式, 大部分应该都使用wireshark抓取过底层 TCP 报文, charles/Fiddler, 有时候会碰到普通的HTTP
认证登录方式, 或者 telnet 认证方式, 这些密码信息以非常直白的方式呈现给第三方网络嗅探器
, 造成极大的网络安全问题. 于是, 在 Shell 之上建立的安全隧道Secure Shell
产生, 在HTTP
之上建立的安全隧道HTTPS
产生.
所以, SSH
产生的原始是传统的 ftp, telnet 本质上都是不安全的, 在网络上使用明文进行传输 token/data, 相关的服务程序验证方式也存在弱点, 容易受到”中间人”攻击, 密码容易被抓包工具截获, 造成密码泄露.
目前来说, SSH
主要用于远程安全登录, 当然, 其还用于SCP
, SFTP
等安全传输中, 另外基于SSH
的安全隧道在很多场景中使用.
上述即使 SSH 的基本定义, 提出来由, 应用场景, 那么SSH
为何能够确保安全性呢? SSH
的交互流程是怎样的呢?
加密和认证
SSH 有两种方式进行认证:
- 基于口令的验证: 密码登录, 可能会被中间人攻击
- 基于密钥的验证: 一对 pulic key, private key
在服务器B
持有某一个特定公钥
的前提下, 任何一个持有该公钥
匹配的私钥
的任何一个人, 都能正常成功的登录该服务器, 所有私钥的保护和密码一样都是非常重要的.
Install
Ubuntu
1 | sudo aptitude install openssh-server |
Centos
1 | yum install openssh-server |
关于配置文件, 可从如下途径获取配置参数:
- 命令行选项
- 用户目录:
~/.ssh/config
- 系统:
/etc/ssh/ssh_config
其中配置文件的格式可以分为多个配置区段
, 每一个区段
都使用 Host 来区分, 当然,
我们可以在命令行中输入不同的 host 来加载不同的配置段.
另外, 不同于 nginx 中的配置加载, ssh configure
的每一个配置项以首次获取的参数值为准,
所以需要将通用的配置放到文件末尾, 特定的配置放在前面.
Permissions
文件的拥有者
, 文件的可访问权限
影响了 ssh 连接中的各类问题, 需要确保
- authorized_keys: 权限必须为 600
- config: 权限必须为, 安装, , 安装, 命令介绍+ private_key_filename: 600
- public_key_filename: 644
~/.ssh
目录下各个文件的含义:
- known_hosts: ssh 默认会将你访问过的计算机的 Public key, 登录进行 OpenSSH 校验, 如果公钥不同会发出警告, 避免 DNS Hijack 攻击
- private_key_filename: 对称加密中的私钥
- public_key_filename.pub: 对称加密中的公钥
- config: 各个秘钥的配置
- authorized_keys: 作为远程主机, 保存 Client 的公钥
Generate Key
Introduction
定义:ssh 公钥认证是 SSH 认证的一种方式
执行过程:获取$HOME/.ssh 下公钥和私钥,完成加密过程
命令:
1 | ssh-keygen Creates key pairs. |
Generate
生成公钥:
1 | ssh-keygen 默认生成, 建议加密密钥对 |
关于 config 配置文件, 见config介绍.
问题 1: 为何要对密钥对设置密码? 怎么设置?
对密钥对本身的加密吧, 避免密钥对被获取之后, 没有任何障碍的获取你所有服务器, 所有其他私密信息.
在使用ssh-keygen
建议输入一个长密码, 如果想修改密码短语: ssh-keygen -f ~/.ssh/id_rsa -p
.
Save
保存:
1 | 操作:保存,并拷贝公钥和私钥到.ssh目录下面 |
登录
1 | 公钥导入服务器SSH:cat id_rsa.pub >> authorited_keys |
Windows Configure
将所有的.ssh 压缩文件直接解压到 C:\用户\unlessbamboo\下面,会见到一个.ssh 的目录,其他原理同 linux.
SSH Client
Login
Login with password
1 | ssh -p Port user@host |
Login by Key
- generate your own public/private key
- save your public key in authorized_keys
- connect
1 | # login if exist config |
复制公钥到远程服务器
在创建好的公钥上传到远程服务器上, 以便使用 SSH 密钥认证.
传统方法: 拷贝文件到远程服务器
1 | # 拷贝文件(此时需要使用密码) |
简单方式, 不会登陆服务器, 使用 ssh-copy-id 命令
1 | # 上传默认id_rsa.pub文件, 其中远程服务器用户名同当前用户名相同 |
Options
Key
Host: 标识了一个配置项, 其中可用使用通配符, *
, ?
, !
HostName: 指定远程主机名, 可用使用 IP, Domain, 还可以使用 Format, 例如%h 会被命令行中的主机名替换
IdentityFile: 指定密钥认证使用的私钥文件路径, 默认为~/.ssh/id_rsa, 其中文件名称可用使用转义符
,
可用指定多个秘钥文件, 认证时会依次尝试
BindAddress: 指定连接的时候使用的本地主机地址,只在系统有多个地址的时候有用
AddKeysToAgent: 是否自动将 key 加入到 ssh-agent, 可以为 no(default)/confirm/ask/yes
Port: 远程主机端口号, 默认为 22
User: 指定登录的用户名, 例如对于某一个固定 IP, 默认使用 root 登录, 则可用设置该值
GlobalKnownHostsFile: 指定一个或多个全局认证主机缓存文件,用来缓存通过认证的远程主机的密钥,多个文件用空格分隔
UserKnownHostsFile: 指定一个或多个用户认证主机缓存文件,用来缓存通过认证的远程主机的密钥.
其中转义符如下:
1 | '%d' 本地用户目录 |
默认缓存文件: ~/.ssh/known_hosts
, /etc/ssh/ssh_known_hosts
关于通配符例子:
1 | * 匹配所有主机名, 一般仅在/etc/ssh/ssh_config中存在 |
Format
每一个配置项的格式如下:
1 | Host example # 关键词, 注意, example仅仅作为一个唯一的关键字 |
其中关键词在方便调用方面非常重要, 例如你已经配置好一个重要的关键词, 那么仅仅需要输入如下命令
即可进行连接: ssh example
, 多么的方便快捷
Disable Password
编辑/etc/ssh/ssh_config
, 禁止密码登录
1 | # 禁止密码登录 |
对于链接断开, 可以尝试开启心跳机制, 根源问题是网络问题, 编辑~/.ssh/config
1 | # for all hosts |
Example
管理多组密钥对
对于不同的服务器, 配置不同的密钥对, 而不是使用-i
参数来指定值
1 | # 同一平台下多账号, 会轮询调用 |
代理登录
没法直接登录到某台服务器,而需要使用一台中间服务器进行中转, 此时需要使用代理登录, 以进行交互
1 | Host gateway |
之后, 使用ssh db
连接, 此时实际执行 ProxyCommand 命令, 并用到了gateway
中的值
参考: