SSH远程管理服务
1.1 SSH服务介绍说明
Secure shell protocol——安全的shell协议
SSH:先对要传输的数据包进行加密处理,然后在进行数据传输,确保了数据的安全
telnet:用于远程连接控制,但不对数据传输进行加密
1.1.1 SSH服务主要提供的两个功能:
1. 远程连接
2. 远程文件传输:如sftp
1.1.2 SSH连接排错思路
1. ping 172.16.1.41
traceroute 172.16.1.1.41 #路由追踪
2.关闭防火墙和SElinux
临时关闭:service iptables stop setenforce 0
永久关闭:chkconfig iptables off
sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/sysconfig/selinux
3.测试SSH服务是否开启:
1. nmap 172.16.1.41 -p 22
2. telnet 172.16.1.41 22 #标准退出方式telnet连接,按ctrl+],输入quit
3. lsof -i:22
4. nc 172.16.1.41:22
5. ss 172.16.1.41 22
PS:1. 不要用iptables -nL检查iptables状态,因检查完会默认开启
2. /etc/services #存放服务与其对应的端口号,只有在这里存放的服务才能被启动
否则,就算启动了,端口号也不在监听状态(相当于没启动)
1.2 远程管理服务说明
1.2.1 telnet远程管理
1. 安装telnet软件服务
yum install -y telnet telnet-server
2. 配置telnet服务可以被xinetd服务管理
vim /etc/xinetd.d/telnet
disable = no
3. 启动xinetd服务
/etc/init.d/xinetd start
netstat -lnptu |grep 23 #检查服务是否开启,这时候服务名不叫telnet了,叫xineted
1.2.2 使用wireshark抓包来实现SSH远程协议进行数据的加密,telnet远程协议未对数据包加密
1. 分析telnet包的数据是明文传输的
1).windows中安装wireshark,选择vmnet 8 网卡
2).抓取telnet包,分析数据不是加密的
3)根据协议过滤出tenet包
4)确认源和目的地址,选择一个telnet包,右击选择追踪流
2. 使用wireshark抓取三次握手和四次挥手包
1)用ssh从本地shell登录进去,exit退出登录
2) 过滤tcp包,进行分析,步骤同上类似
三次握手:
四次挥手:
1.2.3 . linux中使用命令方式抓包
tcpdump -i eth0 -nn -c 5 "port 22" -w /tmp/data.pkg
PS:-i #指定抓取哪一个网卡上产生的数据包流量
-nn #根据端口号转换为服务名
-c #指定抓包数量
"port 22" #抓取指定端口号的数据包
-w #将抓取的数据包内容保存到指定文件中,便于发给其他人
-r #对保存的数据包文件进行读取(否则不能读取)
1.2.4 SSH要点总结
1.3 linux系统中主要的两个数据加密软件(openssh、openssl)
1.3.1 openssh
服务端:
/etc/rc.d/init.d/sshd --- ssh服务端启动脚本命令
/etc/ssh/sshd_config --- ssh服务端配置文件
/usr/sbin/sshd --- 启动ssh服务进程命令
客户端:
/etc/ssh/ssh_config --- ssh客户端配置文件
/usr/bin/.ssh.hmac --- ssh服务的算法文件
/usr/bin/scp --- 基于ssh协议,实现远程拷贝数据命令
/usr/bin/sftp --- 基于ssh协议,实现数据传输命令
/usr/bin/slogin --- 远程登录主机连接命令
/usr/bin/ssh --- 远程登录主机连接命令
/usr/bin/ssh-add --- 此参数必须和ssh-agent命令结合使用,将私钥信息注册到 代理服务中
/usr/bin/ssh-agent --- 启动ssh认证代理服务命令
/usr/bin/ssh-copy-id --- 远程分发公钥命令
/usr/bin/ssh-keyscan --- 显示本地主机上默认的ssh公钥信息
1.3.2 openssl:(https)这个暂时不做解释
1.4 SSH协议实现加密技术的原理
1. 利用了公钥和私钥的认证机制,实现对数据的加密和解密
公钥:在网络中传输
私钥:保存在本地
2. 使用ssh-keyscan可根据IP查看对应主机的公钥
[root@web01 ~]# ssh-keyscan -t dsa 172.16.1.7
172.16.1.7 SSH-2.0-OpenSSH_5.3
172.16.1.7 ssh-dss AAAAB3NzaC1kc3MAAACBAP+E6feKhADKLR5/D/dh4BTn3I8l88wJhITxzNn/XwK88BvWhBPu5sceD9C7JPC47PpDyvG99kL48RaxdiKiaiMvNfoATwutVAUlyx8k/UYRDiQRxAlOnKPj0PFVzDutr6EJad+FNSS0X+av3lHvdJwHHAbo0BpQdGNtmTSgnuORAAAAFQD1ORmJdB+3B75ICTkpLYUKiK7clwAAAIEA1eqSq7QiLrvU9y07I0xrW9uIiFme8+Trgzd7dXJ5aGyRGUB/wJrqjmudtANRoAsmL/gT65oZw2I1AP0KbBqjlqU97Zzbfz7brkeEDdXgZ1yTW1u2vMtKlearlgIoUp0a5DZKZn6+/A5AQG6NvY7Xnu0FhNMirkMWBqZ32n/69WwAAACBAMQiVKjk5KvRGcGzIqErubzOKFj1zlWlgBPot/HoTCdFGfkodaHdqP5JkqEOmrSBtJwNUEPjXOr+fNKL0/qL4FxChbXi4UAe9MixNhXTK7KyU7RsaXPb27d7Kw+34GAyw+VWQAr3DP/6j6S0xGtgv0anHvKzYwq4ZWanVs7xAha5
PS:-t :指定加密类型(默认为rsa)
3. 私钥和公钥的存储位置
[root@backup ~]# ls /etc/ssh
moduli ssh_host_dsa_key ssh_host_rsa_key
ssh_config ssh_host_dsa_key.pub ssh_host_rsa_key.pub
sshd_config ssh_host_key
sshd_config.bak ssh_host_key.pub
PS:1.ssh_host_key就是私钥(里面都是乱码)
2.后面带.pub的文件就是公钥(如:ssh_hosts_pub)
4. 分析执行ssh 10.0.0.31时,下图的含义
客户机执行ssh 10.0.0.31连接服务端时,服务端询问客户端是否要连接我,客户端确认连接后,需要输入服务端的密码,服务端确认正确后,连接连接。
1.4.1 SSH V1和V2版本的区别
1. V1版本钥匙和锁头默认不会变化,数据传输不安全
2. V2版本钥匙和锁头会经常变化,数据传输更安全
1.4.2 SSH服务认证类型
1. 基于密码的认证
2. 基于秘钥的认证、安全 (实现免密码管理)(重点)
1.4.3 基于秘钥管理的认证全过程:(实现免密码管理)
①. 在管理端创建出秘钥对(创建两个信物)
②. 管理端将公钥(锁头)传输给被管理端,锁头传输给被管理端要基于密码方式认证
③. 管理端向被管理端发出建立连接请求
④. 被管理端发出公钥质询
⑤. 管理端利用私钥解密公钥,进行公钥质询响应
⑥. 被管理端接收到质询响应,确认基于秘钥认证成功
下图:客户端为管理端,服务端为被管理端
1.4.4 基于秘钥认证部署过程(免密码方式登录的过程)
1. 客户端上创建秘钥对
1) [root@nfs01 ~]# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): ---确认私钥保存路径(默认路径)
Enter passphrase (empty for no passphrase): ---确认私钥文件是否设置密码(设 置为空)
Enter same passphrase again: ---确认私钥文件是否设置密码 (设置 为空)
Your identification has been saved in /root/.ssh/id_rsa. ——私钥保存位置
Your public key has been saved in /root/.ssh/id_rsa.pub. ——公钥保存位置
The key fingerprint is:
fc:7d:bd:64:62:d1:95:03:ca:c2:7f:71:d0:70:7e:1c root@backup
The key's randomart image is:
+--[ RSA 2048]----+
| oE|
| . ..|
2) 创建完后,会在当前用户的宿主目录.ssh/下生成一个公钥与私钥
[root@nfs01 ~]# ls .ssh/
id_rsa id_rsa.pub known_hosts
2. 分发公钥给服务端主机
1)[root@nfs01 ~]# ssh-copy-id -i .ssh/id_rsa.pub root@172.16.1.31
root@172.16.1.31's password: ——需要服务端密码验证
Now try logging into the machine, with "ssh 'root@172.16.1.31'", and check in:
.ssh/authorized_keys
to make sure we haven't added extra keys that you weren't expecting.
PS:1. -i #指定要进行分发的公钥文件
2. root表示客户端以什么样的身份登录到服务端
补充:
PS: 如果ssh端口不是22了,那么需要在公钥文件后面加参数:-p 666
如:ssh-copy-id -i /root/.ssh/id_rsa.pub -p 666 root@172.16.1.31
2)在服务端查看宿主目录.ssh/下,发现多了authorized_keys这个公钥文件
[root@nfs01 ~]# ls .ssh/
authorized_keys known_hosts
3. 利用基于秘钥方式登录
[root@backup ~]# ssh 172.16.1.31 ——直接可以登录,不需要密码了
Last login: Mon Jan 29 16:31:35 2018 from 172.16.1.41
Either to be the first or to be the best one !
1.4.5 如何实现多台主机之间彼此相互访问,都是基于秘钥的
首先:管理服务器将公钥分别发布给web1、web2
1.创建秘钥对 ssh-keygen -t rsa
2.将公钥发布到web1 ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.1.31
3.将公钥发布到web2 ssh-copy-id -i /root/.ssh/id_rsa.pub root@172.16.1.7
第一步:启动认证代理服务
[root@backup ~]# eval `ssh-agent -s`
Agent pid 2278
PS:eval这个命令,相当于执行俩次bash
第二步:向agent代理服务器注册本地服务器私钥信息
[root@backup ~]# ssh-add
Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)
第三步:将注册凭证信息通过远程登录方式给被管理主机
[root@backup ~]# ssh -A 172.16.1.31
Last login: Mon Jan 29 16:35:28 2018 from 172.16.1.41
Either to be the first or to be the best one !
PS:1.注册凭证不是私钥信息
2.被管理主机接受到后,会产生凭证信息/tmp/ssh-xxx/agent.12334
1.5 企业面试题:
1.5.1 如果给你一个进程名(如:ssh),如何查看对应的端口是什么?
netstat -lnptu |grep sshd
ss -lnptu |grep sshd
1.5.2 取出sshd端口号22
[root@web01 ~]# netstat -lnptu |awk -F "[ :]+" '$4~/^22/{print $4}'
[root@web01 ~]# netstat -lnptu |awk -F "[ :]+" '!/:::/&& /sshd/{print $5}'
[root@web01 ~]# netstat -lnptu |awk -F "[ :]+" '$5~/22/{print $5}'
1.5.3 给你一个端口,如何命令行查出对应的服务是什么?
nmap -p 22 172.16.1.41
netstat -lnptu |grep 22
ss -lnptu |grep 22
lsof -i:22
nc 172.16.1.41 22
1.6 SSH配置文件一些重要参数说明
vim /etc/ssh/sshd_config
13 (行号)#Port 22 --- 表示修改默认端口号信息
15 (行号)#ListenAddress 172.16.1.41 --- 指定监听本地主机网卡地址信息
UseDNS no --- 默认此参数配置信息为yes,要对访问过来主机信 息做dns反向解析
GSSAPIAuthentication no --- 默认此参数配置信息为yes,不对连接进行GSSAPI 认证
permitRootLogin no --- 禁止root登录,默认为yes允许
permitEmptyPasswords no --- 禁止空密码登录
PasswordAuthentication yes --- 密码验证登录
扩展说明:sshd服务主要的两个进程
/usr/sbin/sshd --- 此进程对客户端第一次连接ssh服务端有影响
sshd: root@pts/0 --- 一旦ssh连接成功,是否可以始终保持连接由此进程决定
1.7 SSH***案例说明
1.7.1 如何防止SSH登录***小结
1)用秘钥登录,不用密码登录
2)牤牛阵法,解决SSH安全问题
a. 防火墙关闭SSH,指定源IP限制(局域网,信任公网)
b.(负载均衡服务器)开启SSH只监听内网IP
3)尽量不给服务器外网IP
4)最小化(软件安装授权)
5)给系统重要文件或命令做指纹
6)给重要配置文件加锁chattr -i / -a
最后补充一点:多台服务器之间如何相互免秘钥登录?
最好理解也是最笨的方法:每个服务器都创建密钥对,把公钥分别发给每个服务器,这样每个服务器之间除了第一次要密码,以后就不会要了
小伙伴们可以关注我的微信公众号:linux运维菜鸟之旅
关注“中国电信天津网厅”公众号,首次绑定可免费领2G流量,为你的学习提供流量!
转载于:https://blog.51cto.com/13055758/2066539