在实现日常的维护和管理,我们经常需要远程登录到服务器,在早期,实现这个功能的协议是telnet,现在也较少的使用到,但是telnet一个致命的缺陷就是其不光是数据传输是明文的,就连用户的认证也是明文的,这在互联网是极其不安全的。

 为了实现安全的管理,现在远程登录的时候使用的是都是ssh(secure shell)协议,ssl协议有v1,v2版,但是V1版本因为自身的缺陷也满足不了现在的需求。同telnet一样,ssh协议的实现也是c/s架构,client端可以通过帐号密码的方式登录到server端,server端是一个时时监听在某个套接字上的进程,然后client将用户的指令发送到server端,在server端执行之后,server端的服务器进程再将运行的结果发送给client端。使用ssh的时候这一切过程都是加密的。

  在linux上,实现ssh的工具是openssh系列

        server端:openssh-server

        client端:openssh-clients

还有openssh,生成ssh-keygen工具等。这些软件包一般都需要安装

在redhat的系统上,openssh-server是默认安装并且开机自动启动的。安装生成的服务器端可执行程序的名称是sshd,可以使用service sshd status查看当前系统的sshd是否运行

  sshd配置文件/etc/ssh/在该目录下还存放有ssh客户端的配置文件,下面是该目录下的文件:wKiom1YnTa-gRrnvAAGY5qCNyvc968.jpg

sshd_config就是sshd的配置文件,配置文件中经常用到的参数:

  port 22指定sshd监听的端口(tcp)

 protocol 2 使用的ssh协议版本

 KeyRegenerationInterval 1h随机生成的临时密钥更换时间,默认是一小时

 LoginGraceTime 2m客户端发出请求,等待客户端发送账号的超时时间,或者是等待用户输入密钥的超时时间

 PermitRootLogin yes是否允许管理员远程登录

 PasswordAuthentication yes是的允许基于口令的远程连接

 Subsystem       sftp    /usr/libexec/openssh/sftp-server是SSH软件包中包含的一个安全文件传输子系统,基于ssh实现安全传输,基于ssl实现的时候成为ftps。SFTP本身没有单独的守护进程,它必须使用sshd守护进程(端口号默认是22)来完成相应的连接操作,所以从某种意义上来说,SFTP并不像一个服务器程序,而更像是一个客户端程序。SFTP同样是使用加密传输认证信息和传输的数据,所以,使用SFTP是非常安全的。但是,由于这种传输方式使用了加密/解密技术,所以传输效率比普通的FTP要低得多,如果您对网络安全性要求更高时,可以使用SFTP代替FTP。

SSH会话的建立过程:1.基于口令认证

                                   2.基于密钥认证

基于口令认证:

          a.客户端发起请求(eg 上述192.168.0.1),双方协商使用哪种算法

          b.服务器端向客户端发送一个主机密钥信息(server的公钥),就是/etc/ssl/下的,如果是rsa算法,就发送ssh_host_key.pub,然后保存在客户端当前用户的家目录下的.ssh目录下,文件名是knows-hosts由于没有pki平台中的CA,所以要靠客户端去决定是否信任此公钥

          c.如果客户端信任,客户端会生成一个随机数作为临时会话密钥(对数据对称加密)加密帐号,然后再使用对方的公钥加密生成的对称密钥

          d.客户端发送用户认证密钥,会话建立

sshd服务在启动的时候会开启一个sshd主进程,这个主进程主要用于接收用户请求,然后对于每一个客户端生成一个sshd子进程去响应

基于密钥认证:

   客户端(基于某用户实现)

原理:1.客户端生成一对密钥,使用ssh-keygen生成,假设用户是A

    2.将密钥对中的公钥传输到server端的某用户(B用户)的家目录下的.ssh目录下保存为文件名是authorized.key的文件即可

此时,客户端A用户再以B用户的身份登录server端的时候,发送请求之后会话即可建立,不用在互联网上传输帐号密码,所以基于密钥认证的方式更加安全

使用ssh是应注意的技巧,加强安全性:

 1.定期更换密码

 2.尽量不要使用默认端口,使用非知名端口号

 3.限制可以登录的客户端地址以及用户

 4,尽量不要使用管理员用户直接登录(可以以普通用户的身份登录然后再su到管理员的方式就更加安全)

 5.使用基于密钥的认证

 6.不要使用ssh的V1版本


相关命令以及常用选项:

ssh客户端:ssh  -l选项用于指定用户,以什么身份登录远程主机

      eg:ssh -l jerry 192.168.0.1

ssh-keygen:基于密钥认证是,客户端用于生成密钥对的命令

       -t 用于指定算法(rsa|dsa)

       生成的密钥默认保存在当前用户家目录下的.ssh目录中。当时用rsa算法时,provate-key的文件名是id_rsa,public-key的文件名是is_rsa.pub

       -f选项可以指定保存文件名

注意:.ssh目录在需要手动创建的时候,应该保证目录权限是700,否则系统可能不能正常使用,私钥的权限应该是600,公钥的是644,这也是使用这些自动创建时候的默认权限

ssh-copy-id:实现基于密钥认证的时候,使用该工具将公钥传到远程主机

        -i 指定本地生成的公钥文件

使用该工具的时候,其会自动在远程主机的.ssh目录下,创建authorized.key文件保存传递来的公钥匙,在手动创建该文件的时候,注意文件名,还有多个客户端使用基于密钥认证的时候,使用输出重定向保存至该文件主要不要覆盖

       ssh-copy-id -i ./ssh/id_rsa.pub root@192.168.0.1

可以通过此方法实现双机互信通信,双方对于对方而言既是客户端又是server端