ssh 服务详解

2023年 5月 4日 78.3k 0

SSH
批量管理

SSH介绍

SSH是Secure Shell Protocol的简写,由IETF网络工作小组(Network working Group)指定;在进行数据传输之前,SSH先对联机数据包通过加密技术进行加密处理,加密后在进行数据传输。确保了传递的数据安全
SSH是专为远程登录会话和其他网络服务提供的安全性协议。利用SSH协议可以有效的放置远程管理过程中的信息泄露问题,在当前的生产环境运维工作中,绝大多数企业普遍采用SSH协议服务来代替传统的不安全的远程联机服务软件,如telnet(23端口,非加密)
在默认状态下,SSH服务主要提供了两个服务功能,一个是提供类似Telnet远程联机服务器的服务,即上面提到的SSH服务;另一个是类似FTP服务的sftp-server,借助SSH协议来传输数据的,提供更安全的SFTP服务(vsftp,proftp)
SSH客户端(SSH命令)还包含一个远程安全拷贝命令scp,也是通过ssh协议工作
1.png-64.4kB

ssh小结

1、SSH是安全的加密协议,用于远程连接linux服务器
2、SSH默认端口是22,安全协议版本SSH2,除了2之外还有SSH1(漏洞)
3、SSH服务端主要包含两个服务协议SSH远程连接,SFTP服务
4、Linux SSH客户端包含ssh远程连接命令,以及远程拷贝scp命令

SSH结构

SSH服务由服务端软件OpenSSH (openssl)和客户端(常见的有SSH(linux),SecureCRT,Putty,Xshell)组成,SSH服务默认使用22端口提供服务,它有两个不兼容的SSH协议版本分别是1.x和2.x

检查安装SSH

[root@web01 ~]# rpm -qa openssh
openssh-5.3p1-111.el6.x86_64    远程连接安装包
[root@web01 ~]# rpm -qa openssl
openssl-1.0.1e-42.el6.x86_64        加密安装包

OpenSSH同时支持SSH 1.x和2.x 用SSH 2.x的客户端程序不能链接到SSH1.x的服务程序上
SSH服务是一个守护进程(daemon),他在后台运行并响应来自客户端的连接请求,SSH服务端的进程名为sshd,负责实时监听远程SSH客户端的连接请求,并进行处理,一般包括公共密钥认证、密钥交换、对称密钥加密和非安全连接等。
SSH客户端包含ssh以及像scp(远程拷贝)slogin(远程登录)sftp(安全FTP文件传输)等应用程序
SSH的工作机制大致是本地的ssh客户端发送一个连接请求到远程的ssh服务器,服务器检查连接的客户端发送的数据包和ip地址,如果确认合法,就会发送密钥给SSH的客户端,此时,客户端本地再将密钥发回给服务端,自己建立连接。SSH1.x和SSH2.x在连接协议上有一些安全方面的差异

SSH加密技术

SSH加密技术是将人类可以看得懂的数据,通过一定的特殊的程序算法,把这些数据变成杂乱的无意义的信息,然后,通过网络进行传输,二挡到了目的地后,在通过对应的解密算法,把传过来的加密的数据信息解密成加密前的可读取的正常数据。因此,当数据在互联网上传输时即使被有心的黑客监听窃取了,也很难获取到真正需要的数据
网络上的数据包加密技术一般是通过所谓的一对公钥和私钥(Public key and Pivate key)组合撑的密钥对进行加密与解密操作。
2.png-42.2kB
SSH 1.x
每一台SSH服务器主机都可以使用RSA加密方式来产生一个1024-bit的RSA Key 这个RSA的加密方式就是用来产生公钥和私钥的算法之一。
当服务启动时,就会产生一个768 bit的临时公钥存放在Server中

[root@m01 ~]# grep ServerKey /etc/ssh/sshd_config
#ServerKeyBits 1024

