如何建立一个足够安全的SSH连接?
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
,比如笔者的本机内网ip
为192.168.1.7
,修改为:
AllowUser testuser@192.168.1.7
这样其他ip
就不能登录了。
5.3 禁用特定用户登录
DenyUser testuser
禁止通过testuser
登录。
类似的配置还有AllowGroups
与DenyGroups
。
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 3072
的544
个字符,Ed25519
只有68
个字符 - 更快:生成速度比
RSA
快,同时签名速度也比RSA
快 - 更安全:签名过程不依赖随机数生成器,不依赖哈希函数的防碰撞特性,没有时间通道攻击的问题
生成方式很简单:
ssh-keygen -a 100 -t ed25519 -f ~/.ssh/ed25519
参数说明如下:
-a
:指定KDF
(Key Derivation Function
)的轮数-t
:指定算法,可选dsa
、ecdsa
、ecdsa-sk
、ed25519
、ed25519-sk
、rsa
-f
:指定位置
生成之后复制公钥即可:
ssh-copy-id user@ip -i ~/.ssh/ed25519.pub
8.2 私钥密码
比如按上述方式生成密钥对时,会提示输入私钥密码:
这里的密码会在使用私钥连接的时候提示:
8.3 使用不同密钥对
假设您有多台服务器:server1
,server2
,server3
,则可以为不同服务器使用不同的密钥对,而不是使用同一个密钥对:
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代理:ssh-agent
- 简书-SSH超时断开(ClientAliveInterval和ClientAliveCountMax )的使用
- 使用两步验证(2FA)保护你的SSH连接
- 10 Steps to Secure Open SSH
- Secure The SSH Server On Ubuntu
- Upgrade Your SSH Key to Ed25519
如何建立一个足够安全的SSH连接?的更多相关文章
- 【linux】——FreeBSD 建立 SSH 连接慢的解决方法
一般在编写 linux 程序的时候,会使用 SecureCRT 或者 xshell 等工具远程登录到 linux 服务器上.最近发现在建立 SSH 连接的时候,非常慢,但是建立连接成功之后可以正常使用 ...
- Python建立SSH连接与使用方法
paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接 安装过程也比较简单,先安装pycrypto后安装paramiko,解压后在命令提示符下 ...
- Putty是一个专业的SSH连接客户端
http://www.putty.ws/PuTTY-LinuxVPS Putty是一个专业的SSH连接客户端,当然可以用来连接Linux操作系统的VPS.下文是Putty连接工具的使用方法与详细教程, ...
- RTMPdump(libRTMP) 源代码分析 7: 建立一个流媒体连接 (NetStream部分 2)
===================================================== RTMPdump(libRTMP) 源代码分析系列文章: RTMPdump 源代码分析 1: ...
- RTMPdump(libRTMP) 源代码分析 6: 建立一个流媒体连接 (NetStream部分 1)
===================================================== RTMPdump(libRTMP) 源代码分析系列文章: RTMPdump 源代码分析 1: ...
- RTMPdump(libRTMP) 源代码分析 5: 建立一个流媒体连接 (NetConnection部分)
===================================================== RTMPdump(libRTMP) 源代码分析系列文章: RTMPdump 源代码分析 1: ...
- 【Java编程】建立一个简单的JDBC连接-Drivers, Connection, Statement and PreparedStatement
本blog提供了一个简单的通过JDBC驱动建立JDBC连接例程.并分别通过Statement和PreparedStatement实现对数据库的查询. 在下一篇blog中将重点比較Statement与P ...
- 建立一个可以不停地接收客户端新的连接,但不能处理复杂的业务的C/S网络程序
在Windows平台上主要有两个版本的Socket Api函数:WinSock 1.1和WinSock 2.2 , 2.2版本默认兼容1.1版本,1.1 winsock.h wsock32.lib w ...
- 使用Termux并与ubuntu建立ssh连接
什么是Termux? Termux是一个Android终端仿真器和Linux环境应用程序,直接工作,无需根目录或设置.一个最小的基本系统被自动安装-额外的软件包可以使用APT软件包管理器来使用.不需要 ...
随机推荐
- Github Action 快速上手指南
前言 各位读者,新年快乐,我是过了年匆忙赶回上海努力搬砖的蛮三刀. Github之前更新了一个Action功能(应该是很久以前了),可以实现很多自动化操作.用来替代用户自己设置的自动化脚本(比如:钩子 ...
- Elasticsearch 及其套件的安装上手
前言 本文主要讲解Elasticsearch及其套件Kibana.Logstash的安装及启动,还讲解如何导入数据用于后续的实验. 说明:Elasticsearch是基于Java开发的,所以如果是下载 ...
- ElasticSearch 聚合分析
公号:码农充电站pro 主页:https://codeshellme.github.io ES 中的聚合分析(Aggregations)是对数据的统计分析功能,它的优点是实时性较高,相比于 Hadoo ...
- Vue学习笔记-Vue.js-2.X 学习(五)===>脚手架Vue-CLI(PyCharm)
Vue项目在pycharm中配置 退出运行: ctrl+c Vue学习笔记-Vue.js-2.X 学习(六)===>脚手架Vue-CLI(项目说明)
- pdf转换成文本解决格式不统一问题
pdf转换成文本解决格式不统一问题 懒得调OCR服务了,所以快速解决的方法是: pdf转png:https://pdf2png.com/zh/ png转统一格式pdf:adobe acrobat自带增 ...
- 基于docker创建Cassandra集群
一.概述 简介 Cassandra是一个开源分布式NoSQL数据库系统. 它最初由Facebook开发,用于储存收件箱等简单格式数据,集GoogleBigTable的数据模型与Amazon Dynam ...
- ImportError: No module named _ssl解决方法
import ssl时出现ImportError: No module named _ssl错误是因为咱安装Python的时候没有把ssl模块编译进去导致的. 解决步骤: 系统没有openssl,手动 ...
- Java并发编程基础三板斧之Semaphore
引言 最近可以进行个税申报了,还没有申报的同学可以赶紧去试试哦.不过我反正是从上午到下午一直都没有成功的进行申报,一进行申报 就返回"当前访问人数过多,请稍后再试".为什么有些人就 ...
- POJ-2387(原始dijkstra求最短路)
Til the Cows Come Home POJ-2387 这题是最简单的最短路求解题,主要就是使用dijkstra算法,时间复杂度是\(O(n^2)\). 需要注意的是,一定要看清楚题目的输入要 ...
- 我的2019年总结和一些2020年的flag
我的2019年总结和一些2020年的flag 前言 2019年在我的人生中注定是里程碑的一年,主要是我毕业了.本篇总结主要聊一些2019年经历的事以及对于自己2020年的期待 1. 再见2019 1. ...