在实现日常的维护和管理,我们经常需要远程登录到服务器,在早期,实现这个功能的协议是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客户端的配置文件,下面是该目录下的文件:
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端