3.png-80.8kB
SSH 2.x
在SSH 1.x的联机过程中,当Server接收Clinet端的Private Key后,就不再针对该次联机的Key pair进行检验。若此时有而已黑客对该联机key pair插入而已的程序代码时,由于服务端你不会在检验联机的正确性,因此可能会接收该程序代码,从而导致系统被黑
为了改正这个缺点,SSH version2多加了一个确认联机正确性的Diffie-Hellman机制
在每次数据传输中,Server都会以该机制检查数据的来源是否正确,这样,可以避免联机过程中被插入而已程序代码的问题
另外,SSH2同时支持RSA和DSA密钥,但是SSH1仅支持RSA密钥
由于SSH1协议本身存在较大问题,建议使用SSH2的联机模式
当Client端SSH联机请求传送过来时,Server就会将这个768-bit的公钥传给Client端
此时Client会将此公钥与先前存储的公钥进行对比,看是否一致,判断标准是Client端联机用户目录下~/.ssh/known_hosts文件的内容(linux-客户端)
1.png-109.2kB
不加用户默认是root 不加-p 指定端口 默认是22

[root@m01 ~]# ssh -p52113 oldboy@10.0.0.41
The authenticity of host '[10.0.0.41]:52113 ([10.0.0.41]:52113)' can't be established.
RSA key fingerprint is 96:66:71:6c:ab:2f:8d:58:ce:2c:19:78:a7:ad:13:58.
Are you sure you want to continue connecting (yes/no)?

不加账户默认是root

连接密码文件存放路径

[root@backup /]# cat ~/.ssh/known_hosts 
10.0.0.7 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA3KsbWJYe6fa2by0asfaZluclFBDtJH61HYG/jxxNEXhVqkGfdp2vN6tHroTFSMPdOHNbqOZICP8YQRpS9UMddfeZxWpf/+HwJLe+40J5eCVY/YgVaDIUVJrxVgkUfB4/XBoUawhSoqLQELnQHVeayHLvQSiZmlFYTaQ0Vb7g+qO7cUHdxi5/1zCplJhq9TMbz78yfWrwvP3iX6x/QdBX72OKUSS02b7KSwhfGj76OX56BmnQx8fVMMotrxTtWuRqYAw+BBtAjr197SZ4J0aJagWHod6HDxA4yfYebB/RuBtmd2va4+TqQtq6N2zvZ7Z5ud2drpZZmruIdGg91mlMLQ==

如何防止SSH登录入侵:

1、用密钥登录,不用密码登录
2、牤牛阵法:解决SSH安全问题
3、防火墙封闭SSH,指定源限制(局域网,信任公网)
4、开启SSH只监听本地内网IP(ListenAddress 10.0.0.8)
5、尽量不给服务器外网IP

远程连接SSH服务

ssh基本使用语法
ssh -p52113 oldboy@172.16.1.1
1. 连接远程主机命令的基本语法
2. -p小写接端口,默认22端口时可以省略-p22
3. -@ 前面为用户名,如果当前用户连接,可以不指定用户
4. @后面为要连接的服务器的IP

密钥存储路径

[oldboy@m01 ~]$ cat ~/.ssh/known_hosts

如果端口已修改为特殊端口,那么用上面命令连接就会发生问题

[oldboy@m01 ~]$ ssh -p22 oldboy@10.0.0.31
ssh: connect to host 10.0.0.31 port 22: Connection refused    #提示拒绝连接

保存的结果可能为:
1、no route to hosts 可能为防火墙
2、Connection refused 可能是防火墙,可能是连接端口错误
远程执行命令(最好全路径) ssh -p 22 root@10.0.0.1 /sbin/ifconfig

SSH小结:

1、切换到别的机器上 ssh -p52113 user@ip
2、到其他机器执行命令(不会切到机器上) ssh -p 52113 user@ip 命令
3、当第一次SSH连接的时候,本地会产生一个密钥文件~/.ssh/known_hosts

SSH客户端附带的远程拷贝scp命令

