0%

SSH

记录SSH 非对称加密身份验证,是目前使用较多的主机间连接方式

SSH百科

Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。SSH通过在网络中建立安全隧道来实现SSH客户端与服务器之间的连接。虽然任何网络服务都可以通过SSH实现安全传输,SSH最常见的用途是远程登录系统,人们通常利用SSH来传输命令行界面和远程执行命令。

SSH以非对称加密实现身份验证。身份验证有多种途径,例如其中一种方法是使用自动生成的公钥-私钥对来简单地加密网络连接,随后使用密码认证进行登录;另一种方法是人工生成一对公钥和私钥,通过生成的密钥进行认证,这样就可以在不输入密码的情况下登录。任何人都可以自行生成密钥。公钥需要放在待访问的电脑之中,而对应的私钥需要由用户自行保管。认证过程基于生成出来的私钥,但整个认证过程中私钥本身不会传输到网络中。

SSH相关命令

生成钥匙对

使用ssh-keygen命令即可生成钥匙对

普通用户

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root ~]# ssh-keygen                                         # 命令
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa): # 输入钥匙对位置和名称,默认位置~/.ssh/.id_rsa,没有特殊要求回车即可
Enter passphrase (empty for no passphrase): # 输入密码,默认为空,回车即可
Enter same passphrase again: # 再次输入刚刚密码
Your identification has been saved in /root/.ssh/id_rsa.
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:WXeXTXqe31ROBDvhyvQg3GmG6LhvPlj3fN4lPsjhqzU root@instance-92souhhl
The key's randomart image is:
+---[RSA 2048]----+
| o.o|
| o o o *o|
| . = O *.*|
| o o B = Bo|
| . S o ..+|
| .. . . .o|
| .o . =Eo. +|
| ..o .*ooo.|
| oo....+o..|
+----[SHA256]-----+

按照上面的流程走过后,会在~/.ssh/目录下出现两个文件,分别是id_rsaid_rsa.pub

这两个文件一个是私钥,一个是公钥,从名称上也能区别开,带有pub后缀的是公钥,没有后缀的私钥。

之后将公钥放置到你想要连接的主机里,自己主机留着私钥,即可使用ssh连接了。公钥想当于锁子,私钥相当于钥匙,你把锁子给别人,你自己拿着钥匙,就可以轻易开启锁子了,这把锁子,也就是公钥,可以给许多个人,也就是许多台主机,钥匙也就是私钥一般不给别人,这样就可以做到自己的主机可以连接好多台主机。

为了安全和管理更方便

上面的方式生成钥匙对简单快速,但是存在一些问题,当你需要连接的主机很多之后,你一直用默认的钥匙对,就会带来管理上的不方便,你的公钥分布于GitHub、云服务器、甚至是自己的虚拟机,如果想要定期更换钥匙对,就会带来极大的不方便,换了GitHub的钥匙对之后,其他的主机也要跟着换,应为你只有一个默认钥匙对;同时,只有一个默认钥匙对也是及其不安全的,当你的私钥泄漏后,那么你所有拥有公钥的主机都将敞开大门。因此,从这两个角度出发,必须为不同的主机或者不同类别的主机设置不同的钥匙对。

1
2
3
4
[root ~]# ssh-keygen  -f ~/.ssh/baiduyun  -C "百度云服务器"         

-f:指定文件位置,也可不加此参数,在命令提示中输入文件位置
-C:备注信息

对于不同类型的主机,分别生成各自的钥匙对,既安全又方便管理

放置公钥

生成钥匙对后,就可以将公钥放置到需要连接的主机了,接下来称此主机为目标主机。

手工放置

找到自己的公钥,将里面的内容全部复制,粘贴到目标主机的~/.ssh/authorized_keys文件中(如果目标主机更改过配置文件,那就另当别论)

使用命令放置

手工放置操作起来有些繁琐,其实ssh提供了一条命令可以自动放置到目标主机,那就是ssh-copy-id,具体使用如下:

1
2
3
[root ~]# ssh-copy-id -i ~/.ssh/baiduyun.pub user@ip  

-i:指定公钥文件,如果不加此参数,将会把默认的公钥放置到目标主机中

使用SSH 连接

普通连接

一切就绪后,就可以使用SSH 进行连接了

1
2
3
[root ~]# ssh -i ~/.ssh/baiduyun user@ip  

-i:指定私钥文件,如果不加此参数,将会使用默认的私钥

首次连接将会提示指纹信息,这步是严格的KEY 检查,输入yes即可连接成功,之后再使用ssh连接就可以直接连上了

通过代理连接

配合使用nc命令连接远端主机

1
[root ~]# ssh -o ProxyCommand="nc -X 5 -x 127.0.0.1:1080 %h %p" user@ip

也可将其写入~/.ssh/config文件中,不用每次输入这么长的命令

SSH 配置文件

SSH 的配置文件有两个,一个是服务器的,另一个是客户端的,都在/etc/ssh/ 目录下

服务器端配置文件 /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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#       $OpenBSD: sshd_config,v 1.100 2016/08/15 12:32:04 naddy Exp $

# This is the sshd server system-wide configuration file. See
# sshd_config(5) for more information.

