zoukankan      html  css  js  c++  java
  • SSH

    ssh: secure shell, protocol, 22/tcp, 安全的远程登录

    具体的软件实现:  

      OpenSSH: ssh协议的开源实现,CentOS默认安装

      dropbear:另一个开源实现

    SSH协议版本

      v1: 基于CRC-32做MAC,不安全;man-in-middle

      v2:双方主机协议选择安全的MAC方式

      基于DH算法做密钥交换,基于RSA或DSA实现身份认证

    两种方式的用户登录认证:

      基于password

      基于key

    修改ssh默认的22号端口

      vim /etc/ssh/sshd_config

        #Port 22  -->  Port 9527                      修改为需要的端口

        ssh user@192.168.1.7  -p 9527         重新连接的时候需要-p指定更改后的端口,默认22

    指定连接的IP地址      当连接发起者有多个IP地址时

       ssh -b 192.168.1.4  192.168.1.7            由本机的192.168.1.4地址连接192.168.1.7

    ssh 连接提速

      在服务器端/etc/ssh/sshd_config

        UseDNS yes -->> UseDNS no     

        GSSAPIAuthentication yes -->> GSSAPIAuthentication no

    Openssh软件组成

      相关包:

        openssh

        openssh-clients

        openssh-server

      工具:

        基于C/S结构

        Client: ssh, scp, sftp,slogin

          Windows客户端:

            xshell, putty, securecrt, sshsecureshellclient

        Server: sshd

      客户端组件:

        ssh, 配置文件:/etc/ssh/ssh_config

          Host PATTERN

            StrictHostKeyChecking no 首次登录不显示检查提示

      格式:ssh [user@]host [COMMAND]

         ssh [-l user] host [COMMAND]

           -p port:远程服务器监听的端口

           -b:指定连接的源IP

              -v:调试模式

           -C:压缩方式

              -X: 支持x11转发

           -Y:支持信任x11转发

              ForwardX11Trusted yes

              -t: 强制伪tty分配

              ssh -t remoteserver1 ssh remoteserver2

      允许实现对远程系统经验证地加密安全访问

      当用户远程连接ssh服务器时,会复制ssh服务器/etc/ssh/ssh_host*key.pub(CentOS7默认是ssh_host_ecdsa_key.pub)文件中的公钥到客户机的~./ssh/know_hosts中。下次连接时,会自动匹配相应私钥,不能匹配,将拒绝连接

    ssh服务登录验证

      ssh服务登录验证方式:

        用户/口令 

        基于密钥

      基于用户和口令登录验证

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

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

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

      基于密钥的登录方式

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

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

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

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

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

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

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

      基于密钥的认证:

        (1) 在客户端生成密钥对

         ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa   -t指定加密类型/默认rsa可选,-P无密码/可选, -f指定输出路径

        (2) 把公钥文件传输至远程服务器对应用户的家目录

          ssh-copy-id -i /root/.ssh/id_rsa root@192.168.1.7  -i后跟公钥所在路径,写错私钥也没关系

        (3) 测试

        (4) 在SecureCRT或Xshell实现基于key验证

          在SecureCRT工具—>创建公钥—>生成Identity.pub文件转化为openssh兼容格式(适合SecureCRT,Xshell不需要转化格式),并复制到需登录主机上相应文件authorized_keys中,注意权限必须为600,在需登录的ssh主机上执行:ssh-keygen -i -f Identity.pub >> .ssh/authorized_keys

        (5)重设私钥口令:

          ssh-keygen –p 

        (6)验证代理(authentication agent)保密解密后的密钥

          这样口令就只需要输入一次

          在GNOME中,代理被自动提供给root用户

          否则运行ssh-agent bash

        (7)钥匙通过命令添加给代理

          ssh-add

    多台主机之间互相免密登陆:

      各自进入/root/.ssh/目录,

      ssh-keygen生成私钥和公钥,

      然后所有服务器都将公钥复制到一个主机上ssh-copy-id 192.168.1.7

       然后192.168.1.7的主机上有了所有主机的公钥以后,将/root/.ssh/authorized_keys发送到每台主机的.ssh目录下scp /root/.ssh/authorized_keys  192.168.1.*:/root/.ssh/  

      修改客户端配置文件可以不产生提示

      vim /etc/ssh/ssh_config                  注意sshd_config是服务器端配置文件

      #   StrictHostKeyChecking ask  改为  StrictHostKeyChecking  no 

       

    scp命令:

      scp [options] SRC... DEST/

      两种方式:

        scp [options] [user@]host:/sourcefile /destpath  scp  /etc/fstab 192.168.1.6:/app

        scp [options] /sourcefile [user@]host:/destpath  scp 192.168.1.6:/etc/fstab  /app

      常用选项:

        -C: 压缩数据流

        -r: 递归复制

        -p: 保持原文件的属性信息

        -q: 静默模式

        -P PORT: 指明remote host的监听的端口

    rsync命令            用于高效率的同步文件,只同步发生变化的部分

      基于ssh和rsh服务实现高效率的远程系统之间复制文件

      使用安全的shell连接做为传输方式

        rsync –av /etc server1:/tmp 复制目录和目录下文件

        rsync –av /etc/ server1:/tmp 只复制目录下文件

        比scp更快,只复制不同的文件

        选项:

          -n 模拟复制过程

          -v 显示详细过程

          -r 递归复制目录树

          -p 保留权限

          -t 保留时间戳

          -g 保留组信息

          -o 保留所有者信息

          -l 将软链接文件本身进行复制(默认)

          -L 将软链接文件指向的文件复制

          -a 存档,相当于–rlptgoD,但不保留ACL(-A)和SELinux属性(-X)

    sftp命令

      交互式文件传输工具  

      用法和传统的ftp工具相似

      利用ssh服务实现安全的文件上传和下载

      使用ls cd mkdir rmdir pwd get put等指令,可用?或help

      获取帮助信息

        sftp [user@]host

        sftp> help

      在sftp中加!为本地命令,不加!为目标服务器的命令

      get下载

      put上传

    pssh工具

      pssh是一个python编写可以在多台服务器上执行命令的工具,也可实现文件复制

      选项如下:

        --version:查看版本

        -h:主机文件列表,内容格式”[user@]host[:port]” 

        -H:主机字符串,内容格式”[user@]host[:port]” 

        -l:登录使用的用户名

        -p:并发的线程数【可选】

        -o:输出的文件目录【可选】

      pssh -f ip.txt -o /app cat /var/log/secure

        -e:错误输入文件【可选】

        -t:TIMEOUT 超时时间设置,0无限制【可选】

        -O:SSH的选项

        -v:详细模式

        -A:手动输入密码模式

        -x:额外的命令行参数使用空白符号,引号,反斜线处理

        -X:额外的命令行参数,单个参数模式,同-x

        -i:每个服务器内部处理信息输出

        -P:打印出服务器返回信息

      pssh -h ip.txt -i 'echo $HOSTNAME'

      pssh -h ip.txt -i 'rm -rf *'                   在命令中有特殊字符时需要加单引号,否则命令会作用于本机

      pscp.pssh -h ip.txt /etc/selinux/config  /etc/selinux/                       复制并且覆盖

      pscp.pssh -h ip.txt /etc/selinux/config  /etc/selinux/config2            复制并改名为config2

      通过pssh批量关闭seLinux

        pssh -H root@192.168.1.10 -i "sed -i "s/SELINUX=enforcing/SELINUX=disabled/" /etc/selinux/config"

       批量发送指令

        pssh -H root@192.168.1.10 -i setenforce 0

        pssh -H xuewb@192.168.1.10 -i hostname

      当不支持ssh的key认证时,通过 -A选项,使用密码认证批量执行指令

        pssh -H xuewb@192.168.1.10 -A -i hostname    只支持一个密码输入,需要多台服务器的密码相同

      将标准错误和标准正确重定向都保存至/app目录下

        pssh -H 192.168.1.10 -o /app -e /app -i  "hostname"

    PSCP.PSSH命令

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

        pscp [-vAr] [-h hosts_file] [-H [user@]host[:port]] [-l user] [-p par] [-o outdir] [-e errdir] [-t timeout] [-O options] [-x args] [-X arg] local remote

      Pscp-pssh选项

        -v 显示复制过程   

        -a 复制过程中保留常规属性

        -r 递归复制目录

      将本地curl.sh 复制到/app/目录

        pscp.pssh -H 192.168.1.10 /root/test/curl.sh /app/ 

        pscp.pssh -h host.txt /root/test/curl.sh /app/ 

      将本地多个文件批量复制到/app/目录

        pscp.pssh -H 192.168.1.10 /root/f1.sh /root/f2.sh /app/

      将本地目录批量复制到/app/目录

        pscp.pssh -H 192.168.1.10 -r /root/test/ /app/

    PSLURP.PSSH命令

      pslurp.pssh功能是将远程主机的文件批量复制到本地

        pslurp [-vAr] [-h hosts_file] [-H [user@]host[:port]] [-l user] [-p par][-o outdir] [-e errdir] [-t timeout] [-O options] [-x args] [-X arg] [-L localdir] remote local(本地名)

      Pslurp-pssh选项

        -L 指定从远程主机下载到本机的存储的目录,local是下载到本地后的名称

        -r 递归复制目录

      批量下载目标服务器的passwd文件至/app下,并更名为user

        pslurp -H 192.168.1.10 -L /app/ /etc/passwd user

    SSH端口转发

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

      SSH 端口转发能够提供两大功能:

        加密 SSH Client 端至 SSH Server 端之间的通讯数据

        突破防火墙的限制完成一些之前无法建立的 TCP 连接

      本地转发:

        -L localport:remotehost:remotehostport sshserver

      选项:

        -f 后台启用

        N 不打开远程shell,处于等待状态

        -g 启用网关功能

      示例

        ssh –L 9527:telnetsrv(目标主机):23 -N sshsrv(路由主机)

        telnet 127.0.0.1 9527

        当访问本机的9527的端口时,被加密后转发到sshsrv的ssh服务,再解密被转发到telnetsrv:23

        data <-->  localhost:9527 <-->  localhost:XXXXX  <-->  sshsrv:22  <-->  sshsrv:YYYYY <--->  telnetsrv:23

       远程转发:

        -R sshserverport:remotehost:remotehostport sshserver

      示例:

        ssh –R 9527:telnetsrv(目标主机):23 –N sshsrv(连接主机)

        让sshsrv侦听9527端口的访问,如有访问,就加密后通过ssh服务转发请求到本机ssh客户端,再由本机解密后转发到telnetsrv:23

        Data<-->sshsrv:9527  <-->  sshsrv:22  <-->  localhost:XXXXX  <-->  localhost:YYYYY  <-->  telnetsrv:23

      动态端口转发:

        当用firefox访问internet时,本机的1080端口做为代理服务器,firefox的访问请求被转发到sshserver上,由sshserver替之访问internet

        ssh -D 1080 root@sshserver

        在本机firefox设置代理socket proxy:127.0.0.1:1080

        curl --socks5 127.0.0.1:1080 http://www.qq.com

    X 协议转发

      所有图形化应用程序都是X客户程序

        能够通过tcp/ip连接远程X服务器

        数据没有加密,但是它通过ssh连接隧道安全进行

      ssh -X user@remotehost gedit

        remotehost主机上的gedit工具,将会显示在本机的X服务器上

        传输的数据将通过ssh连接加密

    ssh服务器配置

      服务器端:sshd, 配置文件: /etc/ssh/sshd_config

      常用参数:

        Port                                     默认端口号

        ListenAddress ip                

          LoginGraceTime 2m

        PermitRootLogin yes       拒绝root账号直接连接

        StrictModes yes 检查.ssh/文件的所有者,权限等

        MaxAuthTries 6

        MaxSessions 10 同一个连接最大会话

        PubkeyAuthentication yes

        PermitEmptyPasswords no

        PasswordAuthentication yes

        GatewayPorts no

        ClientAliveInterval:单位:秒

        ClientAliveCountMax:默认3

        UseDNS yes

        GSSAPIAuthentication yes 提高速度可改为no

        MaxStartups 未认证连接最大值,默认值10

        Banner /path/file

        限制可登录用户的办法:

          AllowUsers user1 user2 user3

          DenyUsers

          AllowGroups

          DenyGroups

      ssh服务的最佳实践

        建议使用非默认端口     更改端口号为非标,绑定为内网IP访问,避免公网IP访问ssh服务,

        禁止使用protocol version 1

        限制可登录用户

        设定空闲会话超时时长

        利用防火墙设置ssh访问策略

        仅监听特定的IP地址

        基于口令认证时,使用强密码策略

          tr -dc A-Za-z0-9_ < /dev/urandom | head -c 30| xargs

        使用基于密钥的认证。

        禁止使用空密码

        禁止root用户直接登录

        限制ssh的访问频度和并发在线数

        经常分析日志

    dropbear

      ssh协议的另一个实现:dropbear

      源码编译安装:

        1、安装开发包组:yum groupinstall “Development tools”

        2、下载dropbear-2017.75.tar.bz2

        3、tar xf dropbear-2017.75.tar.bz2

        4、less INSTALL README

        5、./configure

        6、make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp"

        7、make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" install

      启动ssh服务:

        8、ls /usr/local/sbin/ /usr/local/bin/

        9、/usr/local/sbin/dropbear -h

        10、mkdir /etc/dropbear

        11、dropbearkey -t rsa -f  /etc/dropbear/dropbear_rsa_host_key -s 2048

        12、dropbearkey -t dss -f  /etc/dropbear/dropbear_dsa_host_key

        13、dropbear -p :2222 -F –E #前台运行

          dropbear -p :2222 #后台运行

      客户端访问:

        14、ssh -p 2222 root@127.0.0.1

        15、dbclient -p 2222 root@127.0.0.1

  • 相关阅读:
    浏览器渲染HTML页面步骤
    JavaScript中必记英语单词及含义
    JavaScript中的线程与进程
    成绩转换 题解
    计算球的体积 题解 #define
    计算两点间的距离 题解
    ASCII码排序 题解
    python学习——协程
    python学习——进程
    python学习——锁
  • 原文地址:https://www.cnblogs.com/tony3154/p/10127293.html
Copyright © 2011-2022 走看看