SSH工作原理&Ubuntu20.04安装并配置SSH&设置SSH免密登录

2023-11-17

目录

一、SSH的介绍(服务器端,客户端)

1、SSH(远程连接工具)连接原理:

2、SSH的安全机制

3、两种级别的验证方法(登录方法)

二、ssh的安装与启动

1、安装

2、启动服务器的SSH服务

三、SSH客户端

1、前置知识

2、口令登录

1)、登录命令

2)、验证过程

3)、登录失败:1、服务器变更 + 2、服务器IP变化

4)、配置文件(一般不需要配置服务器端)

5)可选的配置选项

四、服务器端(Ubuntu)

1.前置知识

2.配置文件

3.密钥

4.可选命令

5.可用配置项

参考文献:


一、SSH的介绍(服务器端,客户端)

1、SSH(远程连接工具)连接原理:

        ssh服务是一个守护进程(demon),系统后台监听客户端的连接,ssh服务端的进程名为sshd,负责实时监听客户端的请求(IP 22端口),包括公共秘钥等交换等信息。

        ssh服务由2部分组成: openssh(提供ssh服务)    openssl(提供加密的程序);如果你只是想登陆别的机器的SSH只需要安装openssh-client(ubuntu有默认安装,如果没有则sudoapt-get install openssh-client),如果要使本机开放SSH服务就需要安装openssh-server。

Ubuntu/win10(powershell)缺省已经安装了ssh client。

        ssh的客户端可以用 XSHELL,Securecrt, Mobaxterm等工具进行连接

2、SSH的安全机制

SSH之所以能够保证安全,原因在于它采用了公钥加密。

整个过程是这样的:(1)远程主机收到用户的登录请求,把自己的公钥发给用户。(2)用户使用这个公钥,将登录密码加密后,发送回来。(3)远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录。

这个过程本身是安全的,但是实施的时候存在一个风险:如果有人截获了登录请求,然后冒充远程主机,将伪造的公钥发给用户,那么用户很难辨别真伪。因为不像https协议,SSH协议的公钥是没有证书中心(CA)公证的,也就是说,都是自己签发的。

可以设想,如果攻击者插在用户与远程主机之间(比如在公共的wifi区域),用伪造的公钥,获取用户的登录密码。再用这个密码登录远程主机,那么SSH的安全机制就荡然无存了。这种风险就是著名的"中间人攻击"(Man-in-the-middle attack)。

SSH协议是如何应对的呢?

3、两种级别的验证方法(登录方法)

        但并不是说SSH就是绝对安全的,因为它本身提供两种级别的验证方法:

        第一种级别(基于口令的安全验证):只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人攻击”这种方式的攻击。

        第二种级别(基于密钥的安全验证):你必须为自己创建一对密钥,并把公钥放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密钥进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公钥,然后把它和你发送过来的公钥进行比较。如果两个密钥一致,服务器就用公钥加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私钥在本地解密再把它发送给服务器完成登录。与第一种级别相比,第二种级别不仅加密所有传输的数据,也不需要在网络上传送口令,因此安全性更高,可以有效防止中间人攻击。

二、ssh的安装与启动

1、安装

        SSH分为客户端 openssh-client 和服务器 openssh-server,可以利用以下命令确认电脑上是否安装了客户端和服务器。

dpkg -l | grep ssh

        如果只是想远程登陆别的机器只需要安装客户端(Ubuntu默认安装了客户端),如果要开放本机的SSH服务就需要安装服务器。

sudo apt update        #更新数据
sudo apt upgrade        #更新软件
sudo apt install openssh-server  #下载安装ssh服务的服务器
sudo apt install openssh-client  #下载安装ssh服务的客户端

# 上面命令下载失败可以使用下面的命令尝试下载
sudo apt-get install openssh-client 
sudo apt-get install openssh-server 

这里给出的是ubuntu安装命令,其它系统请参考具体的安装命令

windows一般自带ssh客户端,如果没有可以参照以下官方文档教程进行安装
在这里插入图片描述

2、启动服务器的SSH服务

首先确认ssh-server是否已经启动了

ps -e | grep ssh


如图,sshd 表示ssh-server已经启动了。如果没有启动,可以使用如下命令启动:

sudo /etc/init.d/ssh start 


停止和重启ssh服务的命令如下:

sudo /etc/init.d/ssh stop  #server停止ssh服务 
sudo /etc/init.d/ssh restart  #server重启ssh服务


接下来就可以进行使用客户机远程登录服务器了~
 

三、SSH客户端

1、前置知识

位置:

ubuntu 系统的位置是/usr/bin/ssh。
Windows系统的位置是C:\Program Files\OpenSSH-Win64\ssh.exe

用法:

客户端ssh 最常见的用途就是登录服务器,这要求服务器安装并正在运行 SSH 服务器软件。

2、口令登录

1)、登录命令

口令登录非常简单,只需要一条命令,命令格式为: ssh 客户端用户名@服务器ip地址  eg:

ssh lee@IP(服务器的username和IP)

如果需要调用图形界面程序可以使用 -X 选项

ssh -X lee@192.168.52.144

