介绍
SSH是通过命令行连接到远程Linux和类Unix服务器的主要方式。 它提供了一个安全的连接,您可以使用它来运行命令,与系统交互,甚至隧道不相关的流量通过。
大多数用户都知道的如何上手,并连接到远程服务器基础用以下命令:
ssh username@remote_server
但是,配置您的SSH守护程序有更多的选项,可以有助于增加安全性,管理用户连接等。我们将讨论一些可用的选项,以更细粒度的控制您的SSH访问。
我们将在Ubuntu 12.04 VPS实例上演示这些概念,但是任何现代Linux发行版都应该以类似的方式运行。
探索SSHD配置文件
配置为SSH守护程序本身的主要来源是在/etc/ssh/sshd_config
文件。 注意,这是从不同ssh_config
文件,该文件指定了客户端的默认值。
现在使用管理权限打开文件:
sudo nano /etc/ssh/sshd_config
你会看到一个有很多选项的文件,希望(取决于你的发行版),很多评论。 虽然大多数发行版在确定合理的默认值方面做得相当不错,但仍有改进和定制的空间。
让我们来看看我们在Ubuntu 12.04文件中设置的一些选项:
端口和协议
22端口 :指定端口的SSH守护进程会寻找上的连接。 默认情况下,大多数客户端和服务器在端口22上操作,但将此更改为不同的端口可能会减少恶意用户的“驱动”SSH登录尝试的数量。
方案2:SSH已通过两种版本的协议。 除非您特别需要支持只能在协议1上操作的客户端,否则建议保持原样。
键和分离
HOSTKEY的/ etc / SSH / ssh_ 主机 ...:这些行指定服务器的主机密钥。 这些密钥用于标识服务器以连接客户端。 如果客户端已经与服务器通信过,他们可以使用此密钥来验证新连接。
UsePrivilegeSeparation是 :这个选项允许SSH产卵子进程,只有拥有自己的任务必要的特权。 这是在安全漏洞的情况下隔离进程的安全特征。
KeyRegenerationInterval和ServerKeyBits:这些选项会影响为SSH协议1.你不应该担心这个,如果你要求你的连接坚持协议2生成的服务器密钥。
日志和限制
SyslogFacility和LogLevel的 :这些选项指定活动将如何被记录。 第一个选项是用于记录消息的设施代码,第二个选项用于记录日志级别或详细信息量。
LoginGraceTime 120:这规定的秒数,服务器从客户端断开,如果一直没有成功登录之前等待的时间。
的PermitRootLogin是 :此选项允许或拒绝使用root帐户通过SSH的能力。 由于root帐户是攻击者知道的在服务器机器上的帐户,并且因为它提供对机器的不受限制的访问,它通常是高度目标的帐户。 在配置具有sudo权限的常规用户帐户后,建议将此设置为“no”。
StrictModes是 :这告诉SSH忽略不正确的权限的任何用户级的配置文件。 如果用户将其配置文件设置为世界可读,则会有安全隐患。 在这个问题解决之前拒绝访问是更安全的。
将IgnoreRhosts和RhostsRSA验证 :这些指定款式rhost的认证是否会被接受。 这是协议1语法,不适用于协议2。
HostbasedAuthentication no这样 :这是协议版本2以上。 基本上,这允许基于连接的客户端的主机的认证。 这通常只适用于隔离环境,因为可能欺骗源信息。 您可以指定一个主机信息
/etc/ssh/shosts.equiv
文件或/etc/hosts.equiv
的文件。 这不在本指南的范围之内。PermitEmptyPasswords无 :此选项限制了那些没有密码的密码认证时,允许帐户SSH访问。 这可能是一个巨大的安全风险,你应该几乎从不改变它。
ChallengeResponse验证 :此行启用或禁用可通过PAM配置质询-响应认证类型。 这不在本指南的范围之内。
显示
X11Forwarding是 :这可以让你转发X11图形用户界面的服务器到客户端计算机上的应用程序。 这意味着您可以在服务器上启动图形程序,并在客户端上与其进行交互。 客户端必须有一个X窗口系统可用。 您可以在OS X上安装这些功能,任何桌面Linux都将具有此功能。
X11DisplayOffset 10:这是针对X11转发sshd的显示数量抵消。 此偏移允许SSH生成X11窗口,以避免与现有X服务器冲突。
PrintMotd没有 :指定SSH守护程序本身不应该读取并显示当天的文件的消息。 这有时由shell本身读取,因此您可能需要修改您的shell首选项文件。
PrintLastLog是 :这告诉SSH守护程序打印出你登录的最后一次信息。
连接和环境
TCPKEEPALIVE是 :指定TCP keepalive消息是否被发送到客户机。 这可以帮助服务器识别什么时候有问题,连接将被杀死。 如果禁用此选项,则在网络故障少的情况下连接不会被终止,这可能是好的,但这也意味着用户可能会断开连接并继续锁定资源。
AcceptEnv LANG LC_ *:这个选项允许你接受来自客户机的某些环境变量。 在这个特定的实例中,我们接受语言变量,这可以帮助shell会话为客户端正确显示。
子系统SFTP / usr / lib目录/ openssh的/ SFTP服务器 :这个配置可以与SSH可以使用外部子系统。 此示例指定SFTP服务器及其执行路径。
UsePAM是 :指定PAM(可插拔认证模块),将可协助用户进行身份验证。
这将照顾我们的Ubuntu 12.04机器上默认启用的选项。 接下来,让我们谈谈一些其他可能有助于您设置或修改的选项。
其他SSHD选项
还有很多其他选项,我们可以为我们的SSH守护进程设置。 其中一些可能会立即对您有帮助,而其他可能只在特定情况下有用。 我们不会在这里讨论每一个选项,但会讨论一些有用的。
用户和组过滤
一些选项允许您精确控制哪些用户将有能力通过SSH登录。 这些选项应被视为相互排斥。 例如, AllowUsers
选项意味着所有其他用户都可以访问。
AllowGroups:这个选项允许你指定服务器上的组的名称。 只有属于其中一个组的成员的用户才有能力登录。这将构建应具有访问权限的组的白名单。
的AllowUsers:这是类似上面的选项,但它指定谁被允许登录的任何用户不在此名单将无法登录特定用户。 这作为用户白名单操作。
DenyGroups:此选项设置不应该被允许登录到系统组的黑名单。 属于这些群组的用户将无法访问。
DenyUsers:这是一个黑色列表供用户使用。 它具体指定不应授予哪些用户通过SSH登录的权限。
此外,还有一些其他限制性选项可用。 这些可以与以上任何选项一起使用:
匹配 :此选项允许谁可以在什么情况下进行身份验证更细粒度的控制。 它指定在特定用户或组连接时应使用的不同选项集。 我们将在后面更详细地讨论这个问题。
RevokedKeys:这允许您指定吊销公钥的列表。 这将防止列出的密钥用于登录系统。
其他选项
有很多选项,我们可以使用配置什么网络流量SSH守护程序将注意:
AddressFamily:此选项指定什么样的地址,你会接受的连接。 默认情况下,值为“any”,但您可以为IPv4地址放置“inet”,为IPv6地址放置“inet6”。
的ListenAddress:这个选项允许你告诉SSH守护进程来侦听特定的地址和端口。 默认情况下,守护程序将侦听为此计算机配置的所有地址。
可用其它类型的选项是那些用于建立基于证书的认证 ,连接限制选项,如ClientAliveCountMax
和ClientAliveInterval
和类似的选项ChrootDirectory
,它可以被用于锁定在用户登录到一个特定的,预先配置的chroot环境。
限制用户登录
我们上面提到了一些工具,你必须限制对用户和组的访问。 让我们在这里更详细一点。
使用这些的最基本的语法是:
AllowUsers demouser fakeuser madeupuser
如您所见,我们可以在每个指令中指定多个空格分隔的用户。
我们还可以使用通配符和否定条目。 例如,如果我们想允许每个人,但允许用户“john”登录,我们可以尝试这样:
AllowUsers * !john
这个具体的例子可能会用得到更好的表达DenyUsers
行:
DenyUsers john
我们还可以使用?
字符匹配一个字符。 例如,我们可以使用:
AllowUsers ?im
这将允许从诸如“tim”,“jim”或“vim”的帐户登录。
我们可以得到更具体的。 在这两个用户的规格,我们可以使用的形式user@hostname
,以限制登录到特定的客户端源位置。 例如,你可以有类似:
AllowUsers demouser@host1.com fakeuser
这将允许“fakeuser”从任何地方登录,但只允许“demouser”从特定主机登录。
我们还可以限制之外的主机,通过主机上的访问sshd_config
通过TCP封装文件。 这是通过配置/etc/hosts.allow
和/etc/hosts.deny
的文件。
例如,我们可以通过添加这样的线将限制特别基于SSH访问流量hosts.allow
文件:
sshd: .example.com
假设我们在一个同伴线hosts.deny
文件,该文件是这样的:
sshd: ALL
这将限制登录,只有那些从未来example.com
或一个子域。
使用匹配选项添加例外
我们可以通过使用“匹配”选项进一步控制我们的选项。 匹配选项的工作方式是指定一个条件模式,以决定是否应用随后的选项。
我们通过使用开始匹配Match
选项,然后指定标准键-值对。 可用的键是“用户”,“组”,“主机”和“地址”。 我们可以使用空格分隔条件,并使用逗号分隔模式(user1,user2)。 我们还可以使用通配符和否定:
Match User !demouser,!fakeuser Group sshusers Host *.example.com
如果用户不在线的上方将只匹配demouser
或fakeuser
,如果用户是组的成员sshusers
,并且如果它们从连接example.com
或一个子域。
“地址”的标准可以使用CIDR子网掩码符号 。
下面一个选项Match
规范中有条件地应用。 这些条件选项的范围是直到文件结束或直到下一个匹配规范。 因此,建议将您的默认值放在文件的顶部,并将您的例外放在底部。
由于这个条件块,匹配下的选项通常缩进,以指示它们仅在上述匹配时应用。 例如,上面的条件可以有一个块在它下面这样:
Match User !demouser,!fakeuser Group sshusers Host *.example.com
AuthorizedKeysFile /sshusers/keys/%u
PasswordAuthentication yes
X11Forwarding
X11DisplayOffset 15
在处理匹配规范时,您只能访问一部分选项。 要查看完整列表,请查看sshd_config
手册页:
man sshd_config
搜索“匹配”部分,查看可用选项的列表。
结论
您可以看到,您可以在SSH的服务器端调整许多值,这将影响用户登录的能力和他们的体验质量。 请确保在大规模实施之前仔细测试您的更改,以便捕获错误,并确保您的限制不会意外影响太少或太多的用户。
熟悉你/etc/ssh/sshd_config
文件是理解如何小心地控制对服务器的访问一个伟大的第一步。 这是任何Linux系统管理员的重要技能。