SSH远程管理服务

SSH概述

SSH是什么

SSH(Secure Shell)是建立在应用层基础上的安全远程管理协议。SSH 是较可靠、专为远程登录会话和其他网络服务提供安全性的协议,利用 SSH 协议可以有效防止远程管理过程中的信息泄露问题,SSH就是一种用于计算机之间的加密登录的网络协议。

SSH默认采用TCP/22端口,采用密文形式在网络中传输数据,相较于通过明文传输的Telnet协议具有更高的安全性。在默认状态下,SSH服务主要提供两个服务功能:

  • 类似telnet远程连接服务器的服务,即上述SSH服务;
  • 类似FTP服务的sftp-server,借助SSH协议来传输数据,提供更安全的SFTP服务(vsftp,proftp)。

SSH和TELNET

  • SSH是安全的远程连接,数据信息是经过加密的。SSH的默认端口号为22,SSH服务默认可以root用户远程连接,
  • TELNET是不安全的远程连接,数据信息是明文的。TELNET的默认端口号为23,TELNET服务默认不可以root用户远程连接。

SSH远程连接原理

SSH连接原理

  1. 客户端:执行远程连接命令
  2. 客户端&服务端:建立三次握手
  3. 服务端:如果客户端本地家目录下~/.ssh/known_hosts文件中没有服务端公钥信息,则服务端发送公钥信息询问确认
  4. 客户端:进行公钥确认,接收公钥信息
  5. 服务端:让客户端确认登录用户密码信息
  6. 客户端:进行密码信息确认
  7. 客户端&服务端:远程连接建立成功

私钥和公钥的作用:

  • 利用公钥和私钥对数据信息进行加密处理;
  • 利用公钥和私钥进行用户身份认证。

基于密码的方式进行远程连接:公钥和私钥只能完成数据加密过程
基于密钥的方式进行远程连接:公钥和私钥可以完成身份认证功能

SSH远程连接方式

基于口令

基于口令
中间人攻击:SSH虽然采用公钥加密保证了传输信息的安全,但是由于SSH的公钥是服务器自己生成的,并没有证书中心(CA)的公证,如果中途公钥被截获,并冒充服务器将伪造的公钥发给用户,用户通过伪造的公钥加密密码再发送给冒充主机,此时冒充主机就可以获取用户的登录密码。

SSH通过使用$HOME/.ssh/known_hosts文件来解决中间人攻击问题。 known_hosts也会带来一些问题,当服务器端的公钥更新时,由于本地的known_hosts文件记录了原本的公钥会导致指纹认证失败,只需要删除known_hosts文件即可解决。

基于密钥

基于密钥

  • ~/.ssh/目录下会有的文件
      id_rsa:私钥文件
      id_rsa.pub:公钥文件
      authorized_keys:存放客户端公钥的文件
      known_hosts:确认过公钥指纹的可信服务器列表文件
      config:指定不同域名使用哪个密钥的配置文件

注意1:由于一台机器既可以是客户端,也可以是服务端,因此同时存在authorized_keys(服务端使用)和known_hosts(客户端使用)两个文件。
注意2:Linux是多用户系统,若所有用户都使用同一份密钥可能会无法划分权限或区分用户,可以通过config配置文件来配置针对不同服务器的配置,这样在连接服务器的时候就可以使用不同的密钥文件来登录。在客户端生成密钥对之后,将公钥追加到服务器的authorized_keys即可。

SSH密钥连接实践

客户端创建密钥对

ssh-genkey是生成密钥的工具,执行完成后生成公钥和私钥,这两个文件会默认保存在~/.ssh/路径下,常用选项:

  • -t:指定生成密钥类型(rsa、dsa,默认为rsa)
  • -f:指定存放私钥的文件,公钥文件名=私钥文件名.pub后缀(默认为id_rsa)
  • -P:指定私钥密码,用于确保私钥的安全(默认为空)
  • -C:备注(默认为user@hostname)
[root@m01 ~]# ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/root/.ssh/id_dsa):     
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
The key fingerprint is:
99:b5:c6:f1:69:f8:54:c1:d8:2b:51:6d:7a:d9:50:74 root@localhost.localdomain
The key's randomart image is:
+--[ DSA 1024]----+
|             =o+E|
|            o +.+|
|          o  ..=o|
|         = =.oo.o|
|        S = =. . |
|         . +     |
|            .    |
|                 |
|                 |
+-----------------+

客户端将公钥发送给服务端

ssh-copy-id命令将本地公钥添加到远程主机的authorized_keys文件中,常用选项:

  • -i:指定公钥文件

客户端使用ssh-copy-id命令将公钥发送给服务端

