Secure Shell(SSH) 是由 IETF(The Internet Engineering Task Force) 制定的建立在应用层基础上的安全网络协议。它是专为远程登录会话(甚至可以用Windows远程登录Linux服务器进行文件互传)和其他网络服务提供安全性的协议,可有效弥补网络中的漏洞。通过SSH,可以把所有传输的数据进行加密,也能够防止DNS欺骗和IP欺骗。还有一个额外的好处就是传输的数据是经过压缩的,所以可以加快传输的速度。目前已经成为Linux系统的标准配置。
SSH只是一种协议,存在多种实现,既有商业实现,也有开源实现。本文主要介绍OpenSSH免费开源实现在Ubuntu中的应用,如果要在Windows中使用SSH,需要使用另一个软件PuTTY。
SSH的安全机制
SSH之所以能够保证安全,原因在于它采用了非对称加密技术(RSA)加密了所有传输的数据。
传统的网络服务程序,如FTP、Pop和Telnet其本质上都是不安全的;因为它们在网络上用明文传送数据、用户帐号和用户口令,很容易受到中间人(man-in-the-middle)攻击方式的攻击。就是存在另一个人或者一台机器冒充真正的服务器接收用户传给服务器的数据,然后再冒充用户把数据传给真正的服务器。
但并不是说SSH就是绝对安全的,因为它本身提供两种级别的验证方法:
-
第一种级别(基于口令的安全验证):只要你知道自己帐号和口令,就可以登录到远程主机。所有传输的数据都会被加密,但是不能保证你正在连接的服务器就是你想连接的服务器。可能会有别的服务器在冒充真正的服务器,也就是受到“中间人攻击”这种方式的攻击。
-
第二种级别(基于密钥的安全验证):你必须为自己创建一对密钥,并把公钥放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密钥进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公钥,然后把它和你发送过来的公钥进行比较。如果两个密钥一致,服务器就用公钥加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私钥在本地解密再把它发送给服务器完成登录。与第一种级别相比,第二种级别不仅加密所有传输的数据,也不需要在网络上传送口令,因此安全性更高,可以有效防止中间人攻击。
中间人攻击(man-in-the-middle)
SSH登录本身是安全的,问题在于,如果有人截获了登录请求,然后冒充远程主机,将伪造的公钥发给用户,那么用户很难辨别真伪。因为不像https,SSH协议的公钥是没有证书中心(CA)公证的,也就是说,都是自己签发的。
攻击者插在用户和远程主机之间,用伪造公钥,获取到用户的登录面后,再用这个密码登录远程主机,那么SSH的安全机制就荡然无存了,
这就是著名的“中间人攻击”
SSH的启动,重启,查看状态
#查看状态
$ systemctl status sshd.service
#启动服务:
$ systemctl start sshd.service
#重启服务:
$ systemctl restart sshd.service
#开机自启:
$ systemctl enable sshd.service
SSH两种级别的远程登录
一. 口令登录
口令登录非常简单,只需要一条命令
#ssh 客户端用户名@服务器ip地址
$ ssh root@192.168.0.1
#如果客户机的用户名和服务器的用户名相同,登录时可以省略用户名。
$ ssh 192.168.0.1
还要说明的是,SSH服务的默认端口是22,也就是说,如果你不设置端口的话登录请求会自动送到远程主机的22端口。我们可以使用 -p 选项来修改端口号,比如:
# 连接到服务器的1234端口
$ ssh -p 1234 root@192.168.0.1
二. 公钥登录
首先使用ssh-keygen命令生成密钥对
# -t表示类型选项,这里采用rsa加密算法
$ ssh-keygen -t rsa
然后根据提示一步步的按enter键即可,执行结束以后会在 /home/当前用户 目录下生成一个 .ssh 文件夹,其中包含私钥文件id_rsa
和公钥文件 id_rsa.pub
。
(其中有一个提示是要求设置私钥口令passphrase,不设置则为空,如果为了免密登陆可以不设置。)
使用ssh-copy-id
命令将公钥复制到远程主机
$ ssh-copy-id root@192.168.0.1
ssh-copy-id会将公钥写到远程主机的 /root/ .ssh/authorized_key 文件中
使用ssh-copy-id命令登陆哪个用户就会存放在哪个用户的home目录下。
也可以手动复制到authorized_key文件当中。
首次登陆
第一次登录时,会提示用户
The authenticity of host '121.43.230.217 (121.43.230.217)' can't be established.
ECDSA key fingerprint is SHA256:NfXOYhYDaY7cs57XoMqAS+5D+rG8mKTumqyo+8SCO9o.
Are you sure you want to continue connecting (yes/no)?
意思是无法验证用户的公钥,是否正确,询问用户是否要继续。
ECDSA key给出了远程主机公钥的SHA256编码过的值,一般在远程主机的网站会告示公钥的值,
用户可以将这个公钥和网站上的公钥进行比对,正确则表明是远程主机。
输入yes之后,系统会将公钥加入到已知的主机列表,如下所示,已知列表中的主机,下次不会再询问。
Warning: Permanently added '121.43.230.217' (ECDSA) to the list of known hosts.
SSH的基本配置
SSH的配置文件通常在 /etc/ssh/sshd_config
配置文件中有非常详尽的注释,一般在工作中主要用到的几个配置
# 监听地址范围
LiistenAddress 0.0.0.0
# 端口号
Port 22
# 是否开启公钥验证
PubkeyAuthentication yes
# 是否开启密码验证
PasswordAuthentication yes
# 是否允许root用户登陆
PermitRootLogin yes
禁止用户远程登录
- 禁止登陆root
如上配置 - 禁止其他用户登陆
使用ssh登陆的用户和本地的用户是一样的用户,所以禁止远程登陆的用户和禁止用户登陆的方式一致。
在/etc/passwd
中找到当前用户,将用户的登陆方式从/bin/bash
改为/sbin/nologin
网友评论