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登录,但仅在指定了命令选项的情况下。