首页 > 其他分享 >SSH协议实际应用

SSH协议实际应用

时间:2024-05-04 23:12:39浏览次数:24  
标签:协议 公钥 应用 rsa SSH key root id ssh

SSH

SSH公钥传输是SSH协议中用于安全通信的一种身份验证方式。它基于非对称加密算法,使用公钥和私钥进行身份验证和加密通信。以下是SSH公钥传输的原理:

  1. 生成密钥对:用户首先需要生成一对公钥和私钥。公钥用于加密数据并验证签名,私钥用于解密数据和生成签名。通常公钥被保存在远程服务器上,而私钥则由用户保存在本地。

  2. 传输公钥:当用户希望通过SSH连接到远程服务器时,他们需要将自己的公钥传输到服务器上。

  3. 身份验证:当用户尝试连接到服务器时,服务器会发送一个随机字符串给客户端,客户端使用私钥对该字符串进行签名。服务器使用保存的公钥来验证签名是否匹配。如果匹配,用户将被授权连接到服务器。

  4. 加密通信:一旦身份验证成功,SSH连接将使用公钥加密算法进行加密通信。这意味着所有传输的数据都会使用公钥加密,只有对应的私钥才能解密数据。

通过使用SSH的公钥传输,用户可以实现安全的远程连接和通信,同时免去了传统密码传输的安全隐患。公钥传输利用了非对称加密的特性,确保了身份验证和数据传输的安全性。

什么是SSH服务器?

SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程 复制等功能。SSH 协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令,SSH 为建立在应用层和传输层基础上的安全协议。对数据进行压缩,加快传输速度。

优点:

  • 数据传输是加密的,可以防止信息泄漏
  • 数据传输是压缩的,可以提高传输速度

ssh配置文件ssh:可以远程连接 scp sftp rsync:远程传输文件

ssh服务端主要包括两个服务功能 ssh远程链接和sftp服务(文件传输功能)

ssh配置文件

服务名称:sshd
服务端主程序:/usr/sbin/sshd  
服务端配置文件:/etc/ssh/sshd_config ----为服务器端配置文件,设置与服务端相关的应用可通过此文件实现
客户端配置文件:/etc/ssh/ssh_config ----为客户端配置文件,设置与客户端相关的应用可通过此文件实现

[root@rule ~]# cd /etc/ssh/
[root@rule ssh]# ls
moduli      sshd_config         ssh_host_ecdsa_key.pub  ssh_host_ed25519_key.pub  ssh_host_rsa_key.pub
ssh_config  ssh_host_ecdsa_key  ssh_host_ed25519_key    ssh_host_rsa_key

#ecdsa  代表加密算法    pub代表公钥(ssh_host_ecdsa_key.pub和ssh_host_ecdsa_key为一组公私钥、ssh_host_ed25519_key.pub和ssh_host_ed25519_key为一组公私钥、ssh_host_rsa_key.pub和ssh_host_rsa_key为一组公私钥)

ssh服务优化方式

  1. 建议使用非默认端口 22
  2. 禁止使用protocol version 1
  3. 限制可登录用户 白名单
  4. 设定空闲会话超时时长
  5. 利用防火墙设置ssh访问策略
  6. 仅监听特定的IP地址 公网 内网
  7. 基于口令认证时,使用强密码策略,比如:tr -dc A-Za-z0-9_ < /dev/urandom | head -c 12| xargs
  8. 使用基于密钥的认证
  9. 禁止使用空密码
  10. 禁止root用户直接登录
  11. 限制ssh的访问频度和并发在线数
  12. 经常分析日志 分离

基于秘钥登录

  1. 首先在客户端生成一对密钥(ssh-keygen)

  2. 并将客户端的公钥ssh-copy-id 拷贝到服务端

  3. 当客户端再次发送一个连接请求,包括ip、用户名

  4. 服务端得到客户端的请求后,会到authorized_keys()中查找,如果有响应的IP和用户,就会随机生成一个字符串,例如:kgc

  5. 服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端

  6. 得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端

  7. 服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录

#一、生成秘钥
[root@saber ~]# ssh-keygen 
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):  ----选择秘钥加密方式
/root/.ssh/id_rsa already exists.
Overwrite (y/n)? y
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:
SHA256:VMzaBTR1+Nq2upXEAN6owOzRTrPMbw5NUPXv/rEsUzc root@saber
The key's randomart image is:
+---[RSA 2048]----+
|         +B+o..  |
|     o . +o=oo   |
|      = *oo.o..  |
|     . O.=.  o.. |
|      . S .  oo .|
|         +  ..oE.|
|        . +  .+o+|
|         +   +o.o|
|          . oooo+|
+----[SHA256]-----+

#二、传输公钥给对应主机(秘钥默认为~/.ssh/下id_rsa私钥  id_rsa.pub公钥)
[root@saber .ssh]# ssh-copy-id -i 172.16.87.20
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
[email protected]'s password:  ----输入对面密码

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '172.16.87.20'"
and check to make sure that only the key(s) you wanted were added.

