OpenSSH基于Shell (SSH)协议,可用于两台电脑间远程控制或传输文件的免费工具。传统工具,如telnet或rcp将用户密码以明文形式传输,因此是不安全的。

OpenSSH服务组件SSHD用来侦听来自客户端工具的客户端连接。当出现连接请求时,SSHD会根据客户端工具连接的类型设置正确的连接。

1.安装

1.1.客户端安装

apt install openssh-client

1.2.服务端工具

apt install openssh-server

2.配置

通过编辑/etc/ssh/sshd_config文件来配置sshd服务。可以通过man sshd_config来查看该文件的配置信息。

配置前,最好将原配置文件进行备份,并保证它不会被写入,指令如下:

cp /etc/ssh/sshd_config /etc/ssh/sshd_config.original
chmod a-w /etc/ssh/sshd_config.original

此外,错误的配置sshd服务可能导致无法访问,因此在更改配置之后和重新启动服务之前检查配置,检查指令如下:

sshd -t -f /etc/ssh/sshd_config

修改并保存/etc/ssh/sshd_config文件后,使用以下命令重新启动sshd服务以实现更改:

systemctl restart sshd.service

3.SSH免密登录

SSH允许两个主机之间的身份验证,而不需要密码。SSH密钥认证使用私钥和公钥两种方式。

3.1.生成秘钥

可以采用以下指令生成密钥。也可以使用-b选项修改比特数(3072位)

ssh-keygen -t rsa
ssh-keygen -t rsa -b 4096

3.2.配置免密

默认情况下,公钥保存在 /.ssh/id_rsa.pub文件中,而/.ssh/id_rsa为私钥。现在复制公钥文件到远程主机并将其追加到~/.ssh/authorized_keys。指令如下:

ssh-copy-id username@remotehost

检查程主机的authorized_keys文件的权限。只有经过身份验证的用户应该具有读写权限,如果权限不正确,请更改权限:

chmod 600 .ssh/authorized_keys

现在应该能够通过SSH连接到主机,而不会提示输入密码

4.从公共密钥服务器导入密钥

如今,许多用户已经在launchpad或github等服务上注册了ssh密钥。这些可以很容易地导入:

ssh-import-id <username-on-remote-service>

5.sshd_config

sshd从/etc/ssh/sshd_config(或在命令行上用-f指定的文件)读取配置数据。该文件每行包含一组“关键字-参数”对,关键字不区分大小写,参数区分大小写。如果重复配置了“关键字-参数”对,将使用第一个。以“#”开头的行和空行被解释为注释。

注意,Debian openssh-server包在/etc/ssh/sshd_config中设置了几个标准选项,这些选项在sshd中不是默认的:

•   ChallengeResponseAuthentication no
       •   X11Forwarding yes
       •   PrintMotd no
       •   AcceptEnv LANG LC_*
       •   Subsystem sftp /usr/lib/openssh/sftp-server
       •   UsePAM yes
AddressFamily
	指定使用的地址族,有效参数为any(默认)、inet(仅IPv4)或inet6(仅IPv6)
	
ListenAddress
	指定sshd(8)侦听的本地地址
	
Port
	指定sshd(8)监听的端口号,默认值是22
	
AllowAgentForwarding
	是否允许ssh-agent转发,默认为yes。请注意,禁用代理转发不会提高安全性,除非用户也被拒绝shell访问,因为他们总是可以安装自己的转发器
	
AllowStreamLocalForwarding
	是否允许StreamLocal (unix域套接字)转发。可选选项有yes(默认值)或all(允许),no(禁止),local(只允许本地(从ssh(1)的角度来看)转发或remote(只允许远程转发)。注意,禁用StreamLocal转发并不能提高安全性,除非用户也被拒绝shell访问,因为他们总是可以安装自己的转发器。
	
AllowTcpForwarding
	是否允许TCP转发。选项为yes(默认值)或all(允许),no(禁止),local(只允许本地(从ssh(1)的角度)转发或remote(只允许远程转发)。注意,禁用TCP转发并不能提高安全性,除非用户也被拒绝shell访问,因为他们总是可以安装自己的转发器。
	
Banner
	在允许身份验证之前,将指定文件的内容发送给远程用户。如果参数为none,则不显示Banner。默认情况下,不显示Banner。
	
ClientAliveCountMax
	客户端存活数最大值,缺省值为3。如果ClientAliveInterval设置为15,并且ClientAliveCountMax保持默认值,则无响应的SSH客户端将在大约45秒后断开连接。
	
ClientAliveInterval
	客客户端存活时间间隔(以秒为单位)。默认值为0,表示消息不会被发送到客户端。
	
DebianBanner
	指定在初始协议握手期间是否包含指定的额外版本后缀,默认为yes。
	
AllowGroups
	设置允许登录的用户组,可以设置多个组,由空格分隔。如果指定,则仅允许匹配组的用户登录。默认情况下,所有组都允许登录。
	允许/拒绝指令的处理顺序如下:DenyUsers,AllowUsers,DenyGroups,AllowGroups
AllowUsers
	设置允许登录的用户名,可以设置多个用户名,由空格分隔。
	如果指定,则只允许匹配的用户名登录。缺省情况下,允许所有用户登录。如果模式采用USER@HOST的形式,则分别检查USER和HOST,将登录限制为来自特定主机的特定用户。HOST条件还可以包含CIDR地址/掩码格式的地址
DenyGroups
	设置组织登录的用户组
DenyUsers
	设置组织登录的用户名
	
DisableForwarding
	禁用所有转发功能,包括X11、ssh-agent(1)、TCP和StreamLocal。此选项将覆盖所有其他与转发相关的选项,并可能简化受限制的配置。
	
LoginGraceTime
	如果用户没有成功登录,服务器将在此时间后断开连接。取值为0,表示无时间限制。缺省值是120秒。
	
LogLevel
	给出记录消息时使用的详细级别。可能取值为:QUIET、FATAL、ERROR、INFO、VERBOSE、DEBUG、DEBUG1、DEBUG2和DEBUG3。默认为INFO。DEBUG和DEBUG1是等价的。DEBUG2和DEBUG3分别指定更高级别的调试输出。使用DEBUG级别进行日志记录会侵犯用户隐私,不建议使用。

PermitRootLogin
	root用户是否可以ssh登录。参数必须为yes、prohibit-password, forced-commands-only或no。缺省值是prohibit-password。
	如果该选项被设置为prohibit-password(或其已弃用的别名,without-password),则root的密码和键盘交互身份验证将被禁用。
	如果此选项被设置为forced-commands-only,则将允许使用公钥身份验证进行root登录,但仅在指定了命令选项的情况下。