SSH安全外壳协议

SSH是什么?

Secure Shell(缩写为SSH),由IETF的网络工作小组(Network Working Group)所制定;SSH为一项创建在应用层和传输层基础上的安全协议,为计算机上的Shell(壳层)提供安全的传输和使用环境。
传统的网络服务程序,如rsh、FTP、POP和Telnet其本质上都是不安全的;因为它们在网络上用明文传送数据、用户帐号和用户口令,很容易受到中间人(man-in-the-middle)攻击方式的攻击。就是存在另一个人或者一台机器冒充真正的服务器接收用户传给服务器的数据,然后再冒充用户把数据传给真正的服务器。而SSH是目前较可靠,专为远程登录会话和其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题。通过SSH可以对所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。
SSH之另一项优点为其传输的数据可以是经过压缩的,所以可以加快传输的速度。SSH有很多功能,它既可以代替Telnet,又可以为FTP、POP、甚至为PPP提供一个安全的“通道”。
百度百科

命令格式

ssh [选项] 用户@远程登录IP地址
·参数:
-p:指定远程服务器上的端口
-X:可以在远程登录管理时,开启对方的图形程序(firefox,firewall-config)
-T:禁止分配伪终端(不显示终端,只显示连接成功信息)
-o(option) StrictHostKeyChecking=no 表示远程连接时不提示是否输入yes/no
-1:强制使用ssh协议版本1;
-2:强制使用ssh协议版本2;
-4:强制使用IPv4地址;
-6:强制使用IPv6地址;
-A:开启认证代理连接转发功能;
-a:关闭认证代理连接转发功能;
-b:使用本机指定地址作为对应连接的源ip地址;
-C:请求压缩所有数据;
-F:指定ssh指令的配置文件;
-f:后台执行ssh指令;
-g:允许远程主机连接主机的转发端口;
-i:指定身份文件;
-l:指定连接远程服务器登录用户名;
-N:不执行远程指令;
-o:指定配置选项;
-p:指定远程服务器上的端口;
-q:静默模式;
-X:开启X11转发功能;
-x:关闭X11转发功能;
-y:开启信任X11转发功能。
-n:从/dev/null重定向stdin(实际上,防止从stdin读取)。 当ssh在后台运行时,必须使用这个选项。 
常见的技巧是用它在远程机器上运行X11程序。 例如,ssh -n shadows.cs.hut.fi emacs &将开始 shadows上的emacs.cs.hut.fi, X11连接将自动通过加密通道转发。 ssh支持Gram会放在后台。 (如果ssh需要询问口令或密码短语,这将不起作用;另请参见-f)。
可以说这个选项是专门用来解决这个问题的。用/dev/null来当ssh的输入,阻止ssh读取本地的标准输入内容。进一步修改脚本!

ssh登录验证方式

密码验证:客户端通过授权的账号和密码进行远程登录
密钥对验证:服务器核对客户端的私钥是否匹配

主配置文件

[root@localhost ~]# vim /etc/ssh/sshd_config

port 22							监听端口号(默认为22)
port 2222						监听另一个端口号(2222	使用telnet IP 2222可以验证)
ListenAddress 192.168.1.1		监听主机地址
LoginGraceTime 2m				登录会话超时时间,默认2分钟没有输入密码,则自动断开连接 48
PermitRootLogin yes				是否允许root用户登录 49     (默认允许root用户登录)
StrictModes yes     			//严格限定模式(不重要);当远程用户的私钥改变时,则拒绝连接 50
MaxAuthTries 6					最大认证尝试次数,最多可以尝试6次输入密码。之后需要等待某段时间后才能再次输入密码 51
MaxSessions 10                  允许同时连接的最大会话数 52
PubkeyAuthentication yes		是否开启秘钥对验证模式,如果使用秘钥验证的方式登录时,则设置为yes 55
PermitEmptyPasswords no			是否允许空密码用户登录 78
PasswordAuthorization yes		是否开启密码认证模式 79
UsePAM yes						是否启用PAM认证 110
UseDNS yes						是否开启DNS查找
AllowUsers zhz qq				允许访问的用户(自行添加)	#不能使用useadd -p创建用户!必须passwd加密,否则用户验证无效
AllowUsers zhz xx@192.168.1.2	只允许xx用户通过1.2主机登录到本机
AllowUsers zhz qq@192.168.1.0/24 66@192.168.1.*		允许某一个网段的主机通过qq,66用户登录到本机	`如果你使用了AllowUsers选项,那么root用户将会受到限制(也就是无法登录到本地)`
StrictHostKeyChecking			主机公钥确认(非交互方式)
StrictHostKeyChecking=no  最不安全的级别,当然也没有那么多烦人的提示了,相对安全的内网测试时建议使用。如果连接server的key在本地不存在,那么就自动添加到文件中(默认是known_hosts),并且给出一个警告。
StrictHostKeyChecking=ask 默认的级别,就是出现刚才的提示了。如果连接和key不匹配,给出提示,并拒绝登录。
StrictHostKeyChecking=yes 最安全的级别,如果连接与key不匹配,就拒绝连接,不会提示详细信息。