[root@saber .ssh]# ssh 172.16.87.20
Last login: Sat May  4 21:51:45 2024 from 172.16.87.1
[root@acher ~]# ls .ssh/
id_rsa  id_rsa.pub  known_hosts





#免密登录脚本


#!/bin/bash
PASS=123123
#设置网段最后的地址,4-255之间,越小扫描越快
END=254

IP=`ip a s ens33 | awk -F'[ /]+' 'NR==3{print $3}'`
NET=${IP%.*}.

rm -f /root/.ssh/id_rsa
[ -e ./SCANIP.log ] && rm -f SCANIP.log
for((i=3;i<="$END";i++));do
ping -c 1 -w 1  ${NET}$i &> /dev/null  && echo "${NET}$i" >> SCANIP.log &
done
wait

ssh-keygen -P "" -f /root/.ssh/id_rsa
rpm -q sshpass || yum -y install sshpass
sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no $IP

AliveIP=(`cat SCANIP.log`)
for n in ${AliveIP[*]};do
sshpass -p $PASS scp -o StrictHostKeyChecking=no -r /root/.ssh root@${n}:
done

标签:协议,公钥,应用,rsa,SSH,key,root,id,ssh
From: https://www.cnblogs.com/GrandOB/p/18172935

相关文章

  • 开发Android应用程序,在Android10的系统上提示网络出错?
    今天维护以前开发的一个Android客户端程序,发版后,有用户说自己手机安装,无法登录,首屏打开后(有网络通过接口加载服务器数据并显示的行为),提示网络出错。但是我在我自己手上的PDA设备(Android4.4)正常,然后又去找了一台Android设备,是Android8.0的,也正常。初步怀疑是高版本没兼容的问题......
  • 微机的应用领域
    在科学计算方面,微机可是个得力助手。无论是复杂的数学运算,还是物理、化学等学科的模拟实验,微机都能轻松应对。在数据处理方面,微机也发挥着重要作用。无论是企业的财务管理,还是政府的数据统计,都离不开微机的支持。微机在过程控制方面也有着广泛的应用。比如,在工业生产中,微机可以......
  • HTTP协议
    一、HTTP协议定义HTTP是HyperTextTransferProtocol(超文本传输协议)的缩写。它的发展是万维网协会(WorldWideWebConsortium)和Internet工作小组IETF(InternetEngineeringTaskForce)合作的结果,(他们)最终发布了一系列的RFC。http是应用层协议。HTTP协议永远都是客户端发起请求,服......
  • redis缓存和业务应用了解
    转自:https://tech.meituan.com/2017/03/17/cache-about.html1.介绍在主页中显示最新的项目列表:Redis使用的是常驻内存的缓存,速度非常快。LPUSH用来插入一个内容ID,作为关键字存储在列表头部。LTRIM用来限制列表中的项目数最多为5000。如果用户需要的检索的数据量超越这个缓存容......
  • Python深入理解*和**含义和应用
    本文源代码:https://gitee.com/obullxl/PythonCS/tree/master/CS-CY2405Python中*和**很常见禅师在阅读Python代码过程中,经常看到一个函数或方法的入参是*args和**kwargs(如:deffunc(*args,**kwargs)等)形式,或者在调用函数或方法时,在入参的元组和列表前面增加1个*号(如:func(*(1,2,......
  • QT使用Http协议通信的实现示例
    转载自:https://www.jb51.net/program/3074287bh.htm 使用QT进行应用开发时,有时候需要进行客户端和服务端的网络通信,本文主要介绍了QT使用Http协议通信的实现示例,具有一定的参考价值,感兴趣的可以了解一下 −目录介绍1.多个独立参数GET请求2.参数数组GET请求3.上传......
  • 【Netty】【XXL-JOB】时间轮的原理以及应用分析
    1 前言今天晚上看了一本70多页的讲解时间轮的PDF,从是什么为什么以及原理到源码中的应用分析,讲的真好。这节我就按我理解的思路捋一下,记录一下哈。2 时间轮概述2.1 时间轮是什么时间轮是一种高效利用线程资源进行批量化调度的一种调度模型。把大批量的调度任务全部绑......
  • raft算法和etcd代码解析-5.应用模块的启动
    Node接口Node是raft应用模块在节点上的抽象,也是应用模块和算法模块交互的入口应用模块持有Node作为算法模块的引用,通过调用Node接口的API与算法模块通信,通信方式是通过若干个Channel异步完成的。//Noderepresentsanodeinaraftcluster.typeNodeinterface{ //告知......
  • 单个应用失败代码存档
    python版本fromflaskimportFlask,render_template,request,jsonifyimportrequestsimportbase64importosfromPILimportImageimportioimportlogging#ConfigureFlaskapplicationapp=Flask(__name__,template_folder='../web')app.config......
  • c#胖东来小程序自动购物程序(接单,windows桌面程序、linux程序、网络应用等等)
    一、程序效果自动打开胖东来小程序,自动购物 二、实现先截屏,然后利用opencv库识别下一步按键所在位置,然后使用mouse_event控制鼠标,模拟人的动作第一步,截取屏幕staticBitmapCaptureScreen(){intscreenWidth=Screen.PrimaryScreen.Bounds.Width;intscreenHe......