[root@m01 ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub 10.0.0.41
The authenticity of host '10.0.0.41 (10.0.0.41)' can't be established.
ECDSA key fingerprint is d8:b8:45:c4:c5:20:0b:70:bd:41:af:02:9d:e4:47:28.
Are you sure you want to continue connecting (yes/no)? yes 
/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@10.0.0.41's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '10.0.0.41'"
and check to make sure that only the key(s) you wanted were added.

查看服务端将客户端传来的公钥

[root@backup ~]# cat /root/.ssh/authorized_keys 
ssh-dss AAAAB3NzaC1kc3MAAACBALTcbSzaLn6tCmhfCmwRR/kQRGn2ns3k7F5Q8mloBLQuit25YcDSGvW5VwGAvPvAvtZr8OWwxy8jtBlhvXkwfhZcPR4Zrk1kgCvEzJFZXxZ+gyhcfjxK2Vtx+m+LPo53unARgoe7tpClbR6HHQnIJPrc0S3b7k+EL7xLLXXOM4ktAAAAFQC81EjlIEvcUHS8djvu7FK/m1s6swAAAIBj5xZ3ceB5J6qeo5r+gbxELjku4dkbE3VEpGucMdK9EaAQGYvsPNR2K3361FVhigTOniEe8oNGF9TWOYGWFGOFQIZZb3IKmxN2yQw0gxzJB3mgxFDHL4DnCfV/xSvtl3CLtxTows9PzkuJ0jQpRJhK851xhHDbMEuFL/xNYlPrBgAAAIBKaf+AKkNFY3KDWLBNxPvb1kQvulfM5fqYm6x0Iq7T2UP72cPgvrLlLrnVxCGDTjS7yxdcjSeoZT94tIcafkwXH3LhpOBWkLg7JDzi3WXjLslCpF+/z6retrOvbuoErtp3ppjWddsDVM7zvp1o65ZSiwIWlw3KDdfbD1NC9HqtcQ== root@localhost.localdomain

客户端进行远程连接测试

不用输入密码即可直接连接

[root@m01 ~]# ssh 10.0.0.41
Last login: Mon Jul 26 16:11:12 2021 from 10.0.0.1
[root@backup ~]# ssh-copy-id -i /root/.ssh/id_dsa.pub 10.0.0.41

脚本实现批量分发公钥

问题1:有交互过程(输入yes/no以及密码信息)

  • 解决输入密码问题(sshpass):

    [root@m01 ~]# yum install -y sshpass
    [root@m01 ~]# sshpass -predhat ssh-copy-id -i /root/.ssh/id_dsa.pub 10.0.0.41
    
  • 解决yes/no问题(-o参数)

    [root@m01 ~]# sshpass -predhat ssh-copy-id -i /root/.ssh/id_dsa.pub 10.0.0.41 "-o StrictHostKeyChecking=no"
    

问题2:若服务端端口号变化,如何分发公钥?(-p参数)

[root@m01 ~]# sshpass -predhat ssh-copy-id -i /root/.ssh/id_dsa.pub 10.0.0.41 -p 52113 "-o StrictHostKeyChecking=no"

综上所述,不完善的分发公钥脚本如下

#!/bin/bash 

for ip in `cat /server/scripts/ip.txt`
do
	echo "------------host:10.0.0.$ip start------------"
	sshpass -predhat ssh-copy-id -i /root/.ssh/id_dsa.pub 10.0.0.$ip "-o StrictHostKeyChecking=no" &>/dev/null
	echo "host:10.0.0.$ip distributed successfully."
	echo "------------host:10.0.0.$ip end------------"
done

SSH服务配置文件

  • /etc/ssh/ssh_config:针对客户端配置文件

  • /etc/ssh/sshd_config:针对服务端配置文件

    参数作用
    Port 22服务端口信息
    ListenAddress 0.0.0.0监听地址,指定一块网卡接受远程访问的请求(指定监听地址只能是本地网卡有的地址)
    PermitEmptyPasswords no是否允许远程用户使用空密码登录,默认不允许
    PermitRootLogin yes是否允许root用户远程登录,默认允许(建议改为no)
    GSSAPIAuthentication yes是否开启GSSAPI认证功能,默认开启(建议不用的时候关闭,否则会影响ssh连接速率)
    UseDNS no是否开启反向DNS解析功能(建议关闭,提高连接速度)

SSH服务安全防范

  1. 使用密钥登录,不使用密码登录;
  2. 防火墙封闭SSH,指定源IP限制(局域网、信任公网);
  3. 开启SSH只监听本地内网IP(ListenAddress);
  4. 尽量不要给服务器配置外网IP;
  5. 文件权限最小化,服务器服务最少化(服务越多开放的端口越多);
  6. 给系统的重要文件或命令做一个指纹,实时监控指纹的变化,或者inotify实时监控重要目录的变化;
  7. 给系统的重要文件或命令加上特殊权限chattr +i/+a。

SSH服务相关命令

  • ssh:远程连接
  • ssh-keygen:生成密钥的工具,执行完成后生成公钥和私钥
  • ssh-copy-id:将本地公钥添加到远程主机的authorized_keys文件中
  • sshpass:直接使用密码进行远程连接
  • scp:Linux 之间复制文件和目录
  • sftp:交互式文件传输程序,进行加密传输
       ls — 查看远程ftp服务器信息
       cd — 查看远程ftp服务器信息
       lls — 查看本地ftp客户端信息
       lcd — 查看本地ftp客户端信息
       get — 下载信息
       put — 上传信息
       help — 帮助信息
       bye — 退出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值