OpenSSH是一款在linux系统上实现ssh协议的应用程序,可以实现实施远程登录服务器端;
一:ssh服务的最佳实践方案:
1.更换服务端口,不要使用默认的22号端口;
2.禁止使用sshv1;
3.合理的设置登录用户的黑名单和白名单;
4.设置空闲会话的超时时间,将其改的短一些;
5.需要利用防火墙来配合设置ssh的安全访问规则;
6.监听固定的IP地址而不是0.0.0.0;
7.如果必须使用口令认证机制,则需要使用足够复杂的密码;
~]# tr -dc A-Za-z0-9 < /dev/urandom | head -c 30 | xargs
~]# openssl rand -base64 30 | head -c 30 | xargs
8.建议最好使用基于密钥的认证机制;
9.禁止用户使用空密码登录;
10.禁止root用户直接进行远程登录;
11.限制ssh的密码失败频度和并发数;
12.做好日志记录,并经常分析日志内容;
二:SSH提供的认证方式:
        基于口令的认证:
            使用远程服务器上的有效用户账户和该用户的口令,进行身份认证;
            需要在网络中传递被加密的用户名和口令信息;有被拦截和破解的风险;

        基于密钥的认证:
            用户在客户端提供一对密钥,私钥保存在客户端,公钥保存在远程服务器的某个用户的家目录下;
            使用私钥加密一段数据,如果服务器可以使用对应的公钥进行解密,则说明认证成功,可以继续后续通信;
            在整个过程中不涉及用户名和密码等敏感信息的传递;

三:Openssh程序组成
 3.1 openssh应用程序的组成:
   服务器端:
       应用程序
           sshd
       配置文件
          /etc/ssh/sshd_config 

   客户端:
        应用程序
            ssh, scp, sftp
        配置文件
            /etc/ssh/ssh_config
3.2 客户端程序使用
    3.2.1 ssh命令:
        ssh - OpenSSH SSH client (remote login program)

        ssh [options...] [user@]hostname [command]
            常用选项:
                -l login_name:指定此次使用哪个用户进行远程登录;如果使用了该选项,则hostname前面就不能再使用"user@";
                    注意:如果既没有指定此选项,有没有在hostname前面指定"user@"用户名前缀,SSH协议的客户端程序会默认使用客户端本地登录的用户账户作为此次远程登录的用户名;

                -p port:指明访问服务器的哪个具体的服务端口;省略该选项,默认是22;
                -b bind_address:指明此次访问服务器时的源IP地址;省略该选项,则从当前客户端所有有效的IP地址中,选择一个;
                -X:支持X11转发功能,当客户端使用SSH协议远程连接到服务器时,可以在客户端打开图形界面的配置窗口;
                -Y:支持受信任的X11转发;功能与-X相似;
                -o option=value:
                    在实施远程连接时,引入特定的功能或以特定的方式对服务器进行访问;

                    注意:-o选项所能够使用的配置内容非常复杂,通常会将常用的此类功能选项直接写到ssh客户端的配置文件中(/etc/ssh/ssh_config);
                        格式为:
                            HOST pattern
                                OPTION1 value1
                                OPTION2 value2
                                ...
        
    3.2.2 scp命令:基于ssh协议的cp命令;安全复制命令;
        scp - secure copy (remote file copy program)
            两种使用情形:
                推送:PUSH
                    scp [option...] /PATH/FROM/LOCAL_FILE [user@]hostname:/PATH/TO/DESTINATION_REMOTE_FILE

                拉取:PULL
                    scp [option...] [user@]hostname:/PATH/FROM/REMOTE_FILE /PATH/TO/LOCAL_FILE 

                    常用选项:
                        -r:递归复制,可以复制目录;
                        -p:保留源文件中的权限信息;
                        -q:安静模式;
                        -P port:指定远程主机的sshd进程监听的服务端口;

     3.2.3 sftp 命令:

        FTP over ssh
        FTP over ssl(ftps)

        C/S架构:
            S:sftp-server, 由sshd进程管理的一个子服务项目,是sshd的一个子系统;在CentOS中默认是开启的;
            C:sftp命令

        sftp [user@]HOSTNAME

        sftp> help
        sftp> get
        sftp> put
        ...
3.3 服务端--sshd程序:
    配置文件:/etc/ssh/sshd_config
        配置指令的格式:
            指令 值

        常用的指令:
            Port 22:指明sshd服务进程要监听的端口号;建议改为非22号端口;
            ListenAddress 0.0.0.0:指明sshd服务进程监听的IP地址,建议某个固定的IP地址;0.0.0.0表示当前主机上所有的可用IP地址;
            Protocol 2:ssh协议的版本;
            LoginGraceTime 2m:登录时,输入密码操作的最大时长;
            PermitRootLogin yes:是否运行root用户直接进行远程登录;在生产环境中,强烈建议禁用此功能;
            PasswordAuthentication yes:是否开启口令认证机制;
            UseDNS no:是否允许使用DNS反向解析主机名;建议关闭此功能;
            AllowUsers user1 user2 ...:设置登录用户的白名单;
            AllowGroups group1 group2 ...:设置组的白名单;
            DenyUsers user1 user2 ...:设置登录用户的黑名单;
            DenyGroups group1 group2 ...:设置组的黑名单;

        如果对此配置文件中的指令进行了修改,那必须要让sshd进程重新读取配置文件的内容才能使新配置生效;
            CentOS 5、6:
                ~]# service sshd reload
            CentOS 7:
                ~]# systemctl reload sshd
 四:基于密钥的认证机制:
            1.创建密钥对儿:
                ssh-keygen命令:
                    ssh-keygen — authentication key generation, management and conversion
                    格式:
                        ssh-keygen [-q] [-b bits] [-t type] [-P passphrase] [-f output_keyfile]
                            常用选项:
                                -q:安静模式;
                                -b bits:指定创建的密钥的长度;
                                    RSA:最少768bits,默认是2048bits;
                                    DSA:显式给出1024bits;
                                    ECDSA:256bits, 384bits, 521bits;
                                    ED25519:只是使用固定长度的密钥而忽略-b选项指定内容;
                                -t type:指明公钥加密算法的类型;
                                    在SSHv2协议中可以使用上述四种算法;
                                -P passphrase:指定加密私钥文件的口令;
                                -f output_keyfile:生成的密钥文件保存的路径;

                示例:
                    ~]# ssh-keygen -t rsa -P '123456' -f .ssh/id_rsa

            2.将上一步骤中生成的公钥复制到目标服务器指定用户的家目录中:
                ssh-copy-id命令:

                示例:
                    ~]# ssh-copy-id -i .ssh/id_rsa.pub [email protected]

            3.登录测试:
                在客户端执行下列命令:
                    ~]# ssh -l USER hostname
                    ~]# ssh USER@hostname