linux之【ssh远程连接服务】

245 阅读7分钟

1、ssh服务

远程连接协议

软件名:openssh

 最基本的通式:
     ssh +IP地址
     
 扩展通式:
     1、ssh 选项  IP地址   -p   22          
     ssh zhangsan@192.168.91.101 -p 22
     
     2、ssh  ip地址  命令
     ssh 192.168.91.101 hostname
ssh选项含义
-pport 端口号,指定登录的端口号
-l(小L)指定登录名称,-l=@
-t跳板连接
 [root@localhost .ssh]#iptables -A INPUT -s 192.168.91.102 -j REJECT 
 #模拟防火墙
 [root@localhost ~]# ssh -t 192.168.91.101  ssh -t 192.168.91.102  ssh 192.168.91.103
 #方便跳板连接,类似曲线救国

1.1 ssh协议的优点

  • 数据传输是加密的,可以防止信息泄漏
  • 数据传输是压缩的,可以提高传输速度

ssh与telnet的相同点和不同点:

  • 相同点

    • 都是通过协议,去连接远程的服务器。
  • 不同点

    • ssh:密文传输,压缩,ssh应用范围广
    • telnet:明文 ,不安全,但是效率比ssh高。

1.2 openssh的客户端和服务端

类型客户端服务端
服务名openssh-clientsopenssh-server
主程序/usr/bin/ssh/usr/sbin/sshd
配置文件位置/etc/ssh/ssh_config/etc/ssh/sshd_config

// sshd 可以通过网络在主机中 开启shell的服务,d就daemon,就是后台进程的含义。

修改客户端配置文件,无需验证,有安全隐患:

vim /etc/ssh/ssh_config

image.png

1.3 known_hosts

 公钥存放的位置:~/.ssh/known_hosts
 自己的密钥位置:/etc/ssh/

公钥是一串乱码,公钥加密,私钥解密。

 [root@localhost ~]#  cd /etc/ssh
 [root@localhost ssh]#  cat known_hosts

2、ssh原理

ssh是字符界面 image.png image.png

2.1 公钥传输原理:

  • 客户端发起链接请求
  • 服务端返回自己的公钥,以及一个会话ID(这一步客户端得到服务端公钥)
  • 客户端生成密钥对
  • 客户端用自己的公钥异或会话ID,计算出一个值Res,并用服务端的公钥加密
  • 客户端发送加密值到服务端,服务端用私钥解密,得到Res
  • 服务端用解密后的值Res异或会话ID,计算出客户端的公钥(这一步服务端得到客户端公钥)
  • 最终:双方各自持有三个秘钥,分别为自己的一对公、私钥,以及对方的公钥,之后的所有通讯都会被加密

// 密码有可能会被破解,所以要用密钥

2.2 加密类型

  • 对称加密
  • 非对称加密

// 注意:私钥不会发给对方,发给对方的是一般是本机的公钥。

2.3 常用算法

(不是绝对的安全,只是相对比较安全)

  • RSA(RSA algorithm):目前使用最广泛的算法
  • DSA(Digital Signature Algorithm):数字签名算法,和 RSA 不同的是 DSA仅能用于数字签名,不能进行数据加密解密,其安全性和RSA相当,但其性能要比RSA快
  • ECC(Elliptic curve cryptography,椭圆曲线加密算法)
  • ECDSA:Elliptic Curve Digital Signature Algorithm,椭圆曲线签名算法,是ECC和 DSA的结合,相比于RSA算法,ECC 可以使用更小的秘钥,更高的效率,提供更高的安全保障

3、服务端配置

配置文件位置:/etc/ssh/sshd_config

SElinux软件 作用是控制安全,它规定了ssh只能用端口号22,如果想要修改ssh的端口号,需要向SElinux软件 申请放行。

3.1 常用配置项:

配置含义
ListenAddress ip监听地址设置SSHD服务器绑定的IP 地址
LoginGraceTime 2m用来设定如果用户登录失败,在切断连接前服务器需要等待的时间,单位为秒
PermitRootLogin yescentos默认允许, ubuntu不允许root远程ssh登录
StrictModes yes检查.ssh/文件的所有者,权限等
MaxAuthTries用来设置最大失败尝试登陆次数为6
MaxSessions 10同一个连接最大会话
PubkeyAuthentication yes基于key验证
PermitEmptyPasswords no密码验证当然是需要的!所以这里写 yes,也可以设置为 no
UseDNS yes提高速度可改为no 内网改为no 禁用反向解析
AllowUsers user1 user2 user3@ip白名单用户
AllowGroups g1 g2白名单组
DenyUsers user1 user2 user3黑名单用户
DenyGroups g1 g2黑名单组

3.2 ssh服务的最佳实践

  1. 建议使用非默认端口 22
  2. 禁止使用protocol version 1
  3. 限制可登录用户 白名单
  4. 设定空闲会话超时时长
  5. 利用防火墙设置ssh访问策略
  6. 仅监听特定的IP地址 公网 内网
  7. 基于口令认证时,使用强密码策略,比如:tr -dc A-Za-z0-9_ < /dev/urandom | head -c 12| xargs
  8. 使用基于密钥的认证
  9. 禁止使用空密码
  10. 禁止root用户直接登录
  11. 限制ssh的访问频度和并发在线数
  12. 经常分析日志 分离

3.3 服务端实验

