Linux SSH服务介绍4 min read

  • A+
所属分类:Linux运维

  

1 SSH介绍

  

    SSH(端口22)是Secure Shell Protocol的简写,作用是远程登录,在传输数据时可以对数据进行加密,是数据更安全。以前的远程登录是靠telnet(端口23,分加密的)的

    在默认状态下。,SSH服务主要提供两个服务功能,一个是提供类似telnet远程联机服务器的服务,即上面提到的SSH服务,另一个类似FTP服务的sftp-server,借助SSH协议来传输数据的,提供安全的SFTP服务。FTP是文件传输协议,包括(vsftpproftp

    SSH客户端(ssh命令)还包含一个很有用的远程安全拷贝命令scp,也是通过ssh协议工作的

   

ssh小结:

    1. SSH是安全的加密协议,用于远程连接linux服务器

    2. SSH默认端口是22,安全协议版本SSH2,除了2之外还有SSH1(漏洞)

    3. SSH服务端主要包括两个服务功能SSH远程连接,SFTP服务。

    4. linux SSH客户端包含ssh远程连接命令,以及远程拷贝scp命令等

    5. SSH版本不同是连接不上的,必须版本一样才可以

    6. SSH是daemon进程

    7. 在linux系统里面ssh的配置文件有两个(/etc/ssh/sshd_config和/etc/ssh/ssh_config),加d的是服务端,不带d的是客户端

  

SSH图解如下:

Linux SSH服务介绍

图解:

    服务端产生公钥,然后客户端发请求,服务端将公钥发给客户端,客户端随机产生256字节的私钥,客户端将发过来的公钥和自己随机产生的私钥结合成秘钥对(1024字节),最后客户端将1024字节的密钥对发给服务端,双方进行链接,每一台SSH服务器主机都可以使用RSA加密方式来产生一个1024-bit的RSA Key(私钥),至二个RSA的加密方式就是用来产生公钥与私钥的算法之一,

    当客户端SSH联机请求传送过来时,server就会将这个768-bit的公钥传给客户端,此时客户端会将此公钥与先前存储的公钥进行对比,看是否一样,判断标准使客户端联机用户目录下~/.ssh/known_hosts文件内容(linux客户端)

[root@m01 /]# ssh -p52113 zyl@10.0.0.31
The authenticity of host '[10.0.0.31]:52113 ([10.0.0.31]:52113)' can't be established.
RSA key fingerprint is de:c5:88:e3:73:47:43:73:17:11:d8:d5:19:0e:d2:fb.
Are you sure you want to continue connecting (yes/no)? yes
#这是客户端第一次连接服务端没有公钥,然后yes在本地存起公钥,第二次就不会提示了,它会存到本地的~/.ssh/known_hosts文件里

    

2. SSH认证类型

   

2.1 基于口令的安全验证

   

    基于口令的安全验证的方式就是现在我们一直在用的,只要知道服务器的SSH链接账号和口令(当然也要知道对应服务器的IP及开放的SSH端口,默认为22)就可以通过ssh客户端登录到这台远程主机,此时,联机过程中所有传输的数据都是加密的。

[root@m01 /]# ssh -p52113 zyl@10.0.0.31  
zyl@10.0.0.31's password:                #<== 输入密码,这是基于口令
Last login: Sun Jul  3 18:19:28 2016 from 10.0.0.61

     

2.2 基于密钥的安全验证

   

    基于秘钥的安全验证是事先存在一对密钥对,然后把公用密钥(Public key)放在需要访问的目标服务器上,另外还需要把私有密钥放到SSH的客户端对应的客户端服务器上。

    

3. SSH服务启动

   

ssh服务启动

[root@nfs01 /]# /etc/init.d/sshd start
Starting sshd:                                      [  OK  ]

ssh服务配置文件

[root@nfs01 /]# ll /etc/ssh/sshd_config
-rw-------. 1 root root 4025 Jun 17 09:25 /etc/ssh/sshd_config

问1: 给你一个端口,如何命令行查出对应的服务是什么?

lsof –i tcp:52113
netstat –lntup|grep 52113

  

问2: 如果给你一个进程名rsync。如何查看对应的端口是什么?

netstat –lntup|grep rsync

   

4. 更改ssh默认登录配置

    

修改ssh服务运行参数,是通过修改配置文件/etc/ssh/sshd.config实现的

一般来说ssh服务使用默认的配置已经能够很好的工作了,如果安全要求不高,仅仅提供ssh服务的情况,可以不需要修改任何配置,

   

增加ssh安全方法

  以下内容都是ssh配置文件/etc/ssh/sshd_config里面要做的安全提高项

[root@nfs01 /]# vim /etc/ssh/sshd_config
####zyl-sshd-2016.5.4-youhua######
Port 52113
PermitRootLogin no
PermitEmptyPasswords no
UseDNS no
GSSAPIAuthentication no
#####--end--#######

    

解决阿里云服务器ssh连接一段事件后就断开的问题:

在/etc/ssh/sshd.config中配置如下两行内容即可:

ClientAliveInterval 30    #客户端每隔多少秒向服务端发送一次心跳数据
ClientAliveCountMax 300   #客户端多少秒没有相应,服务端自动断开连接

   

参数说明:

参数

说明

Port

指定sshd进程监听的端口号,默认为22,也可以使用多条指令监听多个端口,默认将在本机的所有网络接口上监听,但是可以通过ListenAddress指定只在某个特定的接口上监听

PermitRootLogin

是否允许root登录,可用yes(默认)表示允许,no表示进制,without-password表示进制使用密码认证登录,forced-commands-only表示只有在指定command选项的情况下才允许使用公钥认证登录,同时其它认证方法全部禁止,这个值常用于做远程备份之类的事情

PermitEmptyPasswords

是否允许密码为空的用户远程登录,默认为  no

UseDNS

指定sshd是否应该对远程主机名进行反向解析,已检查此主机名是否与其IP地址正式对应,默认值为yes,速度慢,所以设置为no

GSSAPIAuthentication

解决ssh连接慢

 

5. 防止SSH登录入侵

   

    1. 用密码登录
    2. 牤牛阵法:解决ssh安全问题

        a 防火墙封闭SSH指定源IP限制(局域网、信任公网)

        b 开启SSH值监听本地内网IPListenAddress 10.0.0.8

    3. 尽量不给服务器外网IP 

  

6. SSH连接

  

6.1 Linux客户端通过ssh连接命令

   

ssh基本语法使用

ssh -p52113 root@10.0.0.31
# ssh连接远程主机命令的基本语法
# -p(小写)接端口,默认端口就可以省略-p22
# @前面为用户名,如果用当前用户连接,可以不指定用户
# @后营为要连接的服务器的IP

       

直接登录远程主机的方法

    在未禁止root远程登录及更改SSH端口前的登录方法为

[root@m01 /]# ssh -p52113 root@10.0.0.31 

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

[root@m01 /]# ssh -p22 root@10.0.0.31    
ssh: connect to host 10.0.0.31 port 22: Connection refused    #<== 连接拒接
#提示:如果出现Connection refused报错,可能是防火墙没关,还有可能是连接的对端服务ssh没开

    

SSH客户端命令小结

    1. 切换到别的机器的用法:ssh –p52113 用户名@ip

    2. 到其他机器执行命令(不会切到机器上)ssh –p 52113 user@ip 命令(全路径)

    3. 当前一次SSH连接的时候,本地会产生一个密钥文件~/ssh/known_hosts(多个密钥)

   

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

   

scp 的基本语法使用:scp - secure copy (remote file copy program)

scp是全量拷贝,而rsync是增量拷贝(效率更高),不过scp这个命令很像rsync命令

  

范例:

推:PUSH
   scp –P52113 –r –p /tmp/test zyl@10.0.0.41:/tmp
拉:PULL
   scp –P52113 –r –p zyl@10.0.0.41:/tmp /tmp/test

   

scp为远程拷贝文件和目录的命令

[root@nfs01 /]# scp -P52113 -rp zyl@172.16.1.61:/data /tmp
#解释如下:
#> -P(大写,刚好和ssh命令相反)接端口,默认22端口时可以省略-P22
#--> -r递归,表示拷贝目录
#--> -p 表示在拷贝前后保持文件或目录属性
#--> -l (limit)限制速度
#--> /tmp/oldboy为本地的目录,@前为用户名,@后为要连接服务器的ip,ip后的:/tmp目录,为远端的目标目录,
#--> 还可以将本地的目录推送带别的服务器也可以,只要将位置调换以下即可,
命令为:scp -P52113 -rp /tmp zyl@172.16.1.61:/data
注意:scp拷贝的权限为连接的用户对应的权限

   

scp知识小结

    1. scp是加密的远程拷贝,而cp仅为本地拷贝

    2. 可以把数据从一台机器推送到另一台机器,也可以从其它服务器吧数据拉回本地执行命令的服务器

    3. 每次都是全量完整拷贝,因此,效率不高,适合第一次拷贝用,如果需要增量拷贝,用rsync.

   

7. SSH KEY功能生产实战应用  *****

     

7.1 管理服务器批量管理配置步骤

       

1. m01创建用户及密码(在需要使用ssh管理的服务器上面以及本机上)

useradd oldgirl      #<== 在需要管理的服务器创建
echo 123456|passwd --stdin oldgirl       #<==为创建的管理用户设置密码
id oldgirl           #<== 检查用户是否创建成功
su – oldgirl         #<== 切换到oldgirl用户执行操作

     

2.m01创建密钥对(以下方法任选一种即可)

ssh-keygen -t dsa                #<== 一路回车创建密钥对(第一种方法)两种方法一种即可
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1   #<== 非交互式创建密钥对

     

3. m01分发公钥

#ssh默认22端口
  ssh-copy-id –i .ssh/id_dsa.pub oldgirl@172.16.1.41
#更改过的ssh端口
  ssh-copy-id -i ~/.ssh/id_dsa.pub "-p52113 oldgirl@172.16.1.31"

   

4. 测试

ssh -p52113 oldgirl@172.16.1.41 /sbin/ifconfig eth0 
ssh -p52113 oldgirl@172.16.1.31 /sbin/ifconfig eth0
ssh -p52113 oldgirl@172.16.1.8 /sbin/ifconfig eth0
# 成功标志:连接所有被管理的服务器,不提示密码可直接操作
# 如果想批量执行可将其写进一个脚本一起执行即可

  

7.2 企业中实现ssh方案

  

1. 直接使用root ssh key 不用oldgirl

    条件:允许root ssh登录,然后操作步骤换成root执行即可,还得把禁止root登录取消

    优点:简单、易用

    缺点:安全差、同时无法禁止root远程连接这个功能

 

2. sudo提权实现拷贝没有权限用户拷贝(在要管理的root用户下)

    思路先把分发的文件拷贝到服务器用户家目录,然后sudo提权拷贝分发的文件到远传服务器的对应权限目录。

echo “oldgirl ALL=    NOPASSWD: /usr/bin/rsync” >>/etc/sudoers
visudo –c              #<== 检查语法

   

3. 拓展:同方案2,只是不用sudo,而是设置suid对固定命令提权

    说明:给一个命令授权suid权限,这样这个命令就有了个这个属主一样的权限,如passwd命令,这样不安全。

   

7.3 同时对多台服务器执行相同的命令

    

[class29@m01 scripts]cat view.sh
#!/bin/bash

if [# -ne 1 ]
then      
    echo "usage:0 argv1,must have 1 argvs."
    exit 1
fi

CMD=1

for i in 31 41 61
  do
    echo "==========172.16.1.{i}=================="
    ssh -p 52113 class29@172.16.1.{i} $CMD
done

   

7.4 m01批量管理分发文件

   

说明:当使用下面脚本时可根据情况做调整

第一种:

[class29@m01 ~]cat scripts/fenfa.sh 
#!/bin/bash
. /etc/init.d/functions

for i in 31 41 61
  do
    scp -P52113 ~/hosts class29@172.16.1.{i}:~ &>/dev/null &&\
    ssh -t -p52113 class29@172.16.1.{i} sudo cp ~/hosts /etc/hosts &>/dev/null

    if [? -eq 0 ]
      then
         action "172.16.1.{i}" /bin/true
      else
         action "172.16.1.{i}" /bin/false
    fi
done

   

第二种:批量分发文件(完美版)

[class29@m01 scripts]cat fenfa_file.sh
#!/bin/sh
. /etc/init.d/functions

if [# -ne 2 ]
then      
    echo "usage:0 argv1 argv2,must have two argvs."
    exit
fi

file="1"
basefile=`basename 1`
remote_dir="2"

for ip in (cat ~/scripts/all_iplist.txt)
do
   scp -P52113 -r -pfile class29@ip:~ &>/dev/null &&\
   ssh -p 52113 -t class29@ip sudo cp -a ~/basefileremote_dir &>/dev/null

   if [ ? -eq 0 ]
   then 
       action "ip is successful." /bin/true
   else
       action "$ip is failure." /bin/false
   fi
done

   

批量分发文件原理

    1. 在m01上将想要推送的文件使用scp安全拷贝到被推送服务器的家目录

    2. 将被推送的服务器cp命令授权

    3. 在m01上使用ssh命令远程操作cp命令,将推送过来的文件复制到需要的·目录下下

       


zhaoyulin

发表评论

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