SSH

一、ssh (安全外壳协议)
SSH 为 Secure Shell的缩写,由 IETF 的网络小组(Network Working Group)所制定;SSH 为建立在应用层基础上的安全协议。SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。
SSH是标准的网络协议,可用于大多数UNIX操作系统,能够实现字符界面的远程登录管理,它默认使用22号端口,采用密文的形式在网络中传输数据,相对于通过明文传输的Telnet,具有更高的安全性。
SSH提供了口令和密钥两种用户验证方式,这两者都是通过密文传输数据的。
不同的是,口令用户验证方式传输的是用户的账户名和密码,这要求输入的密码具有足够的复杂度才能具有更高的安全性。
而基于密钥的安全验证必须为用户自己创建一对密钥,并把共有的密钥放在需要访问的服务器上。当需要连接到SSH服务器上时,客户端软件就会向服务器发出请求,请求使用客户端的密钥进行安全验证。服务器收到请求之后,先在该用户的根目录下寻找共有密钥,然后把它和发送过来的公有密钥进行比较。如果两个密钥一致,服务器就用公有的密钥加密“质询”,并把它发送给客户端软件。客户端收到质询之后,就可以用本地的私人密钥解密再把它发送给服务器。这种方式是相当安全的。
 
二、ssh服务认证类型
1.基于口令认证
基于口令的安全验证的方式就是大家现在一直在用的,只要知道服务器的SSH连接帐号和口令(当然也要知道对应服务器的IP及开放的 SSH端口,默认为22 ),就可以通过 ssh客户端登录到这台远程主机。此时,联机过程中所有传输的数据都是加密的。
例如:#  ssh 192.168.10.7  输入用户与密码
2.基于密钥认证
首先在客户端生成一对密钥
# ssh-keygen -t dsa
#ssh-copy-id -i id_dsa.pub root@192.168.10.7    输入root密码
#ssh-copy-id -i id_dsa.pub "-p 6622 root@192.168.10.7"  非22端口注意语法
# ssh192.168.10.7    即可免密登录
#ssh-keygen -t dsa -f /root/.ssh/id_dsa -P ""         非交互式生成一对密钥
# echo-e "\n" |ssh-keygen -t dsa -N ""              非交互式生成一对密钥
 
三、配置ssh服务
ssh服务的默认端口是22,我们要把默认端口改了,这样就不容易被攻击者扫出来恶意登录了。
# cp/etc/ssh/sshd_config /etc/ssh/sshd_config.bak
# vim/etc/ssh/sshd_config   修改默认port
#/etc/init.d/sshd restart
禁止root登录 :# vim /etc/ssh/sshd_config      =>        PermitRootLogin no
限制ssh监听的IP:ListenAddress 192.168.10.7   指定监听并提供服务相应的网卡地址信息
禁止使用密码登录:PasswordAuthentication no
一键优化:sed -ir '13i Port 6622\nPermitRootLogin no\nPermitEmptyPasswordsno\nUseDNS no\nGSSAPIAuthentication no' /etc/ssh/sshd_config
 
四、ssh端口转发
SSH 不光会自动加密和解密所有 SSH客户端与服务端之间的网络数据。而且SSH 还有一个非常有用的功能,这就是端口转发。它能够将其他 TCP 端口的网络数据通过 SSH链接来转发,并且自动提供了相应的加密及解密服务。这一过程有时也被叫做“隧道”(tunneling),这是因为 SSH 为其他 TCP链接提供了一个安全的通道来进行传输而得名。
ssh端口转发两大功能
1.加密SSH Client 端至SSHServer端之间的通信数据
2.为了突破防火墙的限制完成一些之前无法建立的TCP连接
ssh端口转发又分为本地转发和远程转发
1.本地转发
本地转发主要运用于目标服务器因为防火墙规则无法访问,只能由处于同一个局域网内的机器访问,这时候就需要我们用本地端口转发了
本地端口转发格式如下:
ssh -L <localport>:<remote host>:<remote port> <SSH hostname>
外部主机A要访问数据库服务器C,但是因为防火墙规则无法直接访问,这时候我们要先连接内部服务器B,通过B来连接C,也就是拿B做跳板
首先我们要在外部主机上选择一个端口作为监听端口,我们使用telnet访问,所以不能用管理员访问,而非管理员用户对1-1023端口是没有权限的,所以我们要选1024-65535之间未被占用的端口。
在数据库服务器上也要安装telnet.server
我们只需要在外部主机上操作就可以了
首先我们看能否直接连接数据库服务器
#telnet tangC       是不能连接的
我们做一个本地端口转发
# ssh-L 1080:tangC:23 -Nf tangB
tangC就是我们要访问的数据库服务器
tangB就是我们的转发服务器
1080就是我们选择的本地端口
-f:后台启用
-N:不打开远程shell,处于等待状态
-g:启用网关功能
这个时候我们只需通过本地监听的1080端口就能访问数据库服务器了
# telnet127.0.0.1 1080
2.远程转发
远程转发不同之处在于远程转发的监听端口是在远程主机上打开的,就像我们要访问数据库服务器C,使用远程端口转发就是在内部服务器B上进行,使用远程端口转发要保证端口转发服务器和目标服务器之间没有被防火墙拦截。
SSH 的远程端口转发的格式如下所示
ssh -Rsshserver_port:remote_host:remotehost_port sshserver
远程端口的转发应用于数据库服务器和内部管理都不允许外网连接,这时候我们就需要在内部管理服务器上做一个远程端口转发隧道,让远程主机可以与数据库服务器建立连接
# ssh-R 1080:tangC -Nf tangB
这样远程主机监听本地端口,使用telnet协议就可以远程访问数据库服务器了。
 