3.3.1 实验一:修改默认端口

  • 修改服务机的端口
 [root@localhost ~]#  vim /etc/ssh/sshd_config #进入服务端配置文件
 # port 22  #原来的端口号22
 port 9527   #将22改成9527
 [root@localhost ~]#  systemctl restart sshd
     Job for sshd.service failed because the control process exited with error code. See "systemctl status sshd.service" and "journalctl -xe" for details.   #正常情况下会报错,因为Selinux安全软件
 ​
 [root@localhost ~]#  getenforce    #检查一下
 Enforcing          #Selinux安全软件对其进行了限制,所以导致报错
 ​
 [root@localhost ~]#  setenforce 0   #使用该命令,就可以修改了
 [root@localhost ~]#  systemctl restart sshd
  • 然后用客户机去远程连接服务机,验证端口号是否修改成功
 [root@localhost ~]#  ssh 192.168.125.130 -p 9527
 Last login: Mon Apr 29 22:09:07 2024 from 192.168.125.100    #连接成功,证明端口号已被成功修改。

3.3.2 实验二:禁止root用户登录

image.png

 ssh zhangsan@192.168.91.130 -p 9527
 #zhangsan不是超级管理员,不受限制,可以登录。

3.3.3 实验三:白名单黑名单列表

  • 白名单:默认拒绝所有,只有在白名单内的才放行
  • 黑名单:默认允许所有,只有在黑名单内的才拒绝
 [root@localhost ssh]#vim /etc/ssh/sshd_config
 #手动添加
 AllowUsers zhangsan@192.168.91.100  lisi   
 #允许所有有的主机访问我的lisi用户
 #只允许192.168.91.100 访问服务器的zhangsan用户
 ​
 DenyUsers  liwu@192.168.91.100  #只拒绝192.168.91.100登录服务器的liwu用户
 ​
 systemctl restart sshd

小拓展:查看用户信息、给用户添加密码

 id zhangsan    #查看zhangsan的信息
 useradd lisi   #添加lisi用户
 echo "123" |passwd --stdin lisi   #给lisi用户添加免交互密码123

3.3.4 实验四:客户端免密登录服务端

ssh-keygen 生成密钥的命令

ssh-keygen -t 生成密钥的算法方式,默认是id_rsa算法

// 客户端想免密登录服务端,要把自己(客户端)的公钥 推给服务端

第一步:生成密钥

 [root@localhost ~]#  ssh-keygen   #生成密钥的命令
 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:QnTHZ8gA4xhzEEjoDryrWaR93gtXsTYFeAZGFPzyhHg root@localhost.localdomain
 The key's randomart image is:
 +---[RSA 2048]----+
 | o..=*@=++..     |
 |. .  Ooooo+ o    |
 |o   ..o=. .o     |
 |.o  ..E o+       |
 |o o  ..+S        |
 | *     +..       |
 |. + o .          |
 | + o +           |
 |+   . o.         |
 +----[SHA256]-----+

第二步:把密钥传给对方

 [root@localhost ~]#  cd .ssh/
 [root@localhost .ssh]#  ssh-copy-id   -i   id_rsa.pub   192.168.125.130    #id_rsa.pub是公钥,如果在家目录下,要用绝对路径      
 ​
 密钥文件的位置:~/.ssh/id_rsa

第三步:免密登录服务端

 [root@localhost .ssh]#  ssh 192.168.125.130
 Last login: Mon Apr 29 22:25:48 2024 from 192.168.125.130

3.4 代理 agent

 ssh-agent bash   #启用代理,用bash进行后台运行
 ssh-add + 密码    #相当于把密码交给 agent管理
 #如果重启或者退出,需要进行重新代理

image.png

3.5 使同网段的设备之间 免密登录

 #免密登录脚本
 vim ssh_log.sh
 ​
 #!/bin/bash
 PASS=123123     #密码
 ​
 #设置网段最后的地址,4-255之间,越小扫描越快
 END=254
 ​
 IP=`ip a s ens33 | awk -F'[ /]+' 'NR==3{print $3}'`
 NET=${IP%.*}.
 ​
 rm -f /root/.ssh/id_rsa
 [ -e ./SCANIP.log ] && rm -f SCANIP.log
 for((i=3;i<="$END";i++));do
 ping -c 1 -w 1  ${NET}$i &> /dev/null  && echo "${NET}$i" >> SCANIP.log &
 done
 wait
 ​
 ssh-keygen -P "" -f /root/.ssh/id_rsa
 rpm -q sshpass || yum -y install sshpass
 sshpass -p $PASS ssh-copy-id -o StrictHostKeyChecking=no $IP
 ​
 AliveIP=(`cat SCANIP.log`)
 for n in ${AliveIP[*]};do
 sshpass -p $PASS scp -o StrictHostKeyChecking=no -r /root/.ssh root@${n}:
 done

3.6 pssh

轻量级自动化运维工具 (EPEL源)

pssh命令 比较实用,可以批量操作。

用pssh之前,要先免密登录 ssh-keygen

 加强版的ssh
 -H:主机字符串,内容格式”[user@]host[:port]” 
 -h file:主机列表文件,内容格式”[user@]host[:port]” 
 -A:手动输入密码模式
 -i:每个服务器内部处理信息输出
 -l:登录使用的用户名
 -p:并发的线程数【可选】
 -o:输出的文件目录【可选】
 -e:错误输出文件【可选】
 -t:TIMEOUT 超时时间设置,0无限制【可选】
 -O:SSH的选项
 -P:打印出服务器返回信息
 -v:详细模式
 --version:查看版本