SSH 为 Secure Shell 的缩写,由 IETF 的网络工作小组(Network Working Group)所制定;SSH 为建立在应用层和传输层基础上的安全协议。SSH 是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题。接下来让我们一起来认识一下ssh的魅力所在。
一、ssh服务的基本认知
1、SSH服务提供的功能:
- 提供类似telnet的远程联机服务器的服务,即SSH服务。
- 提供类似FTP服务的sftp-server,借助SSH协议来传输数据,提供更安全的SFTP服务。
-
提供远程安全拷贝命令SCP,rsync以及pssh等。
2、具体的软件实现:
- OpenSSH: ssh协议的开源实现,CentOS默认安装
- dropbear:另一个开源实现
3、连接远程主机的服务命令
[root@localhost ~]#ssh username@ip
[root@localhost ~]#ssh -l username ip
4、ssh 两种方式的用户登录认证:
- 基于password
基于口令的安全验证的方式就是大家现在一直在用的,只要知道服务器的SSH连接帐号和口令(当然也要知道对应服务器的 IP及开放的 SSH端口,默认为22 ),就可以通过 ssh客户端登录到这台远程主机。此时,联机过程中所有传输的数据都是加密的。
- 基于密钥的登录方式
– 1 首先在客户端生成一对密钥(ssh-keygen)
– 2 并将客户端的公钥ssh-copy-id 拷贝到服务端
– 3 当客户端再次发送一个连接请求,包括ip、用户名
– 4 服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP和用户,就会 随机生成一个字符串,例如:acdf
– 5 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端
– 6 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务 端
– 7服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码 登录
具体操作步骤:首先,关闭在/etc/ssh/sshd_config中的密码
[root@localhost ~]#vim /etc/ssh/sshd_config
PasswordAuthentication no
其次生成公私钥,再把私钥传送给想建立连接的机器
[root@localhost ~]# ssh-keygen
[root@localhost~]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.18.250.203
二、基于ssh的文件传输命令
1、scp命令
- 语法:scp [options] SRC... DEST/
- 常用的两种方式:
[root@localhost ~]# scp -p /app/test.txt /etc/passwd root@172.18.250.243:/app/ 将app下的test文件和etc下的passwd文件拷贝到地址为192.168.153.7主机的app下
[root@localhost ~]# scp root@172.18.251.25:/app/* /app 拷贝地址为192.168.153.6主机app下的所有文件到当前主机的app下
- 常用选项:
-C: 压缩数据流
-r: 递归复制
-p: 保持原文件的属性信息
-q: 静默模式
-P PORT: 指明remote host的监听的端口
2、rsync命令(基于ssh和rsh服务实现高效率的远程系统之间复制文件保证两个目录下文件实时同步 )
- 使用安全的shell连接做为传输方式
[root@localhost ~]# rsync –av /etc 172.18.251.25:/tmp 复制目录和目录下文件 [root@localhost ~]# rsync –av /etc/ 172.18.251.25:/tmp 只复制目录下文件
- 特点: 比scp更快,只复制不同的文件 ,默认不显示复制过程
- 选项:
-n 模拟复制过程
-v 显示详细过程
-r 递归复制目录树
-p 保留权限
-t 保留时间戳
-g 保留组信息
-o 保留所有者信息
-l 将软链接文件本身进行复制(默认)
-L 将软链接文件指向的文件复制
-a 存档,相当于–rlptgoD,但不保留ACL(-A)和SELinux属性(-X)
3、sftp命令( 交互式文件传输工具)
• 用法和传统的ftp工具相似
• 利用ssh服务实现安全的文件上传和下载
• 使用ls cd mkdir rmdir pwd get put等指令,可用?或help获取帮助信息
[root@localhost ~]#sftp root@172.18.251.25
Connected to 172.18.251.25.
sftp> ls
2018-07-11 Desktop
Documents Downloads
Music Pictures
Public Templates
Videos access_log
anaconda-ks.cfg backup
bin centos6x.key
dropbear-2016.74.tar.bz2 etc2018-08-02
f1.txt f2.awk
fangkuai.sh fun.awk
install.log install.log.syslog
linux-4.15.13.tar.xz ll
mydata testdir
time.txt time1.txt
sftp> get fun.awk
Fetching /root/fun.awk to fun.awk
/root/fun.awk 100% 93 2.7KB/s 00:00
sftp> exit 基于ssh服务的登录登录目标主机获取密码
4、pssh命令(默认没有安装,需要通过epel源安装)
[root@localhost ~]#yum -y install pssh
- -H 使用密钥验证登录
[root@localhost ~]#pssh -H 172.18.251.25 -H 172.18.250.42 -i hostname 默认通过密钥验证(需要先把密钥收下来手动敲yes)
[1] 10:34:31 [SUCCESS] 172.18.251.25
localhost.localdomain
[2] 10:34:31 [SUCCESS] 172.18.250.42
centos6
- -A 使用密码验证
[root@localhost ~]#pssh -A -H 172.18.251.25 -A -H 172.18.250.42 -i hostname
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password:
[1] 10:46:51 [SUCCESS] 172.18.251.25
localhost.localdomain
[2] 10:46:51 [SUCCESS] 172.18.250.42
centos6
- -h 加文件名
当默认管理的ip地址较多时可以将ip地址写入地址文件/root/ip.txt
172.18.250.42
172.18.254.218
172.18.250.43
172.18.251.25
[root@localhost ~]#pssh -h ip.txt -i 'hostname'
[root@localhost app]#pssh -h /root/ip.txt -o /app/f1 -i "hostname" 生成app下的一个目录
[1] 10:59:29 [SUCCESS] 172.18.251.25
localhost.localdomain
[2] 10:59:29 [SUCCESS] 172.18.250.42
centos6
[root@localhost app]#cat f1
cat: f1: Is a directory
[root@localhost app]#cd f1
[root@localhost f1]#ls
172.18.250.42 172.18.251.25
- 将远程主机的文件拷贝至本地
[root@localhost app]#pslurp -h ip.txt -L /app /etc/passwd .
- 在远程主机执行脚本,则需先将脚本传到远程主机
[root@localhost app]# pscp.pssh -h ip.txt /root/jiaoben.sh /app/
[root@localhost app]# pssh -h ip.txt -i '/app/jiaoben.sh'
- 把多个目标的selinux设置为开机默认关闭
[root@localhost ~]#pssh -h ip.txt -i "sed -ri 's/(^SELINUX=).*/\1disabled/' /etc/selinux/config"
三、ssh端口转发
1、基于telnet的本地端口转发
c7:client c6:踏板机 c5:server(c5安装telnet-sever,c6和c7安装telnet)
在centos5的主机上将防火墙给关掉,然后设置允许centos6的机器访问,不允许别的机子访问
[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -A INPUT -s 172.18.251.25 -p tcp --dport 23 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p tcp --dport 23 -j REJECT
在centos7开启本地端口转发 -L 启动本地端口转发 -N 不启用shell -f 后台
[root@localhost ~]#ssh -L 9527:172.18.253.195:23 -Nf 172.18.251.25
然后查看本地端口转发是否开启
[root@localhost ~]#ss -ntl|grep 9527
LISTEN 0 128 127.0.0.1:9527 *:*
LISTEN 0 128 ::1:9527 :::*
连接目标主机
[root@localhost ~]#telnet 127.0.0.1 9527
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
Red Hat Enterprise Linux Server release 5.4 (Tikanga)
Kernel 2.6.18-164.el5 on an i686
login: liu
Password:
Login incorrect
login: liu
Password:
Last login: Tue Sep 4 17:33:42 from 172.18.251.25
2、基于smtp的远程端口转发
c5:client c6:跳板机 c7:server
在centos7:在目标主机上配置smtp服务
[root@localhost ~]#vim /etc/postfix/main.cf
inet_interfaces=all
[root@localhost ~]#systemctl restart postfix
在centos6:[root@centos6(nanyibo) ~]# ssh -R 9527:172.18.250.243:25 -fN 172.18.253.195
查看centos5上的监听端口是否已开
[root@localhost ~]# ss -ntl |grep 9527
0 0 127.0.0.1:9527 *:*
0 0 ::1:9527 :::*
在centos5上连接目标主机
[root@localhost ~]# telnet 127.0.0.1 9527
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 localhost.localdomain ESMTP Postfix
mail from:mage@magedu.com
250 2.1.0 Ok
rcpt to:root@centos7.magedu.com
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
hello centos7
.
250 2.0.0 Ok: queued as 31E7219670B
quit
221 2.0.0 Bye
Connection closed by foreign host.
3、动态代理端口
动态代理,在centos7上部署http服务,在centos7上写防火墙,禁止物理机172.18.250.203访问centos7上的web服务,但centos6可以访问。目标利用ssh -D 建立通道,再利用sock5 代理访问
禁止物理机本机访问
[root@localhost ~]#iptables –A INPUT –s 172.18.250.203 –p tcp –dport 80 –j REJECT
禁止centos5访问7的地址
[root@localhost ~]#iptables –A INPUT –s 172.18.253.195 –p tcp –dport 80 –j REJECT
[root@localhost ~]#ssh –fND 1080 root@172.18.251.25
[root@localhost ~]#curl --socks5 127.0.0.1:1080 http://www.google.com
centos6可以直接访问
自此,我们就觉得ssh服务是一个比较厉害的服务,支持的命令也比较多,所以我们应该学习好相关命令,检查日志做好日常分析,再结合防火墙相关的命令防止恶意攻击。