如果客户机的用户名和服务器的用户名相同,登录时可以省略用户名。

ssh 192.168.52.1

还要说明的是,SSH服务的默认端口是22,也就是说,如果你不设置端口的话登录请求会自动送到远程主机的22端口。我们可以使用 -p 选项来修改端口号,比如连接到服务器的1234端口:

ssh -p 1234 lee@192.168.52.1

客户机必须要知道服务器的ip地址。可以在服务器端电脑上利用 ifconfig 命令查看该机的ip地址:

2)、验证过程

ssh 连接远程服务器后,首先有一个验证过程,验证远程服务器是否为陌生地址。如果是第一次登录远程主机,系统会给出下面提示:

上面这段文字告诉用户,这台服务器的指纹是陌生的,让用户选择是否要继续连接(输入 yes 或 no)。所谓“服务器指纹”,指的是 SSH 服务器公钥的哈希值。每台 SSH 服务器都有唯一一对密钥,用于跟客户端通信,其中公钥的哈希值就可以用来识别服务器。

下面的命令可以查看某个公钥的指纹。

ssh-keygen -l -f /etc/ssh/ssh_host_ecdsa_key.pub

上面的例子中,ssh-keygen -l -f命令会输出公钥/etc/ssh/ssh_host_ecdsa_key.pub的指纹。

        ssh 会将本机连接过的所有服务器公钥的指纹,都储存在本机的~/.ssh/known_hosts文件中。每次连接服务器时,通过该文件判断是否为陌生主机(陌生公钥)。

        上面输入yes即可。这时系统会提示远程主机被添加到已知主机列表,即本机的~/.ssh/known_hosts文件中。

然后会要求我们输入远程主机的密码,输入的密码正确就可以成功登录了。命令提示符会修改为远程主机的提示符,现在开始,终端中输入的命令都将在服务器中执行。

我们可以通过 Ctrl+D 或者 exit 命令退出远程登录。
 

3)、登录失败:1、服务器变更 + 2、服务器IP变化

        服务器指纹可以防止有人恶意冒充远程主机。如果服务器的密钥发生变更(比如重装了 SSH 服务器),客户端再次连接时,就会发生公钥指纹不吻合的情况。这时,客户端就会中断连接,并显示一段警告信息。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
77:a5:69:81:9b:eb:40:76:7b:13:04:a9:6c:f4:9c:5d.
Please contact your system administrator.
Add correct host key in /home/me/.ssh/known_hosts to get rid of this message.
Offending key in /home/me/.ssh/known_hosts:36

        上面这段文字的意思是,该主机的公钥指纹跟~/.ssh/known_hosts文件储存的不一样,必须处理以后才能连接。这时,你需要确认是什么原因,使得公钥指纹发生变更,到底是恶意劫持,还是管理员变更了 SSH 服务器公钥。

        如果新的公钥确认可以信任,需要继续执行连接,你可以执行下面的命令,将原来的公钥指纹从~/.ssh/known_hosts文件删除。

ssh-keygen -R hostname

上面命令中,hostname是发生公钥变更的主机名。

除了使用上面的命令,你也可以手工修改known_hosts文件,将公钥指纹删除。

删除了原来的公钥指纹以后,重新执行 ssh 命令连接远程服务器,将新的指纹加入known_hosts文件,就可以顺利连接了。

4)、配置文件(一般不需要配置服务器端)
 

文件位置:

        SSH 客户端的全局配置文件是/etc/ssh/ssh_config,用户个人的配置文件在~/.ssh/config,优先级高于全局配置文件。

        除了配置文件,~/.ssh目录还有一些用户个人的密钥文件和其他文件。下面是其中一些常见的文件。

~/.ssh/id_ecdsa:用户的 ECDSA 私钥。
~/.ssh/id_ecdsa.pub:用户的 ECDSA 公钥。

~/.ssh/id_rsa:用于 SSH 协议版本2 的 RSA 私钥。
~/.ssh/id_rsa.pub:用于SSH 协议版本2 的 RSA 公钥

~/.ssh/identity:用于 SSH 协议版本1 的 RSA 私钥。
~/.ssh/identity.pub:用于 SSH 协议版本1 的 RSA 公钥。
~/.ssh/known_hosts:包含 SSH 服务器的公钥指纹。


配置主机:(一般不配置)

用户个人的配置文件~/.ssh/config,可以按照不同服务器,列出各自的连接参数,从而不必每一次登录都输入重复的参数。下面是一个例子。

Host *
     Port 2222

Host remoteserver
     HostName remote.example.com
     User neo
     Port 2112

上面代码中,Host *表示对所有主机生效,后面的Port 2222表示所有主机的默认连接端口都是2222,这样就不用在登录时特别指定端口了。这里的缩进并不是必需的,只是为了视觉上,易于识别针对不同主机的设置。

后面的Host remoteserver表示,下面的设置只对主机remoteserver生效。remoteserver只是一个别名,具体的主机由HostName命令指定,User和Port这两项分别表示用户名和端口。这里的Port会覆盖上面Host *部分的Port设置。

