0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

OpenSSH的SSH协议实现

马哥Linux运维 来源:未知 作者:龚婷 2018-03-12 15:41 次阅读

OpenSSH 是 SSH 协议的一个实现。一般通过scp或sftp用于远程登录、备份、远程文件传输等功能。SSH能够完美保障两个网络或系统间数据传输的保密性和完整性。尽管如此,它最大的优势是使用公匙加密来进行服务器验证。时不时会出现关于 OpenSSH 零日漏洞的传言。本文将描述如何设置你的 Linux 或类 Unix 系统以提高 sshd 的安全性。

OpenSSH 默认设置

TCP 端口 – 22

OpenSSH 服务配置文件 –sshd_config(位于/etc/ssh/)

1、 基于公匙的登录

OpenSSH 服务支持各种验证方式。推荐使用公匙加密验证。首先,使用以下ssh-keygen命令在本地电脑上创建密匙对:

1024 位或低于它的 DSA 和 RSA 加密是很弱的,请不要使用。当考虑 ssh 客户端向后兼容性的时候,请使用 RSA密匙代替 ECDSA 密匙。所有的 ssh 密钥要么使用 ED25519 ,要么使用 RSA,不要使用其它类型。

$ssh-keygen -tkey_type -bbits -C"comment"

示例:

$ssh-keygen -ted25519 -C"Login to production cluster at xyz corp"

$ssh-keygen -trsa -b4096 -f ~/.ssh/id_rsa_aws_$(date +%Y-%m-%d) -C"AWS key for abc corp clients"

下一步,使用 ssh-copy-id 命令安装公匙:

$ssh-copy-id -i /path/to/public-key-file user@host

$ssh-copy-id user@remote-server-ip-or-dns-name

示例:

$ssh-copy-id vivek@rhel7-aws-server

提示输入用户名和密码的时候,确认基于 ssh 公匙的登录是否工作:

$ssh vivek@rhel7-aws-server

2、 禁用 root 用户登录

禁用 root 用户登录前,确认普通用户可以以 root 身份登录。例如,允许用户 vivek 使用sudo命令以 root 身份登录。

在 Debian/Ubuntu 系统中如何将用户 vivek 添加到 sudo 组中

允许 sudo 组中的用户执行任何命令。将用户 vivek 添加到 sudo 组中:

$sudo adduser vivek sudo

使用 id 命令 验证用户组。

$id vivek

在 CentOS/RHEL 系统中如何将用户 vivek 添加到 sudo 组中

在 CentOS/RHEL 和 Fedora 系统中允许 wheel 组中的用户执行所有的命令。使用 usermod 命令将用户 vivek 添加到 wheel 组中:

$sudo usermod -aG wheel vivek

$id vivek

测试 sudo 权限并禁用 ssh root 登录

测试并确保用户 vivek 可以以 root 身份登录执行以下命令:

$sudo -i

$sudo /etc/init.d/sshd status

$sudo systemctl status httpd

添加以下内容到 sshd_config 文件中来禁用 root 登录:

PermitRootLogin no

ChallengeResponseAuthentication no

PasswordAuthentication no

UsePAM no

3、 禁用密码登录

所有的密码登录都应该禁用,仅留下公匙登录。添加以下内容到 sshd_config 文件中:

AuthenticationMethods publickey

PubkeyAuthentication yes

CentOS 6.x/RHEL 6.x 系统中老版本的 sshd 用户可以使用以下设置:

PubkeyAuthentication yes

4、 限制用户的 ssh 访问

默认状态下,所有的系统用户都可以使用密码或公匙登录。但是有些时候需要为 FTP 或者 email 服务创建 UNIX/Linux 用户。然而,这些用户也可以使用 ssh 登录系统。他们将获得访问系统工具的完整权限,包括编译器和诸如 Perl、Python(可以打开网络端口干很多疯狂的事情)等的脚本语言。通过添加以下内容到 sshd_config 文件中来仅允许用户 root、vivek 和 jerry 通过 SSH 登录系统:

AllowUsers vivek jerry

当然,你也可以添加以下内容到 sshd_config 文件中来达到仅拒绝一部分用户通过 SSH 登录系统的效果。