scp的基本语法使用:scp -sercure copy (remote file copy program)
推 PUSH
scp -P22 -rp /tmp/oldboy oldboy@10.0.0.1:/tmp
拉 PULL

scp -P22 -rp root@10.0.0.1:/tmp/oldboy/ /tmp/

参数:
#→ -P(大写)接接口,默认22 可以省略
#→-r 递归,表示拷贝目录
#→-p 表示在拷贝前后保持文件或目录属性
# -l 限制速度

scp 知识小结:

1、scp是加密的远程拷贝,而cp仅为本地拷贝
2、可以把数据从一台机器推送到另一台机器,也可以从其他服务器把数据拉回到本地执行命令的服务器
3、每次都是全量完成拷贝,因此效率不高,适合第一次拷贝用,如果需要增量拷贝,用rsync

ssh服务附带的sftp功能服务

windows客户端和linux服务器之间传输数据工具:
1) rz、sz(lrzsz)
2) winscp WinSCP-v4.0.5 基于SSH,sftp
3) SFX(xshell) 4) SFTP 基于SSH加密传输
5) samba,http,ftp,nfs
FTP工具:vsftp、proftpd、SFTP

linux sftp客户端连接sftp服务方法

登录FTP的方法就是sftp oldboy@10.0.0.1 如果ssh端口为52113,则命令如下

[oldboy@m01 ~]$ sftp -oPort=52113 oldboy@10.0.0.31
Connecting to 10.0.0.31...
sftp> cd /home/oldboy

#还可以像命令行那些切换目录

sftp> put /etc/hosts   #把/etc/hosts
从客户端本地传到nfs服务器当做连接目录
Uploading /etc/hosts to /home/oldboy/hosts
/etc/hosts                 100%  349     0.3KB/s   00:00    
sftp>ls -l /home/oldboy  #可以查看目录

SSH服务认证类型介绍

基于口令的安全验证:

基于口令的安全验证的方式就是大家现在一直在用的,只要知道服务器的SSH端口号和口令,应服务器的IP及开放的端口,默认都为22,就可以通过ssh客户端登录到主机,此时联机过程中所有传输都是加密的

基于密钥的安全验证:

基于密钥的安全验证方式是指,需要依靠密钥,也就是必须事先建立一对密钥,然后把公用密钥(Publickey)放在需要访问的目标服务器上,另外,个还需要把私有密钥(Private key)放到SSH客户端或对应的客户端服务器上
此时,如果要想连接到这个带有公用密钥的SSH服务器,客户端SSH软件或者客户端端服务就会想SSH服务端发出请求,请求用联机用户密钥进行安全连接。SSH服务会在收到请求之后,会现在改SSH服务器上连接的用户的加密路下 放上去的对应用户密钥,然后把它和连接的SSH客户端发来进行密钥,如果两个密钥一直SSH服务就会用公用密钥加密“质询”(challenge)并把它发送给SSH客户端
2.png-19.7kB
3.png-198kB

更改ssh默认登录配置

修改SSH服务的运行参数,是通过修改配置文件/etc/ssh/sshd_config实现的
一般来说SSH服务使用默认的配置已经够很好的工作,如果对安全要求不高,仅仅提供SSH服务的情况不需要修改任何配置
sshd_config配置文件说明:
4.png-41.2kB
优化SSH配置文件选项

[root@m01 etc]# cp /etc/ssh/sshd_config{,.ori}  修改配置文件前进行备份
[root@m01 etc]# vim /etc/ssh/sshd_config
Port 52113              //ssh连接端口默认为22,修改端口号可以提高级别
PermitRootLogin no      //禁止root远程登录
PermitEmptyPasswords no //禁止空密码的用户登录
UseDNS no               //不使用DNS进行解析
GSSAPIAuthentication no //会导致SSH连接慢

SSH远程连接服务慢的解决方案