五、ssh批量管理分发
1、创建用户及密码
useradd tang
echo 123456|passwd --stdin tang
2、创建密钥对
# ssh-keygen -t dsa
#ssh-keygen -t dsa -f /root/.ssh/id_dsa -P ""         非交互式生成一对密钥
# echo-e "\n" |ssh-keygen -t dsa -N ""              非交互式生成一对密钥
3、分发公钥
#ssh-copy-id -i id_dsa.pub root@192.168.10.7    输入root密码
# ssh-copy-id -iid_dsa.pub '-p 6622'root@192.168.10.7   非22端口注意语法
4、测试
# sshroot@192.168.10.7    即可免密登录
5、使用非ROOT用户使用SSH操作的时候无权限操作时:
可以使用sudo对所使用的用户提权,也可以使用SUID给所使用的命令授权。
#ssh-P 6622 hosts tang@192.168.10.7:/etc/        Permission denied     无权限
#ssh-P 6622 hosts  tang@192.168.10.7:~     可以先放到家目录
再在192.168.10.7上对reync授权 chmod u+s /usr/bin/rsync
或者visudo里面添加:echo"tang   ALL=(ALL) NOPASSWD:  /usr/bin/rsync" >>/etc/sudoers;visudo -c 检查语法
#ssh-P 6622 -t tang@192.168.10.7 sudo rsync ~/hosts /etc/hosts     使用tang用户终端操作sudo rsync命令
#ssh-P 6622 tang@192.168.10.7 rsync ~/hosts /etc/hosts    rsync有suid特性时
6、ssh与rsync通道模式配置传输文件与增量备份文件
#rsync -avz /etc/hosts -e 'ssh -p 22' root@192.168.10.7:/tmp/
#rsync -avz -e 'ssh -p 22' root@192.168.10.7:/etc/hosts /tmp/
7、批量分发脚本实例:
#vimhosts_distribute.sh
ssh -P 6622hosts  tang@192.168.10.7:~
ssh -P 6622-t tang@192.168.10.7 sudo rsync ~/hosts /etc/hosts
ssh -P 6622hosts  tang@192.168.10.6:~
ssh -P 6622-t tang@192.168.10.6 sudo rsync ~/hosts /etc/hosts
ssh -P 6622hosts  tang@192.168.10.5:~
ssh -P 6622-t tang@192.168.10.5 sudo rsync ~/hosts /etc/hosts
#/bin/shhosts_distribute.sh
8、批量分发脚本深度优化:
#vimhosts_distribute.sh
# !/bin/bash
./etc/init.d/functions
for n in 5 67
do  
    ssh -P 6622 ~/hosts  tang@192.168.10.${n}:~ >/dev/null2>&1 &&\
    ssh -P 6622 -t tang@192.168.10.${n} sudorsync /etc/hosts /etc/hosts_$(date +%F-%H-%M-%S).bak >/dev/null 2>&1&&\
    ssh -P 6622 -t tang@192.168.10.${n} sudorsync ~/hosts /etc/hosts >/dev/null 2>&1
    if [ $? -eq 0 ];then
        action "distribute hosts192.168.10.${n}" /bin/true
    else
        action "distribute hosts192.168.10.${n}" /bin/false
    fi
done
9、通过批量分发脚本把root家目录下某个文件推送到目标服务器的某个路径:
#vimhosts_distribute.sh
# !/bin/bash
./etc/init.d/functions
if [ $# -ne2 ];then
      echo "USAGE:/bin/sh $0 ARG1ARG2"
      exit 1
fi
for n in 5 67
do  
    ssh -P 6622 ~/$1  tang@192.168.10.${n}:~ >/dev/null2>&1 &&\
    ssh -P 6622 -t tang@192.168.10.${n} sudorsync ~/$1 $2 >/dev/null 2>&1
    if [ $? -eq 0 ];then
        action "distribute hosts192.168.10.${n}" /bin/true
    else
        action "distribute hosts192.168.10.${n}" /bin/false
    fi
done
例如:
#/bin/sh hosts_distribute.sh hosts /tmp   将hosts文件分发到所有服务器的/tmp目录
10、批量管理脚本
# vimview.sh
#!/bin/sh
./etc/init.d/functions
if [ $# -ne1 ];then
      echo "USAGE:/bin/sh $0 ARG1"
      exit 1
fi
for n in 5 67
do
   echo ======== 192.168.10.$n =========
   ssh -P 6622 tang@192.168.10.${n}"$1"
done
例如:
#/bin/sh view.sh "ifconfig eth0"  查看所有服务器网络信息   $1 为需要在远程服务器执行的命令
#/bin/sh view.sh "cat /etc/redhat-release”查看所有服务器系统版本信息
 
六、非交互式生成密钥及实现批量管理
1、创建用户及密码
useradd tang
echo 123456|passwd --stdin tang
2、创建密钥对
# ssh-keygen -t dsa
#ssh-keygen -t dsa -f /root/.ssh/id_dsa -P ""         非交互式生成一对密钥
# echo-e "\n" |ssh-keygen -t dsa -N ""              非交互式生成一对密钥
3、分发公钥
#ssh-copy-id -i id_dsa.pub "-p 6622root@192.168.10.7"   非22端口注意语法
也可以使用expect脚本非交互式批量分发密钥:
yum installexpect -y