以后,登录remote.example.com时,只要执行ssh remoteserver命令,就会自动套用 config 文件里面指定的参数。 单个主机的配置格式如下。
 

ssh remoteserver

等同于

ssh -p 2112 neo@remote.example.com

Host命令的值可以使用通配符,比如Host *表示对所有主机都有效的设置,Host *.edu表示只对一级域名为.edu的主机有效的设置。它们的设置都可以被单个主机的设置覆盖。

5)可选的配置选项

AddressFamily inet:表示只使用 IPv4 协议。如果设为inet6,表示只使用 IPv6 协议。

BindAddress 192.168.10.235:指定本机的 IP 地址(如果本机有多个 IP 地址)。

CheckHostIP yes:检查 SSH 服务器的 IP 地址是否跟公钥数据库吻合。

Ciphers blowfish,3des:指定加密算法。

Compression yes:是否压缩传输信号。

ConnectionAttempts 10:客户端进行连接时,最大的尝试次数。

ConnectTimeout 60:客户端进行连接时,服务器在指定秒数内没有回复,则中断连接尝试。

DynamicForward 1080:指定动态转发端口。

GlobalKnownHostsFile /users/smith/.ssh/my_global_hosts_file:指定全局的公钥数据库文件的位置。

Host server.example.com:指定连接的域名或 IP 地址,也可以是别名,支持通配符。Host命令后面的所有配置,都是针对该主机的,直到下一个Host命令为止。

HostKeyAlgorithms ssh-dss,ssh-rsa:指定密钥算法,优先级从高到低排

HostName myserver.example.com:在Host命令使用别名的情况下,HostName指定域名或 IP 地址。

IdentityFile keyfile:指定私钥文件。

LocalForward 2001 localhost:143:指定本地端口转发。

LogLevel QUIET:指定日志详细程度。如果设为QUIET,将不输出大部分的警告和提示。

MACs hmac-sha1,hmac-md5:指定数据校验算法。

NumberOfPasswordPrompts 2:密码登录时,用户输错密码的最大尝试次数。

PasswordAuthentication no:指定是否支持密码登录。不过,这里只是客户端禁止,真正的禁止需要在 SSH 服务器设置。

Port 2035:指定客户端连接的 SSH 服务器端口。

PreferredAuthentications publickey,hostbased,password:指定各种登录方法的优先级。

Protocol 2:支持的 SSH 协议版本,多个版本之间使用逗号分隔。

PubKeyAuthentication yes:是否支持密钥登录。这里只是客户端设置,还需要在SSH 服务器进行相应设置。

RemoteForward 2001 server:143:指定远程端口转发。

SendEnv COLOR:SSH 客户端向服务器发送的环境变量名,多个环境变量之间使用空格分隔。环境变量的值从客户端当前环境中拷贝。

ServerAliveCountMax 3:如果没有收到服务器的回应,客户端连续发送多少次keepalive信号,才断开连接。该项默认值为3。

ServerAliveInterval 300:客户端建立连接后,如果在给定秒数内,没有收到服务器发来的消息,客户端向服务器发送keepalive消息。如果不希望客户端发送,这一项设为0。

StrictHostKeyChecking yes:yes表示严格检查,服务器公钥为未知或发生变化,则拒绝连接。no表示如果服务器公钥未知,则加入客户端公钥数据库,如果公钥发生变化,不改变客户端公钥数据库,输出一条警告,依然允许连接继续进行。ask(默认值)表示询问用户是否继续进行。

TCPKeepAlive yes:客户端是否定期向服务器发送keepalive信息。

User userName:指定远程登录的账户名。

UserKnownHostsFile /users/smith/.ssh/my_local_hosts_file:指定当前用户的known_hosts文件(服务器公钥指纹列表)的位置。

VerifyHostKeyDNS yes:是否通过检查 SSH 服务器的 DNS 记录,确认公钥指纹是否与known_hosts文件保存的一致。
 


 

四、服务器端(Ubuntu)

1.前置知识

简介:

SSH 的架构是服务器/客户端模式,两端运行的软件是不一样的。OpenSSH 的客户端软件是 ssh,服务器软件是 sshd。

sshd

上面的命令运行后,如果提示“sshd re-exec requires execution with an absolute path”,就需要使用绝对路径来启动。这是为了防止有人出于各种目的,放置同名软件在$PATH变量指向的目录中,代替真正的 sshd。

可以使用以下命令查找位置

whereis sshd

# sshd: /usr/sbin/sshd #返回的结果

然后进行使用:

 /usr/sbin/sshd
启动:
sudo service ssh start

重启:
sudo service ssh restart

停止:
sudo service ssh stop

下面的命令让 sshd 在计算机下次启动时自动运行。
sudo systemctl enable sshd.service

2.配置文件

sshd 的配置文件在/etc/ssh目录,主配置文件是sshd_config,此外还有一些安装时生成的密钥。

