Ssh是secure shell protocol的简写,由IETF的网络工作小组(Network working GROUP)所制定;它通过对联机数据包加密的技术来进行数据传递,因此,数据很安全.ssh是专为远程登录会话和其他网络服务提供安全性的协议.利用ssh协议可以有效防止远程管理过程中的信息泄露问题.
默认状态下,ssh本身提供两个服务功能:一个是类似telnet的远程联机使用shell的服务,即俗称的ssh;另一个是类似FTP服务的sftp-server,可以提供更安全的FTP.
从客户端来看,ssh提供两种级别的安全验证.
第一种级别(基于口令的安全验证)
只要你知道自己账号和口令,就可以登录到远程主机.所有传输的数据都会被加密.
第二种级别(基于密钥的安全验证)
需要依靠密钥,也就是你必须为自己创建一对密钥,并把公用密钥放在需要访问的服务器上.如果你要连接到ssh服务器上,客户端ssh软件就会向服务器发出请求,请求用你的密钥进行安全验证.服务器收到请求后,先在该服务器上你的用户主目录下寻找你的公用密钥,然后把它和你发送过来的公用密钥进行比较.如果两个密钥一致,服务器就用公用密钥加密”质询(challenge)”并把它发送给客户端软件.
客户端软件收到”质询”之后就可以自己私钥解密再把它发送给服务器.用这种方式,你必须知道自己密钥的口令.但是,与第一种级别相比,第二种级别不需要在网络上传送口令.
Ssh结构
Ssh是由客户端和服务端的软件组成的,有两个不兼容的版本分别是:1.X和2.X.
用ssh2.X的客户程序是不能连接到ssh1.X的服务程序上去的.OpenSSH同时支持1.X和2.X
Ssh服务端是一个守护进程(demon),他在后台运行并响应来自客户端的连接请求.服务端一般是sshd进程,提供了对远程连接的处理,一般包括公共密钥认证、密钥交换、对称密钥加密和非安全连接.
客户端包含ssh程序以及scp(远程拷贝)、slogin(远程登录)、sftp(安全文件传输)等其他的应用程序.
他们的工作机制大致是本地的客户端发送一个连接请求到远程的服务端,服务端检查申请的包和ip地址再发送密钥给ssh的客户端,本地再将密钥发回给服务端,自此连接建立.ssh1.X和ssh2.X在连接协议上有一些差异.
一旦建立一个安全传输层连接,客户机就发送一个服务请求.当用户认证完成之后,会发送第二个服务请求.这样就允许新定义的协议可以与上述协议共存.
网络数据包的加密技术通常是通过所谓的一对公钥与私钥(Public key and Private key)组合成的密钥对进行加密与解密的操作.如下图所示,主机端所要传给client端的数据,会先通过公钥加密后再到网络上传输.而到达client端后,再经由私钥将加密的数据解开来.由于在Internet上传输的数据是加密过的,所以数据内容当然就比较安全了. 加密数据
每一台ssh服务器主机都可以使用rsa加密方式来产生一个1024-bit的rsa key,这个
- 分发数据(一把钥匙开多把锁)
Cat /etc/redhat-release
Uname –mi
Uname –r
主机网络参数设置:
主机名
默认网关
网卡eth0
机器名
A-Server
10.0.0.254
192.168.125.128
中心分发服务器
B-Server
10.0.0.254
192.168.125.130
接收节点服务器
c-Server
10.0.0.254
10.0.0.183
接收节点服务器
2.1需求分析 2.1.1具体需求要求所有服务器在同一用户wj系统用户下,实现A机器从本地分发数据到B、c机器上,在分发过程中不需要B、c的提示系统密码验证,当然,还包括批量查看客户机上的cpu,load,mem等使用信息.
即实现从A服务器发布数据到B、c客户端服务器或查看信息的免密码登录验证解决方案.
分发数据流方式如下:
A------------àB
A-----------àC
提示:形象比喻,即一把钥匙(A)开多把锁(B/c)
2.1.2实现拓扑
3.1行前准备 3.1.1添加系统账号在部署密钥之前,首先要分别在A、B和C服务器上添加好wj用户并设置密码,然后,通过wj用户来实现多个服务器之间免密码登录,以A服务器为例,具体步骤如下:
Useradd wj
Echo “123456”|passwd –stdin wj
如果已存在同名用户,可通过userdel –rf wj来删除之,然后在添加.
4.1开始部署因为A服务器为中心分发服务器,所以我们选择在A端建立public key(锁)与private key(钥匙)
在本文中,为了方便读者更好的学习和理解,我这里把服务器密钥对以生活中大家每天都要接触到的锁和钥匙的关系来打比方.public key公钥比作锁,private key私钥比作钥匙.密钥的基本原理可以理解为生活中用钥匙开锁的过程.
特别提示:在整个方案实现中,钥匙(Private key)和锁(Public key)仅需要建立一次即可,可以在A,B,C任意机器上来执行,本文选择了在A服务器来生成密钥对.
4.1.1生成密钥对“去超市买锁”
在A机器上建立dsa key,生成Public key锁与private key钥匙,执行步骤如下.
Su – wj
Ssh-keygen –t dsa
Ssh-keygen 是生成密钥的工具,-t参数指建立密钥的类型,这里是建立dsa类型密钥.也可以执行ssh-keygen –t rsa来建立rsa类型密钥
Rsa与dsa加密算法区别
Rsa是一种加密算法(rsa也可以进行数字签名的)它的简写的来由是ron rivest adi shamir和leo三个人名字首字母连接起来就是rsa.
Dsa就是数字签名算法的英文全称的简写,即digital signature algorithm,简写是dsa,rsa既可以进行加密,也可以进行数字签名实现认证,而dsa只能用于数字签名从而实现认证.
提示:1.请一路按回车键即可.密钥的生成可以在任意机器上,且生成一次即可.
2.可以看到密钥的存放路径为用户家目录下的.ssh目录。
- 有关ssh-keygen说明请man ssh-keygen,或参考http://lamp.linux.gov.cn/OpenSSH/ssh-keygen.html
ls –l .ssh/
ls –ld .ssh/
另外,在创建密钥对的同时在用户家目录下生成了.ssh隐藏目录.
.ssh目录的权限为700,另外,private key(钥匙)id_dsa文件权限为600,public key(锁)id_dsa.pub当前文件权限为644.其中,private key(钥匙)id_dsa文件权限必须为600.
4.1.2分发公钥(锁)把公钥(锁)从A拷贝到b,c端用户家目录各一份.
即在A端执行如下命令:
cd .ssh/
ls –l –time-style=long-iso
ssh-copy-id –i id_dsa.pub wj@192.168.125.130要把192.168.125.130当作锁端,只需要id_dsa.pub放到192.168.125.130上家目录的.ssh目录即可(需要改名).
Ssh-copy-id为系统自带的shell脚本,可用来分发公钥(锁).输入yes在本地添加ssh公钥信息.该信息默认会被添加到本地~/.ssh/know_hosts文件中.
Ssh-copy-id –I id_dsa.pub wj@192.168.125.130
我们看到b,c服务器上的wj用户目录多了一个.ssh目录,.ssh目录里增加了一个文件authorized_keys,那么这个文件就是改了名字的id_dsa.pub文件.默认情况下ssh的配置文件中默认调用的公钥路径为.ssh,文件名就是authorized_keys.
特别注意:当要分发的节点机器有数百台时,使用ssh-copy-id就相对麻烦,因为第一次拷贝时需要人工输入密码.解决这个问题的办法就是用expect交互式命令来实现,另一个办法是手动处理公钥的办法.
具体方案是,把公钥改名后做成压缩包,然后放到一个所有分发节点都可以访问的http server上然后在所有分发的机器上(secure crt本身就有这个功能,可以同时批量管理数百台服务器)写脚本直接wget下载解压即可.不过手工修改会带来部署出问题的风险,其中最常见的问题是.ssh目录权限的问题.
4.1.4ssh-copy-id的特殊应用如果ssh修改成为特殊端口,如52113,那么,用上面的ssh-copy-id命令就无法进行分发公钥了.如果仍要使用ssh-copy-id的话:
1.命令为:ssh-copy-id –i id_dsa.pub “-p 52113 wj@192.168.125.130” 特殊端口分发,适当加引号
2.编辑vi /usr/bin/ssh-copy-id在第41行做如下修改,见加粗部分
41{eval “$GET_ID”;}|ssh –p52113 $1”umask 077;test –d.ssh||mkdir .ssh;cat>>.ssh/authorized_keys”||exit 1
在中心分发服务器A机器上执行了ssh-copy-id脚本成功后,从B 10.0.0.142和C 10.0.0143上可以看到从A端拷贝过来的公钥(锁文件)如下:
防止ssh暴力破解:
1.密码给8位到14位,多种组合
2.改默认端口,禁用root登录
3.fail2ban python2.4以上 lastb查看/var/log/btmp文件比较大,封掉ip
在/etc/init.d/下创建服务启动脚本
查找以上文件位置启动脚本