秘钥对验证

SSH证书认证登录的基础是一对唯一匹配密钥:私钥(private key)和公钥(public key)。公钥用于对数据进行加密,而且只能用于加密。而私钥只能对使用所匹配的公钥,所加密过的数据进行解密。私钥需要用户单独妥善保管。SSH客户端使用私钥向服务器证明自已的身份。而公钥是公开的,可以按需将其配置到目标服务器上自己的相应账号中。在进行SSH登录认证时,进行私钥和公钥协商。如果匹配,则身份得以证明,认证成功,允许登录。否则,将会继续使用密码验证等其它方式进行登录校验。SSH证书验证登录配置及登录协商过程,如下图所示。
在这里插入图片描述

1.在客户端使用ls用户生成密钥对

useradd ls
echo 123.com | passwd ls --stdin
[root@localhost ~]# su ls
[ls@localhost root]$ ssh-keygen -t rsa		(默认使用RSA加密方式)
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ls/.ssh/id_rsa): 		# 指定私钥位置
Created directory '/home/ls/.ssh'.
Enter passphrase (empty for no passphrase): 						# 设置私钥短语 
Enter same passphrase again: 										# 确认私钥短语
Your identification has been saved in /home/ls/.ssh/id_rsa.
···

2.将生成的公钥传给ssh服务器

[ls@localhost root]$ cd /home/ls/.ssh/				# 查看生成的.ssh加密文件,并查看其中的文件
[ls@localhost .ssh]$ ls
id_rsa(公钥值)  id_rsa.pub(私钥值)
[ls@localhost .ssh]$ ssh-copy-id -i /home/ls/.ssh/id_rsa zhz@192.168.1.1

3.在ssh服务器上修改配置文件,启用密钥对验证,关闭密码验证

[root@localhost ~]# ls /home/zhz/.ssh/
authorized_keys
[root@localhost ~]# vim /etc/ssh/sshd_config 
55 PubkeyAuthentication yes
79 PasswordAuthentication no
[root@localhost ~]# systemctl restart sshd

4.验证,在客户端上(无需密码即可登录)

[ls@localhost .ssh]$ ssh zhz@192.168.1.1			   # 一定要在拥有密钥文件的用户下才能进行远程登陆
Last login: Tue Jun 15 15:52:32 2021 from 192.168.1.111
[zhz@localhost ~]$ exit
登出
Connection to 192.168.1.1 closed.
[ls@localhost .ssh]$ exit
exit
[root@localhost ~]# ssh root@192.168.1.1			   # 即使是root用户也无法登录
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

解决SSH登录慢问题

修改 /etc/ssh/sshd_config 配置文件
修改如下内容:

79 GSSAPIAuthentication no		# 关闭认证接口
129 UseDNS no					# 关闭DNS解析功能

GSSAPI ( Generic Security Services Application Programming Interface) 是一套类似Kerberos 5 的通用网络安全系统接口。该接口是对各种不同的客户端服务器安全机制的封装,以消除安全接口的不同降低编程难度。但该接口在目标机器无域名解析时会有问题。系统是默认开启的,需要手动关闭。

systemctl restart sshd && systemctl status sshd

解决SSH连接超时断开问题

方法1、修改 /etc/ssh/sshd_config 配置文件

ClientAliveInterval 0	表示服务器端向客户端请求消息的时间间隔,默认是0不发送。
ClientAliveInterval 60	表示每分钟向客户端发送一次,然后客户端响应,这样保持长时间连接的状态,SSH远程连接不断开。
ClientAliveCountMax		表示服务器发出请求后客户端没有响应的次数达到一定值,就自动断开。正常情况下客户端不会不响应。默认即可。
systemctl restart sshd && systemctl status sshd

方法2、修改client端的/etc/ssh/ssh_config:(在没有权限修改server端的SSH配置的情况下)

ServerAliveInterval 60 	client每隔60秒发送一次请求给server,然后server响应,从而保持连接。
ServerAliveCountMax 3 	client发出请求后,服务器端没有响应的次数达到3次,就自动断开连接,正常情况下server不会不响应。

方法3、不修改配置文件,直接在SSH远程连接时命令加参数

即ssh -o ServerAliveinterval=60 root@'远程连接IP地址',这样就只会在当前需要的远程连接中保持持久的连接, 并不是所有的远程连接都需要保持持久连接的!

免密(A -> B A免密登录B)