/etc/ssh/sshd_config:配置文件
/etc/ssh/ssh_host_ecdsa_key:ECDSA 私钥。
/etc/ssh/ssh_host_ecdsa_key.pub:ECDSA 公钥。
/etc/ssh/ssh_host_key:用于 SSH 1 协议版本的 RSA 私钥。
/etc/ssh/ssh_host_key.pub:用于 SSH 1 协议版本的 RSA 公钥。
/etc/ssh/ssh_host_rsa_key:用于 SSH 2 协议版本的 RSA 私钥。
/etc/ssh/ssh_host_rsa_key.pub:用于 SSH 2 协议版本的 RSA 公钥。

/etc/pam.d/sshd:PAM 配置文件。

        注意,如果重装 sshd,上面这些密钥都会重新生成,导致客户端重新 ssh 连接服务器时,会跳出警告,拒绝连接。为了避免这种情况,可以在重装 sshd 时,先备份/etc/ssh目录,重装后再恢复这个目录。

        配置文件sshd_config的格式是,每个命令占据一行。每行都是配置项和对应的值,配置项的大小写不敏感,与值之间使用空格分隔。

Port 2034
Port = 2034

上面的配置命令指定,配置项Port的值是2034。Port写成port也可。

配置文件还有另一种格式,就是配置项与值之间有一个等号,等号前后的空格可选。

配置文件里面,#开头的行表示注释。注意,注释只能放在一行的开头,不能放在一行的结尾。

Port 2034 # 此处不允许注释

上面的写法是错误的。另外,空行等同于注释。

        sshd 启动时会自动读取默认的配置文件。如果希望使用其他的配置文件,可以用 sshd 命令的-f参数指定。

sshd -f /usr/local/ssh/my_config

上面的命令指定 sshd 使用另一个配置文件my_config。

修改配置文件以后,可以用 sshd 命令的-t(test)检查有没有语法错误。

 sshd -t

配置文件修改以后,并不会自动生效,必须重新启动 sshd。

sudo service ssh restart 

3.密钥

sshd 有自己的一对或多对密钥。它使用密钥向客户端证明自己的身份。所有密钥都是公钥和私钥成对出现,公钥的文件名一般是私钥文件名加上后缀.pub。

DSA 格式的密钥文件默认为/etc/ssh/ssh_host_dsa_key(公钥为ssh_host_dsa_key.pub),RSA 格式的密钥为/etc/ssh/ssh_host_rsa_key(公钥为ssh_host_rsa_key.pub)。如果需要支持 SSH 1 协议,则必须有密钥/etc/ssh/ssh_host_key。

如果密钥不是默认文件,那么可以通过配置文件sshd_config的HostKey配置项指定。默认密钥的HostKey设置如下。
 

# HostKey for protocol version 1
# HostKey /etc/ssh/ssh_host_key

# HostKeys for protocol version 2
# HostKey /etc/ssh/ssh_host_rsa_key
# HostKey /etc/ssh/ssh_host_dsa_ke

上面命令前面的#表示这些行都是注释,因为这是默认值,有没有这几行都一样。

如果要修改密钥,就要去掉行首的#,指定其他密钥。

HostKey /usr/local/ssh/my_dsa_key
HostKey /usr/local/ssh/my_rsa_key
HostKey /usr/local/ssh/my_old_ssh1_key

4.可选命令

sshd 命令有一些配置项。这些配置项在调用时指定,可以覆盖配置文件的设置。

注意,如果出现

sshd re-exec requires execution with an absolute path

就要用绝对路径代替

/usr/sbin/sshd -d

如果出现

sshd: no hostkeys available -- exiting.

可能是权限不够,添加sudo

sudo /usr/sbin/sshd -d

如果依旧不行,可执行一下以下命令:

sudo ssh-keygen -A

-d参数用于显示 debug 信息。

sshd -d

-D参数指定 sshd 不作为后台守护进程运行。

sshd -D

-e参数将 sshd 写入系统日志 syslog 的内容导向标准错误(standard error)。

-f参数指定配置文件的位置。

-h参数用于指定密钥。

sshd -h /usr/local/ssh/my_rsa_key

-o参数指定配置文件的一个配置项和对应的值。

sshd -o "Port 2034"

配置项和对应值之间,可以使用等号。

 sshd -o "Port = 2034"

如果省略等号前后的空格,也可以不使用引号。

 sshd -o Port=2034

-o参数可以多个一起使用,用来指定多个配置关键字。

-p参数指定 sshd 的服务端口。

sshd -p 2034

上面命令指定 sshd 在2034端口启动。

-p参数可以指定多个端口。

$ sshd -p 2222 -p 3333

-t参数检查配置文件的语法是否正确。

5.可用配置项

以下是/etc/ssh/sshd_config文件里面的配置项。

AcceptEnv

AcceptEnv指定允许接受客户端通过SendEnv命令发来的哪些环境变量,即允许客户端设置服务器的环境变量清单,变量名之间使用空格分隔(AcceptEnv PATH TERM)。

AllowGroups