# This sshd was compiled with PATH=/usr/local/bin:/usr/bin

# The strategy used for options in the default sshd_config shipped with
# OpenSSH is to specify options with their default value where
# possible, but leave them commented. Uncommented options override the
# default value.

# If you want to change the port on a SELinux system, you have to tell
# SELinux about this change.
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#
#Port 22 服务器端默认端口为22,如果需要可以改为其他端口,更加安全
#AddressFamily any
#ListenAddress 0.0.0.0 服务器端档绑定的IP地址,如果有多个网卡或出现不同的IP地址,可以设置为其中的一块网卡,0.0.0.0表示全部
#ListenAddress ::

HostKey /etc/ssh/ssh_host_rsa_key 这四条是服务器端私钥档案
#HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
HostKey /etc/ssh/ssh_host_ed25519_key

# Ciphers and keying
#RekeyLimit default none

# Logging 日志记录
#SyslogFacility AUTH
SyslogFacility AUTHPRIV SyslogFacility用来设定在记录来自sshd的消息的时候,是否给出“facility code”
#LogLevel INFO 日志级别为INFO

# Authentication:

#LoginGraceTime 2m 客户端用户认证时间,默认为120s,0为无限制
PermitRootLogin yes 是否允许Root 用户通过ssh 登陆
#StrictModes yes StrictModes用来设置ssh在接收登录请求之前是否检查用户根目录和rhosts文件的权限和所有权,建议开启
#MaxAuthTries 6 最大尝试次数,默认为6
#MaxSessions 10 最大ssh 客户端连接个数,默认为10

PubkeyAuthentication yes PubkeyAuthentication用来设置是否开启公钥验证,如果使用公钥验证的方式登录时,则设置为yes


# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
# but this is overridden so installations will only check .ssh/authorized_keys
#AuthorizedKeysFile .ssh/authorized_keys AuthorizedKeysFile用来设置公钥验证文件的路径,与PubkeyAuthentication配合使用,默认值是".ssh/authorized_keys"

#AuthorizedPrincipalsFile none

#AuthorizedKeysCommand none
#AuthorizedKeysCommandUser nobody

下面这7行是关于首次连接添加到known_hosts文件的配置
# For this to work you will also need host keys in /etc/ssh/ssh_known_hosts
#HostbasedAuthentication no
# Change to yes if you don't trust ~/.ssh/known_hosts for
# HostbasedAuthentication
#IgnoreUserKnownHosts no
# Don't read the user's ~/.rhosts and ~/.shosts files
#IgnoreRhosts yes

# To disable tunneled clear text passwords, change to no here!
#PasswordAuthentication yes 是否允许密码登陆,建议配置好ssh后关闭此选项
#PermitEmptyPasswords no 是否允许空密码登陆

# Change to no to disable s/key passwords
#ChallengeResponseAuthentication yes 设置禁用s/key 密码

下面6行关于Kerberos有关的设定
# Kerberos options
#KerberosAuthentication no
#KerberosOrLocalPasswd yes
#KerberosTicketCleanup yes
#KerberosGetAFSToken no
#KerberosUseKuserok yes

下面6行关于GSSAPI有关的设定
# GSSAPI options
GSSAPIAuthentication yes
GSSAPICleanupCredentials no
#GSSAPIStrictAcceptorCheck yes
#GSSAPIKeyExchange no
#GSSAPIEnablek5users no

# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
# be allowed through the ChallengeResponseAuthentication and
# PasswordAuthentication. Depending on your PAM configuration,
# PAM authentication via ChallengeResponseAuthentication may bypass
# the setting of "PermitRootLogin without-password".
# If you just want the PAM account and session checks to run without
# PAM authentication, then enable this but set PasswordAuthentication
# and ChallengeResponseAuthentication to 'no'.
# WARNING: 'UsePAM no' is not supported in Red Hat Enterprise Linux and may cause several
# problems.
UsePAM yes

#AllowAgentForwarding yes
#AllowTcpForwarding yes
#GatewayPorts no
X11Forwarding yes 是否允许X11转发
#X11DisplayOffset 10 指定X11 转发的第一个可用的显示区(display)数字。默认值是 10
#X11UseLocalhost yes
#PermitTTY yes
#PrintMotd yes PrintMotd用来设置sshd是否在用户登录时显示“/etc/motd”中的信息,可以选在在“/etc/motd”中加入警告的信息
#PrintLastLog yes PrintLastLog 是否显示上次登录信息
#TCPKeepAlive yes 是否持续连接,设置yes可以防止死连接,这种消息可以检测到死连接、连接不当关闭、客户端崩溃等异常。在这个情况下,任何一端死掉后, SSH 可以立刻知道,而不会有僵尸程序的发生!
#UseLogin no 是否在交互式会话的登录过程中使用,如果开启此指令,那么X11Forwarding将会被禁止,因为login不知道如何处理 xauth cookies。需要注意的是,在SSH底下本来就不接受 login这个程序的登入,如果指UsePrivilegeSeparation ,那么它将在认证完成后被禁用。
#UsePrivilegeSeparation sandbox 客户端权限
#PermitUserEnvironment no
#Compression delayed
#ClientAliveInterval 0
#ClientAliveCountMax 3
#ShowPatchLevel no
#UseDNS yes 是否使用dns反向解析
#PidFile /var/run/sshd.pid 进程号所在文件
#MaxStartups 10:30:100 设置同时允许几个尚未登入的联机,当用户连上ssh但并未输入密码即为所谓的联机,而已经建立联机的不计算入内,这个设置可以防止恶意对服务器进行连接
#PermitTunnel no
#ChrootDirectory none
#VersionAddendum none

