Secure Shell(安全外壳协议,简称SSH)是一种加密的网络传输协议,可在不安全的网络中为网络服务提供安全的传输环境。SSH通过在网络中创建安全隧道来实现SSH客户端与服务器之间的连接,SSH最常见的用途是远程登录系统,人们通常利用SSH来传输命令行界面和远程执行命令。如果使用弱密码,也是最容易致使服务器受到攻击威胁的,甚至直接成为“肉鸡”。
ssh 提供两种级别的安全认证:
- 基于口令的安全认证
- 基于密钥的安全认证
一.基于口令的安全认证,即通常说的root和root密码
需要知道用户名和密码即可登录,该连接是加密的,但客户端不能确认目标主机是否为“伪造的”,也不能保证口令安全。任何只要知道用户名和密码的人都可以登录远程主机(在没有限制登录IP的情况下)
修改远程主机的 /etc/ssh/sshd_config 为:
PasswordAuthentication yes
重启 sshd 使改动生效:
systemctl restart sshd.service
二. 基于密钥的安全认证
用户持有“公钥/私钥对”,远程服务器持有公钥(public key),本地持有私钥(private key)。
使用公私钥登录时,客户端向服务器发出请求。服务器收到请求之后,先在用户的主目录下找到该用户的公钥,然后对比用户发送过来的公钥。如果一致,服务器用公钥加密“质询”并发送给客户端。客户端收到“质询”后用私钥解密,再发还给服务器。认证结束。
服务器上生成 ssh-key,选加密算法(rsa,dsa等),给秘钥命名(可选):
$ ssh-keygen -t rsa -C "name"
输出类似:
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.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:tDVwRr0qXXXXXXXXXXXXXXXXX8xm8YQ jxcn2
passphrase是证书口令,最少需要5个字符,以加强安全性,避免证书被恶意复制(默认为空)。
会在 ~.ssh
下生成 id_rsa
, id_rsa.pub
两个文件,分别是 私钥/公钥。
公钥需保存到远程服务器 ~/.ssh/authorized_keys
里,私钥由客户端本地留存。
要保证 .ssh
和 authorized_keys
都只有用户自己有写权限。否则验证无效:
$ chmod -R 700 ~/.ssh/
$ chmod 600 ~/.ssh/authorized_keys
#写入公钥
cat id_rsa.pub >>authorized_keys
最后需要将私钥保存到本地。可以安装lrzsz,使用命令 sz id_rsa 保存私钥到本地。最好先看下能否使用密钥登录,然后在禁用密码登录。
centos7 ssh key登录 配置具体实践:
$ vi /etc/ssh/sshd_config
# 禁用root账户登录,非必要,但为了安全性,请配置
PermitRootLogin no
# 是否让 sshd 去检查用户家目录或相关档案的权限数据,这是为了担心使用者将某些重要档案的权限设错,可能会导致一些问题所致。例如使用者的 ~/.ssh/ 权限设错时,某些特殊情况下会不许用户登入
StrictModes no
# 是否允许用户自行使用成对的密钥系统进行登入行为,仅针对 version 2。至于自制的公钥数据就放置于用户家目录下的 .ssh/authorized_keys 内
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
# 有了证书登录了,就禁用密码登录吧,安全要紧
PasswordAuthentication no
#重启ssh服务
service sshd restart
使用xshell登录时
填写用户名 和ssh 端口,并选择public key登录,导入保存的私钥,密码若创建的时候没有填写passphrase,则默认为空。