草庐IT

SSH远程登录协议

feizirui 2023-03-28 原文

一、SSH服务

1.1SSH基础

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

(2)SSH协议的优点:

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

(3)服务名称:sshd

服务端主程序:/usr/sbin/sshd
服务端配置文件:/etc/ssh/sshd_config
客户端配置文件:/etc/ssh/ssh_config

1.2SSH原理

(1)公钥传输原理

  • 客户端发起链接请求
  • 服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)
  • 客户端生成密钥对
  • 客户端用自己的公钥异或会话ID,计算出一个值Res,并用服务端的公钥加密
  • 客户端发送加密值到服务端,服务端用私钥解密,得到Res
  • 服务端用解密后的值Res异或会话ID,计算出客户端的公钥(这一步服务端得到客户端公钥)
  • 最终:双方各自持有三个秘钥,分别为自己的一对公、私钥,以及对方的公钥,之后的所有通讯都会被加密

(2)ssh远程登录

方法一:
ssh [远程主机用户名]@[远程服务器主机名或IP地址] -p 端口号

方法二:
ssh -l [远程主机用户名] [远程服务器主机名或IP 地址] -p 端口号

-l:-l选项,指定登录名称。
-p:-p选项,指定登录端口(当服务端的端口非默认时,需要使用-p 指定端口进行登录)。

1.3服务端配置

[root@client ~]# vim /etc/ssh/sshd_config        #修改常用配置项
  • Port 22   #生产建议修改
  • ListenAddress ip   #监听地址设置SSHD服务器绑定的IP 地址,0.0.0.0 表示侦听所有地址安全建议:如果主机不需要从公网ssh访问,可以把监听地址改为内网地址 这个值可以写成本地IP地址,也可以写成所有地址,即0.0.0.0 表示所有IP。
  • LoginGraceTime 2m   #用来设定如果用户登录失败,在切断连接前服务器需要等待的时间,单位为秒
  • PermitRootLogin yes   #默认 ubuntu不允许root远程ssh登录
  • StrictModes yes   #检查.ssh/文件的所有者,权限等
  • MaxAuthTries   #用来设置最大失败尝试登陆次数为6
  • MaxSessions 10   #同一个连接最大会话
  • PubkeyAuthentication yes   #基于key验证
  • PermitEmptyPasswords no   #密码验证当然是需要的!所以这里写 yes,也可以设置为 no,在真实的生产服务器上,根据不同安全级别要求,有的是设置不需要密码登陆的,通过认证的秘钥来登陆。
  • PasswordAuthentication yes   #基于用户名和密码连接
  • GatewayPorts no
  • ClientAliveInterval 10   #单位:秒
  • ClientAliveCountMax 3   #默认3
  • UseDNS yes   #提高速度可改为no 内网改为no 禁用反向解析
  • GSSAPIAuthentication yes   #提高速度可改为no
  • MaxStartups   #未认证连接最大值,默认值10
  • Banner /path/file   #以下可以限制可登录用户的办法:白名单 黑名单
  • AllowUsers user1 user2 user3@ip(限制主机)
  • DenyUsers user1 user2 user3
  • AllowGroups g1 g2
  • DenyGroups g1 g2

(1)白名单黑名单列表

 (2)输入密码限制

 

1.4SSH客户端

(1)免密登录

[root@server ~]#ssh-keygen
[root@server ~]#ssh-copy-id -i .ssh/id_rsa.pub 192.168.10.20
[root@server ~]#ssh 192.168.10.20

(2)隐藏端口号,并且不让用户使用su命令切换root用户

[root@server ~]#vim /etc/ssh/sshd_config
#修改以下两行
Port 10086
PermitRootLogin no
[root@server ~]#systemctl restart sshd

[root@server ~]#vim /etc/pam.d/su
打开第6行

客户端测试:
[root@client ~]#ssh zhangzijun@192.168.10.10 -p 10086

 

二、TCP Wrappers

在Linux 系统中,许多网络服务针对客户端提供了访问控制机制,如 Samba、BIND、 HTTPD、OpenSSH 等。本节将介绍另一种防护机制——TCP Wrappers(TCP 封套),以作为应用服务与网络之间的一道特殊防线,提供额外的安全保障。TCP Wrappers 将 TCP 服务程序“包裹”起来,代为监听 TCP 服务程序的端口,增加了 一个安全检测过程,外来的连接请求必须先通过这层安全检测,获得许可后才能访问真正 的服务程序。TCP Wrappers 还可以记录所有企图访问被保护服务的行为, 为管理员提供丰富的安全分析资料。

2.1策略的配置格式

两个策略文件的作用相反,但配置记录的格式相同,如下所示
服务程序列表、客户端地址列表之间以冒号分隔,在每个列表内的多个项之间以逗号分隔
(1)服务程序列表可分为以下几类。

  • ALL:代表所有的服务
  • 单个服务程序:如“vsftpd“
  • 多个服务程序组成的列表:如“vsftpd,sshd”

(2)客户端地址列表可分为以下几类。

  • ALL:代表任何客户端地址。
  • LOCAL:代表本机地址。
  • 单个 IP 地址:如“192.168.10.10”
  • 网络段地址:如“192.168.10.0/255.255.255.0”
  • 以“.”开始的域名:如“.bdqn.com”匹配 bdqn.com 域中的所有主机。
  • 以“.”结束的网络地址:如“192.168.10.”匹配整个 192.168.10.0/24 网段
  • 嵌入通配符“*”“?”:前者代表任意长度字符,后者仅代表一个字符,如“10.0.8.2*”
  • 匹配以 10.0.8.2 开头的所有 IP 地址。不可与以“**.**”开始或结束的模式混用
  • 多个客户端地址组成的列表:如“192.168.1.,172.16.16.,.bdqn.com”

