SSH协议
SSH英文全称Secure SShell,是一种安全的协议,也是用于远程登入的。
SSH相比telenet而言,具有更高的安全性,使用telent远处登入某台主机,存在着以下两个隐患:
1、用户认证是明文的
2、数据传输也是明文的
因此,处于数据安全考虑,使用SSH来远处登入更安全。
SSH有2个版本,SSHv1和SSHv2,SSH1由于无法抵挡中间人攻击,因此,现在很少使用SSHv1版了。所以使用更多的还是SSHv2版,毕竟它要安全多了。
SSH是工作在TCP层,端口号是22;telent也是工作在TCP层的,端口是23
要想实现SSH整个功能,我们需要借助Openssh来完成,Openssh是SSH的开源实现,Openssh即是一种软件也是一种协议,由于是开源的,因此自然就不需要花钱了。
既然是远处登入工具,那么就需要有一台主机作为客户端,另一台主机作为服务器端。且在客户端上面必须要有能够远处登入的软件工具才行。
对于客户端来说:
如果客户端是Linux系统,只需要使用ssh命令远处登入即可
如何客户端是windows系统,能够实现远程登入的工具主要有:
putty,secureCRT、SSHSecureShellClient,Xmanger
对于服务器来说:
只需要开启ssh服务即可,这个服务名称为sshd,因此只要确保sshd服务一直在运行即可。
如何使用ssh来远处登入某台主机?
ssh用法
ssh -l USERANEM REMOTE_HOST ['COMMAND']
以某个用户的身份登入到指定主机
'COMMAND':表示为不用登入到远处主机,但是可以在远处主机上面执行某些命令,并将结果返回给
客户端
ssh USERNAME@REMOTE_HOST:以指定用户身份登入到远处主机,如果没有指定用户,则是以当
前用户的身份登录
-X,-Y:表示登入到远处主机,并在远处主机上面执行打开图形窗口命令,而图形窗口将会在本地
打开,因此,本地要能够支持图形窗口界面
刚刚说过ssh既要有客户端也要有服务器端,所以,在Linux主机上面,及含有客户端配置文件,也含有服务器配置文件。
SSH客户端的配置文件是/etc/ssh/ssh_config
SSH服务器的配置文件是/etc/ssh/sshd_config
这两个文件的内容差不多,只有稍许的差别,在这里,我只介绍SSH服务器端的配置文件中大概的内容:
/etc/ssh/sshd_config
1、关于ssh server的设定说明
Protocol 2 #ssh的协议版本
ListenAddress 0.0.0.0 监听的主机地址,默认是监听所有接口的ssh要求
PidFile /var/run/sshd.pif 放置sshd这个pid的文件
LoginGraceTime 2m 多久没有成功连上就强迫断线,默认单位为秒
Compression delayed 指定何时开始使用数据压缩模式进行传输。有yes、no和登入后才将数据压缩(delayed)选项
2说明主机的Private key放置的档案
HostKey /etc/ssh/ssh_host_key # SSH version 1 使用的私钥
HostKey /etc/ssh/ssh_host_rsa_key # SSH version 2 使用的 RSA 私钥
HostKey /etc/ssh/ssh_host_dsa_key # SSH version 2 使用的 DSA 私钥
PermitRootLogin yes 是否允许 root 登入!预设是允许的,但是建议设成no !
StrictModes yes 是否让 sshd 去检查用户家目录或相关档案的权限数据
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
是否允许用户自行使用成对的密钥系统进行登入行为,仅针对 version 2。
至于自制的公钥数据就放置于用户家目录下的 .ssh/authorized_keys 内
PasswordAuthentication yes
PermitEmptyPasswords no
IgnoreUserKnownHosts no
#是否忽略家目录内的 ~/.ssh/known_hosts 这个档案所记录的主机内容?
ChallengeResponseAuthentication no 允许任何的密码认证
UsePAM yes 利用 PAM 管理使用者认证
TCPKeepAlive yes
# 当达成联机后,服务器会一直传送 TCP 封包给客户端藉以判断对方式否一直存在联机。
MaxStartups 10 # 同时允许几个尚未登入的联机画面
DenyUsers *
# 设定受抵挡的使用者名称,如果是全部的使用者,那就是全部挡吧!
DenyGroups test
Subsystem sftp /usr/libexec/openssh/sftp-server 基于ssh的ftp服务
ssh的认证方式:
一种基于口令认证,ssh默认的认证发送就是基于口令认证的。
一种是基于密钥认证
密钥验证工作原理
客户端A会在自己主机生成一个公钥和一个私钥,然后再将公钥拷贝给服务器端B,当客户端A下次再发送ssh请求时,该请求中包含了客户端A的公钥,服务器端收到请求后,查看客户端A中的公钥和自己主机上保存的公钥是否一样,如果一样,服务器端B就会随机产生一些数字C,然后服务器端B就会用A的公钥对这些数字C进行加密,加密后的数据在返回给客户端A,在用客户端A的私钥进行解密,解密得到的数据C2将返回给服务器B,服务器B会将这些数据C2和自己随机产生的数据C进行对比,如果数据一样,则说明客户端验证通过,否则,验证失败。
服务器的公钥放在~/.ssh/known_hosts文件中
基于密钥认证的整个步骤如下:
1、在客户端上生产一对密钥
使用ssh-keygen命令生成
-t {rsa|dsa} 指定加密算法
-f filename 指定密钥保存的文件
默认私钥保存在~/.ssh/id_rsa中
公钥保存在~/.ssh/id_rsa.pub 中
-N ‘password’ 指定密码,该密码是用来加密密钥的
2、将客户端生成的公钥传给服服务器 某用户家目录下的.ssh/authorized_keys文件中
文件传输可以使用ssh-copy-id和scp命令来完成
使用ssh-copy-id来自动完成将公钥传给服务器某用户家目录下的.ssh/authorized_keys文件中
ssh-copy-id -i /path/to/pubkey USERNAME@REMOTE_HOST
使用scp完成公钥传输
scp命令语法基本和cp命令相同,不同之处在于指定远处主机时,要是有这样的结构:
USERNAME@REMOTE_HOST :/PATH/TO/SOMEFILE
因此,对于将本地数据复制到远处主机上,可以这样使用:
scp /path/to/loacl USERNAME@REMOTE_HOST:/PATH/TO/SOMEWHERE
对于将远处主机上面的数据复制到本地,可以这么使用:
scp USERNAME@REMOTE_HOST:/PATH/TO/SOMEWHERE /path/to/loacl
3、测试登入即可,验证是否正确
总结关于使用ssh登录远处主机时,应该注意的安全事项:
1、密码应该经常换且足够复杂
2、使用非默认端口
3、限制登录客户地址
4、禁止管理员直接登入
5、仅允许有限用户登入
6、使用基于密钥的认证
7、禁止使用版本1
本文出自 “linux学习之路” 博客,谢绝转载!