# no default banner path
#Banner none

# Accept locale-related environment variables
AcceptEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
AcceptEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
AcceptEnv LC_IDENTIFICATION LC_ALL LANGUAGE
AcceptEnv XMODIFIERS

# override default of no subsystems
Subsystem sftp /usr/libexec/openssh/sftp-server

# Example of overriding settings on a per-user basis
#Match User anoncvs
# X11Forwarding no
# AllowTcpForwarding no
# PermitTTY no
# ForceCommand cvs server

配置文件需要改动的可能就是:是否Root用户登陆、是否开启RSA验证、是否持久连接、最大连接数、最大未登入连接数

设置完成后,必须重启SSH服务以使更改生效:

1
[root ~]# service sshd restart

客户端系统配置文件 /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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#       $OpenBSD: ssh_config,v 1.30 2016/02/20 23:06:23 sobrado Exp $

# This is the ssh client system-wide configuration file. See
# ssh_config(5) for more information. This file provides defaults for
# users, and the values can be changed in per-user configuration files
# or on the command line.

# Configuration data is parsed as follows:
# 1. command line options
# 2. user-specific file
# 3. system-wide file
# Any configuration value is only changed the first time it is set.
# Thus, host-specific definitions should be at the beginning of the
# configuration file, and defaults at the end.

# Site-wide defaults for some commonly used options. For a comprehensive
# list of available options, their meanings and defaults, please see the
# ssh_confg(5) man page.

# Host *
# ForwardAgent no 连接是否经过验证代理(如果存在)转发给远程计算机
# ForwardX11 no X11连接是否被自动重定向到安全的通道和显示集(DISPLAY set)
# RhostsRSAAuthentication no 是否使用基于rhosts的安全验证
# RSAAuthentication yes 是否使用RSA算法进行安全验证
# PasswordAuthentication yes 是否使用口令验证
# HostbasedAuthentication no 是否使用基于Host的安全验证
# GSSAPIAuthentication no
# GSSAPIDelegateCredentials no
# GSSAPIKeyExchange no
# GSSAPITrustDNS no
# BatchMode no 批处理模式,一般设为"no";如果设为"yes",交互式输入口令的提示将被禁止,这个选项对脚本文件和批处理任务十分有用
# CheckHostIP yes 设置ssh是否查看连接到服务器的主机的IP地址以防止DNS欺骗。建议设置为"yes"。
# AddressFamily any
# ConnectTimeout 0
# StrictHostKeyChecking ask 如果设为"yes",ssh将不会自动把计算机的密匙加入"$HOME/.ssh/known_hosts"文件,且一旦计算机的密匙发生了变化,就拒绝连接
# IdentityFile ~/.ssh/identity 设置读取用户的RSA安全验证标识
# IdentityFile ~/.ssh/id_rsa
# IdentityFile ~/.ssh/id_dsa
# IdentityFile ~/.ssh/id_ecdsa
# IdentityFile ~/.ssh/id_ed25519
# Port 22
# Protocol 2
# Cipher 3des
# Ciphers aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc
# MACs hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160
# EscapeChar ~
# Tunnel no
# TunnelDevice any:any
# PermitLocalCommand no
# VisualHostKey no
# ProxyCommand ssh -q -W %h:%p gateway.example.com
# RekeyLimit 1G 1h
#
# Uncomment this if you want to use .local domain
# Host *.local
# CheckHostIP no

Host *
GSSAPIAuthentication yes
# If this option is set to yes then remote X11 clients will have full access
# to the original X11 display. As virtually no X11 client supports the untrusted
# mode correctly we set this to yes.
ForwardX11Trusted yes
# Send locale-related environment variables
SendEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
SendEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
SendEnv LC_IDENTIFICATION LC_ALL LANGUAGE
SendEnv XMODIFIERSi

客户端配置文件通常只改动:RSA安全验证文件位置等

客户端用户配置文件 ~/.ssh/config

这个文件是客户端用户配置文件,需要自己生成,可以对不同域名指定密钥文件,例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
HOST *
ServerAliveInterval 20


Host github.com 指定GitHub的密钥文件
User MinuteSheep
PreferredAuthentications publickey
IdentityFile ~/.ssh/github

Host 111.22.33.44 指定百度云服务器的密钥文件
User root
PreferredAuthentications publickey
IdentityFile ~/.ssh/baiduyun

参考资料

[1] Secure Shell,wiki
[2] SSH远程登录配置文件sshd_config详解,csdn
[3] Linux启动或禁止SSH用户及IP的登录,csdn
[4] linux ssh_config和sshd_config配置文件,博客园