概述
简单来说,ssh是一种网络协议,用于计算机之间的加密登录。如果一个用户从本地计算机,使用ssh协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露。
需要指出的是,ssh只有一种协议,存在多种实现,既有商业实现,也有开源实现。
SSH
之所以安全是采用了公钥加密的方式,通过客户自己签发公钥加密用户密码,再通过主机持有的私钥解密;不像HTTPS
协议存在证书管理中心CA用于验证公钥的合法性,因此,存在被中间人劫持的风险,即劫持登录请求发送篡改的公钥来截获用户登录密码,俗称”中间人攻击“;
不过SSH
存在一套自有的验证方式:口令验证及密钥验证,可有效避免大部分的攻击;
-
口令验证
用户通过自己的账号及口令登录远程主机,所有传输的数据都是加密的,但不能保证登录请求不被劫持,即”中间人攻击“;
-
密钥验证
需要将用户的公钥放在远程服务器上,登录请求时会携带公钥信息,服务端会比对公钥信息是否一致来判定合法性,因此不存在”中间人攻击“问题,安全性要高;
基本使用
登录
-
ssh user@host
指定登录远端主机的用户名
-
ssh host
如果本机用户名和需要登录的远端用户名一致,可省略用户名
-
ssh -p port -i ~/.ssh/id_rsa user@host
-p
指定目的端口,默认为22,可通过修改配置文件/etc/ssh/ssh_config
来修改该默认端口;-i
指定私钥文件;
测试
$ ssh -vT user@host
使用上述命令测试连接性及验证流程;
公钥
通过ssh-keygen
工具生成本地公钥文件,常用命令如下:
# -t 指定加密的方式,如rsa dsa ecdsa,默认rsa
# -f 指定生成目标文件位置,默认~/.ssh/id_rsa
# -C 新的注释,一般添加邮箱,用于程序提示信息区分不同用户,默认用户名@主机名
# -b 指定生成公钥的bits长度
$ ssh-keygen -t rsa -f ~/.ssh/xxx -b 521 -C "xxxx"
对于是否需要设定私钥密码的可依定个人情况,如果担心私钥安全,可设定一个;
在$HOME/.ssh/
目录下,会新生成两个文件:id_rsa.pub
和id_rsa
。id_rsa.pub
是公钥,id_rsa
是私钥,其中id_rsa
为默认文件名称,若如上图指定了文件路径及名称,则按照指定路径及文件名生成;
ssh-agent
ssh-agent是一种控制用来保存公钥身份验证所使用的私钥的程序,其实ssh-agent就是一个密钥管理器,运行ssh-agent以后,使用ssh-add将私钥交给ssh-agent保管,其他程序需要身份验证的时候可以将验证申请交给ssh-agent来完成整个认证过程。
说明:若ssh
登录使用密钥验证方式登录,则需要输入私钥的密码(生成密钥时指定的密码),若使用ssh-agent
代理,则在同一个session
会话下,只需要输入一次私钥密码即可,由ssh-agent
帮我们代理,避免每次登录都需要输入私密码;
如
github SSH
登录,若设置私钥密码则需要每次输入,可通过ssh-agent
代理实现免输入私钥密码;
若登录时未开启,可手动开启ssh-agent
,可通过如下命令:
$ eval "$(ssh-agent -s)"
添加生成的 SSH key
到 ssh-agent
:
$ ssh-add ~/.ssh/id_rsa
查看添加的SSH key
:
$ ssh-add -l
ssh-copy-id
若需要免密登录,则需要将用户的public key
文件内存追加复制到登录主机的authorized_keys
配置文件中(默认路径为~/.ssh/authorized_keys
),或者直接通过ssh-copy-id
工具完成,具体如下:
# 默认拷贝的公钥文件为~/.ssh/id*.pub,也可以通过 -i 选项指定
$ ssh-copy-id user@host
使用上述命令后即可实现免密登录;
ssh 配置
ssh
配置包括系统级别的(针对客户端的默认为/etc/ssh/ssh_config
,针对服务端的``/etc/ssh/sshd_config)及用户级别的配置文件(默认为
~/.ssh/config`);且配置文件存在优先级,低优先级的配置项可视作默认值;而高优先级的配置项则会覆盖默认值。按优先级,有如下排序:
- 用户实际执行
ssh
时传入的参数; - 用户的 SSH 配置文件
${HOME}/.ssh/config
; - 系统的 SSH 配置文件
/etc/ssh/ssh_config
。
/etc/ssh/config配置文件选项如下:
选项参数 说明
Host * 选项“Host”只对能够匹配后面字串的计算机有效。“*”表示所有的计算机。
ForwardAgent no 设置连接是否经过验证代理(如果存在)转发给远程计算机。
ForwardX11 no 设置X11连接是否被自动重定向到安全的通道和显示集(DISPLAY set)
RhostsAuthentication no 设置是否使用基于rhosts的安全验证
RhostsRSAAuthentication no 设置是否使用用RSA算法的基于rhosts的安全验证
RSAAuthentication yes 设置是否使用RSA算法进行安全验证
PasswordAuthentication yes 设置是否使用口令验证
FallBackToRsh no 设置如果用ssh连接出现错误是否自动使用rsh
UseRsh no 设置是否在这台计算机上使用“rlogin/rsh”
BatchMode no 如果设为“yes”,passphrase/password(交互式输入口令)的提示将被禁止。当不能交互式输入口令的时候,这个选项对脚本文件和批处理任务十分有用
CheckHostIP yes 设置ssh是否查看连接到服务器的主机的IP地址以防止DNS欺骗。建议设置为“yes”
StrictHostKeyChecking no 如果设置成“yes”,ssh就不会自动把计算机的密匙加入“$HOME/.ssh/known_hosts”文件,并且一旦计算机的密匙发生了变化,就拒绝连接
IdentityFile ~/.ssh/identity 设置从哪个文件读取用户的RSA安全验证标识
Port 22 设置连接到远程主机的端口
Cipher blowfish 设置加密用的密码
EscapeChar ~ 设置escape字符
/etc/ssh/sshd_config配置文件选项如下:
参数选项 说明
Port 22 SSH 预设使用 22 这个 port,您也可以使用多的 port !
Protocol 2,1 选择的 SSH 协议版本,可以是 1 也可以是 2 ,如果要同时支持两者,就必须要使用 2,1 这个分隔了!
ListenAddress 0.0.0.0 监听的主机适配卡
RSAAuthentication yes 是否使用纯的 RSA 认证!?仅针对 version 1 !
PubkeyAuthentication yes 是否允许 Public Key ?只有 version 2
AuthorizedKeysFile .ssh/authorized_keys 设定若要使用不需要密码登入的账号时,那么那个账号的存放档案所在档名!
IgnoreRhosts yes 是否取消使用 ~/.ssh/.rhosts 来做为认证!
RhostsRSAAuthentication no 针对 version 1 ,使用 rhosts 档案在/etc/hosts.equiv配合 RSA 演算方式来进行认证!
HostbasedAuthentication no 这个项目与上面的项目类似,不过是给 version 2 使用的!
IgnoreUserKnownHosts no 是否忽略家目录内的 ~/.ssh/known_hosts 这个档案所记录的主机内容
PasswordAuthentication yes 密码验证当然是需要的!
KeepAlive yes 一般而言,如果设定这项目的话,那么 SSH Server 会传送KeepAlive 的讯息给 Client 端,以确保两者的联机正常!在这个情况下,任何一端死掉后, SSH 可以立刻知道!而不会有僵尸程序的发生!
UsePrivilegeSeparation yes 使用者的权限设定项目!
DenyUsers * 设定受抵挡的使用者名称
AllowUsers * 设定允许的使用者名称
PermitRootLogin no 是否允许root权限登录
.....
常用的选项如下:
-
Host
,限定主机名 -
ForwardAgent
,是否开启代理模式,若使用ssh-agent
并指定私钥,需要开启 -
RSAAuthentication
,是否使用RSA
算法进行安全验证,默认YES -
PasswordAuthentication
,是否开启口令验证 -
Port
,指定连接到远端主机的端口,默认22 -
ListenAddress
,指定允许连接的主机地址 -
AllowUsers
,指定允许连接的用户
git-ssh配置
-
设置
git
账号的username
及email
$ git config --global user.name "humingx" $ git config --global user.email "humingx@yeah.net"
生成
ssh
密钥,见上添加私钥到
ssh-agent
(若存在私钥密码的话),以避免频繁输入私钥密码-
登录github设置相应的ssh公钥
测试
ssh -T git@github.com
验证连接性,成功如下: