1 概述

使用SSH连接服务器是一件很平常的事,但是,连接是否足够安全是一个令人担忧的问题。本文从如下几个方面介绍了如何建立一个足够安全的SSH连接:

  • 端口
  • 协议
  • 用户
  • 密码
  • 密钥对
  • ssh-agent

2 端口

第一步就是修改默认端口22,修改/etc/ssh/sshd_config中的Port即可,比如这里修改为1234端口:

Port 1234

注意这里需要配合SELinu添加端口,否则不能启动sshd服务,在CentOS8中可以通过semanage添加端口,首先查看是否安装policycoreutils-python-utils

rpm -qa | grep policycoreutils-python-utils

如果没有安装就使用yum安装:

sudo yum install policycoreutils-python-utils

接着添加ssh端口:

sudo semanage port -m -t ssh_port_t -p tcp 1234

查看是否添加成功:

sudo semanage port -l | grep ssh

3 SSH协议

SSH2协议要比SSH1安全,因此建议使用,同样修改配置文件:

Protocol 2 # 如果没有就末尾添加

注意服务器添加Protocol 2后,客户端也需要在/etc/ssh/sshd_config中添加Protocol 2

4 超时断开

修改为60s未操作自动断开:

ClientAliveInterval 60
# 以秒为单位,超过60s未操作自动断开 ClientAliveCountMax 0
# 如果客户端没有响应则判断一次超时,该参数设置允许超时的次数

5 限制用户

5.1 禁用Root用户登录

PermitRootLogin no

5.2 指定用户登录

AllowUsers testuser

这样只能通过ssh testuser@ip连接到该服务器。

另外还可以为用户添加指定ip,比如笔者的本机内网ip192.168.1.7,修改为:

AllowUser testuser@192.168.1.7

这样其他ip就不能登录了。

5.3 禁用特定用户登录

DenyUser testuser

禁止通过testuser登录。

类似的配置还有AllowGroupsDenyGroups

6 密码

6.1 禁用(空)密码登录

PermitEmptyPasswords no
PasswordAuthentication no

6.2 错误次数

MaxAuthTries 6

默认为最多允许3次密码错误(需要除2),修改为2则表示如果密码输入错误一次即自动断开。

7 日志

LogLevel VERBOSE

默认为INFO,修改为VERBOSE可以得到更加详细的信息。

8 密钥对

8.1 生成密钥对

上面已经设置了不能使用密码登录,那么,换句话说需要使用密钥登录,生成密钥并不难:

ssh-keygen -t rsa

只需要指定算法即可,默认为3072位,可选4096位。

但是,相比起传统的RSA,在OpenSSH 6.5中引入了另一种叫Ed25519的更加安全的算法,使用椭圆曲线进行加密。Ed25519相比起RSA的优点有:

  • 体积更小:相比起RSA 3072544个字符,Ed25519只有68个字符
  • 更快:生成速度比RSA快,同时签名速度也比RSA
  • 更安全:签名过程不依赖随机数生成器,不依赖哈希函数的防碰撞特性,没有时间通道攻击的问题

生成方式很简单:

ssh-keygen -a 100 -t ed25519 -f ~/.ssh/ed25519

参数说明如下:

  • -a:指定KDFKey Derivation Function)的轮数
  • -t:指定算法,可选dsaecdsaecdsa-sked25519ed25519-skrsa
  • -f:指定位置

生成之后复制公钥即可:

ssh-copy-id user@ip -i ~/.ssh/ed25519.pub

8.2 私钥密码

比如按上述方式生成密钥对时,会提示输入私钥密码:

这里的密码会在使用私钥连接的时候提示:

8.3 使用不同密钥对

假设您有多台服务器:server1server2server3,则可以为不同服务器使用不同的密钥对,而不是使用同一个密钥对:

ssh-keygen -a 100 -t ed25519 -f ~/.ssh/server1
ssh-keygen -a 100 -t ed25519 -f ~/.ssh/server2
ssh-keygen -a 100 -t ed25519 -f ~/.ssh/server3

接着复制公钥到对应的服务器上:

ssh-copy-id user@server1 -i ~/.ssh/server1.pub
ssh-copy-id user@server2 -i ~/.ssh/server2.pub
ssh-copy-id user@server3 -i ~/.ssh/server3.pub

9 ssh-agent

9.1 这是什么?

ssh-agent是一个程序,可以帮助管理私钥。代理能提供如下用途:

  • 自动选择密钥:使用不同密钥连接到不同主机时,需要手动指定密钥(比如上面的使用不同密钥对的例子中,连接到不同服务器时需要加上-i参数),ssh-agent可以自动选择,不需要手动指定
  • 自动输入私钥密码:如果私钥设置了密钥(比如上面的私钥密码例子),但是又需要频繁地使用私钥进行认证时,ssh-agent可以帮助自动输入私钥的密码

9.2 使用

首先启动:

eval `ssh-agent` # 注意是反引号

接着添加私钥:

# 以上面“使用不同的密钥对”为例
ssh-add ~/.ssh/server1
ssh-add ~/.ssh/server1
ssh-add ~/.ssh/server1

这样连接的时候就不需要手动指定-i参数了。

如果私钥指定了密码,会在ssh-add时进行提示输入:

这样下次使用带密钥的私钥连接时就不需要输入密码了。

10 2FA

Two-Factor Authentication,缩写2FA,意为双重认证双因子认证等等,顾名思义就是进行两步认证的操作,可选的应用有:

  • Google Authenticator
  • Authy
  • Yubico
  • Duo

比如Google Authenticator,安装之后,连接服务器需要进行输入验证码的操作。

具体的话就不演示了,因为笔者需要经常连接,因此这个选项对笔者来说不太实际,想要实现的话具体可以参考这里

11 参考

如何建立一个足够安全的SSH连接?的更多相关文章

  1. 【linux】——FreeBSD 建立 SSH 连接慢的解决方法

    一般在编写 linux 程序的时候,会使用 SecureCRT 或者 xshell 等工具远程登录到 linux 服务器上.最近发现在建立 SSH 连接的时候,非常慢,但是建立连接成功之后可以正常使用 ...

  2. Python建立SSH连接与使用方法

    paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接 安装过程也比较简单,先安装pycrypto后安装paramiko,解压后在命令提示符下 ...

  3. Putty是一个专业的SSH连接客户端

    http://www.putty.ws/PuTTY-LinuxVPS Putty是一个专业的SSH连接客户端,当然可以用来连接Linux操作系统的VPS.下文是Putty连接工具的使用方法与详细教程, ...

  4. RTMPdump(libRTMP) 源代码分析 7: 建立一个流媒体连接 (NetStream部分 2)

    ===================================================== RTMPdump(libRTMP) 源代码分析系列文章: RTMPdump 源代码分析 1: ...

  5. RTMPdump(libRTMP) 源代码分析 6: 建立一个流媒体连接 (NetStream部分 1)

    ===================================================== RTMPdump(libRTMP) 源代码分析系列文章: RTMPdump 源代码分析 1: ...

  6. RTMPdump(libRTMP) 源代码分析 5: 建立一个流媒体连接 (NetConnection部分)

    ===================================================== RTMPdump(libRTMP) 源代码分析系列文章: RTMPdump 源代码分析 1: ...

  7. 【Java编程】建立一个简单的JDBC连接-Drivers, Connection, Statement and PreparedStatement

    本blog提供了一个简单的通过JDBC驱动建立JDBC连接例程.并分别通过Statement和PreparedStatement实现对数据库的查询. 在下一篇blog中将重点比較Statement与P ...

  8. 建立一个可以不停地接收客户端新的连接,但不能处理复杂的业务的C/S网络程序

    在Windows平台上主要有两个版本的Socket Api函数:WinSock 1.1和WinSock 2.2 , 2.2版本默认兼容1.1版本,1.1 winsock.h wsock32.lib w ...

  9. 使用Termux并与ubuntu建立ssh连接

    什么是Termux? Termux是一个Android终端仿真器和Linux环境应用程序,直接工作,无需根目录或设置.一个最小的基本系统被自动安装-额外的软件包可以使用APT软件包管理器来使用.不需要 ...

随机推荐

  1. socket通信框架——boost asio

    boost asio是一个封装了基本socket的跨平台通信框架.它支持异步访问,并支持tcp的自动封闭控制等操作. 一个简单的通信协议可以为: header body body长 数据 通过boos ...

  2. git log的常用命令

    git config --global alias.lg "log --graph --oneline --pretty='%Cred%h%Creset -%C(yellow)%d%Cblu ...

  3. 最佳搭档:利用 SSH 及其配置文件节省你的生命

    本文转载自最佳搭档:利用 SSH 及其配置文件节省你的生命 导语 SSH 协议是事实上的互联网基石之一.在 SSH 协议出现之前(1995 年由 Tatu Ylonen 设计),通过互联网远程登录其他 ...

  4. eclipse中将项目加载到tocat报错:Tomcat version 6.0 only supports J2EE 1.2, 1.3, 1.4, and Java EE 5 Web modules

    第一种解决方法:只需要找到导入项目的配置文件即可,举个栗子:D:\公司\iptv_gx\iptv_gx\.settings\org.eclipse.wst.common.project.facet.c ...

  5. LayUI之弹出层

    1.导入插件 layui使用需要导入layui的js和css: <link rel="stylesheet" href="layui/css/layui.css&q ...

  6. JVisualVM监控JVM-外网服务器

    环境说明: a:阿里云服务器Centos8.2 b:JDK1.8 1:增加JMV运行参数 java -jar 启动时添加一下参数: -Djava.rmi.server.hostname=外网IP地址 ...

  7. MySQL:字段约束与索引

    字段约束 MySQL的字段约束共四种: 约束名 关键字 描述 主键约束 PRIMARY KEY 字段值唯一,且不能为NULL 非空约束 NOT NULL 字段值不能为NULL 唯一约束 UNIQUE ...

  8. 面试题-python 如何读取一个大于 10G 的txt文件?

    前言 用python 读取一个大于10G 的文件,自己电脑只有8G内存,一运行就报内存溢出:MemoryError python 如何用open函数读取大文件呢? 读取大文件 首先可以自己先制作一个大 ...

  9. CSDN博客转MD格式

    基于大神作品修改原文,使用了一下发现有一些小问题,爬取的博客标题如果含有字符是Windows不支持的命名格式,会卡在界面,进行了一下优化,加了一些字符过滤处理,但是tomd模块对html的处理还是不是 ...

  10. JAVA-标识符、变量、数据类型

    标识符和关键字 ​ 所有的标识符否应该以字母a ~ z和 A ~Z ,美元符($).下划线(_)开始. ​ 首字符之后可以是字母a ~ z和 A ~Z ,美元符($).下划线(_)的任意字符组合. 注 ...