在这里我们可以使用`sed`进行一键替换
[root@m01 etc]# sed -r '13 iPort 52113nPermitRootLogin nonPermitEmptyPasswords nonUseDNS nonGSSAPIAuthentication no' /etc/ssh/sshd_config

准备工作

优化SSH
sed -i '13 iPort 52113nPermitRootLogin nonPermitEmptyPasswords
nonUseDNS nonGSSAPIAuthentication no' /etc/ssh/sshd_config

sed -i '13 iPort 52113nPermitRootLogin no   n   禁止root登录
PermitEmptyPasswords no n              禁止使用密码
UseDNS non                     禁用DNS
GSSAPIAuthentication no'                禁用GSSAPI
sshd_config

检查houst解析

cat >>/etc/hosts/ <<EOF
172.16.1.5      lb01
172.16.1.6      lb02
172.16.1.7      web02
172.16.1.8      web01
172.16.1.51     db01 db01.etiantian.org
172.16.1.31     nfs01
172.16.1.41     backup
172.16.1.61     m01
EOF结束

实验步骤

[root@m01 /]# useradd oldboy
[root@m01 /]# echo "123456"|passwd --stdin oldboy
[root@m01 /]# id oldboy
[root@m01 /]#su – oldboy
[oldboy@web01 ~]$ ssh-keygen -t dsa   //非交互式创建密钥  

#ssh-keygen是生产密钥的工具 -t参数是指定密钥的类型,这里是建立dsa类型密钥
#也可以使用ssh-keygen -t rsa来建立rsa类型密钥
#RSA与DSA加密算法的区别
#RSA:是一种加密算法(PS:RSA也可以进行数字签名的)它的简写的来由是RonRivest、Adi Shamir和LeonAdleman 这三个姓氏加在一起就是RSA
#DSA就是数字签名算法的英文全称的简写,即Digital Sigenature Algorithm=DSA
RSA既可以进行加密,也可以进行数字签名实现认证,而DSA只能用于数字签名

脚本分发密钥

yum install -y sshpass
ssh-keygen -t rsa -P '' -f ~/.ssh/id_dsa &>/dev/null
sshpass -p 123456  ssh -o StrictHostKeyChecking=no  用户名@主机名

一键产生密钥对:

ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
echo -e "n"|ssh-keygen -t dsa -N "" 
[oldboy@web01 ~]$ ll -la
total 28
drwx------. 3 oldboy oldboy 4096 May  6 00:59 .
drwxr-xr-x. 3 root   root   4096 May  1 04:39 ..
-rw-------. 1 oldboy oldboy   25 May  5 18:58 .bash_history
-rw-r--r--. 1 oldboy oldboy   18 Jul 24  2015 .bash_logout
-rw-r--r--. 1 oldboy oldboy  176 Jul 24  2015 .bash_profile
-rw-r--r--. 1 oldboy oldboy  124 Jul 24  2015 .bashrc
drwx------  2 oldboy oldboy 4096 May  6 00:59 .ssh   注意权限
[oldboy@web01 .ssh]$ ll
total 8
-rw------- 1 oldboy oldboy 668 May  6 00:59 id_dsa       私钥=钥匙
-rw-r--r-- 1 oldboy oldboy 602 May  6 00:59 id_dsa.pub  公钥=锁

[oldboy@web01 .ssh]$ssh-copy-id -i id_dsa.pub oldboy@10.0.0.41
ssh-copy-id 只能发公钥,不能发私钥
-i 代表发送的文件 代表默认发送(端口22情况)

[oldboy@web01 .ssh]$ ssh-copy-id -i id_dsa.pub “-p 52113 oldboy@10.0.0.41”

代表改变端口-p 后面加上修改后的端口即可

[oldboy@web01 ~]$ ssh-copy-id -i .ssh/id_dsa.pub  oldboy@172.16.1.31
[oldboy@web01 ~]$ ssh-copy-id -i .ssh/id_dsa.pub "-p52113 oldboy@172.16.1.41"

SSH免密码登录小结:

1)免密码登录是单向的,方向从私钥(钥匙)==》公钥(锁)
2)SSH免密码登录基于用户的,最好不要跨不同的用户
3)ssh连接慢的问题解决

例子:将本地hosts发送给指定的ip

第一种 sudo 提权实现没有权限用户拷贝

[root@web01~]#echo“oldboyALL= NOPASSWD:/usr/bin/rsync ”>>/etc/sudoers
[root@web01~]#visudo -c 
[oldboy@web01 ~]$scp -P52113 hosts oldboy@172.16.1.31:~	//最好发送到家目录下,直接发送到/下是没有权限
[oldboy@web01 ~]$ssh -p52113 -t oldboy@172.16.1.31 sudo rsync ~/hosts /etc/hosts
需要授权sudo权限

第二种 利用suid实现没有权限用户拷贝(了解即可,不建议使用)

[root@web01~]#chmod u+s `which rsync`
[oldboy@web01 ~]$scp -P52113 hosts oldboy@172.16.1.31:~
[oldboy@web01 ~]$ssh -p52113 oldboy@172.16.1.31 rsync ~/hosts  /etc/hosts

第三种 使用root进行操作
rsync使用

rsync -avz hosts -e ‘ssh -p 52113’oldboy@172.16.1.31:~

1、可以增量备份
2、使用ssh隧道加密传输

常用连接介绍:

1.png-34.5kB

发送文件脚本

[cyh888@m01 ~]$ sh fenfa.sh hosts
hosts 10.0.0.41 is ok                                      [  OK  ]
hosts 10.0.0.31 is ok                                      [  OK  ]
[cyh888@m01 ~]$ cat hosts 
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
172.16.1.5      lb01
172.16.1.6      lb02
172.16.1.7      web02
172.16.1.8      web01
172.16.1.51     db01 db01.etiantian.org
172.16.1.31     nfs01
172.16.1.41     backup
172.16.1.61     m01
===================2016-05-08=====
[cyh888@m01 ~]$

查看对方系统版本

[oldboy@web01 ~]$ sh view.sh 
====172.16.1.41====CentOS release 6.7 (Final)
====172.16.1.31====CentOS release 6.7 (Final)
[oldboy@web01 ~]$ cat view.sh
#!/bin/sh
for n in 41 31 
do
  echo -n "====172.16.1.$n===="			-n代表不换行
  ssh -p 22 172.16.1.$n cat /etc/redhat-release
done

[oldboy@web01 ~]$ sh view.sh "cat /etc/redhat-release"
====172.16.1.41====CentOS release 6.7 (Final)
====172.16.1.31====CentOS release 6.7 (Final)
[oldboy@web01 ~]$ cat view.sh 
#!/bin/sh
for n in 41 31 
do
  echo -n "====172.16.1.$n===="	
  ssh -p 22 172.16.1.$n $1			$1脚本当中第一个参数
done

[oldboy@web01 ~]$ sh view.sh "iostat" 查看系统中的IO

