SSH 服务的原理与实验场景

SSH服务的原理 略

SSH远程管理 - 图1
说明:
(1)Client和Serve之间的网络是畅通的
(2)Sever开放22端口,允许Clinet进行SSH连接
(3)用户掌握了Server上的登录账号(root)

2 SSH客户端(Linux)使用

1.查看ssh客户端的版本

  1. [root@dbserver ~]# ssh -V
  2. OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017

2.使用ssh客户端连接远程SSH服务器

  1. [root@dbserver ~]# ssh root@192.168.237.201
  2. #root@192.168.237.201,表示使用root账户登录192.168.237.201
  3. The authenticity of host '192.168.237.201 (192.168.237.201)' can't be established.
  4. ECDSA key fingerprint is SHA256:aeQmT5o+YDTiRMbie+ggf5+ks9ID0mBni42KvabPHL4.
  5. ECDSA key fingerprint is MD5:31:80:f4:ec:b2:9e:77:29:d2:91:6a:a8:ac:0f:d4:db.
  6. Are you sure you want to continue connecting (yes/no)? yes
  7. Warning: Permanently added '192.168.237.201' (ECDSA) to the list of known hosts.
  8. root@192.168.237.201's password:
  9. Last login: Tue May 24 11:10:26 2022 from 192.168.237.1
  10. [root@webserver ~]#
  11. [root@webserver ~]# exit
  12. 登出
  13. Connection to 192.168.237.201 closed.
  14. #exit命令用于推出登录,返回当前主机

也可以使用如下形式

  1. [root@dbserver ~]# ssh 192.168.237.201 -l student -p 22
  2. #-l 指定登录的用户名,-p 指定端口号
  3. student@192.168.237.201's password:
  4. Last login: Tue May 24 11:44:32 2022 from 192.168.237.202
  5. [student@webserver ~]$

也可以使用如下形式

  1. [root@dbserver ~]# ssh root@192.168.179.231
  2. ssh: connect to host 192.168.179.231 port 22: Network is unreachable
  3. [root@dbserver ~]# ssh -t root@192.168.237.201 ssh root@192.168.179.231
  4. root@192.168.237.201's password:
  5. root@192.168.179.231's password:
  6. Last login: Tue May 24 11:47:33 2022 from 192.168.87.100
  7. [root@myhost ~]# ip addr
  8. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
  9. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  10. inet 127.0.0.1/8 scope host lo
  11. valid_lft forever preferred_lft forever
  12. inet6 ::1/128 scope host
  13. valid_lft forever preferred_lft forever
  14. 2: ens192: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  15. link/ether 00:50:56:a0:0a:5d brd ff:ff:ff:ff:ff:ff
  16. inet 192.168.179.231/24 brd 192.168.179.255 scope global ens192
  17. valid_lft forever preferred_lft forever
  18. inet6 fe80::250:56ff:fea0:a5d/64 scope link
  19. valid_lft forever preferred_lft forever
  20. [root@myhost ~]#

3 使用ssh远程连接,在远程主机上直接执行命令
ssh 用户名@远程主机 ‘在远程主机上执行的命令行’

  1. [root@client ~]# ssh root@192.168.237.202 'ls -l /root'
  2. root@192.168.237.202's password:
  3. Permission denied, please try again.
  4. root@192.168.237.202's password:
  5. 总用量 4
  6. -rw-------. 1 root root 1548 6 8 2020 anaconda-ks.cfg
  7. drwxr-xr-x. 2 root root 29 6 8 2020 env3.6.10
  8. drwxr-xr-x. 2 root root 29 6 8 2020 env3.8.3
  9. -rw-r--r--. 1 root root 0 5 31 08:41 example
  10. drwxr-xr-x. 2 root root 6 6 8 2020 perl5
  11. [root@client ~]# ssh root@192.168.237.202 'mkdir /root/test'
  12. root@192.168.237.202's password:

3 Linux环境下sftp客户端的使用

3.1 使用sftp客户端命令连接到远程服务器(交互式连接)

