目录
1.1、什么是OpenSSH Secure Shell(SSH)
一、使用SSH访问远程主机
1.1、什么是OpenSSH Secure Shell(SSH)
OpenSSH指系统中使用的Secure Shell软件。OpenSSH Secure Shell(以下称ssh)用于在远程系统上安全的运行shell。
我们可以当前身份创建远程交互式shell, ssh remotehost,然后在结束时用exit命令返回到当前shell。比如我们可以以student的身份从desktop远程登录server。也可以以其他身份登录远程主机, ssh remoteuser@remotehost。
我们先以student身份从desktop登录server,再以root身份从desktop登录server。
[student@desktop0 ~]$ ssh server0
The authenticity of host 'server0 (172.25.0.11)' can't be established.
ECDSA key fingerprint is 65:4d:ac:8a:c9:58:82:b5:0c:91:c4:ef:a5:e6:f6:65.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'server0,172.25.0.11' (ECDSA) to the list of known hosts.
student@server0's password:
Last login: Fri Jun 26 10:50:36 2020 from desktop0.example.com
[student@server0 ~]$ exit
logout
Connection to server0 closed.
[student@desktop0 ~]$
[student@desktop0 ~]$ ssh root@server0
root@server0's password:
Last login: Fri Jun 26 10:50:06 2020 from 172.25.0.250
[root@server0 ~]#
[root@server0 ~]# exit
logout
Connection to server0 closed.
1.2、SSH主机密钥
SSH通过公钥加密的方式保障通信安全。当某一ssh客户端连接到ssh服务器时,在该客户端登录之前,服务器会向客户端发送公钥副本。第一次远程登录server时,提示将server0 172.25.0.11加入known host里面。
当用户第一次使用ssh连接到特定服务器时,ssh命令可以在用户的 ~/.ssh/known_hosts 文件中存储该服务器的公钥。在此之后每当用户进行连接时,客户端都会通过对比 ~/.ssh/known_hosts 文件中的服务器条目和服务器发送的公钥,确保从服务器获得相同的公钥。如果公钥不匹配,客户端会假定网络通信遭到劫持或服务器已被入侵,并中断连接。
也就是说,如果服务器的公钥发生更改,用户需要更新起 ~/.ssh/known_hosts 文件并删除旧的条目才能登录。
服务器ID存储在本地客户端的 ~/.ssh/known_hosts 中。
[student@desktop0 ~]$ ll .ssh/known_hosts
-rw-r--r--. 1 student student 181 Jun 26 10:51 .ssh/known_hosts
[student@desktop0 ~]$ cat .ssh/known_hosts
server0,172.25.0.11 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBBwmqCDZ/R1sMbPrZgHARIeL+RYPJ0CVt9AJRzJt4cHk4Ky4tmNjRx6FKJjhlcQJMDb+8CZjveJrgmOHxANvSgE=
[student@desktop0 ~]$
服务器主机密钥存储在服务器/etc/ssh/目录下的ssh_host_*key*文件中。非对称加密,私钥没有扩展名,公钥带.pub扩展名。
[root@server0 ~]# ll /etc/ssh/*key*
-rw-r-----. 1 root ssh_keys 227 Jan 7 2015 /etc/ssh/ssh_host_ecdsa_key
-rw-r--r--. 1 root root 162 Jan 7 2015 /etc/ssh/ssh_host_ecdsa_key.pub
-rw-r-----. 1 root ssh_keys 1675 Jan 7 2015 /etc/ssh/ssh_host_rsa_key
-rw-r--r--. 1 root root 382 Jan 7 2015 /etc/ssh/ssh_host_rsa_key.pub
二、配置基于SSH密钥的身份验证
2.1、基于SSH密钥的身份验证
之前远程连接时,都需要用户输入密码,这既不方便也不安全。ssh允许用户使用私钥-公钥方式进行身份验证。私钥文件用作身份验证的凭据,需要妥善保管。公钥并不苞米,将公钥复制到用户希望登录的系统,用于验证私钥。
使用命令ssh-keygen来生成密钥。这样就生成了私钥 ~/.ssh/id_rsa 和 公钥 ~/.ssh/id_rsa.pub。私钥和公钥的权限应该分别为600和644。
[student@desktop0 ~]$ ll .ssh/
total 8
-rw-------. 1 student student 1651 Jan 7 2015 authorized_keys
-rw-r--r--. 1 student student 181 Jun 26 10:51 known_hosts
[student@desktop0 ~]$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/student/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/student/.ssh/id_rsa.
Your public key has been saved in /home/student/.ssh/id_rsa.pub.
The key fingerprint is:
4e:4e:73:3c:9d:3a:9f:7c:d6:f5:b5:13:8e:08:9a:9f student@desktop0.example.com
The key's randomart image is:
+--[ RSA 2048]----+
| |
| |
| |
| . . . |
| S + o |
| = + o .o|
| = + . o.*|
| o .= oo+o|
| .E +o .|
+-----------------+
[student@desktop0 ~]$ ll .ssh/
total 16
-rw-------. 1 student student 1651 Jan 7 2015 authorized_keys
-rw-------. 1 student student 1679 Jun 26 11:11 id_rsa
-rw-r--r--. 1 student student 410 Jun 26 11:11 id_rsa.pub
-rw-r--r--. 1 student student 181 Jun 26 10:51 known_hosts
通过ssh-copy-id命令将密钥复制到目标系统上,它默认复制的是~/.ssh/id_rsa.pub,也可以用-i选项指定复制哪个公钥ssh-copy-id -i FILE remoteuser@remotehost。
比如将student在desktop上生成的公钥复制到server上的root用户,会提示输入root@server的密码,复制成了以后student再远程登录root@server0就不再需要密码了。
那么公钥放在远程主机哪里呢?放在远程主机远程用户目录下的文件authorized_keys里面。我们是ssh-copy-id root@server0,那么公钥就放~root/.ssh/authorized_keys文件里面。
[student@desktop0 ~]$ ssh-copy-id root@server0
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@server0's password:
Number of key(s) added: 1
Now try logging into the machine, with: "ssh 'root@server0'"
and check to make sure that only the key(s) you wanted were added.
[student@desktop0 ~]$ ssh root@server0
Last login: Fri Jun 26 11:03:52 2020 from desktop0.example.com
[root@server0 ~]#
[root@server0 ~]# tail -n 1 .ssh/authorized_keys
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDqhQdZKRa7iHuCYAVRyLZ6MAHVQgeHhm8UCAn0JGA99PRR+llg7hnP3TRtD25z1PleDHZ1CWbTNYbROGxfeQ/vIfLQBQgfvJs47FMn8ggEPrEaFLX2g9GVk9RrxGdQPVcMCDRpPlbH1oyFPix3dihOyKbmOR6R89+EQWulstLFaxGTaT+BIhC1KgXCsECMAlONlcHiYbA+RH2MxS5UYHtQ/TN4wEdHa+4D2DOb+dfwzrfkG45MPv2GSp0onjMvaGGGD8w4SlMA0AjNxB+NQbCC3/hy1+4VcWIHDRJqZF6GOOc5cGfZICMi4YAOK/ibJB9FjHwiDV5m+NnJCzfMvSNr student@desktop0.example.com
远程注意和本地并不一定有相同用户名的用户,那么ssh远程连接的时候优先选择哪个用户呢?做个试验,在desktop上建立zhangsan用户,在server上配置user1、user2用户,并且zhangsan可以用密钥验证的方式以root、student、user1、user2身份远程登录server。假如我们不指定用户名会怎么样呢?是zhangsan@server,但是server上没有zhangsan啊!这个默认的用户就是由~zhangsan/.ssh/config 文件来控制的。文件里面可以设置多个主机。每个主机的设置由4行构成。
- Host指对哪个主机生效。
- StrictHostKeyChecking是对主机密钥是否强制检查。
- PreferredAuthentications是默认使用哪个认证方式,publickey或者password。
- User是默认登录的用户。
[zhangsan@desktop0 ~]$ cd .ssh
[zhangsan@desktop0 .ssh]$ vim config
[zhangsan@desktop0 .ssh]$ cat config
Host *.example.com *
StrictHostKeyChecking no
PreferredAuthentications publickey
User user1
[zhangsan@desktop0 .ssh]$ ssh server0
Last login: Fri Jun 26 13:16:17 2020 from desktop0.example.com
[user1@server0 ~]$
2.2、自定义SSH服务配置
可以在/etc/ssh/sshd_config中修改OpenSSH服务。
限制root用户使用ssh登录。为了安全起见,禁止root用户通过ssh直接登录系统。将配置文件中的 PermitRootLogin yes 行去掉注释改为PermitRootLogin no,重启sshd服务使之生效,即可禁止root登录系统。另外,还可以改为PermitRootLogin without-password,只允许root进行密钥认证的登录,这个配置非常有用。
建议在 /etc/ssh/sshd_config 如下面配置时,配置密钥认证,用ssh-copy-id将密钥配置好。
PasswordAuthentication yes
PubkeyAuthentication yes
PermitRootLogin yes
密钥认证配置完成后,修改 /etc/ssh/sshd_config 配置文件为:禁止密码验证、允许密钥验证、只允许root密钥验证登录。重启sshd服务使之生效。
PasswordAuthentication no
PubkeyAuthentication yes
PermitRootLogin without-password
另外,/etc/ssh/sshd_config 还有其它和sshd相关的配置。比如,修改ssh的端口、主机密钥、用户公钥存储也不一定在 ~/.ssh/authorized_keys文件等等。查看man 5 sshd_config知道更多。
Port 22
# HostKeys for protocol version 2
HostKey /etc/ssh/ssh_host_rsa_key
#HostKey /etc/ssh/ssh_host_dsa_key
HostKey /etc/ssh/ssh_host_ecdsa_key
# 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
2.3、sftp传输文件
sftp登录,可以上传下载文件,非常方便。主要用到的命令是put和get。
[student@server0 ~]$ echo "test sftp" > f1
[student@server0 ~]$ ll
total 4
-rw-rw-r--. 1 student student 10 Jun 26 14:53 f1
[student@server0 ~]$ sftp root@server0
Connected to server0.
sftp> put ./f1
Uploading ./f1 to /root/f1
./f1 100% 10 0.0KB/s 00:00
sftp> get f2
Fetching /root/f2 to f2
/root/f2 100% 5 0.0KB/s 00:00
sftp> exit
[student@server0 ~]$ ll
total 8
-rw-rw-r--. 1 student student 10 Jun 26 14:53 f1
-rw-r--r--. 1 student student 5 Jun 26 14:54 f2
[student@server0 ~]$ cat f2
down
[student@server0 ~]$