配置ssh

配置ssh分为服务端配置和客户端配置
以下为Ubuntu Server 20.04的ssh配置

服务端

服务端sshd配置

配置文件路径/etc/ssh/sshd_config

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# 指定子配置文件路径,注意服务端sshd配置的应用顺序,取第一个获取的参数值
Include /etc/ssh/sshd_config.d/*.conf
# 端口号,默认22,公网环境建议更改为其他端口
Port 2233
# 地址族,可选any(默认),inet(IPv4),inet6(IPv6)
AddressFamily inet
# 监听地址,可指定具体IP
ListenAddress 0.0.0.0
# 日志类型,可选DAEMON, USER, AUTH(默认), LOCAL0, LOCAL1~LOCAL7
SyslogFacility AUTH
# 日志级别,可选QUIET, FATAL, ERROR, INFO(默认), VERBOSE, DEBUG, DEBUG1, DEBUG2, DEBUG3
LogLevel INFO
# 尝试登录的超时时间,默认单位秒,支持其他单位m(分钟),h(小时)
LoginGraceTime 30
# 尝试登录的最大次数
MaxAuthTries 3
# 是否允许root登录,建议禁止
PermitRootLogin no
# 是否允许空密码登录,建议禁止
PermitEmptyPasswords no
# 公钥认证
PubkeyAuthentication yes
# 保存公钥的文件路径,默认路径为用户家目录
AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2
# 密码认证,公网环境建议禁止,建议在添加公钥认证之后禁止密码认证
PasswordAuthentication yes
# 是否允许交互登录方式,允许PAM则需要同时允许该项
ChallengeResponseAuthentication no
# PAM认证,如果不使用LDAP之类的登录方式,建议禁用
UsePAM no
# 是否允许TCP转发
AllowTcpForwarding yes
# 是否允许远程主机连接到转发端口,即作为网关进行端口转发
GatewayPorts no
# 是否允许X11图形界面转发
X11Forwarding no
# 是否允许分配终端
PermitTTY yes
# 登录成功后是否显示提示信息
PrintMotd no
# 是否显示最后一次的登录信息
PrintLastLog yes
# 是否开启TCP长连接
TCPKeepAlive yes
# 是否开启压缩
Compression yes
# 是否解析主机名
UseDNS no
# 登录前是否显示提示信息
Banner none
# 指定接收客户端的环境变量,建议禁止
AcceptEnv LANG LC_*
# 是否开启sftp服务,开启sftp日志 -l INFO,日志保存在/var/log/auth.log
Subsystem sftp /usr/lib/openssh/sftp-server -l INFO

服务端配置实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ cat /etc/ssh/sshd_config
Include /etc/ssh/sshd_config.d/*.conf
Port 2233
AddressFamily inet
ListenAddress 0.0.0.0
LoginGraceTime 30
MaxAuthTries 3
PermitRootLogin no
PermitEmptyPasswords no
PubkeyAuthentication yes
PasswordAuthentication yes
ChallengeResponseAuthentication no
UsePAM no
X11Forwarding no
PrintMotd no
Compression yes
UseDNS no
Subsystem sftp /usr/lib/openssh/sftp-server -l INFO

禁止编辑文件-可选

1
2
3
4
# 增加配置文件的安全性,任何用户都无法更改该文件
$ chattr +i /etc/ssh/sshd_config
# 取消操作
$ chattr -i /etc/ssh/sshd_config

重启服务

1
2
3
systemctl restart ssh
# 或
systemctl restart sshd

客户端

客户端ssh配置

客户端ssh配置的应用顺序,取第一个获取的参数值:

  1. 命令行参数
  2. 用户配置文件
  3. 系统配置文件

配置文件路径/etc/ssh/ssh_config

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# 指定子配置文件路径
Include /etc/ssh/ssh_config.d/*.conf
# 指定匹配的主机名,支持通配符匹配,多个主机名用空格分隔
Host *
# 指定匹配规则,可选规则host,user,多个参数用逗号分隔
Match host vm1,vm2
# 指定远程主机的端口,默认22
Port 22
# 指定登录远程主机的用户
User ops
# 密码认证
PasswordAuthentication yes
# 指定客户端尝试身份认证的顺序
PreferredAuthentications publickey,keyboard-interactive,password
# 是否检查 known_hosts 中的IP地址信息
CheckHostIP yes
# 指定连接时使用的地址族,可选any(默认),inet(IPv4),inet6(IPv6)
AddressFamily inet
# 指定本地IP作为ssh连接的出口地址,用于本地有多个IP的情况
BindAddress 192.168.80.11
# 指定SSH连接超时时间,单位秒
ConnectTimeout 10
# 添加新的主机密钥时是否检查 known_hosts 中的主机信息
StrictHostKeyChecking no
# 指定私钥位置
IdentityFile ~/.ssh/id_rsa
# 是否加密添加到 ~/.ssh/known_hosts 中的主机名和IP
HashKnownHosts yes
# 是否允许基于GSSAPI的用户认证
GSSAPIAuthentication no
# 指定发送到服务端的变量,建议禁止
SendEnv LANG LC_*
# 是否开启代理转发
ForwardAgent yes
# 是否开启TCP长连接
TCPKeepAlive yes
# 是否开启数据压缩
Compression yes
# 指定服务端健康检查的时间周期,单位秒
ServerAliveInterval 60
# 指定服务端健康检查的最大失败次数,超过此设置则断开连接
ServerAliveCountMax 3
# 是否开启连接共享,即使用socket通过单个网络连接共享多个会话,默认为no
ControlMaster auto
# 指定用于连接共享的socket文件路径
ControlPath ~/.ssh/%h-%p-%r
# 指定连接共享的保持时间,超过此设置则断开连接并删除socket文件,默认为no
ControlPersist 1h

客户端配置实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 系统配置文件
$ cat /etc/ssh/ssh_config
Include /etc/ssh/ssh_config.d/*.conf
Host *
HashKnownHosts yes

# 用户配置文件
$ cat ~/.ssh/config
Host node11
HostName 192.168.80.11
Port 2233
User ops
Host *
Port 22
User ops
PreferredAuthentications publickey,keyboard-interactive,password
StrictHostKeyChecking no
IdentityFile ~/.ssh/id_rsa
HashKnownHosts yes
ForwardAgent yes
TCPKeepAlive yes
Compression yes
ConnectTimeout 10
ServerAliveInterval 60
ServerAliveCountMax 3

配置密钥认证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 生成密钥对
# -P 设置密码,-f 私钥路径,-C 注释
$ ssh-keygen -q -t rsa -b 2048 -P '' -f ~/.ssh/id_rsa -C 'comment'

# 发送公钥到服务器
# 自动上传-推荐,需要输入服务器的用户名和密码
# -p ssh端口,默认端口22可省略-p选项,-i 公钥路径
$ ssh-copy-id [-p 2233] -i ~/.ssh/id_rsa.pub username@servername

# 手动粘贴,需要手动创建并更改文件权限
# 使用用户名和密码登录到服务器
$ ssh username@servername
# 创建并设置'~/.ssh'目录权限为700
$ mkdir ~/.ssh && chmod 700 ~/.ssh
# 创建并设置'authorized_keys'文件权限为600
$ touch ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys
# 粘贴公钥内容
$ vim ~/.ssh/authorized_keys

# 本地测试登录
$ ssh username@servername