SSH服务详解
SSH服务
SSH服务协议功能
在默认状态下,SSH服务主要提供两个服务功能:
-
一是提供类似telnet远程联机服务器的服务,即上面提到的SSH服务。
-
另一个是类似FTP服务的sftp-server,借助SSH协议来传输数据的.提供更安全的SFTP服务(vsftp,proftp)。
SSH加密技术说明
简单的说,SSH加密技术就是将人类可以看得懂的数据,通过一些特殊的程序算法,把这些数据变成杂乱的无意义的信怠,然后,通过网络进行传输,而当到了目的地后,在通过对应的解密算法,把传过来的加密的数据信怠解密成加密前的可读的正常数据。因此,当数据在互联网上传输时即使被有心的黑客监听窃取了,也很难获取到真正黑要的数据。
当前,网络上的数据包加密技术一般是通过所谓的一对公钥与私钥(PublickeyandPivatekey)组合成的密钥对进行加密与解密操作。如下图,A-Server要给B_Client传数据,首先会通过本地的公钥加密后再到发到网络上传输。而加密的数据到达B_Client端后,再经由B_Client本地的私钥将加密的数据解密出来。由于在intemet上传输过程中的数据是加密过的,所以,传输的数据内容一般来说是比较安全的。
SSH 密钥登录采用的是非对称加密,每个用户通过自己的密钥登录。其中,私钥必须私密保存,不能泄漏;公钥则是公开的,可以对外发送。它们的关系是,公钥和私钥是一一对应的,每一个私钥都有且仅有一个对应的公钥,反之亦然。 如果数据使用公钥加密,那么只有使用对应的私钥才能解密,其他密钥都不行;反过来,如果使用私钥加密(这个过程一般称为“签名”),也只有使用对应的公钥解密。
密钥登陆过程
SSH 密钥登录分为以下的步骤。
预备步骤,客户端通过ssh-keygen生成自己的公钥和私钥。
- 第一步,手动将客户端的公钥放入远程服务器的指定位置。
- 第二步,客户端向服务器发起 SSH 登录的请求。
- 第三步,服务器收到用户 SSH 登录的请求,发送一些随机数据给用户,要求用户证明自己的身份。
- 第四步,客户端收到服务器发来的数据,使用私钥对数据进行签名,然后再发还给服务器。
- 第五步,服务器收到客户端发来的加密签名后,使用对应的公钥解密,然后跟原始数据比较。如果一致,就允许用户登录。
客户端生成密钥
密钥登录时,首先需要生成公钥和私钥。OpenSSH 提供了一个工具程序ssh-keygen命令,用来生成密钥。 直接输入ssh-keygen,程序会询问一系列问题,然后生成密钥。
[root@ceph135 ~]# ssh-keygen
通常做法是使用-t参数,指定密钥的加密算法。
[root@ceph135 ~]# ssh-keygen -t dsa
最后,就会生成私钥和公钥,屏幕上还会给出公钥的指纹,以及当前的用户名和主机名作为注释,用来识别密钥的来源。
公钥文件和私钥文件都是文本文件.
下面的命令可以列出用户所有的公钥。
root@ceph135 ~]# ll ~/.ssh/id_*.pub
-rw-r--r-- 1 root root 394 1月 18 12:34 /root/.ssh/id_rsa.pub
生成密钥以后,建议修改它们的权限,防止其他人读取。
[root@ceph135 ~]# chmod 600 ~/.ssh/id_rsa
[root@ceph135 ~]# chmod 600 ~/.ssh/id_rsa.pub
配置项
ssh-keygen的命令行配置项,主要有下面这些。
- -b -b参数指定密钥的二进制位数。这个参数值越大,密钥就越不容易破解,但是加密解密的计算开销也会加大。
一般来说,-b至少应该是1024,更安全一些可以设为2048或者更高。
- -C -C参数可以为密钥文件指定新的注释,格式为username@host。
下面命令生成一个2048位 RSA 加密算法的密钥对,并且给出了用户名和主机名。
[root@ceph135 ~]# ssh-keygen -t rsa -b 2048 -C "root@192.168.8.135"
- -f -f参数指定生成的私钥文件。
[root@ceph135 ~]# ssh-keygen -t dsa -f mykey
上面命令会在当前目录生成私钥文件mykey和公钥文件mykey.pub。
- -N -N参数用于指定私钥的密码(passphrase)。
[root@ceph135 ~]# ssh-keygen -t dsa -N abcabcabc
- -t
-t参数用于指定生成密钥的加密算法,一般为dsa或rsa
上传公钥
手动上传公钥
生成密钥以后,公钥必须上传到服务器,才能使用公钥登录。
OpenSSH 规定,用户公钥保存在服务器的/.ssh/authorized_keys文件。你要以哪个用户的身份登录到服务器,密钥就必须保存在该用户主目录的/.ssh/authorized_keys文件。只要把公钥添加到这个文件之中,就相当于公钥上传到服务器了。每个公钥占据一行。如果该文件不存在,可以手动创建。
用户可以手动编辑该文件,把公钥粘贴进去,也可以在本机计算机上,执行下面的命令。
[root@ceph135 ~]# cat ~/.ssh/id_rsa.pub | ssh user@host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
上面示例中,user@host要替换成你所要登录的用户名和主机名。
注意,authorized_keys文件的权限要设为644,即只有文件所有者才能写。如果权限设置不对,SSH 服务器可能会拒绝读取该文件。
只要公钥上传到服务器,下次登录时,OpenSSH 就会自动采用密钥登录,不再提示输入密码。
ssh-copy-id 命令:自动上传公钥
OpenSSH 自带一个ssh-copy-id命令,可以自动将公钥拷贝到远程服务器的/.ssh/authorized_keys文件。如果/.ssh/authorized_keys文件不存在,ssh-copy-id命令会自动创建该文件。 用户在本地计算机执行下面的命令,就可以把本地的公钥拷贝到服务器。
[root@ceph135 ~]# ssh-copy-i key_file user@host
上面命令中,-i参数用来指定公钥文件,user是所要登录的账户名,host是服务器地址。如果省略用户名,默认为当前的本机用户名。执行完该命令,公钥就会拷贝到服务器。
注意,公钥文件可以不指定路径和.pub后缀名,ssh-copy-id会自动在~/.ssh目录里面寻找。
ssh-agent 命令,ssh-add 命令
基本用法
私钥设置了密码以后,每次使用都必须输入密码,有时让人感觉非常麻烦。比如,连续使用scp命令远程拷贝文件时,每次都要求输入密码。
ssh-agent命令就是为了解决这个问题而设计的,它让用户在整个 Bash 对话(session)之中,只在第一次使用 SSH 命令时输入密码,然后将私钥保存在内存中,后面都不需要再输入私钥的密码了。
第一步,使用下面的命令新建一次命令行对话。
[root@ceph135 ~]# ssh-agent bash
如果想在当前对话启用ssh-agent,可以使用下面的命令。
[root@ceph135 ~]# ssh-agent
上面命令中,ssh-agent会先自动在后台运行,并将需要设置的环境变量输出在屏幕上,类似下面这样。
SSH_AUTH_SOCK=/tmp/ssh-mqQx4W1WEdgs/agent.12680; export SSH_AUTH_SOCK;
SSH_AGENT_PID=12681; export SSH_AGENT_PID;
echo Agent pid 12681;
eval命令的作用,就是运行上面的ssh-agent命令的输出,设置环境变量。
第二步,在新建的 Shell 对话里面,使用ssh-add命令添加默认的私钥(比如/.ssh/id_rsa,或/.ssh/id_dsa,或/.ssh/id_ecdsa,或/.ssh/id_ed25519)。
[root@ceph135 ~]# ssh-add
Enter passphrase for /root/.ssh/id_rsa:
Enter passphrase for /root/.ssh/id_dsa:
Bad passphrase, try again for /root/.ssh/id_dsa:
上面例子中,添加私钥时,会要求输入密码。以后,在这个对话里面再使用密钥时,就不需要输入私钥的密码了,因为私钥已经加载到内存里面了。
如果添加的不是默认私钥,ssh-add命令需要显式指定私钥文件。
[root@ceph135 ~]# ssh-add my-other-key-file
上面的命令中,my-other-key-file就是用户指定的私钥文件。
第三步,使用 ssh 命令正常登录远程服务器。
[root@ceph135 ~]# ssh 192.168.8.178
上面命令中192.168.8.178是远程服务器的地址,ssh 使用的是默认的私钥。这时如果私钥设有密码,ssh 将不再询问密码,而是直接取出内容里面的私钥。
如果要使用其他私钥登录服务器,需要使用 ssh 命令的-i参数指定私钥文件。
[root@ceph135 ~]# ssh -i OpenSSHPrivateKey 192.168.8.178
最后,如果要退出ssh-agent,可以直接退出子 Shell(按下 Ctrl + d),也可以使用下面的命令。
[root@ceph135 ~]# ssh-agent -k
ssh-add命令
ssh-add命令用来将私钥加入ssh-agent,它有如下的参数。
- -d -d参数从内存中删除指定的私钥。
[root@ceph135 ~]# ssh-add -d name-of-key-file
- -D
-D参数从内存中删除所有已经添加的私钥。
[root@ceph135 ~]# ssh-add -D
- -l -l参数列出所有已经添加的私钥。
[root@ceph135 ~]# ssh-add -l
关闭密码登录
为了安全性,启用密钥登录之后,最好关闭服务器的密码登录。
对于 OpenSSH,具体方法就是打开服务器 sshd 的配置文件/etc/ssh/sshd_config,将PasswordAuthentication这一项设为no。
PasswordAuthentication no
修改配置文件以后,不要忘了重新启动 sshd,否则不会生效。
查看状态:
systemctl status sshd.service
启动服务:
systemctl start sshd.service
重启服务:
systemctl restart sshd.service
开机自启:
systemctl enable sshd.service