zoukankan      html  css  js  c++  java
  • openssh,dropbear,pssh,rsync等安全传输工具详解

    openssh

    secure shell,安全的远程登录;openssh和dropbear都是它的开源实现,ssh协议有v1和v2俩个版本,现在使用的都是v2版,v1已经不安全了;ssh基于DH算法做密钥交换,基于RSA或DSA实现身份认证;ssh有俩种方式验证:密码验证和秘钥验证。

    openssl的组成包包括openssl、openssl-clients和openssl-server,基于C/S架构。

    客户端:ssh

    常见的客户端工具有:Windows版的putty、securecrt、xshell;linux中有ssh、sftp、scp、slogin等

    配置文件:/etc/ssh/ssh_config

    Port 22  #默认登录的ssh端口
    StrictHostKeyChecking ask | no  #首次登录不显示检查提示
    CheckHostIP no  #检查主机地址是否是可信的

    ssh命令:

    用法:ssh  username@host [CMD]

    选项:

    • -p port:远程服务器监听的端口
    • -l username:指定用户名
    • -b IP:指定连接的源IP(自己主机的IP)
    • -v:调试模式
    • -C:压缩方式
    • -X:支持x11转发
    • -Y:支持信任x11转发
    • -t:强制伪tty分配,例:ssh -t remoteserver1 ssh remoteserver2
    • -f 后台启用
    • -N 不打开远程shell,处于等待状态
    • -g 启用网关功能

    客户端第一次连接服务器端的时候,服务器会将自己的公钥发送给客户端并保存到客户端的~/.ssh/known_hosts文件中,下次连接则不会再次询问。

    基于密码的验证:

    1)客户端发起ssh请求,服务器会把自己的公钥发送给用户;

    2)用户会根据服务器发来的公钥对密码进行加密;

    3)加密后的信息回传给服务器,服务器用自己的私钥解密,如果密码正确,则用户登录成功。

    基于秘钥的验证:

    1)首先在客户端生成一对密钥(ssh-keygen);

    2)并将客户端的公钥ssh-copy-id 拷贝到服务端;

    3)当客户端再次发送一个连接请求,包括ip、用户名;

    4)服务端得到客户端的请求后,会到authorized_keys中查找,如果有响应的IP和用户,就会随机生成一个字符串;

    5)服务端将使用客户端拷贝过来的公钥进行加密,然后发送给客户端;

    6)得到服务端发来的消息后,客户端会使用私钥进行解密,然后将解密后的字符串发送给服务端;

    7)服务端接受到客户端发来的字符串后,跟之前的字符串进行对比,如果一致,就允许免密码登录。

    示例:配置基于秘钥验证

    1、在客户端生成秘钥对

    # ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa  #未加密
    # ssh-keygen -p #为私钥加密

    2、将公钥文件复制到服务器对应用户的家目录中(~/.ssh/authorized_keys)

    # ssh-copy-id -i ~/.ssh/id_rsa.pub root@192.168.0.7

    3、如果私钥加密,为了避免我们每次使用都需要输入密码,我们可以使用代理

    [root@rhel6 ~]# ssh-agent bash
    [root@rhel6 ~]# ssh-add 
    Enter passphrase for /root/.ssh/id_rsa: ******
    Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)
    [root@rhel6 ~]# ssh 192.168.0.7
    Last login: Sat May 19 10:21:24 2018 from 192.168.0.6
    [root@centos7 ~]# 

    ssh的端口转发

    SSH 会自动加密和解密所有 SSH 客户端与服务端之间的网络数据。但是,SSH 还能够将其他 TCP 端口的网络数据通过 SSH 链接来转发,并且自动提供了相应的加密及解密服务。这一过程也被叫做“隧道”(tunneling),这是因为 SSH 为其他 TCP 链接提供了一个安全的通道来进行传输而得名。例如,Telnet,SMTP,LDAP 这些 TCP 应用均能够从中得益,避免了用户名,密码以及隐私信息的明文传输。而与此同时,如果工作环境中的防火墙限制了一些网络端口的使用,但是允许 SSH 的连接,也能够通过将 TCP 端口转发来使用 SSH 进行通讯。

    1、本地转发:

    我们在Client端,想访问内网的Telnet服务器,但是直接访问Telnet服务器是不安全的,明文用户名密码容易被截获,现在我们就需要借助ssh的端口转发功能搭建一条隧道。

    Client端:

    # ssh -L 本地端口:Telnet-server_IP:Telnet-server_Port sshd_IP #建立隧道
    # ssh -f -L 1080:192.168.0.10:23 -N 192.168.0.7
    # telnet 127.0.0.1 1080

    其他的服务也是同样的原理,只有把端口改变成对应的就好了

    2、远程转发

    我们在sshd服务器端,如果在互联网上有用户需要登录Telnet-server,我们可以在sshd端开启一个安全的隧道

    ssh服务器端:

    # ssh -R 客户端PORT:Telnet_IP:Telnet_Port  客户端IP
    # ssh -f -R 1080:192.168.0.10:23 -N 192.168.0.6
    # telnet 127.0.0.1 1080

    3、动态转发

    例如当用firefox访问internet时,本机的1080端口做为代理服务器,firefox的访问请求被转发到sshserver上,由sshserver替之访问internet; 在本机firefox设置代理socket proxy:127.0.0.1:1080。

    在linux客户端做以下操作

    # ssh -D 1080 root@可访问互联网主机IP
    # curl  --socks5 127.0.0.1:1080  http://www.qq.com 

    服务器端:sshd

    配置文件:/etc/ssh/sshd_conf

    #Port 22 #监听端口
    #AddressFamily any #支持IPv4和ipv6
    #ListenAddress 0.0.0.0 #监听地址
    HostKey /etc/ssh/ssh_host_rsa_key #私钥文件
    SyslogFacility AUTHPRIV #记录日志/var/log/secure
    #LogLevel INFO #记录日志的级别
    #LoginGraceTime 2m #2分钟登录超时时长(在输入密码的时候)
    #PermitRootLogin yes #是否允许root登录
    #StrictModes yes #检查文件的所有者和权限
    #MaxAuthTries 6 #最大的验证次数
    #MaxSessions 10 #一个会话可以克隆几次
    #PubkeyAuthentication yes #是否允许基于key验证
    AuthorizedKeysFile      .ssh/authorized_keys #秘钥验证公钥存放路径
    PasswordAuthentication yes #是否允许基于密码的连接
    GSSAPIAuthentication no #基于GSSAPI验证
    #ClientAliveInterval 0 #是否允许客户端的活动间隔时间,0 不限制
    #ClientAliveCountMax 3 #非活动连接的通知次数
    UseDNS no #禁用DNS反向解析
    #MaxStartups 10:30:100 #未认证连接最大值,默认值10,当达到10个以上,会断开30%,当达到100个的时候全部断开
    #Banner none #提示信息,指定一个文件
    #AllowUsers user1 user2 user3  #白名单
    #DenyUsers  #黑名单

    ssh服务安全建议配置

    1. 建议使用非默认端口
    2. 限制可登录用户
    3. 设定空闲会话超时时长
    4. 利用防火墙设置ssh访问策略
    5. 仅监听特定的IP地址
    6. 基于口令认证时,使用强密码策略
    7. 使用基于密钥的认证
    8. 禁止使用空密码
    9. 禁止root用户直接登录
    10. 限制ssh的访问频度和并发在线数
    11. 经常分析日志

    scp

    用于远程复制,基于ssh

    用法:

    scp [options] [user@]host:/sourcefile /destpath :将自己的文件上传到服务器

    scp [options] /sourcefile [user@]host:/destpath :将服务器的文件下载到本地

    选项:

    • -C: 压缩数据流
    • -r: 递归复制
    • -p: 保持原文件的属性信息
    • -q: 静默模式
    • -P PORT: 指明服务器的监听的端口

    sftp

    基于ssh的交互式文件传输工具,用法与ftp工具相似

    用法:sftp  username@host

    常用指令:ls cd mkdir rmdir pwd get put

    dropbear

    ssh的另一个开源实现软件

    示例:源码编译安装dropbear(环境:CentOS6.9)

    1、获取源码

    [root@centos6 ~]# wget https://matt.ucc.asn.au/dropbear/dropbear-2018.76.tar.bz2
    [root@centos6 ~]# tar xf dropbear-2018.76.tar.bz2 
    [root@centos6 ~]# cd dropbear-2018.76

    2、配置

    [root@centos6 dropbear-2018.76]# ./configure --prefix=/usr/local --sysconfdir=/etc/

    3、编译安装

    # make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert" 
    # make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert" install 

    4、创建私钥

    [root@centos6 ~]# mkdir /etc/dropbear 
    [root@centos6 ~]# dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key -s 4096

    5、启动服务并监听2222端口

    [root@centos6 ~]# dropbear -p 2222

    6、测试

    [root@centos6 ~]# ss -tnlp |grep 2222
    LISTEN     0      128                      :::2222                    :::*      users:(("dropbear",10519,5))
    LISTEN     0      128                       *:2222                     *:*      users:(("dropbear",10519,4))
    [root@centos7 ~]# ssh -p 2222 192.168.0.6

    expect

    expect 是由Don Libes基于Tcl( Tool Command Language )语言开发的,主要应用于自动化交互式操作的场景,借助Expect处理交互的命令,可以将交互过程如:ssh登录,ftp登录等写在一个脚本上,使之自动化完成。尤其适用于需要对多台服务器执行相同操作的环境中,可以大大提高系统管理人员的工作效率。

    用法:expect [ 选项 ] [ -c cmds ] [ [ -[f|b] ] cmdfile ] [ args ]

    选项:

    -c:从命令行执行expect脚本,默认expect是交互地执行的 

    -d:可以输出输出调试信息

    命令:

    spawn:启动新的进程

    send:用于向进程发送字符串

    expect:从进程接收字符串

    interact:允许用户交互

    exp_continue:匹配多个字符串在执行动作后加此命令

    示例:使用expect批量推送ssh的秘钥

    #!/bin/bash
    rpm -q expect &>/dev/null || yum -q -y install expect
    #在客户端生成秘钥对
    [ ! -e ~/.ssh/id_rsa ] && ssh-keygen -t rsa -P "" -f ~/.ssh/id_rsa &>/dev/null
    read -p "Host_ip_list: " ip_list_file
    read -p "Username: " username
    read -s -p "Password: " password
    [ ! -e "$ip_list_file" ] && echo "$ip_list_file not exist." && exit
    [ -z "$ip_list_file" -o -z "$username" -o -z "$password" ] && echo "input error!" && exit
    localhost_ip=`hostname -I |cut -d' ' -f1`
    
    #将自己当成服务器并且把公钥传给自己
    expect <<EOF
    set timeout 10
    spawn ssh-copy-id -i /root/.ssh/id_rsa.pub $localhost_ip
    expect {
    "yes/no" { send "yes
    "; exp_continue}
    "password" { send "$password
    "}
    }
    expect eof
    EOF
    
    #登录一次所有的服务器,获取公钥保存到known_hosts文件中,避免其他主机登录再次询问
    while read ipaddr1; do
    expect <<EOF
    set timeout 10
    spawn ssh ${username}@${ipaddr1} ':'
    expect {
    "yes/no" { send "yes
    "; exp_continue}
    "password" { send "$password
    "}
    }
    expect eof
    EOF
    done < "$ip_list_file"
    
    #将自己的秘钥对、known_hosts和authorized_keys文件复制到所有主机,从而达到所有主机可以互相基于秘钥验证
    while read ipaddr2; do
    expect <<EOF
    set timeout 10
    spawn scp -pr .ssh/ ${username}@${ipaddr2}:
    expect {
    "yes/no" { send "yes
    "; exp_continue}
    "password" { send "$password
    "}
    }
    expect eof
    EOF
    done < "$ip_list_file"

    pssh

    pssh是一个python编写可以在多台服务器上执行命令的工具

    常用选项:

    • --version:查看版本
    • -h:主机文件列表,内容格式”[user@]host[:port]”
    • -H:主机字符串,内容格式”[user@]host[:port]”
    • -l:登录使用的用户名
    • -p:并发的线程数【可选】
    • -o:输出的文件目录【可选】
    • -e:错误输入文件【可选】
    • -t:TIMEOUT 超时时间设置,0无限制【可选】
    • -O:SSH的选项
    • -v:详细模式
    • -A:手动输入密码模式
    • -x:额外的命令行参数使用空白符号,引号,反斜线处理
    • -X:额外的命令行参数,单个参数模式,同-x
    • -i:每个服务器内部处理信息输出
    • -P:打印出服务器返回信息
    # pssh -l root -h ip.txt -i "date;hostname" #批量在多台服务器上执行date和hostname命令

    pscp.pssh:将本地文件批量复制到远程主机

    • -v 显示复制过程
    • -a 复制过程中保留常规属性
    • -r 递归复制目录
    # pscp.pssh -l root -h ip.txt /data/testfile /data

    pslurp:将远程主机的文件批量复制到本地

    • -L 指定从远程主机下载到本机的存储的目录,local是下载到本地后的名称
    • -r 递归复制目录
    # pslurp -l root -h ip.txt -L /data/ /etc/passwd user #批量下载服务器上的文件保存到/data目录下并且改名为user

    rsync

    基于ssh和rsh服务实现高效率的远程系统之间复制文件,与scp的区别是rsync只复制有更改的文件。

    常用选项:

    • -n 模拟复制过程
    • -v 显示详细过程
    • -r 递归复制目录树
    • -p 保留权限
    • -t 保留时间戳
    • -g 保留组信息
    • -o 保留所有者信息
    • -l 将软链接文件本身进行复制(默认)
    • -L 将软链接文件指向的文件复制
    • -a 存档,不保留ACL(-A)和SELinux属性(-X)
    # rsync -av /data 192.168.0.7:/data   #复制/data目录和目录下的文件到另一台主机
    # rsync -av /data/ 192.168.0.7:/data  #只复制目录下的文件

    示例:rsync+inotify实现文件同步

    备份服务器:

    1、准备工作

    # mkdir /backup
    # useradd rsync -s /sbin/nologin  -M
    # chown rsync.rsync /backup/

    2、配置rsyncd

    # vim /etc/rsyncd.conf
    uid = rsync
    gid = rsync
    use chroot = no
    max connections = 200
    timeout = 300
    pid file = /var/run/rsyncd.pid
    lock file = /var/run/rsync.lock
    log file = /var/log/rsyncd.log
    [backup]
    path = /backup/
    ignore errors
    read only = false
    list = false
    hosts allow = 192.168.0.0/24
    hosts deny = 0.0.0.0/32
    auth users = rsync_backup
    secrets file = /etc/rsync.password
    # echo "rsync_backup:123456" >/etc/rsync.password
    # chmod 600 /etc/rsync.password

    3、启动服务

    # rsync --daemon
    # ss -tanl |grep 873
    LISTEN     0      5                        :::873                     :::*     
    LISTEN     0      5                         *:873                      *:*     

    数据服务器:

    1、准备工作

    # echo "123456" >/etc/rsync.password 创建虚拟用户密码文件
    # chmod 600 /etc/rsync.password
    # rsync -avz test.txt rsync_backup@192.168.0.9::backup --password-file=/etc/rsync.password  #测试rsync daemon是否就绪
    # yum -y install inotify-tools

    2、编写监控脚本

    # vim chkfile.sh
    #!/bin/bash
    host=192.168.0.9                   #备份服务器的ip地址
    src=/data/                         #本地监控的目录
    dst=backup                         #备份服务器的rsync服务的模块名
    user=rsync_backup                  #备份服务器的rsync服务的虚拟用户
    rsync_passfile=/etc/rsync.password    #本地调用rsync服务的密码文件
    
    [ -z "$src" -o -z  "${rsync_passfile}" ] && echo "Check File and Folder" && exit
    /usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f' -e close_write,delete,create,attrib $src | while read file; do
            cd $src && rsync -aruz -R --delete ./  --timeout=100 $user@$host::$dst --password-file=${rsync_passfile} >/dev/null 2>&1
    done

    3、监控并测试

    # chmod +x chkfile.sh
    # ./chkfile.sh &

    个人学习笔记    2018-05-19 17:51:18

  • 相关阅读:
    thrift学习
    Spring Bean的生命周期
    无聊的编程题
    jpa双向多对多关联映射
    jpa单向多对多关联映射
    jpa双向一对多关联映射
    jpa单向一对多关联映射
    【计导作业】链表——差集与交集
    【计导作业】链表——成绩统计2
    C语言中访问结构体成员时用‘.’和‘->’的区别
  • 原文地址:https://www.cnblogs.com/L-dongf/p/9058265.html
Copyright © 2011-2022 走看看