1、在A上生成公钥私钥。
2、将公钥拷贝给server B,要重命名成authorized_keys(从英文名就知道含义了)
3、Server A向Server B发送一个连接请求。
4、Server B得到Server A的信息后,在authorized_key中查找,如果有相应的用户名和IP,则随机生成一个字符串,并用Server A的公钥加密,发送给Server A。
5、Server A得到Server B发来的消息后,使用私钥进行解密,然后将解密后的字符串发送给Server B。Server B进行和生成的对比,如果一致则允许免登录
6、得到server B发来的消息后,会使用私钥进行解析,然后将机密后的字符串发给server B。
7、接收到机密后的字符串会跟先前生成的字符串进行对比,如果一致就允许免密登陆。
注意这里的root用户,你将A主机的公钥保存在B主机的哪个用户主目录下,那么就只能以这个用户的身份免密登录,此例配置在了root用户的主目录下,实际情况中根据自己的需求选择用户

[root@master ~]# rpm -qf `which ssh-keygen`
openssh-6.6.1p1-31.el7.x86_64
[root@master ~]# ssh-keygen -t rsa
authorized_keys:存放远程免密登录的公钥,主要通过这个文件记录多台机器的公钥
id_rsa 		  生成的私钥文件
id_rsa.pub    生成的公钥文件
know_hosts    已知的主机公钥清单
如果希望ssh公钥生效需满足至少下面两个条件:
1 .ssh目录的权限必须是700
2 .ssh/authorized_keys文件权限必须是600

命令: ssh-copy-id -i ~/.ssh/id_rsa.pub <romte_ip>		如果没有这个命令解决办法:yum -y install openssh-clients
scp -p ~/.ssh/id_rsa.pub root@<remote_ip>:/root/.ssh/authorized_keys

sshd

语法:
sshd (选项)

·常用命令选项
-4:强制使用IPv4地址;
-6:强制使用IPv6地址;
-D:以非后台守护进程方式运行服务器;  	《将 sshd 作为前台进程运行,而不是脱离控制台成为后台守护进程。主要用于调试》
-d:调试模式;
-e:将错误发送到标准错误设备,而不是将其发送到系统日志;
-f:指定服务器的配置文件;
-g:指定客户端登录时的过期时间,如果在此期限内,用户没有正确认证,则服务器断开次客户端的连接;
-h:指定读取主机key文件;
-i:ssh以inetd方式运行;
-o:指定ssh的配置选项;
-p:静默模式,没有任何信息写入日志;
-t:测试模式。

判断全网主机是否在线

#!/bin/bash
# 执行脚本方式为./ 192.168.1
str=$1
date=$(date "+%Y-%m-%d-%H-%M-%S")
mkdir ./log 2>/dev/null

for num in $(seq 2 254)
do
    ip=${str}.${num}
    if ping -c1 -w1 ${ip} &>/dev/null;then
       echo "$ip 1qaz#EDC is online." >>./log/${str}online.log
    elif [ $num -eq 254 ];then
	cat>./log/${str}copy-ip.sh<<\QQ						//在分界符前添加反斜杠\单引号\双引号都可以实现取消转义
#!/bin/bash
# 使用IFS作为分隔符读文件(说明:默认情况下IFS是空格,如果需要使用其它的需要重新赋值)
# IFS=:
sed -i '/StrictHostKeyChecking/s/^#//; /StrictHostKeyChecking/s/ask/no/' /etc/ssh/ssh_config
sed -i "/#UseDNS/ s/^#//; /UseDNS/ s/yes/no/" /etc/ssh/sshd_config
echo -e 'y\n' | ssh-keygen -q -f ~/.ssh/id_rsa -t rsa -N ''

cat ./${str}online.log | while read ip passwd is state; do
  if sshpass -p $passwd ssh-copy-id -f $ip &>>/dev/null ;then
    echo "copy-id to $ip success"
    ssh -n $ip "ifconfig | grep $ip"
    ssh -n $ip "ulimit -n"
  else
    echo "copy-id to  $ip failed"
  fi
  #ssh -nq $ip "echo -e 'y\n' | ssh-keygen -q -f ~/.ssh/id_rsa -t rsa -N ''"
  #scp $ip:/root/.ssh/id_rsa.pub ./$host-id_rsa.pub
  #echo $ip $host >> /etc/hosts
done
QQ
    sed -i "s/'${str}'/${str}/g" ./log/${str}online.log		#此命令不生效的话需要手动改
	chmod +x ./log/${str}copy-ip.sh
    else
         echo "$ip is offline" >>./log/${str}offline.log
    fi
done
online=$(cat ./log/${str}online.log | wc -l)
offline=$(cat ./log/${str}offline.log | wc -l)
echo "当前${str}网段主机在线${online}个,不在线${offline}个"
echo "在线主机为"
cat ./log/${str}online.log | cut -d ' ' -f 1
mkdir -p ./log/${str}-${date}
mv ./log/${str}*  ./log/${str}-${date}/
sh ./log/${str}-${date}/${str}copy-ip.sh

Only open the pattern first, to become the strong!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星光落入你灰蒙蒙的眼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值