SSH:最佳实践

SSH:最佳做法

介绍

您是否以最佳方式使用SSH? 您是否将其配置为尽可能有限和安全? 本文档的目标是通过SSH的一些最佳实践来崭新的一年:为什么要使用它们,如何设置它们以及如何验证它们是否到位。

以下所有示例都假设您正在使用EnGarde Secure Linux,但任何现代的Linux发行版都会做得很好,因为据我所知,每个人都会运行OpenSSH。

SSHv2与SSHv1

使用最新版本的SSH协议(版本2)与旧版本的版本1有很多好处,我不会在这里看到很多关于这些优点的详细信息 - 如果您有兴趣,请参阅以下参考或Google。 话虽如此,如果您没有明确的理由使用旧版本1,则应始终使用版本2。

要默认使用SSHv2,但允许SSHv1,请在sshd_config文件中找到“协议”行,并将其更改为:

Protocol 2,1

当做2,1请注意,协议选择留给客户端。 大多数客户端将默认为v2,并且“退回”到v1,而旧版客户端可能会继续使用v1。 要强制所有人使用SSHv2,请将其更改为:

Protocol 2

当您进行此更改时,请勿忘记生成相应的HostKey! SSHv2需要以下密钥:

# HostKeys for protocol version 2
HostKey /etc/ssh/ssh_host_rsa_key
HostKey /etc/ssh/ssh_host_dsa_key

而SSHv1需要:

# HostKey for protocol version 1
HostKey /etc/ssh/ssh_host_key

完成更改后,重新启动SSH守护程序:

# /etc/init.d/sshd restart
[ SUCCESSFUL ] Secure Shell Daemon
[ SUCCESSFUL ] Secure Shell Daemon

从另一台机器上,尝试使用SSH.in。您可以使用-v选项查看正在使用的协议,还可以使用'-oProtocol ='选项来强制执行一个或另一个 - 例如“ssh -v -oProtocol = 2 “将强制协议版本2。

绑定到特定地址或非标准端口

如果您在内部防火墙工作站上运行SSH,那么您可以跳过此部分,但如果您在防火墙或具有两个网络接口的计算机上运行SSH,则此部分适用于您。

开箱即用OpenSSH将绑定到每个可用的网络地址; 同时方便,适合大多数安装,这是远非最佳的。 如果您的机器有两个或更多接口,则可能有一个是“可信任”,另一个是“不信任”。 如果是这种情况,并且您不需要也不希望在不受信任的接口上进入SSH访问,那么您应该配置OpenSSH来监听特定的接口。

要使OpenSSH仅绑定到您的内部接口,在下面的示例中为192.168.0.1,请在sshd_config文件中找到以下行:

ListenAddress 0.0.0.0

并将0.0.0.0更改为192.168.0.1:

ListenAddress 192.168.0.1

要验证是否需要更改,请重新启动OpenSSH并查看netstat:

# /etc/init.d/sshd restart
[ SUCCESSFUL ] Secure Shell Daemon
[ SUCCESSFUL ] Secure Shell Daemon
# netstat -anp | grep sshd
tcp 0 0 192.168.0.1:22 0.0.0.0:* LISTEN 7868/sshd

你可以看到,sshd守护进程现在只在192.168.0.1上监听。 任何其他界面中的 SSH请求将被忽略。

同样,您可能希望更改SSH守护程序绑定到的端口。 有时候这是一个功能上的需要(即你的雇主阻止了22 / tcp的出站),但是在这方面也有安全隐患的价值。 虽然没有为确定的攻击者提供任何真正的安全性好处,但将SSH守护程序从端口22移除,可以保护您免受假定守护程序在端口22上运行的自动攻击。

要使OpenSSH绑定到以下示例中的端口22,31337以外的端口,请在sshd_config文件中找到以下行:

Port 22

并将22改为31337:

Port 31337

要验证是否需要进行此更改,请重新启动OpenSSH,再次查看netstat:

# netstat -anp | grep sshd
tcp 0 0 192.168.0.1:31337 0.0.0.0:* LISTEN 330/sshd

最后,要SSH登录到SSH守护程序正在非标准端口上监听的主机,请使用-p选项:

ssh -p 31337 user@192.168.0.1

使用TCP包装器

TCP Wrappers用于限制对您机器上TCP服务的访问。 如果您没有听说过TCP Wrappers,您可能听说过/etc/hosts.allow和/etc/hosts.deny:这些是TCP Wrappers的两个配置文件。 在SSH的上下文中,TCP Wrappers允许您确定具体的地址或网络是否可以访问SSH服务。

要使用带有SSH的TCP Wrappers,您需要确保使用-with-tcp-wrappers构建OpenSSH。 在任何现代分配情况下都是这样。

如前所述,TCP Wrappers通过编辑/etc/hosts.deny和/etc/hosts.allow文件进行配置。 通常你告诉hosts.deny否认一切,然后添加条目到hosts.allow允许特定的主机访问特定的服务。

一个例子:

#
# hosts.deny    This file describes the names of the hosts which are
#               *not* allowed to use the local INET services, as decided
#               by the '/usr/sbin/tcpd' server.
#
ALL: ALL
#
# hosts.allow   This file describes the names of the hosts which are
#               allowed to use the local INET services, as decided
#               by the '/usr/sbin/tcpd' server.
# sshd: 207.46.236. 198.133.219.25