2.2访问控制的基本格式

注意sshd_config的黑白名单:

有关SSH远程登录协议的更多相关文章

  1. ruby - Capistrano 3 在任务中更改 ssh_options - 2

    我尝试使用不同的ssh_options在同一阶段运行capistranov.3任务。我的production.rb说:set:stage,:productionset:user,'deploy'set:ssh_options,{user:'deploy'}通过此配置,capistrano与用户deploy连接,这对于其余的任务是正确的。但是我需要将它连接到服务器中配置良好的an_other_user以完成一项特定任务。然后我的食谱说:...taskswithoriginaluser...task:my_task_with_an_other_userdoset:user,'an_othe

  2. CAN协议的学习与理解 - 2

    最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总

  3. ruby - 使用 ruby​​ gem net-ssh-multi 同时在多个服务器上执行 sudo 命令 - 2

    在previousquestion中我想出了如何在多个服务器上启动经过密码验证的sshsession来运行单个命令。现在我需要能够执行“sudo”命令。问题是,net-ssh-multi没有分配sudo需要运行的伪终端(pty),导致以下错误:[127.0.0.1:stderr]sudo:sorry,youmusthaveattytorunsudo根据documentation,可以通过调用channel对象的方法来分配伪终端,但是,以下代码不起作用:它会生成上面的“notty”错误:require'net/ssh'require'net/ssh/multi'Net::SSH::Mul

  4. ruby - 使用 Ruby 和 Mechanize 登录网站 - 2

    我需要从站点抓取数据,但它需要我先登录。我一直在使用hpricot成功地抓取其他网站,但我是使用mechanize的新手,我真的对如何使用它感到困惑。我看到这个例子经常被引用:require'rubygems'require'mechanize'a=Mechanize.newa.get('http://rubyforge.org/')do|page|#Clicktheloginlinklogin_page=a.click(page.link_with(:text=>/LogIn/))#Submittheloginformmy_page=login_page.form_with(:act

  5. ruby - HTTP POST 上的 SSL 错误(未知协议(protocol)) - 2

    尝试通过SSL连接到ImgurAPI时出现错误。这是代码和错误:API_URI=URI.parse('https://api.imgur.com')API_PUBLIC_KEY='Client-ID--'ENDPOINTS={:image=>'/3/image',:gallery=>'/3/gallery'}#Public:Uploadanimage##args-Theimagepathfortheimagetoupload#defupload(image_path)http=Net::HTTP.new(API_URI.host)http.use_ssl=truehttp.verify

  6. 物联网MQTT协议详解 - 2

    一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su

  7. 【Linux操作系统】——网络配置与SSH远程 - 2

    Linux操作系统——网络配置与SSH远程安装完VMware与系统后,需要进行网络配置。第一个目标为进行SSH连接,可以从本机到VMware进行文件传送,首先需要进行网络配置。1.下载远程软件首先需要先下载安装一款远程软件:FinalShell或者xhell7FinalShellxhell7FinalShell下载:Windows下载http://www.hostbuf.com/downloads/finalshell_install.exemacOS下载http://www.hostbuf.com/downloads/finalshell_install.pkg2.配置CentOS网络安装好

  8. ruby - Net::SSH sudo 命令在输入密码后挂起 - 2

    我一直在尝试使用Thor编写一个小型库,以帮助我快速创建新项目和站点。我写了这个小方法:defssh(cmd)Net::SSH.start(server_ip,user,:port=>port)do|session|session.execcmdendend只是协助我在需要时在远程服务器上运行快速命令。问题是当我需要在远程端的sudo下运行命令时,脚本似乎卡在我身上。例如当执行这个...ssh("sudocp#{file_from_path}#{file_to_path}")脚本会提示我输入密码[sudo]passwordforuser:但是在输入之后整个事情就挂起。有人会碰巧知道它为

  9. ruby-on-rails - 使用用户或管理员模型和 Basecamp 样式子域设计登录 - 2

    我为Devise用户和管理员提供了不同的模型。我也在使用Basecamp风格的子域。除了我需要能够以用户或管理员身份进行身份验证的一些Controller和操作外,一切都运行良好。目前我有authenticate_user!在我的application_controller.rb中设置,对于那些只有管理员才能访问的Controller和操作,我使用skip_before_filter跳过它。不幸的是,我不能简单地指定每个Controller的身份验证要求,因为我仍然需要一些Controller和操作才能被用户或管理员访问。我尝试了一些方法都无济于事。看来,如果我移动authentica

  10. ruby - 如何使用 omniauth/oauth 对每秒登录数进行基准测试? ( ruby +rspec) - 2

    我想用一个(自己的)omniauth提供商来衡量每秒可以登录多少次。我需要了解此omniauth/oauth请求的性能如何,以及此身份验证是否具有可扩展性?到目前为止我得到了什么:defperformance_auth(user_count=10)bm=Benchmark.realtimedouser_count.timesdo|n|forkdoclick_on'Logout'omniauth_config_mock(:provider=>"foo",:uid=>n,:email=>"foo#{n}@example.net")visit"/account/auth/foo/"enden

随机推荐