sftp 用户名@远程主机 [ -p 端口号 ]

  1. [root@client ~]# sftp -P 22 root@192.168.237.202
  2. root@192.168.237.202's password:
  3. Connected to 192.168.237.202.
  4. sftp> help
  5. Available commands:
  6. bye Quit sftp
  7. cd path Change remote directory to 'path'
  8. chgrp grp path Change group of file 'path' to 'grp'
  9. chmod mode path Change permissions of file 'path' to 'mode'
  10. chown own path Change owner of file 'path' to 'own'
  11. df [-hi] [path] Display statistics for current directory or
  12. filesystem containing 'path'
  13. exit Quit sftp
  14. get [-afPpRr] remote [local] Download file
  15. reget [-fPpRr] remote [local] Resume download file
  16. reput [-fPpRr] [local] remote Resume upload file
  17. help Display this help text
  18. lcd path Change local directory to 'path'
  19. lls [ls-options [path]] Display local directory listing
  20. lmkdir path Create local directory
  21. ln [-s] oldpath newpath Link remote file (-s for symlink)
  22. lpwd Print local working directory
  23. ls [-1afhlnrSt] [path] Display remote directory listing
  24. lumask umask Set local umask to 'umask'
  25. mkdir path Create remote directory
  26. progress Toggle display of progress meter
  27. put [-afPpRr] local [remote] Upload file
  28. pwd Display remote working directory
  29. quit Quit sftp
  30. rename oldpath newpath Rename remote file
  31. rm path Delete remote file
  32. rmdir path Remove remote directory
  33. symlink oldpath newpath Symlink remote file
  34. version Show SFTP version
  35. !command Execute 'command' in local shell
  36. ! Escape to local shell
  37. ? Synonym for help
  38. sftp> exit

[root@177 ~]# sftp -P 22 root@192.168.179.11
root@192.168.179.11’s password:
Connected to 192.168.179.11.
sftp> pwd
Remote working directory: /root

[root@177 ~]# sftp root@192.168.179.11:/etc
#直接以root身份等录sftp服务器的/etc目录

[root@177 ~]# sftp root@192.168.179.11:/etc/selinux/config
#以root身份将sftp服务器上的/etc/selinux/config文件下载到本地当前目录中。

3.2 sftp常用的操作命令

(1)服务端操作命令
cd 转换目录
exit 退出登录
ls 查看目录
mkdir 新建目录
mv 移动文件
rm 删除文件
rmdir 删除目录
pwd 查看当前目录
chmod chgrp chown 修改文件权限和所有者

  1. sftp> pwd
  2. Remote working directory: /root
  3. sftp> cd /tmp
  4. sftp> pwd
  5. Remote working directory: /tmp
  6. sftp> mkdir /tmp/test
  7. sftp> ls -l /tmp/test
  8. sftp> pwd
  9. Remote working directory: /tmp
  10. sftp> cd /tmp/test
  11. sftp> pwd
  12. Remote working directory: /tmp/test

(2)客户端操作命令
lcd 转换目录
lls 查看目录
lmkdir 新建目录
lrm 删除文件

  1. sftp> lcd /etc
  2. sftp> lpwd
  3. Local working directory: /etc
  4. sftp> lls

lpwd 查看客户端当前目录
(3)文件传输操作
get [-r] 从服务器端下载文件到客户端
put [-r] 从客户端上传文件到服务器端

  1. [root@client ~]# sftp -P 22 root@192.168.237.202
  2. #登录sftp服务器
  3. root@192.168.237.202's password:
  4. Connected to 192.168.237.202.
  5. sftp> cd /tmp/test
  6. #切换(服务器)远程工作目录
  7. sftp> ls
  8. #显示远程工作目录中的内容
  9. Hello.txt
  10. sftp> lcd /root
  11. #切换(客户端)本地当前工作目录
  12. sftp> pwd
  13. #显示远程当前工作目录
  14. Remote working directory: /tmp/test
  15. sftp> lpwd
  16. #显示本地当前工作目录
  17. Local working directory: /root
  18. sftp> get Hello.txt
  19. #下载Hello.txt,从远程当前工作目录中下载到本地当前工作目录中
  20. Fetching /tmp/test/Hello.txt to Hello.txt
  21. /tmp/test/Hello.txt 100% 16 13.9KB/s 00:00
  22. sftp> lls
  23. #查看本地当前工作目录中的内容
  24. anaconda-ks.cfg env3.6.10 env3.8.3 Hello.txt perl5
  25. sftp> lcd /etc
  26. sftp> lpwd
  27. Local working directory: /etc
  28. sftp> put fstab
  29. #将fstab文件从本地当前工作目录上传到远程当前工作目录
  30. Uploading fstab to /tmp/test/fstab
  31. fstab 100% 541 962.7KB/s 00:00
  32. sftp> ls
  33. Hello.txt fstab

3.3 scp命令实现文件传送

scp [-r] 本地文件(目录) 用户名@远程主机:/路径
#使用scp实现文件(目录)上传
[root@177 code]# scp /root/code/test2.sh root@192.168.179.11:/tmp
root@192.168.179.11’s password:
test2.sh 100% 126 105.9KB/s 00:00