DenyUsers root saroj anjali foo

你也可以通过配置 Linux PAM 来禁用或允许用户通过 sshd 登录。也可以允许或禁止一个用户组列表通过 ssh 登录系统。

5、 禁用空密码

你需要明确禁止空密码账户远程登录系统,更新 sshd_config 文件的以下内容:

PermitEmptyPasswords no

6、 为 ssh 用户或者密匙使用强密码

为密匙使用强密码和短语的重要性再怎么强调都不过分。暴力破解可以起作用就是因为用户使用了基于字典的密码。你可以强制用户避开字典密码并使用约翰的开膛手工具来检测弱密码。以下是一个随机密码生成器(放到你的 ~/.bashrc 下):

genpasswd(){

locall=$1

["$l" == ""] && l=20

tr -dcA-Za-z0-9_ < /dev/urandom | head -c${l} | xargs

运行:

genpasswd16

输出:

uw8CnDVMwC6vOKgW

7、 为 SSH 的 22端口配置防火墙

你需要更新 iptables/ufw/firewall-cmd 或 pf 防火墙配置来为 ssh 的 TCP 端口 22 配置防火墙。一般来说,OpenSSH 服务应该仅允许本地或者其他的远端地址访问。

Netfilter(Iptables) 配置

更新 /etc/sysconfig/iptables (Redhat 和其派生系统特有文件) 实现仅接受来自于 192.168.1.0/24 和 202.54.1.5/29 的连接,输入:

-ARH-Firewall-1-INPUT -s192.168.1.0/24 -mstate --state NEW -ptcp --dport22 -jACCEPT

-ARH-Firewall-1-INPUT -s202.54.1.5/29 -mstate --state NEW -ptcp --dport22 -jACCEPT

如果同时使用 IPv6 的话,可以编辑 /etc/sysconfig/ip6tables (Redhat 和其派生系统特有文件),输入:

-ARH-Firewall-1-INPUT -sipv6network::/ipv6mask -mtcp -ptcp --dport22 -jACCEPT

将 ipv6network::/ipv6mask 替换为实际的 IPv6 网段。

Debian/Ubuntu Linux 下的 UFW

UFW 是 Uncomplicated FireWall 的首字母缩写,主要用来管理 Linux 防火墙,目的是提供一种用户友好的界面。输入以下命令使得系统仅允许网段 202.54.1.5/29 接入端口 22:

$sudo ufw allow from202.54.1.5/29toany port22

*BSD PF 防火墙配置

如果使用 PF 防火墙 /etc/pf.conf 配置如下:

passinon$ext_ifinetprototcpfrom{192.168.1.0/24,202.54.1.5/29}to$ssh_server_ip port ssh flagsS/SA synproxy state

8、 修改 SSH 端口和绑定 IP

ssh 默认监听系统中所有可用的网卡。修改并绑定 ssh 端口有助于避免暴力脚本的连接(许多暴力脚本只尝试端口 22)。更新文件 sshd_config 的以下内容来绑定端口 300 到 IP 192.168.1.5 和 202.54.1.5:

Port300

ListenAddress192.168.1.5

ListenAddress202.54.1.5

当需要接受动态广域网地址的连接时,使用主动脚本是个不错的选择,比如 fail2ban 或 denyhosts。

9、 使用 TCP wrappers (可选的)

TCP wrapper 是一个基于主机的访问控制系统,用来过滤来自互联网的网络访问。OpenSSH 支持 TCP wrappers。只需要更新文件 /etc/hosts.allow 中的以下内容就可以使得 SSH 只接受来自于 192.168.1.2 和 172.16.23.12 的连接:

sshd : 192.168.1.2172.16.23.12

10、 阻止 SSH 破解或暴力攻击

暴力破解是一种在单一或者分布式网络中使用大量(用户名和密码的)组合来尝试连接一个加密系统的方法。可以使用以下软件来应对暴力攻击:

DenyHosts是一个基于 Python SSH 安全工具。该工具通过监控授权日志中的非法登录日志并封禁原始 IP 的方式来应对暴力攻击。

RHEL / Fedora 和 CentOS Linux 下如何设置DenyHosts。

Fail2ban是另一个类似的用来预防针对 SSH 攻击的工具。

sshguard是一个使用 pf 来预防针对 SSH 和其他服务攻击的工具。

security/sshblock阻止滥用 SSH 尝试登录。

IPQ BDB filter可以看做是 fail2ban 的一个简化版。

11、 限制 TCP 端口 22 的传入速率(可选的)

netfilter 和 pf 都提供速率限制选项可以对端口 22 的传入速率进行简单的限制。

Iptables 示例

以下脚本将会阻止 60 秒内尝试登录 5 次以上的客户端的连入。

#!/bin/bash

inet_if=eth1

ssh_port=22

$IPT -IINPUT -ptcp --dport${ssh_port} -i${inet_if} -mstate --stateNEW -mrecent --set

$IPT -IINPUT -ptcp --dport${ssh_port} -i${inet_if} -mstate --state NEW -mrecent --update --seconds60 --hitcount5

在你的 iptables 脚本中调用以上脚本。其他配置选项:

$IPT -AINPUT -i${inet_if} -ptcp --dport${ssh_port} -mstate --stateNEW -mlimit --limit3/min --limit-burst3 -jACCEPT

$IPT -AINPUT -i${inet_if} -ptcp --dport${ssh_port} -mstate --stateESTABLISHED -jACCEPT

$IPT -AOUTPUT -o${inet_if} -ptcp --sport${ssh_port} -mstate --stateESTABLISHED -jACCEPT

# another one line example

# $IPT -A INPUT -i ${inet_if} -m state --state NEW,ESTABLISHED,RELATED -p tcp --dport 22 -m limit --limit 5/minute --limit-burst 5-j ACCEPT

其他细节参见 iptables 用户手册。

*BSD PF 示例

以下脚本将限制每个客户端的连入数量为 20,并且 5 秒内的连接不超过 15 个。如果客户端触发此规则,则将其加入 abusive_ips 表并限制该客户端连入。最后 flush 关键词杀死所有触发规则的客户端的连接。

sshd_server_ip = "202.54.1.5"

table persist

block inquick from

pass inon$ext_if proto tcp to$sshd_server_ip port ssh flagsS/SA keep state(max-src-conn20,max-src-conn-rate15/5,overload flush)

12、 使用端口敲门(可选的)

端口敲门是通过在一组预先指定的封闭端口上生成连接尝试,以便从外部打开防火墙上的端口的方法。一旦指定的端口连接顺序被触发,防火墙规则就被动态修改以允许发送连接的主机连入指定的端口。以下是一个使用 iptables 实现的端口敲门的示例:

$IPT -Nstage1

$IPT -Astage1 -mrecent --remove --name knock

$IPT -Astage1 -ptcp --dport3456 -mrecent --set --name knock2

$IPT -Nstage2

$IPT -Astage2 -mrecent --remove --name knock2

$IPT -Astage2 -ptcp --dport2345 -mrecent --set --name heaven

$IPT -Ndoor

$IPT -Adoor -mrecent --rcheck --seconds5 --name knock2 -jstage2

$IPT -Adoor -mrecent --rcheck --seconds5 --name knock -jstage1

$IPT -Adoor -ptcp --dport1234 -mrecent --set --name knock

$IPT -AINPUT -m --state ESTABLISHED,RELATED -jACCEPT

$IPT -AINPUT -ptcp --dport22 -mrecent --rcheck --seconds5 --name heaven -jACCEPT

$IPT -AINPUT -ptcp --syn -jdoor

13、 配置空闲超时注销时长

用户可以通过 ssh 连入服务器,可以配置一个超时时间间隔来避免无人值守的 ssh 会话。 打开 sshd_config 并确保配置以下值:

ClientAliveInterval300

ClientAliveCountMax0

以秒为单位设置一个空闲超时时间(300秒 = 5分钟)。一旦空闲时间超过这个值,空闲用户就会被踢出会话。更多细节参见如何自动注销空闲超时的 BASH / TCSH / SSH 用户。

14、 为 ssh 用户启用警示标语

更新 sshd_config 文件如下行来设置用户的警示标语:

Banner /etc/issue

`/etc/issue 示例文件:

以上是一个标准的示例,更多的用户协议和法律细节请咨询你的律师团队。

15、 禁用 .rhosts 文件(需核实)

禁止读取用户的 ~/.rhosts 和 ~/.shosts 文件。更新 sshd_config 文件中的以下内容:

IgnoreRhosts yes

SSH 可以模拟过时的 rsh 命令,所以应该禁用不安全的 RSH 连接。

16、 禁用基于主机的授权(需核实)

禁用基于主机的授权,更新 sshd_config 文件的以下选项:

HostbasedAuthentication no

17、 为 OpenSSH 和操作系统打补丁

推荐你使用类似 yum、apt-get 和 freebsd-update 等工具保持系统安装了最新的安全补丁。

18、 Chroot OpenSSH (将用户锁定在主目录)

默认设置下用户可以浏览诸如 /etc、/bin 等目录。可以使用 chroot 或者其他专有工具如 rssh 来保护 ssh 连接。从版本 4.8p1 或 4.9p1 起,OpenSSH 不再需要依赖诸如 rssh 或复杂的 chroot(1) 等第三方工具来将用户锁定在主目录中。可以使用新的 ChrootDirectory 指令将用户锁定在其主目录,参见这篇博文。

19. 禁用客户端的 OpenSSH 服务

工作站和笔记本不需要 OpenSSH 服务。如果不需要提供 ssh 远程登录和文件传输功能的话,可以禁用 sshd 服务。CentOS / RHEL 用户可以使用 yum 命令 禁用或删除 openssh-server:

$sudo yum erase openssh-server

Debian / Ubuntu 用户可以使用 apt 命令/apt-get 命令 删除 openssh-server:

$sudo apt-get remove openssh-server

有可能需要更新 iptables 脚本来移除 ssh 的例外规则。CentOS / RHEL / Fedora 系统可以编辑文件 /etc/sysconfig/iptables 和 /etc/sysconfig/ip6tables。最后重启 iptables 服务:

# service iptables restart

# service ip6tables restart

20. 来自 Mozilla 的额外提示

如果使用 6.7+ 版本的 OpenSSH,可以尝试下以下设置:

使用以下命令获取 OpenSSH 支持的加密方法:

$ssh -Qcipher

$ssh -Qcipher-auth

$ssh -Qmac

$ssh -Qkex

$ssh -Qkey

如何测试 sshd_config 文件并重启/重新加载 SSH 服务?

在重启 sshd 前检查配置文件的有效性和密匙的完整性,运行:

$sudo sshd -t

扩展测试模式:

$sudo sshd -T

最后,根据系统的的版本重启 Linux 或类 Unix 系统中的 sshd 服务:

$[sudo systemctl start ssh][38]## Debian/Ubunt Linux##

$[sudo systemctl restart sshd.service][39]## CentOS/RHEL/Fedora Linux##

$doas /etc/rc.d/sshd restart## OpenBSD##

$sudo service sshd restart## FreeBSD##

其他建议

使用 2FA 加强 SSH 的安全性– 可以使用OATH Toolkit或DuoSecurity启用多重身份验证。

基于密匙链的身份验证– 密匙链是一个 bash 脚本,可以使得基于密匙的验证非常的灵活方便。相对于无密码密匙,它提供更好的安全性。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 服务器
    +关注

    关注

    12

    文章

    9010

    浏览量

    85160
  • SSH协议
    +关注

    关注

    0

    文章

    4

    浏览量

    1606

原文标题:20 个 OpenSSH 最佳安全实践

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    ssh连接

    实现,二者互不兼容。SSH2比SSH1在安全性,功能和性能 上提高了很多,所以目前被广泛使用的SSH2。 1.SSH服务器的安装 Linu
    发表于 03-28 16:38

    如何实现远程登录ssh并配置为开机启动

    今天教论坛的发烧友们如何实现远程登录ssh,并配置为开机启动!千万要注意的一点,ssh和ssl不能混淆安装并运行ssh1,安装sshapt-get install
    发表于 09-12 10:32

    MYS-6ULX-IOT怎么安装openssh??

    试了下好像默认没有带SSH,串口速度太慢了,想安装openssh怎么弄??求大神帮助
    发表于 06-03 22:59

    SSH arm移植

    移植ssh到开发板主要是将开发板当成服务器,电脑端可以作为客户端进行访问,从而实现通过网线就可以进行文件的传输以及控制台控制。移植ssh主要包含三大部分:1. zlib的移植; 2. openssl
    发表于 07-01 12:24

    迅为-3399开发板QT系统-使用openssh

    OpenSSHSSH (Secure SHell) 协议的免费开源实现SSH 协议族可以
    发表于 07-14 10:12

    Linux开发板上的SSH服务移植过程

    SSH服务可以很方便的通过网络登录到Linux开发板,同时支持SFTP协议向开发板传输文件。下面简单讲下移植过程。开发板环境:名称:imx283内核:Linux2.6.35.31.下载源码zlib
    发表于 11-04 08:22

    RK3568开发板安装SSH

    开发的过程中会经常在 Windows 和 Ubuntu 系统之间进行文件的传输,为了实现 Windows和 Ubuntu 文件的互传,需要在 Ubuntu 上安装 SSH 服务,具体步骤如下:首先
    发表于 03-27 11:10

    在全志V851S开发板上使用SSH配置步骤分析

    在Tina板子上面开启SSH SERVER 在Tina配置界面的以下目录中 > Network > SSH 勾选的项目 《》openssh
    发表于 04-28 10:11

    SSH指南

    OpenSSH OpenSSHSSH (Secure SHell) 协议的免费开源实现。它用安全、加密的网络连接工具代替了 telne
    发表于 11-07 11:44 1次下载

    嵌入式Linux添加ssh服务

    OpenSSH因为其相对较大,一般不太适用于嵌入式平台,多用于PC或者服务器的Linux版本中。Dropbear是一个相对较小的SSH服务器和客户端。
    发表于 10-20 11:50 8次下载
    嵌入式Linux添加<b class='flag-5'>ssh</b>服务

    嵌入式Linux开发板移植SSH

    SSH服务可以很方便的通过网络登录到Linux开发板,同时支持SFTP协议向开发板传输文件。下面简单讲下移植过程。开发板环境:名称:imx283 内核:Linux2.6.35.31.下载源码zlib
    发表于 11-01 17:06 2次下载
    嵌入式Linux开发板移植<b class='flag-5'>SSH</b>

    开发板openssh移植步骤

    SSH简介SSH为SecureShell的缩写,由IETF的网络小组(NetworkWorkingGroup)所制定,为建立在应用层基础上的安全协议。通过对密码进行加密传输验证,可在不安全的网络中
    的头像 发表于 09-05 11:23 1354次阅读
    开发板<b class='flag-5'>openssh</b>移植步骤

    SSH端口号是什么?SSH原理详解分析

    OpenSSHSSH协议的开源实现,支持在Unix操作系统上运行,最新版本可以在OpenSSH官网下载。目前Windows10已经包含
    发表于 10-16 16:00 7833次阅读
    <b class='flag-5'>SSH</b>端口号是什么?<b class='flag-5'>SSH</b>原理详解分析

    SSH端口号是什么?SSH是如何工作的?

    SSH(Secure Shell,安全外壳)是一种网络安全协议,通过加密和认证机制实现安全的访问和文件传输等业务。传统远程登录或文件传输方式,例如Telnet、FTP,使用明文传输数据,存在很多
    的头像 发表于 11-10 10:06 2654次阅读
    <b class='flag-5'>SSH</b>端口号是什么?<b class='flag-5'>SSH</b>是如何工作的?

    Serial、SSH、Rlogin、Telnet、Raw协议介绍

    SSH是较可靠,专为远程登录会话和其他网络服务提供安全性的文件传输协议。建立在应用层和传输层基础上。利用SSH协议可以有效防止远程管理过程中的信息泄露问题。
    的头像 发表于 12-05 09:55 2676次阅读