ssh 服务详解

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

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

OpenSSH同时支持SSH 1.x2.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

  1. [root@m01 ~]# grep ServerKey /etc/ssh/sshd_config
  2. #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同时支持RSADSA密钥,但是SSH1仅支持RSA密钥
由于SSH1协议本身存在较大问题,建议使用SSH2的联机模式
当Client端SSH联机请求传送过来时,Server就会将这个768-bit的公钥传给Client端
此时Client会将此公钥与先前存储的公钥进行对比,看是否一致,判断标准是Client端联机用户目录下~/.ssh/known_hosts文件的内容(linux-客户端
1.png-109.2kB

不加用户默认是root 不加-p 指定端口 默认是22

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

不加账户默认是root

连接密码文件存放路径

  1. [root@backup /]# cat ~/.ssh/known_hosts
  2. 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

密钥存储路径

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

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

  1. [oldboy@m01 ~]$ ssh -p22 oldboy@10.0.0.31
  2. 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 copyremote file copy program
PUSH
scp -P22 -rp /tmp/oldboy oldboy@10.0.0.1:/tmp
PULL

  1. 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,则命令如下

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

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

  1. sftp> put /etc/hosts #把/etc/hosts
  2. 从客户端本地传到nfs服务器当做连接目录
  3. Uploading /etc/hosts to /home/oldboy/hosts
  4. /etc/hosts 100% 349 0.3KB/s 00:00
  5. 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配置文件选项

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

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

  1. 在这里我们可以使用`sed`进行一键替换
  2. [root@m01 etc]# sed -r '13 iPort 52113\nPermitRootLogin no\nPermitEmptyPasswords no\nUseDNS no\nGSSAPIAuthentication no' /etc/ssh/sshd_config

准备工作

优化SSH

sed -i '13 iPort 52113\nPermitRootLogin no\nPermitEmptyPasswords
no\nUseDNS no\nGSSAPIAuthentication no' /etc/ssh/sshd_config

  1. sed -i '13 iPort 52113\nPermitRootLogin no \n 禁止root登录
  2. PermitEmptyPasswords no \n 禁止使用密码
  3. UseDNS no\n 禁用DNS
  4. GSSAPIAuthentication no' 禁用GSSAPI
  5. sshd_config

检查houst解析

  1. cat >>/etc/hosts/ <<EOF
  2. 172.16.1.5 lb01
  3. 172.16.1.6 lb02
  4. 172.16.1.7 web02
  5. 172.16.1.8 web01
  6. 172.16.1.51 db01 db01.etiantian.org
  7. 172.16.1.31 nfs01
  8. 172.16.1.41 backup
  9. 172.16.1.61 m01
  10. EOF结束

实验步骤

  1. [root@m01 /]# useradd oldboy
  2. [root@m01 /]# echo "123456"|passwd --stdin oldboy
  3. [root@m01 /]# id oldboy
  4. [root@m01 /]#su oldboy
  5. [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只能用于数字签名

脚本分发密钥

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

一键产生密钥对:

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

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

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

  1. [oldboy@web01 ~]$ ssh-copy-id -i .ssh/id_dsa.pub oldboy@172.16.1.31
  2. [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 提权实现没有权限用户拷贝

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

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

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

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

  1. rsync -avz hosts -e ssh -p 52113oldboy@172.16.1.31:~

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

常用连接介绍:

1.png-34.5kB

发送文件脚本

  1. [cyh888@m01 ~]$ sh fenfa.sh hosts
  2. hosts 10.0.0.41 is ok [ OK ]
  3. hosts 10.0.0.31 is ok [ OK ]
  4. [cyh888@m01 ~]$ cat hosts
  5. 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
  6. ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
  7. 172.16.1.5 lb01
  8. 172.16.1.6 lb02
  9. 172.16.1.7 web02
  10. 172.16.1.8 web01
  11. 172.16.1.51 db01 db01.etiantian.org
  12. 172.16.1.31 nfs01
  13. 172.16.1.41 backup
  14. 172.16.1.61 m01
  15. ===================2016-05-08=====
  16. [cyh888@m01 ~]$

查看对方系统版本

  1. [oldboy@web01 ~]$ sh view.sh
  2. ====172.16.1.41====CentOS release 6.7 (Final)
  3. ====172.16.1.31====CentOS release 6.7 (Final)
  4. [oldboy@web01 ~]$ cat view.sh
  5. #!/bin/sh
  6. for n in 41 31
  7. do
  8. echo -n "====172.16.1.$n====" -n代表不换行
  9. ssh -p 22 172.16.1.$n cat /etc/redhat-release
  10. done
  11. [oldboy@web01 ~]$ sh view.sh "cat /etc/redhat-release"
  12. ====172.16.1.41====CentOS release 6.7 (Final)
  13. ====172.16.1.31====CentOS release 6.7 (Final)
  14. [oldboy@web01 ~]$ cat view.sh
  15. #!/bin/sh
  16. for n in 41 31
  17. do
  18. echo -n "====172.16.1.$n===="
  19. ssh -p 22 172.16.1.$n $1 $1脚本当中第一个参数
  20. done

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

  1. ====172.16.1.41====Linux 2.6.32-573.el6.x86_64 (backup) 05/06/2016 _x86_64_ (1 CPU)
  2. avg-cpu: %user %nice %system %iowait %steal %idle
  3. 0.01 0.00 0.14 0.10 0.00 99.76
  4. Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
  5. scd0 0.00 0.01 0.00 264 0
  6. sda 0.18 4.90 0.77 99662 15746
  7. ====172.16.1.31====Linux 2.6.32-573.el6.x86_64 (nfs01) 05/06/2016 _x86_64_(1 CPU)
  8. avg-cpu: %user %nice %system %iowait %steal %idle
  9. 0.03 0.03 0.22 0.20 0.00 99.53
  10. Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
  11. scd0 0.00 0.00 0.00 264 0
  12. sda 0.51 14.88 12.88 1153072 997908
  1. [oldboy@web01 ~]$ sh view.sh "free -m"
  2. ====172.16.1.41====
  3. total used free shared buffers cached
  4. Mem: 475 107 367 0 11 34
  5. -/+ buffers/cache: 60 414
  6. Swap: 1023 0 1023
  7. ====172.16.1.31====
  8. total used free shared buffers cached
  9. Mem: 475 417 57 0 28 288
  10. -/+ buffers/cache: 100 374
  11. Swap: 1023 0 1023
  12. 脚本里面将echo -n中的-n取消即可

批量分发文件:(housts

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

脚本内容

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

另一种方法:

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

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

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

脚本内容

  1. #!/bin/sh
  2. . /etc/init.d/functions
  3. if [ $# -ne 1 ];then
  4. echo "USAGE:/bin/sh $0 FILENAME"
  5. exit 1
  6. fi
  7. for n in 41 31
  8. do
  9. scp -P22 $1 172.16.1.$n:~ &>/dev/null
  10. if [ $? -eq 0 ];then
  11. action "dis $1 to 172.16.1.$n" /bin/true
  12. else
  13. action "172.16.1.$n" /bin/false
  14. fi
  15. done

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

  1. [root@m01 ~]# which expect
  2. /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隧道模式


  • 2
  • 4,788 views
    A+
发布日期:2016年08月22日  所属分类:Linux
标签:
新闻联播老司机

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:2   其中:访客  1   博主  1

  1. avatar 李七夜 0
    • avatar 新闻联播老司机
      ....