scp [-r] 用户名@远程主机:/路径/文件 本地文件(目录)
#使用scp实现文件(目录)下载
[root@177 code]# scp -r root@192.168.179.11:/tmp/test0521 /root/code
root@192.168.179.11’s password:
testCron.sh 100% 89 20.0KB/s 00:00
[root@177 code]# ls -ld /root/code/test0521/
drwxr-xr-x. 2 root root 25 5月 21 15:43 /root/code/test0521/
[root@177 code]# ls -ls /root/code/test0521/
总用量 4
4 -rwxr-xr-x. 1 root root 89 5月 21 15:43 testCron.sh

  1. [root@client ~]# mkdir /source
  2. [root@client ~]# echo "Hello,SCP" > /source
  3. -bash: /source: 是一个目录
  4. [root@client ~]# echo "Hello,SCP" > /source/example
  5. [root@client ~]# cat /source/example
  6. Hello,SCP
  7. [root@client ~]# cd /source/
  8. [root@client source]# ls
  9. example
  10. [root@client source]# scp /source/example root@192.168.237.202:/dist
  11. #scp将本地/source/example文件上传到服务器192.168.237.201的/dist目录中
  12. root@192.168.237.202's password:
  13. example 100% 10 7.5KB/s 00:00
  14. [root@client source]# scp root@192.168.237.202:/etc/gshadow /source
  15. #scp将远程服务器上的gshadow文件,下载到本地目录中
  16. root@192.168.237.202's password:
  17. gshadow 100% 509 11.7KB/s 00:00
  18. [root@client source]# ls
  19. example gshadow

4 使用sshpass命令

sshpass是一个简单的轻量级的命令行工具。
使用sshpass可以在命令行将密码传递给ssh、sftp、scp命令。
但是,这个命令是不安全的,在脚本中使用sshpass更为可靠。

4.1 安装sshpass

  1. [root@179-11 tmp]# rpm -qa | grep sshpass
  2. [root@179-11 tmp]# yum -y install sshpass
  3. #或者
  4. [root@client ~]# rpm -ivh sshpass-1.06-2.el7.x86_64.rpm

4.2 使用sshpass免输入密码登录ssh

sshpass –p ‘密码’ ssh 用户名@远程主机 [‘远程主机上的命令’]

  1. [root@client ~]# sshpass -p 'Abc@123!' ssh root@192.168.237.202
  2. Last login: Tue May 31 08:41:13 2022 from 192.168.237.201
  3. [root@client ~]# sshpass -p 'Abc@123!' scp /etc/passwd root@192.168.237.202:/dist

4.3 使用sshpass –e 将用户ssh登录密码写入环境变量SSHPASS中。

  1. [root@client ~]# SSHPASS='Abc@123!'
  2. [root@client ~]# export SSHPASS
  3. [root@client ~]# echo $SSHPASS
  4. Abc@123!
  5. [root@client ~]# sshpass -e ssh root@192.168.237.202
  6. Last login: Tue May 31 09:49:08 2022 from 192.168.237.201

4.4 使用sshpass –f 将用户密码从指定的文件中读取出来

  1. [root@client ~]# touch SSHPASS
  2. [root@client ~]# echo 'Abc@123!' > /root/SSHPASS
  3. [root@client ~]# cat /root/SSHPASS
  4. Abc@123!
  5. [root@client ~]# chmod 600 /root/SSHPASS
  6. [root@client ~]# sshpass -f /root/SSHPASS ssh root@192.168.237.202
  7. Last login: Tue May 31 10:16:34 2022 from 192.168.237.201

5 配置SSH服务器的公钥身份认证

5.1 在Linux的SSH客户端上完成