在上面的示例中,访问SSH仅限于网络207.46.236.0/24和地址198.133.219.25。 在任何其他地址的任何其他服务的请求被hosts.deny中的“ALL:ALL”拒绝。 如果您尝试SSH进入机器,并且TCP Wrappers拒绝您的访问,您会看到如下:

ssh_exchange_identification: Connection closed by remote host

这种简单的配置更改会显着加强您的安装,因为在适当的情况下,来自恶意客户端的数据包将在TCP会话早期被丢弃,并且在可能对潜在的弱势守护进程造成任何实际损害之前。

公钥认证

我将介绍的最后一个项目是公钥认证。 您可以采取的最好的措施之一是收紧SSH安装的安全性,即禁用密码验证,并改用公钥验证。 因为许多原因,密码认证是次优的,但主要是因为人们选择不良密码,攻击者常常尝试强制使用密码。 如果系统管理员选择了错误的密码,并且他允许root登录...游戏结束。

公钥认证不是银弹 - 同样的人也可以生成密码短语,或者让他们不要运行ssh代理,但是在我看来,这是一个更好的选择。

关于每个配送公司都会启用公钥认证,但首先要确定:

RSAAuthentication yes
PubkeyAuthentication yes

这两个选项默认为“yes”,“RSAAuthentication”选项用于SSHv1,“PubkeyAuthentication”选项用于SSHv2。 如果您计划专门使用此身份验证方法,那么您可能需要禁用密码验证:

PasswordAuthentication no

在继续之前,请确保您的目标机器上有一个终端打开。 一旦您重新启动SSH守护程序,您将无法再登录没有密钥...我们还没有生成!

一旦你确定,重新启动SSH守护进程:

# /etc/init.d/sshd restart
[ SUCCESSFUL ] Secure Shell Daemon
[ SUCCESSFUL ] Secure Shell Daemon

现在,从桌面上,尝试SSH到目标机器:

$ ssh rwm@brainy
Permission denied (publickey,keyboard-interactive).

我们被锁定了 这是一件好事。 在桌面上的下一步是生成一个键:

$ ssh-keygen -t dsa -C "Ryan's SSHv2 DSA Key (Jan 2008)"
Generating public/private dsa key pair. 
Enter file in which to save the key (/home/rwm/.ssh/id_dsa):
Enter passphrase (empty for no passphrase): **********
Enter same passphrase again: **********
Your identification has been saved in /home/rwm/.ssh/id_dsa.
Your public key has been saved in /home/rwm/.ssh/id_dsa.pub.
The key fingerprint is:
98:4d:50:ba:ee:8b:79:be:b3:36:75:8a:c2:4a:44:4b Ryan's SSHv2 DSA Key (Jan 2008)

几点注意:

  • 您可以生成DSA(-t dsa),RSA(-t rsa)或SSHv1(-t rsa1)密钥。 在上面的例子中,我使用dsa。
  • 我喜欢把日期生成的关键在评论(-C)字段中,这样我可以每隔一段时间更改它。
  • 您正在输入密码,而不是密码。 使用长空格和标点符号。 越长越复杂越好!

您刚刚运行的命令生成了两个文件 - id_dsa,您的私钥和id_dsa.pub,您的公钥。 保持私有密钥至关重要,但您可以将公钥分发到您要访问的任何计算机。

现在您已经生成了密钥,我们需要将公钥存入目标机器上的〜/ .ssh / authorized_keys文件中。 最好的方法是复制粘贴它 - 首先连接公钥文件:

$ cat .ssh/id_dsa.pub
ssh-dss AAAAB3NzaC1kc3MAAACBAL7p6bsg5kK4ES9BWLPCNABl20iQQB3R0ymaPMHK... 
... ds= Ryan's SSHv2 DSA Key (Jan 2008)

这是一个非常长的字符串。 确保您复制所有它 ,并且不要在最后复制换行符。 换句话说,从“ssh”复制到“2008”),但不是过去。

下一步是将此密钥附加到目标计算机上〜/ .ssh / authorized_keys文件的末尾。 请记住,终端我告诉你几步前开放吗? 在其中键入以下命令,将刚刚复制的密钥粘贴到注释的区域中:

echo "KEY" >> ~/.ssh/authorized_keys

例如:

echo "ssh-dss AAAA5kS9BWLPCN...s= Ryan's SSHv2 DSA Key (Jan 2008)" >> ~/.ssh/authorized_keys

现在,再试一次SSH。 如果您正确执行此过程,而不是被拒绝访问,系统将提示您输入密码:

$ ssh rwm@brainy
Enter passphrase for key '/home/rwm/.ssh/id_dsa': 
Last login: Thu Jan 10 14:37:14 2008 from papa.engardelinux.org
[rwm@brainy ~]$

中提琴! 您现在使用公钥身份验证而不是密码身份验证登录。

综上所述...

SSH是一个奇妙的工具,是每个系统管理员第二好友(Perl,当然是第一个:)。 它允许您从任何地方阅读您的电子邮件,前提是您仍然使用基于终端的邮件阅读器。 它允许您在工作时将xterm或X11应用程序从家庭服务器隧道传输到桌面。 它为您提供了在SFTP和SCP中远远优于FTP的替代方案。

SSH是伟大的,但就像任何工具,它只有你使用它一样好。 我希望你在一些最好的做法中找到价值,如果你有任何自己的优点,请留下他们的意见!

在我去之前,这里有一些额外的SSH资源:

赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