====172.16.1.41====Linux 2.6.32-573.el6.x86_64 (backup)     05/06/2016  _x86_64_    (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.01    0.00    0.14    0.10    0.00   99.76

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
scd0              0.00         0.01         0.00        264          0
sda               0.18         4.90         0.77      99662      15746

====172.16.1.31====Linux 2.6.32-573.el6.x86_64 (nfs01)  05/06/2016  _x86_64_(1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.03    0.03    0.22    0.20    0.00   99.53

Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
scd0              0.00         0.00         0.00        264          0
sda               0.51        14.88        12.88    1153072     997908
[oldboy@web01 ~]$ sh view.sh "free -m"
====172.16.1.41====
             total       used       free     shared    buffers     cached
Mem:           475        107        367          0         11         34
-/+ buffers/cache:         60        414 
Swap:         1023          0       1023 
====172.16.1.31====
             total       used       free     shared    buffers     cached
Mem:           475        417         57          0         28        288
-/+ buffers/cache:        100        374 
Swap:         1023          0       1023
脚本里面将echo -n中的-n取消即可

批量分发文件:(housts)

[oldboy@web01 ~]$ scp -P22 hosts 172.16.1.41:~
hosts                                          100%  349     0.3KB/s   00:00    
[oldboy@web01 ~]$ scp -P22 hosts 172.16.1.31:~
hosts                                          100%  349     0.3KB/s   00:00  

脚本内容

[oldboy@web01 ~]$ sh fenfa.sh 
hosts                                          100%  349     0.3KB/s   00:00    
hosts                                          100%  349     0.3KB/s   00:00    
[oldboy@web01 ~]$ cat fenfa.sh 
#!/bin/sh
for n in 41 31 
do
  echo -n "====172.16.1.$n===="	
  scp -P22 hosts 172.16.1.$n:~
done

另一种方法:

[oldboy@web01 ~]$ sh fenfa.sh hosts 
hosts                                          100%  349     0.3KB/s   00:00    
hosts                                          100%  349     0.3KB/s   00:00   
[oldboy@web01 ~]$ cat fenfa.sh 
#!/bin/sh
for n in 41 31 
do
  echo -n "====172.16.1.$n===="	
  scp -P22 $1 172.16.1.$n:~
done

控制不输入任何命令进行操作

[oldboy@web01 ~]$ sh fenfa.sh 
USAGE:/bin/sh fenfa.sh FILENAME
[oldboy@web01 ~]$ cat fenfa.sh
#!/bin/sh
if [ $# -ne 1 ];then   $#参数多少
    echo "USAGE:/bin/sh $0 FILENAME"	$0脚本名字
    exit 1      1脚本执行后的状态
fi
for n in 41 31 
do
  echo -n "====172.16.1.$n===="	
  scp -P22 $1 172.16.1.$n:~     对应第一个执行命令
done
[oldboy@web01 ~]$ sh fenfa.sh 
USAGE:/bin/sh fenfa.sh FILENAME
[oldboy@web01 ~]$ sh fenfa.sh hosts   成功ok  失败no
dis hosts to 172.16.1.41                                   [  OK  ]
dis hosts to 172.16.1.31                                   [  OK  ]

脚本内容

#!/bin/sh
. /etc/init.d/functions

if [ $# -ne 1 ];then
	echo "USAGE:/bin/sh $0 FILENAME"
    exit 1
fi
for n in 41 31 
do
  scp -P22 $1 172.16.1.$n:~ &>/dev/null
  if [ $? -eq 0 ];then
	action "dis $1 to 172.16.1.$n" /bin/true
else
	action "172.16.1.$n" /bin/false
fi
done

expect语言 解决非交互式输入密码的问题
yum -y install expect 默认不存在需要安装

[root@m01 ~]# which expect
/usr/bin/expect

2.png-94.3kB
ssh+rsync+sersync简单易用
Saltstack
pupet 大网站用
ansible (不需要客户端)
cfengine (已淘汰)

SSH批量管理步骤:

1、ssh优化和hosts解析
2、创建用户
3、生成密钥对
4、分发公钥到所有服务器 ssh-copy-id
5、测试 远程连接ssh 远程执行命令ssh ifconfig
远程拷贝文件scp rsync-e隧道模式

相关文章:

  1. Kubernetes 1.14 二进制集群安装
  2. 老男孩Shell企业面试题30道 [答案]
  3. Shell 基础介绍 [1]
  4. Shell 变量及函数讲解 [2]

相关文章

服务器端口转发,带你了解服务器端口转发
服务器开放端口,服务器开放端口的步骤
产品推荐:7月受欢迎AI容器镜像来了,有Qwen系列大模型镜像
如何使用 WinGet 下载 Microsoft Store 应用
百度搜索:蓝易云 – 熟悉ubuntu apt-get命令详解
百度搜索:蓝易云 – 域名解析成功但ping不通解决方案

发布评论