1 在客户端创建客户端公钥和私钥

  1. [root@client ~]# ssh-keygen
  2. Generating public/private rsa key pair.
  3. Enter file in which to save the key (/root/.ssh/id_rsa):
  4. #输入密钥对的存放位置,默认是:/root/.ssh/id_rsa
  5. Enter passphrase (empty for no passphrase):
  6. #输入使用私钥解密时的口令,回车表示口令为空
  7. Enter same passphrase again:
  8. #确认口令
  9. Your identification has been saved in /root/.ssh/id_rsa.
  10. Your public key has been saved in /root/.ssh/id_rsa.pub.
  11. The key fingerprint is:
  12. SHA256:BylpSLisTw7vBzUdgpignN5OGFmCmjmJQZIRkiZUKx8 root@client
  13. The key's randomart image is:
  14. +---[RSA 2048]----+
  15. |@@.=. |
  16. |&.B.o... . |
  17. |*% E.o+.o |
  18. |O O +... . |
  19. | = = . S . |
  20. |o = . |
  21. | * o |
  22. | + . |
  23. | ... |
  24. +----[SHA256]-----+
  25. [root@client .ssh]# cd /root/.ssh
  26. [root@client .ssh]# ls -l
  27. 总用量 16
  28. -rw-r--r--. 1 root root 824 10月 21 2020 authorized_keys
  29. -rw-------. 1 root root 1679 5月 31 10:32 id_rsa
  30. -rw-r--r--. 1 root root 393 5月 31 10:32 id_rsa.pub
  31. -rw-r--r--. 1 root root 177 5月 31 08:40 known_hosts

生成客户端的公私密钥对,可以用-t指定加密算法,用-f指定密钥文件存放地和文件名。
#默认情况下,为用户创建的公私密钥对存放在~用户名/.ssh目录中。
2 将创建好的客户端公钥传送到SSH服务器
将创建好的客户端公钥传送到SSH服务器上,并保存到登录用户的家目录下的.ssh子目录中,并以特定的文件名保存(authorized_keys)。
方法一:
(1)使用scp命令将上一步中创建的客户端公钥上传服务器的”~登录用户/.ssh”
[root@177 ~]# scp /root/.ssh/id_rsa.pub root@192.168.179.11:/root/.ssh
(2)使用密码登录SSH服务器
[root@177 ~]# ssh root@192.168.179.11
root@192.168.179.11’s password:
Last login: Thu May 23 14:36:23 2019 from 192.168.94.177
在服务器上将复制过来的客户端公钥文件导入到~登录用户/.ssh/authorized_keys文件中。
[root@179-11 .ssh]# cat id_rsa.pub >> authorized_keys
方法二:

  1. [root@client .ssh]# which ssh-copy-id
  2. /usr/bin/ssh-copy-id
  3. [root@client .ssh]# ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.237.202
  4. #ssh-copy-id脚本用于创建ssh远程免密登录连接 -i选项用来指定客户端的公钥
  5. /usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
  6. /usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
  7. /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
  8. root@192.168.237.202's password:
  9. Number of key(s) added: 1
  10. Now try logging into the machine, with: "ssh 'root@192.168.237.202'"
  11. and check to make sure that only the key(s) you wanted were added.

使用ssh-copy-id脚本程序将客户端公钥上传并导入登录用户的家目录下的.ssh子目录下的authorized_keys文件中。
3 在客户端使用ssh客户端进行基于公钥的登录连接
[root@177 .ssh]# ssh root@192.168.179.11

5.2 在Windows的SSH客户端(Bitvise SSH Client)上完成

1 创建客户端公私密钥对,并导出客户端公钥文件
打开客户端密钥管理器
image.png
创建客户端公私密钥对
image.png
image.png
导出客户端公钥文件
image.png
image.png
image.png

2 上传客户端公钥文件到SSH服务器~登录用户家目录/.ssh目录中
image.png
3. 在SSH服务器上,将上传到客户端公钥文件导入到服务器的~用户/.ssh/authorized_key文件中去。

  1. [root@server ~]# cd /root/.ssh
  2. [root@server .ssh]# ls
  3. authorized_keys client.pub id_rsa.pub
  4. [root@server .ssh]# cat client.pub >> authorized_keys

4.在客户端使用公钥验证登录。
image.png

6 SSHD服务器端配置文件

1 sshd服务的配置文件/etc/ssh/sshd_config
2 了解SSHD服务配置文件的常用配置选项
(1)Port 22
指定SSH服务的端口,默认为22,可以增加其他的端口,只需写多行Port指令即可。
(2)Protocol 2
指定SSH服务协议的版本,一般为2,如果需要支持旧的版本,可以写成Protocol 2,1
(3)ListenAddress 0.0.0.0
指定SSH 服务的监听地址,0.0.0.0表示监听本机所有地址。可以改成指定的IP地址。
(4)SSH服务器密钥存放文件(私钥)
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
(5)PermitRootLogin yes
是否允许root通过SSH进行登录,默认是允许,建议设置成no.
(6)PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
定义是否允许用户自行使用密钥对进行验证的登录
(7)PasswordAuthentication yes
定义是否允许使用密码登录
(8)PermitEmptyPassword yes
定义是否允许使用空密码
3 修改配置文件之后,记得重启服务或者重新加载配置文件。