AllowGroups指定允许登录的用户组(AllowGroups groupName,多个组之间用空格分隔。如果不使用该项,则允许所有用户组登录。

AllowUsers

AllowUsers指定允许登录的用户,用户名之间使用空格分隔(AllowUsers user1 user2),也可以使用多行AllowUsers命令指定,用户名支持使用通配符。如果不使用该项,则允许所有用户登录。该项也可以使用用户名@域名的格式(比如AllowUsers jones@example.com)。

AllowTcpForwarding

AllowTcpForwarding指定是否允许端口转发,默认值为yes(AllowTcpForwarding yes),local表示只允许本地端口转发,remote表示只允许远程端口转发。

AuthorizedKeysFile

AuthorizedKeysFile指定储存用户公钥的目录,默认是用户主目录的ssh/authorized_keys目录(AuthorizedKeysFile .ssh/authorized_keys)。

Banner

Banner指定用户登录后,sshd 向其展示的信息文件(Banner /usr/local/etc/warning.txt),默认不展示任何内容。

ChallengeResponseAuthentication

ChallengeResponseAuthentication指定是否使用“键盘交互”身份验证方案,默认值为yes(ChallengeResponseAuthentication yes)。

从理论上讲,“键盘交互”身份验证方案可以向用户询问多重问题,但是实践中,通常仅询问用户密码。如果要完全禁用基于密码的身份验证,请将PasswordAuthentication和ChallengeResponseAuthentication都设置为no。

Ciphers

Ciphers指定 sshd 可以接受的加密算法(Ciphers 3des-cbc),多个算法之间使用逗号分隔。

ClientAliveCountMax

ClientAliveCountMax指定建立连接后,客户端失去响应时,服务器尝试连接的次数(ClientAliveCountMax 8)。

ClientAliveInterval

ClientAliveInterval指定允许客户端发呆的时间,单位为秒(ClientAliveInterval 180)。如果这段时间里面,客户端没有发送任何信号,SSH 连接将关闭。

Compression

Compression指定客户端与服务器之间的数据传输是否压缩。默认值为yes(Compression yes)

DenyGroups

DenyGroups指定不允许登录的用户组(DenyGroups groupName)。

DenyUsers

DenyUsers指定不允许登录的用户(DenyUsers user1),用户名之间使用空格分隔,也可以使用多行DenyUsers命令指定。

FascistLogging

SSH 1 版本专用,指定日志输出全部 Debug 信息(FascistLogging yes)。

HostKey

HostKey指定 sshd 服务器的密钥,详见前文。

KeyRegenerationInterval

KeyRegenerationInterval指定 SSH 1 版本的密钥重新生成时间间隔,单位为秒,默认是3600秒(KeyRegenerationInterval 3600)。

ListenAddress

ListenAddress指定 sshd 监听的本机 IP 地址,即 sshd 启用的 IP 地址,默认是 0.0.0.0(ListenAddress 0.0.0.0)表示在本机所有网络接口启用。可以改成只在某个网络接口启用(比如ListenAddress 192.168.10.23),也可以指定某个域名启用(比如ListenAddress server.example.com)。

如果要监听多个指定的 IP 地址,可以使用多行ListenAddress命令。

ListenAddress 172.16.1.1
ListenAddress 192.168.0.1

LoginGraceTime

LoginGraceTime指定允许客户端登录时发呆的最长时间,比如用户迟迟不输入密码,连接就会自动断开,单位为秒(LoginGraceTime 60)。如果设为0,就表示没有限制。

LogLevel

LogLevel指定日志的详细程度,可能的值依次为QUIET、FATAL、ERROR、INFO、VERBOSE、DEBUG、DEBUG1、DEBUG2、DEBUG3,默认为INFO(LogLevel INFO)。

MACs

MACs指定sshd 可以接受的数据校验算法(MACs hmac-sha1),多个算法之间使用逗号分隔。

MaxAuthTries

MaxAuthTries指定允许 SSH 登录的最大尝试次数(MaxAuthTries 3),如果密码输入错误达到指定次数,SSH 连接将关闭。

MaxStartups

MaxStartups指定允许同时并发的 SSH 连接数量(MaxStartups)。如果设为0,就表示没有限制。

这个属性也可以设为A:B:C的形式,比如MaxStartups 10:50:20,表示如果达到10个并发连接,后面的连接将有50%的概率被拒绝;如果达到20个并发连接,则后面的连接将100%被拒绝。

PasswordAuthentication

PasswordAuthentication指定是否允许密码登录,默认值为yes(PasswordAuthentication yes),建议改成no(禁止密码登录,只允许密钥登录)。

PermitEmptyPasswords

PermitEmptyPasswords指定是否允许空密码登录,即用户的密码是否可以为空,默认为yes(PermitEmptyPasswords yes),建议改成no(禁止无密码登录)。

PermitRootLogin

PermitRootLogin指定是否允许根用户登录,默认为yes(PermitRootLogin yes),建议改成no(禁止根用户登录)。

还有一种写法是写成prohibit-password,表示 root 用户不能用密码登录,但是可以用密钥登录。

PermitRootLogin prohibit-password

PermitUserEnvironment

PermitUserEnvironment指定是否允许 sshd 加载客户端的/.ssh/environment文件和/.ssh/authorized_keys文件里面的environment= options环境变量设置。默认值为no(PermitUserEnvironment no)。

Port

Port指定 sshd 监听的端口,即客户端连接的端口,默认是22(Port 22)。出于安全考虑,可以改掉这个端口(比如Port 8822)。

配置文件可以使用多个Port命令,同时监听多个端口。

Port 22
Port 80
Port 443
Port 8080

上面的示例表示同时监听4个端口。

PrintMotd

PrintMotd指定用户登录后,是否向其展示系统的 motd(Message of the day)的信息文件/etc/motd。该文件用于通知所有用户一些重要事项,比如系统维护时间、安全问题等等。默认值为yes(PrintMotd yes),由于 Shell 一般会展示这个信息文件,所以这里可以改为no。

PrintLastLog

PrintLastLog指定是否打印上一次用户登录时间,默认值为yes(PrintLastLog yes)。

Protocol

Protocol指定 sshd 使用的协议。Protocol 1表示使用 SSH 1 协议,建议改成Protocol 2(使用 SSH 2 协议)。Protocol 2,1表示同时支持两个版本的协议。

PubKeyAuthentication

PubKeyAuthentication指定是否允许公钥登录,默认值为yes(PubKeyAuthentication yes)。

QuietMode

SSH 1 版本专用,指定日志只输出致命的错误信息(QuietMode yes)。

RSAAuthentication

RSAAuthentication指定允许 RSA 认证,默认值为yes(RSAAuthentication yes)。

ServerKeyBits

ServerKeyBits指定 SSH 1 版本的密钥重新生成时的位数,默认是768(ServerKeyBits 768)。

StrictModes

StrictModes指定 sshd 是否检查用户的一些重要文件和目录的权限。默认为yes(StrictModes yes),即对于用户的 SSH 配置文件、密钥文件和所在目录,SSH 要求拥有者必须是根用户或用户本人,用户组和其他人的写权限必须关闭。

SyslogFacility

SyslogFacility指定 Syslog 如何处理 sshd 的日志,默认是 Auth(SyslogFacility AUTH)。

TCPKeepAlive

TCPKeepAlive指定打开 sshd 跟客户端 TCP 连接的 keepalive 参数(TCPKeepAlive yes)。

UseDNS

UseDNS指定用户 SSH 登录一个域名时,服务器是否使用 DNS,确认该域名对应的 IP 地址包含本机(UseDNS yes)。打开该选项意义不大,而且如果 DNS 更新不及时,还有可能误判,建议关闭。

UseLogin

UseLogin指定用户认证内部是否使用/usr/bin/login替代 SSH 工具,默认为no(UseLogin no)。

UserPrivilegeSeparation

UserPrivilegeSeparation指定用户认证通过以后,使用另一个子线程处理用户权限相关的操作,这样有利于提高安全性。默认值为yes(UsePrivilegeSeparation yes)。

VerboseMode

SSH 2 版本专用,指定日志输出详细的 Debug 信息(VerboseMode yes)。

X11Forwarding

X11Forwarding指定是否打开 X window 的转发,默认值为 no(X11Forwarding no)。

修改配置文件以后,可以使用下面的命令验证,配置文件是否有语法错误。

sshd -t

新的配置文件生效,必须重启 sshd。

sudo service ssh restart

参考文献:

(29条消息) SSH简介及两种远程登录的方法_Jack LDZ的博客-CSDN博客_ssh@

(22条消息) ssh用法及命令_-柚子皮-的博客-CSDN博客_ssh命令

SSH原理与运用(一):远程登录 - 阮一峰的网络日志 (ruanyifeng.com)

SSH原理与运用(二):远程操作与端口转发 - 阮一峰的网络日志 (ruanyifeng.com)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SSH工作原理&Ubuntu20.04安装并配置SSH&设置SSH免密登录 的相关文章

  • Java时区混乱

    我正在运行 Tomcat 应用程序 并且需要显示一些时间值 不幸的是 时间快到了 还有一个小时的休息时间 我调查了一下 发现我的默认时区被设置为 sun util calendar ZoneInfo id GMT 08 00 offset
  • 打印本周星期一的日期(在 bash 中)

    我想获取本周星期一的 YYYYMMdd 格式的日期 例如 今天是 20110627 从明天到周日 我仍然想打印周一 今天 的日期 然后下周重复这个过程 monday date dmonday Y m d last monday date d
  • Linux下单个目录下文件过多会怎样?

    如果一个目录中有大约 1 000 000 个单独的文件 大部分大小为 100k 其中没有其他目录和文件 是否会以任何其他可能的方式降低效率或产生缺点 ARG MAX 会对此提出异议 例如 rm rf 在目录中时 会说 参数太多 想要执行某种
  • 当在 python linux 中执行命令 os.system() 时,在 python 中给出响应 yes/no

    考虑一个像这样的命令 yum install boto 当我在终端中执行时 要继续 会询问我是 否 我可以像这样用 python 回应它吗 os system yum install boto Next Yes 将通过相同的 python
  • Android SSH 示例代码

    我想创建一个 android 活动 用于与远程设备 通过 Wifi 建立 SSH 会话并在远程设备上执行一些 Linux 命令 任何人都可以获得一个快速 简短的示例 用于使用以下命令进行连接 身份验证和发送远程命令Trilead https
  • 安装 JDK 时出错:keytool 命令需要已安装的 proc fs (/proc)。 Linux 的 Windows 子系统

    我尝试在 Linux 的 Windows 子系统 Ubuntu 14 04 上安装 Oracle JDK 1 7 但出现以下错误 the keytool command requires a mounted proc fs proc Jav
  • Linux 中有没有一种轻量级的方法来获取当前进程数?

    我希望我的 基于 C C 的 程序显示一个数字指示器 指示本地系统上当前有多少个进程 将经常查询正在运行的进程数值 例如每秒一次 以更新我的显示 有没有一种轻量级的方法来获取该数字 显然我可以调用 ps ax wc l 但我不想强迫计算机生
  • 通过名称获取进程ID

    我想在 Linux 下获得一个给定其名称的进程 ID 有没有一种简单的方法可以做到这一点 我还没有在 C 上找到任何可以轻松使用的东西 如果追求 易于使用 char buf 512 FILE cmd pipe popen pidof s p
  • 虚拟内存澄清——大连续内存的分配

    我有一个应用程序 我必须在 Windows 上分配 使用运算符 new 相当大的内存空间 数百 MB 该应用程序是 32 位 我们现在不使用 64 位 即使在 64 位系统上也是如此 我启用了 LARGEADDRESSAWARE 链接器选项
  • 在 Linux 服务器上创建和编辑 MS-Word 文档?

    希望开发处理文档的服务器端应用程序 源文档大多是MS Word 2003 2007 即MS版本的Docx 希望服务器应用程序能够在linux或windows上运行 想知道在linux下读写MS Word文件最好的工具或库是什么 兼容性是最重
  • Linux 上的“软/硬 nofile”是什么意思

    当我尝试在RedHat EL5上安装软件时 我得到了错误 软 硬nofile的期望值是4096 而默认值是1024 我设法增加了这个数字 但我不知道参数是什么 他们指的是软链接和硬链接吗 我改变的方法是 a 修改 etc security
  • 为什么我的代码在编译用于分析 (-pg) 时在多线程下运行比在单线程下运行慢?

    我正在写一个光线追踪器 最近 我在程序中添加了线程 以利用 i5 四核上的附加内核 奇怪的是 应用程序的调试版本现在运行速度变慢 但优化后的构建运行速度比添加线程之前更快 我将 g pg 标志传递给 gcc 以进行调试构建 并将 O3 标志
  • X 按键/释放事件捕获,与焦点窗口无关

    我想记录所有传入的按键事件 无论哪个窗口处于焦点状态或指针位于何处 我编写了一个示例代码 它应该捕获当前焦点窗口的按键事件 include
  • PHP 日志文件颜色

    我正在编写一个 PHP 日志文件类 但我想为写入文件的行添加颜色 我遇到的问题是颜色也会改变终端的颜色 我想要实现的是仅更改写入日志文件的行的颜色 class logClass extends Singleton private funct
  • 在 MacO 和 Linux 上安装 win32com [重复]

    这个问题在这里已经有答案了 我的问题很简单 我可以安装吗win32com蟒蛇API pywin32特别是 在非 Windows 操作系统上 我一直在Mac上尝试多个版本pip install pywin32 都失败了 下面是一个例子 如果你
  • 在Linux中创建可执行文件

    我计划做的一件事是编写 非常简单的 Perl 脚本 并且我希望能够在不从终端显式调用 Perl 的情况下运行它们 我明白 要做到这一点 我需要授予他们执行权限 使用 chmod 执行此操作非常简单 但它似乎也是一个稍微费力的额外步骤 我想要
  • 路由是否会影响具有绑定源地址的套接字?

    假设我有两个网络接口 eth0有地址10 0 0 1 eth1有地址192 168 0 1 Using route or ip route add我已将其设置为路由 所有地址至eth0 1 2 3 4只为了eth1 所以数据包到1 2 3
  • 为什么“script”命令会生成 ^[ 和 ^M 字符以及如何使用 vim 搜索和替换删除它们?

    在linux上 使用bash shell 当我使用script命令时 生成的文件称为typescript 当我用 vim 打开该文件时 每一行都包含 M字符 并且有几行 由于我的彩色命令提示符 包含一个字符 我想用任何东西替换这些字符 从而
  • bash "&" 不打印 "[1]+ Done "

    我在 bashrc 中调用一个脚本来打印打开终端时收到的新消息数 我希望该调用在访问网络时是非阻塞的 有时需要几秒钟 这意味着我无法使用终端直到完成 但是如果我输入 mailcheck 在我的 bashrc 中 它工作正常 但然后打印一个空
  • 将 bash 脚本作为守护进程运行

    我有一个脚本 它每 X 次运行我的 PHP 脚本 bin bash while true do usr bin php f my script php echo Waiting sleep 3 done 我怎样才能将它作为守护进程启动 要从

随机推荐

  • 编程每日一题_C程序设计_两整型数据求和

    问题描述 Calculate a b 问题来源https zoj pintia cn problem sets 91827364500 problems Time Limit 2000 ms Memory Limit 65536 KB In
  • HTML5做移动开发一定要搞明白MPA 与 SPA 的差别

    用HTML5做WEB与移动开发一定要搞明白MPA 与 SPA 的差别 刚开始可能会不明白 为什么习惯pc端web app开发 会发现Sencha Touch这样的框架 用起来有点别扭 老在想那熟悉的多页面开发方式 却总也找不到实现的接口 也
  • Mac系统下Flutter安装教程

    一 下载Flutter 1 第一种方式git repo方式 执行下列命令下载最新的flutter代码 系统请先安装Git git clone b beta https github com flutter flutter git 2 第二种
  • 如何解决:ConnectionRefusedError: [WinError 10061] 由于目标计算机积极拒绝,无法连接。

    如何解决 ConnectionRefusedError WinError 10061 由于目标计算机积极拒绝 无法连接 在阅读 Python编程 从入门到实践 17 1 6时遇到了这个问题 项目场景 import requests url
  • spyglass使用教程

    spyglass使用教程 ic 爱好者的博客 CSDN博客
  • vivo手机计算机恢复出厂设置,vivo手机系统恢复出厂设置里面清除所有数据

    哎呀 手机怎么又卡了 完了这局农药又要输了 这个破手机 才用了一年就卡的不要不要的了 是时候要通过恢复出厂设置来解决了 但它真的能让我们的手机变流畅吗 什么是恢复出厂设置 顾名思义 恢复出厂设置就是将手机里所有的设置还原到最开始时的状态 就
  • [网络安全自学篇] 三.Burp Suite安装配置、Proxy基础用法及流量分析示例

    最近开始学习网络安全相关知识 接触了好多新术语 感觉自己要学习的东西太多 真是学无止境 也发现了好几个默默无闻写着博客 做着开源的大神 接下来系统分享一些网络安全的自学笔记 希望读者们喜欢 上一篇文章分享了Chrome浏览器保留密码功能渗透
  • vue的transition动画条上下跳动

    vue部分
  • Dynamics 365 DevOps CI/CD之ConfigurationData

    ConfigurationData如省市区 门店地址这种业务类型的数据 还有系统自定义过程中配置或开发涉及的参数 需要在系统间进行同步 此处CI用到了Power Platform Tool这个工具 这个也是可以在Azure DevOps的商
  • 进度条程序

    package progressbar import java awt BorderLayout import java awt Container import java awt Dimension import java util Ar
  • java中FileReader的使用

    package com test io01 import java io File import java io FileNotFoundException import java io FileReader import java io
  • TTreeNode编程思路

    导读 TTreeNode编程思路 本问以TreeView为例子讲述 其他的用到TTreeNodes的控件的编程思想如出一辙 TreeView由节点构成 建树通过对TreeView items属性进行操作 Items是一个TTreeNodes
  • Redis 配置文件最佳解析

    配置文件 https raw githubusercontent com redis redis 7 0 redis conf 通用模板 引入 include 用于引入其他配置文件 支持使用通配符 根据从上到下的顺序 读取配置项 对同一个配
  • 解决vite首次加载很慢的问题

    目录 vite很快吗 为什么说vite快 为什么说vite慢 解决方案 附加 vite很快吗 vite要比webpack快 是的 真的很快 但个人感受 默认情况下 vite项目的启动确实比webpack快 但如果某个界面是首次进入 且依赖比
  • LaTex希腊字母大全

    小写字母 LaTex指令 大写字母 LaTex指令 alpha alpha A A
  • MySql修改主键字段

    一 应用实例 去除原来的主键字段的主键 ALTER TABLE mdm customer DROP PRIMARY KEY 新增字段并设置为主键 ALTER TABLE mdm customer ADD ID int 32 PRIMARY
  • 【图像处理】数码相机工作原理完整解析

    在过去二十年里 消费电子产品的大多数重要技术突破实际上可归结于一项更大意义上的科技革命 仔细观察就会发现 CD DVD 高清电视 MP3和DVR其实都是基于相同的原理 即 将传统的模拟信息转变为数字信息 这一技术上的根本转变完全颠覆了我们处
  • Tomcat中server.xml中访问多个项目的配置

    Tomcat中server xml中访问多个项目的配置 server xml作为 tomcat 启动时的配置依据 其功能包含了配置访问端口 访问路径等 这里主要针对在同一个 tomcat 中发布多个项目 其中最关键的配置是 标签下appBa
  • 码农的自我修养 - ARM编译器的区分

    在嵌入式软件开发的编码中 有时使用的一些指令是和编译器相关的 这时就要判断当前使用的编译器类型 不同的编译器 会定义不同的宏来进行识别 比如在ARM开发工具包中 cortex M系列开发中 CMSIS Cortex Mx Core Peri
  • SSH工作原理&Ubuntu20.04安装并配置SSH&设置SSH免密登录

    目录 一 SSH的介绍 服务器端 客户端 1 SSH 远程连接工具 连接原理 2 SSH的安全机制 3 两种级别的验证方法 登录方法 二 ssh的安装与启动 1 安装 2 启动服务器的SSH服务 三 SSH客户端 1 前置知识 2 口令登录